mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-03 23:06:37 +00:00
21_OWAD.pm: Update, nur minimale Änderungen
21_OWID.pm: Update, nur minimale Änderungen 21_OWMULTI.pm: Große Überarbeitung für asynchrones OWX-NG 21_OWSWITCH.pm: Große Überarbeitung für asynchrones OWX-NG 21_OWTHERM.pm: Große Überarbeitung für asynchrones OWX-NG 21_OWVAR.pm: Große Überarbeitung für asynchrones OWX-NG git-svn-id: https://svn.fhem.de/fhem/trunk@13642 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
1354308564
commit
05d2103271
@ -86,7 +86,7 @@ use ProtoThreads;
|
||||
no warnings 'deprecated';
|
||||
sub Log3($$$);
|
||||
|
||||
my $owx_version="6.0";
|
||||
my $owx_version="6.1";
|
||||
#-- fixed raw channel name, flexible channel name
|
||||
my @owg_fixed = ("A","B","C","D");
|
||||
my @owg_channel = ("A","B","C","D");
|
||||
@ -944,7 +944,7 @@ sub OWAD_Set($@) {
|
||||
|
||||
#-- re-intialize
|
||||
if($key eq "initialize") {
|
||||
OWADInitializeDevice($hash);
|
||||
OWAD_Initialize($hash);
|
||||
return undef;
|
||||
}
|
||||
|
||||
@ -1737,6 +1737,8 @@ sub OWXAD_PT_SetPage($$) {
|
||||
1;
|
||||
|
||||
=pod
|
||||
=item device
|
||||
=item summary to control 1-Wire A/D converters DS2450
|
||||
=begin html
|
||||
|
||||
<a name="OWAD"></a>
|
||||
|
@ -68,7 +68,7 @@ use ProtoThreads;
|
||||
no warnings 'deprecated';
|
||||
sub Log3($$$);
|
||||
|
||||
my $owx_version="6.01";
|
||||
my $owx_version="6.1";
|
||||
#-- declare variables
|
||||
my %gets = (
|
||||
"present" => "",
|
||||
@ -477,6 +477,8 @@ sub OWID_Undef ($) {
|
||||
1;
|
||||
|
||||
=pod
|
||||
=item device
|
||||
=item summary to control 1-Wire devices having only a serial number
|
||||
=begin html
|
||||
|
||||
<a name="OWID"></a>
|
||||
|
@ -87,7 +87,7 @@ no warnings 'deprecated';
|
||||
|
||||
sub Log($$);
|
||||
|
||||
my $owx_version="6.01";
|
||||
my $owx_version="6.1";
|
||||
#-- flexible channel name
|
||||
my ($owg_channel,$owg_schannel);
|
||||
|
||||
@ -888,9 +888,10 @@ sub OWXMULTI_BinValues($$$$$$$) {
|
||||
|
||||
#-- process results
|
||||
@data=split(//,$res);
|
||||
if (@data != 9) {
|
||||
$msg="$name returns invalid data length, ".int(@data)." instead of 9 bytes";
|
||||
}elsif ((ord($data[0]) & 112)!=0) {
|
||||
#-- not useful here, because data may be filled up with ff
|
||||
#if (@data != 9) {
|
||||
# $msg="$name returns invalid data length, ".int(@data)." instead of 9 bytes";
|
||||
if ((ord($data[0]) & 112)!=0) {
|
||||
$msg="$name: conversion not complete or data invalid";
|
||||
}elsif (OWX_CRC8(substr($res,0,8),$data[8])==0) {
|
||||
$msg="$name returns invalid CRC";
|
||||
@ -898,12 +899,13 @@ sub OWXMULTI_BinValues($$$$$$$) {
|
||||
$msg="No error";
|
||||
}
|
||||
OWX_WDBG($name,"OWXMULTI_BinValues: ".$msg,"")
|
||||
if( $main::owx_debug>2 );
|
||||
if( $main::owx_debug>2 );
|
||||
|
||||
#-- this must be different for the different device types
|
||||
# family = 26 => DS2438
|
||||
#-- transform binary rep of VDD
|
||||
if( $context eq "ds2438.getvdd") {
|
||||
#-- possible addtional check: $data[0] must be 08
|
||||
#-- temperature
|
||||
$lsb = ord($data[1]);
|
||||
$msb = ord($data[2]) & 127;
|
||||
@ -933,6 +935,7 @@ sub OWXMULTI_BinValues($$$$$$$) {
|
||||
|
||||
#-- transform binary rep of VAD
|
||||
}elsif( $context eq "ds2438.getvad") {
|
||||
#-- possible addtional check: $data[0] must be 08
|
||||
#-- voltage
|
||||
$lsb = ord($data[3]);
|
||||
$msb = ord($data[4]) & 3;
|
||||
@ -1088,38 +1091,38 @@ sub OWXMULTI_GetValues($) {
|
||||
#OWX_Qomplex($master, $hash, "write SP", 0, $owx_dev, "\x4E\x00\x08", 0, 0, 0, undef, 0);
|
||||
#-- switch the device to current measurement on, VDD only
|
||||
#-- issue the match ROM command \x55 and the write scratchpad command
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "write SP", 0, $owx_dev, "\x4E\x00\x09", 0, 0, 0, undef, 0);
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "write SP", 0, $owx_dev, "\x4E\x00\x09", 0, 2, 0, undef, 0.01);
|
||||
|
||||
#-- copy scratchpad to register
|
||||
#-- issue the match ROM command \x55 and the copy scratchpad command
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "copy SP", 0, $owx_dev, "\x48\x00", 0, 0, 0, undef, 0);
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "copy SP", 0, $owx_dev, "\x48\x00", 0, 1, 0, undef, 0.01);
|
||||
|
||||
#-- initiate temperature conversion
|
||||
#-- conversion needs some 12 ms !
|
||||
#-- issue the match ROM command \x55 and the start conversion command
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "T conversion", 0, $owx_dev, "\x44", 0, 0, 0, undef, 0);
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "T conversion", 0, $owx_dev, "\x44", 0, 0, 0, undef, 0.02);
|
||||
|
||||
#-- initiate voltage conversion
|
||||
#-- conversion needs some 6 ms !
|
||||
#-- issue the match ROM command \x55 and the start conversion command
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "V conversion", 0, $owx_dev, "\xB4", 0, 0, 0, undef, 0);
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "V conversion", 0, $owx_dev, "\xB4", 0, 0, 0, undef, 0.01);
|
||||
|
||||
#-- from memory to scratchpad
|
||||
#-- copy needs some 12 ms !
|
||||
#-- issue the match ROM command \x55 and the recall memory command
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "recall", 0, $owx_dev, "\xB8\x00", 0, 0, 0, undef, 0);
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "recall", 0, $owx_dev, "\xB8\x00", 0, 2, 0, undef, 0.02);
|
||||
|
||||
#-- NOW ask the specific device
|
||||
#-- issue the match ROM command \x55 and the read scratchpad command \xBE
|
||||
#-- reading 9 + 2 + 9 data bytes = 20 bytes
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
# 1 provides additional reset after last operattion
|
||||
OWX_Qomplex($master, $hash, "ds2438.getvdd", 1, $owx_dev, "\xBE\x00\x08", 0, 9, 11, \&OWXMULTI_BinValues, 0);
|
||||
# 1 provides additional reset after last operation
|
||||
OWX_Qomplex($master, $hash, "ds2438.getvdd", 1, $owx_dev, "\xBE\x00\x08", 0, 9, 11, \&OWXMULTI_BinValues, 0.01);
|
||||
|
||||
#-- switch the device to current measurement off, V external only
|
||||
#-- issue the match ROM command \x55 and the write scratchpad command
|
||||
@ -1127,33 +1130,33 @@ sub OWXMULTI_GetValues($) {
|
||||
#OWX_Qomplex($master, $hash, "write SP", 0, $owx_dev, "\x4E\x00\x00", 0, 0, 0, undef, 0);
|
||||
#-- switch the device to current measurement on, V external only
|
||||
#-- issue the match ROM command \x55 and the write scratchpad command
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "write SP", 0, $owx_dev, "\x4E\x00\x01", 0, 0, 0, undef, 0);
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "write SP", 0, $owx_dev, "\x4E\x00\x01", 0, 1, 0, undef, 0.01);
|
||||
|
||||
|
||||
#-- copy scratchpad to register
|
||||
#-- issue the match ROM command \x55 and the copy scratchpad command
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "copy SP", 0, $owx_dev, "\x48\x00", 0, 0, 0, undef, 0);
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "copy SP", 0, $owx_dev, "\x48\x00", 0, 1, 0, undef, 0.01);
|
||||
|
||||
#-- initiate voltage conversion
|
||||
#-- conversion needs some 6 ms !
|
||||
#-- issue the match ROM command \x55 and the start conversion command
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "V conversion", 0, $owx_dev, "\xB4", 0, 0, 0, undef, 0);
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "V conversion", 0, $owx_dev, "\xB4", 0, 0, 0, undef, 0.01);
|
||||
|
||||
#-- from memory to scratchpad
|
||||
#-- copy needs some 12 ms !
|
||||
#-- issue the match ROM command \x55 and the recall memory command
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "recall", 0, $owx_dev, "\xB8\x00", 0, 0, 0, undef, 0);
|
||||
OWX_Qomplex($master, $hash, "recall", 0, $owx_dev, "\xB8\x00", 0, 1, 0, undef, 0.02);
|
||||
|
||||
#-- NOW ask the specific device
|
||||
#-- issue the match ROM command \x55 and the read scratchpad command \xBE
|
||||
#-- reading 9 + 2 + 9 data bytes = 20 bytes
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
# 1 provides additional reset after last operattion
|
||||
OWX_Qomplex($master, $hash, "ds2438.getvad", 1, $owx_dev, "\xBE\x00", 0, 20, 11, \&OWXMULTI_BinValues, 0);
|
||||
# 1 provides additional reset after last operation
|
||||
OWX_Qomplex($master, $hash, "ds2438.getvad", 1, $owx_dev, "\xBE\x00", 0, 9, 11, \&OWXMULTI_BinValues, 0.01);
|
||||
|
||||
return undef;
|
||||
}
|
||||
@ -1396,6 +1399,8 @@ sub OWXMULTI_PT_SetValues($@) {
|
||||
1;
|
||||
|
||||
=pod
|
||||
=item device
|
||||
=item summary to control 1-Wire chip DS2438Z - Smart Battery Monitor
|
||||
=begin html
|
||||
|
||||
<a name="OWMULTI"></a>
|
||||
|
@ -87,7 +87,7 @@ no warnings 'deprecated';
|
||||
|
||||
sub Log($$);
|
||||
|
||||
my $owx_version="6.02";
|
||||
my $owx_version="6.1";
|
||||
#-- fixed raw channel name, flexible channel name
|
||||
my @owg_fixed = ("A","B","C","D","E","F","G","H");
|
||||
my @owg_channel = ("A","B","C","D","E","F","G","H");
|
||||
@ -209,6 +209,10 @@ sub OWSWITCH_Define ($$) {
|
||||
if( $fam eq "3A" ){
|
||||
$model = "DS2413";
|
||||
CommandAttr (undef,"$name model DS2413");
|
||||
}elsif( $fam eq "85" ){
|
||||
$fam ="3A";
|
||||
$model = "DS2413";
|
||||
CommandAttr (undef,"$name model DS2413");
|
||||
}elsif( $fam eq "12" ){
|
||||
$model = "DS2406";
|
||||
CommandAttr (undef,"$name model DS2406");
|
||||
@ -411,6 +415,7 @@ sub OWSWITCH_FormatValues($) {
|
||||
OWSWITCH_ChannelNames($hash);
|
||||
|
||||
#-- put into READINGS
|
||||
my $gpio = 0;
|
||||
readingsBeginUpdate($hash);
|
||||
|
||||
#-- formats for output
|
||||
@ -418,6 +423,8 @@ sub OWSWITCH_FormatValues($) {
|
||||
|
||||
#-- input state is 0 = ON or 1 = OFF
|
||||
$vval = $hash->{owg_val}->[$i];
|
||||
$gpio += $hash->{owg_val}->[$i]<<$i;
|
||||
|
||||
#-- output state is 0 = ON or 1 = OFF
|
||||
$vvax = $hash->{owg_vax}->[$i];
|
||||
|
||||
@ -442,6 +449,7 @@ sub OWSWITCH_FormatValues($) {
|
||||
|
||||
#-- STATE
|
||||
readingsBulkUpdate($hash,"state",$svalue);
|
||||
readingsBulkUpdate($hash,"gpio",$gpio);
|
||||
readingsEndUpdate($hash,1);
|
||||
|
||||
return $svalue;
|
||||
@ -532,7 +540,7 @@ sub OWSWITCH_Get($@) {
|
||||
|
||||
#-- OWX interface
|
||||
if( $interface eq "OWX" ){
|
||||
OWXSWITCH_GetModState($hash,undef,undef);
|
||||
OWXSWITCH_GetModState($hash,"final",undef);
|
||||
}elsif( $interface eq "OWX_ASYNC") {
|
||||
eval {
|
||||
$ret = OWX_ASYNC_RunToCompletion($hash,OWXSWITCH_PT_GetState($hash));
|
||||
@ -608,11 +616,8 @@ sub OWSWITCH_GetValues($) {
|
||||
#-- Get readings according to interface type
|
||||
my $interface= $hash->{IODev}->{TYPE};
|
||||
if( $interface eq "OWX" ){
|
||||
#-- max 3 tries
|
||||
for(my $try=0; $try<3; $try++){
|
||||
$ret = OWXSWITCH_GetModState($hash,undef,undef);
|
||||
return if( !defined($ret) );
|
||||
}
|
||||
$ret = OWXSWITCH_GetModState($hash,"final",undef);
|
||||
return if( !defined($ret) );
|
||||
}elsif( $interface eq "OWX_ASYNC" ){
|
||||
eval {
|
||||
OWX_ASYNC_Schedule( $hash, OWXSWITCH_PT_GetState($hash) );
|
||||
@ -685,7 +690,7 @@ sub OWSWITCH_Set($@) {
|
||||
|
||||
my ($cname,@cnama,@channel);
|
||||
my $ret="";
|
||||
my ($ret1,$ret2);
|
||||
my ($ret1,$ret2,$ret3);
|
||||
|
||||
#-- for the selector: which values are possible
|
||||
if (@a == 2){
|
||||
@ -724,7 +729,7 @@ sub OWSWITCH_Set($@) {
|
||||
#-- Set readings according to interface type
|
||||
my $interface= $hash->{IODev}->{TYPE};
|
||||
|
||||
#-- set single state
|
||||
#-- set single output state: get-set-get needed because external shorting can be discovered only after set
|
||||
if( $key eq "output" ){
|
||||
return "OWSWITCH: Set needs parameter when writing output: <channel>"
|
||||
if( int(@a)<2 );
|
||||
@ -765,15 +770,17 @@ sub OWSWITCH_Set($@) {
|
||||
$nstr = "$a[0] $a[1] $a[2] on";
|
||||
}
|
||||
}else{
|
||||
return "OWSWITCH: Wrong data value $a[3], must be on, off, on-for-timer or off-for-timer";
|
||||
return "OWSWITCH: Set has wrong data value $a[3], must be on, off, on-for-timer or off-for-timer";
|
||||
}
|
||||
|
||||
#-- timer for timed on/off
|
||||
if ($nstr ne ""){
|
||||
fhem("define ".$a[0].".".$owg_fixed[$outfnd]."Timer at +".$ntim." set ".$nstr);
|
||||
}
|
||||
|
||||
#-- combined get-set-get operation
|
||||
#-- OWX interface
|
||||
if( $interface eq "OWX" ){
|
||||
#-- all-in one needed, because return not sure
|
||||
$ret1 = OWXSWITCH_GetModState($hash,$outfnd,$outval);
|
||||
}elsif( $interface eq "OWX_ASYNC"){
|
||||
eval {
|
||||
@ -793,9 +800,10 @@ sub OWSWITCH_Set($@) {
|
||||
$gpio |= (1<<$outfnd);
|
||||
}
|
||||
$ret2 = OWFSSWITCH_SetState($hash,$gpio);
|
||||
$ret3 = OWFSSWITCH_GetState($hash);
|
||||
#-- Unknown interface
|
||||
}else{
|
||||
return "OWSWITCH: Get with wrong IODev type $interface";
|
||||
return "OWSWITCH: Set with wrong IODev type $interface";
|
||||
}
|
||||
#-- process results
|
||||
$ret .= $ret1
|
||||
@ -806,7 +814,7 @@ sub OWSWITCH_Set($@) {
|
||||
return "OWSWITCH: Could not set device $name, reason: ".$ret;
|
||||
}
|
||||
|
||||
#-- set state
|
||||
#-- set complete gpio output state: set-get needed because external shorting can be discovered only after set
|
||||
}elsif( $key eq "gpio" ){
|
||||
#-- check value and write to device
|
||||
return "OWSWITCH: Set with wrong value for gpio port, must be 0 <= gpio <= ".((1 << $cnumber{$attr{$name}{"model"}})-1)
|
||||
@ -820,9 +828,10 @@ sub OWSWITCH_Set($@) {
|
||||
};
|
||||
$ret = GP_Catch($@) if $@;
|
||||
}elsif( $interface eq "OWServer" ){
|
||||
$ret = OWFSSWITCH_SetState($hash,int($value));
|
||||
$ret2 = OWFSSWITCH_SetState($hash,int($value));
|
||||
$ret3 = OWFSSWITCH_GetState($hash);
|
||||
}else{
|
||||
return "OWSWITCH: GetValues with wrong IODev type $interface";
|
||||
return "OWSWITCH: Set with wrong IODev type $interface";
|
||||
}
|
||||
#-- process results
|
||||
if($ret){
|
||||
@ -830,8 +839,6 @@ sub OWSWITCH_Set($@) {
|
||||
}
|
||||
}
|
||||
|
||||
#-- process results - we have to reread the device
|
||||
#OWSWITCH_GetValues($hash);
|
||||
Log 4, "OWSWITCH: Set $hash->{NAME} $key $value";
|
||||
return undef;
|
||||
}
|
||||
@ -1031,12 +1038,14 @@ sub OWXSWITCH_BinValues($$$$$$$) {
|
||||
|
||||
#-- note: value 1 corresponds to OFF, 0 to ON normally
|
||||
# val = input value, vax = output value
|
||||
# setstate -> only set, getstate -> only get, mod -> get-set
|
||||
#-- Outer if - check get or set
|
||||
if ( $context =~ /^(......)\.(get|mod)state\.?(\d)?\.?(\d)?/){
|
||||
$cmd = $2;
|
||||
$chip = $1;
|
||||
if ( $context =~ /^(......)\.(get|mod)state\.?(final|(\d))?\.?(\d)?/){
|
||||
$cmd = $2;
|
||||
$chip = $1;
|
||||
$outfnd = $3;
|
||||
$outval = $4;
|
||||
$outval = $5;
|
||||
#-- initial get operation
|
||||
#-- family = 12 => DS2406 -------------------------------------------------------
|
||||
if( $chip eq "ds2406" ) {
|
||||
@data=split(//,$res);
|
||||
@ -1053,9 +1062,6 @@ sub OWXSWITCH_BinValues($$$$$$$) {
|
||||
$hash->{owg_vax}->[1] = ($value>>1) & 1;
|
||||
|
||||
}
|
||||
OWX_WDBG($name,"OWXSWITCH_BinValues: ".$msg,$res)
|
||||
if( $main::owx_debug>2 );
|
||||
|
||||
#-- family = 29 => DS2408 -------------------------------------------------------
|
||||
}elsif( $chip eq "ds2408" ) {
|
||||
@data=split(//,$res);
|
||||
@ -1072,9 +1078,6 @@ sub OWXSWITCH_BinValues($$$$$$$) {
|
||||
$hash->{owg_vax}->[$i] = (ord($data[1])>>$i) & 1;
|
||||
};
|
||||
}
|
||||
OWX_WDBG($name,"OWXSWITCH_BinValues: ".$msg,$res)
|
||||
if( $main::owx_debug>2 );
|
||||
|
||||
#-- family = 3A => DS2413 -------------------------------------------------------
|
||||
}elsif( $chip eq "ds2413" ){
|
||||
@data=split(//,$res);
|
||||
@ -1089,13 +1092,21 @@ sub OWXSWITCH_BinValues($$$$$$$) {
|
||||
$hash->{owg_val}->[1] = (ord($data[0])>>2) & 1;
|
||||
$hash->{owg_vax}->[1] = (ord($data[0])>>3) & 1;
|
||||
}
|
||||
OWX_WDBG($name,"OWXSWITCH_BinValues: ".$msg,$res)
|
||||
if( $main::owx_debug>2 );
|
||||
|
||||
#--
|
||||
}else{
|
||||
die "OWSWITCH: $name has unknown device family $hash->{OW_FAMILY} in OWXSWITCH_BinValues getstate\n";
|
||||
};
|
||||
OWX_WDBG($name,"OWXSWITCH_BinValues: ".$msg,$res)
|
||||
if( $main::owx_debug>2 );
|
||||
|
||||
#-- Formatting only after final get
|
||||
if( $outfnd eq "final"){
|
||||
$hash->{PRESENT} = 1;
|
||||
$value = OWSWITCH_FormatValues($hash);
|
||||
return undef;
|
||||
}
|
||||
|
||||
#-- modstate -> get-set, here set operation
|
||||
#-- now only if data has to be overwritten
|
||||
if( $cmd eq "mod" ){
|
||||
my $gpio = 0;
|
||||
@ -1107,11 +1118,12 @@ sub OWXSWITCH_BinValues($$$$$$$) {
|
||||
}else{
|
||||
$gpio |= (1<<$outfnd);
|
||||
}
|
||||
#Log 1,"DEBUGGING OWXNG : After reading old gpio as $old, with outval=$outval and outfnd=$outfnd we are setting a new gpio as $gpio";
|
||||
Log 1,"DEBUGGING OWXNG : After reading old gpio with outval=$outval and outfnd=$outfnd we are setting a new gpio as $gpio";
|
||||
#-- re-set the state
|
||||
OWXSWITCH_SetState($hash,$gpio);
|
||||
}
|
||||
#-- Now for context setstate
|
||||
|
||||
#-- Now for context setstate. Either being called after modstate, or directly from Set
|
||||
}elsif ( $context =~ /^(......)\.setstate\.?(\d+)?\.?(\d+)?/){
|
||||
$chip = $1;
|
||||
$value = $2;
|
||||
@ -1124,18 +1136,11 @@ sub OWXSWITCH_BinValues($$$$$$$) {
|
||||
$msg="Error - state could not be set for device $name, invalid CRC, ";
|
||||
}else{
|
||||
$msg="No error, ";
|
||||
$outval = $value % 2;
|
||||
$hash->{owg_vax}->[0] = $outval;
|
||||
$hash->{owg_val}->[0] = 0
|
||||
if( $outval ==0);
|
||||
$outval = int($value / 2);
|
||||
$hash->{owg_vax}->[1] = $outval;
|
||||
$hash->{owg_val}->[1] = 0
|
||||
if( $outval ==0);
|
||||
$hash->{owg_val}->[0] = ($value>>2) & 1;
|
||||
$hash->{owg_vax}->[0] = $value & 1;
|
||||
$hash->{owg_val}->[1] = ($value>>3) & 1;
|
||||
$hash->{owg_vax}->[1] = ($value>>1) & 1;
|
||||
}
|
||||
OWX_WDBG($name,"OWXSWITCH_BinValues: ".$msg,$res)
|
||||
if( $main::owx_debug>2 );
|
||||
|
||||
#-- family = 29 => DS2408 -------------------------------------------------------
|
||||
}elsif( $chip eq "ds2408" ) {
|
||||
if (length($res)!=1){
|
||||
@ -1151,9 +1156,6 @@ sub OWXSWITCH_BinValues($$$$$$$) {
|
||||
if( $outval ==0);
|
||||
};
|
||||
}
|
||||
OWX_WDBG($name,"OWXSWITCH_BinValues: ".$msg,$res)
|
||||
if( $main::owx_debug>2 );
|
||||
|
||||
#-- family = 3A => DS2413 -------------------------------------------------------
|
||||
}elsif( $chip eq "ds2413" ){
|
||||
@data=split(//,$res);
|
||||
@ -1172,20 +1174,17 @@ sub OWXSWITCH_BinValues($$$$$$$) {
|
||||
$hash->{owg_val}->[1] = 0
|
||||
if( $outval ==0);
|
||||
}
|
||||
OWX_WDBG($name,"OWXSWITCH_BinValues: ".$msg,$res)
|
||||
if( $main::owx_debug>2 );
|
||||
#--
|
||||
}else{
|
||||
die "OWSWITCH: $name has unknown device family $hash->{OW_FAMILY} in OWXSWITCH_BinValues setstate\n";
|
||||
};
|
||||
OWXSWITCH_GetModState($hash,undef,undef);
|
||||
OWX_WDBG($name,"OWXSWITCH_BinValues: ".$msg,$res)
|
||||
if( $main::owx_debug>2 );
|
||||
#-- and finally after setstate follows another getstate
|
||||
OWXSWITCH_GetModState($hash,"final",undef);
|
||||
}else{
|
||||
die "OWSWITCH: unknown context $context in OWXSWITCH_BinValues";
|
||||
}
|
||||
|
||||
#-- and now from raw to formatted values
|
||||
$hash->{PRESENT} = 1;
|
||||
$value = OWSWITCH_FormatValues($hash);
|
||||
return undef;
|
||||
}
|
||||
|
||||
@ -1222,6 +1221,10 @@ sub OWXSWITCH_GetModState($$$) {
|
||||
$context = "getstate";
|
||||
#-- take your time
|
||||
$proc = 0;
|
||||
}elsif( $outfnd eq "final"){
|
||||
$context = "getstate.final";
|
||||
#-- faster !
|
||||
$proc = 16;
|
||||
}else{
|
||||
$context = "modstate.$outfnd.$outval";
|
||||
#-- faster !
|
||||
@ -1312,7 +1315,7 @@ sub OWXSWITCH_GetModState($$$) {
|
||||
|
||||
########################################################################################
|
||||
#
|
||||
# OWXSWITCH_SetState - Set gpio ports of device
|
||||
# OWXSWITCH_SetState - Set and reread gpio ports of device, and rereads gpio ports
|
||||
#
|
||||
# Parameter hash = hash of device addressed
|
||||
# value = integer value for device gpio output
|
||||
@ -1336,25 +1339,10 @@ sub OWXSWITCH_SetState($$) {
|
||||
#-- family = 12 => DS2406
|
||||
if( $hash->{OW_FAMILY} eq "12" ) {
|
||||
#=============== set gpio values ===============================
|
||||
# Writing the output state via the access channel command does
|
||||
# not work contrary to documentation. Using the write status command
|
||||
#-- issue the match ROM command \x55 and the read status command
|
||||
# \xAA at address TA1 = \x07 TA2 = \x00
|
||||
#-- reading 9 + 3 + 1 data bytes + 2 CRC bytes = 15 bytes
|
||||
OWX_Reset($master);
|
||||
$res = OWX_Complex($master,$owx_dev,"\xAA\x07\x00",3);
|
||||
if( $res eq 0 ){
|
||||
return "device $owx_dev not accessible in writing";
|
||||
}
|
||||
OWX_Reset($master);
|
||||
|
||||
my $stat = ord(substr($res,12,1));
|
||||
my $statneu = ( $stat & 159 ) | (($value<<5) & 96) ;
|
||||
#-- call the second step
|
||||
#-- issue the match ROM command \x55 and the write status command
|
||||
# \x55 at address TA1 = \x07 TA2 = \x00
|
||||
#-- reading 9 + 4 + 2 data bytes = 15 bytes
|
||||
$select=sprintf("\x55\x07\x00%c",$statneu);
|
||||
$select=sprintf("\x55\x07\x00%c",(($value<<5) & 96));
|
||||
#-- OLD OWX interface
|
||||
if( !$master->{ASYNCHRONOUS} ){
|
||||
OWX_Reset($master);
|
||||
@ -1368,7 +1356,8 @@ sub OWXSWITCH_SetState($$) {
|
||||
}else{
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
# 16 pushes this to the top of the queue
|
||||
OWX_Qomplex($master, $hash, "ds2406.setstate.$value", 16, $owx_dev, $select, $select, 2, 13, \&OWXSWITCH_BinValues, 0);
|
||||
#OWX_Qomplex($master, $hash, "ds2406.setstate.$value", 0, $owx_dev, $select, 0, 2, 13, \&OWXSWITCH_BinValues, 0.01);
|
||||
OWX_Qomplex($master, $hash, "ds2406.setstate.$value", 0, $owx_dev, $select, 0, 2, 2, \&OWXSWITCH_BinValues, 0.01);
|
||||
return undef;
|
||||
}
|
||||
#-- family = 29 => DS2408
|
||||
@ -1389,7 +1378,7 @@ sub OWXSWITCH_SetState($$) {
|
||||
#-- NEW OWX interface
|
||||
}else{
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
# 16 pushes this to the top of the queue
|
||||
# 16 pushes this to the top of the queue
|
||||
OWX_Qomplex($master, $hash, "ds2408.setstate.$value", 16, $owx_dev, $select, 0, 1, 12, \&OWXSWITCH_BinValues, 0);
|
||||
return undef;
|
||||
}
|
||||
@ -1411,11 +1400,11 @@ sub OWXSWITCH_SetState($$) {
|
||||
#-- NEW OWX interface
|
||||
}else{
|
||||
#### master slave context proc owx_dev data cmd numread startread callback delay
|
||||
# 16 pushes this to the top of the queue
|
||||
# 16 pushes this to the top of the queue
|
||||
OWX_Qomplex($master, $hash, "ds2413.setstate", 16, $owx_dev, $select, 0, 2, 12, \&OWXSWITCH_BinValues, 0);
|
||||
return undef;
|
||||
}
|
||||
}else {
|
||||
} else {
|
||||
return "unknown device family $hash->{OW_FAMILY}\n";
|
||||
}
|
||||
}
|
||||
@ -1661,6 +1650,8 @@ sub OWXSWITCH_PT_SetOutput($$$) {
|
||||
1;
|
||||
|
||||
=pod
|
||||
=item device
|
||||
=item summary to control 1-Wire adressable switches DS2413, DS206, DS2408
|
||||
=begin html
|
||||
|
||||
<a name="OWSWITCH"></a>
|
||||
|
@ -86,7 +86,7 @@ no warnings 'deprecated';
|
||||
sub Log3($$$);
|
||||
sub AttrVal($$$);
|
||||
|
||||
my $owx_version="6.0";
|
||||
my $owx_version="6.1";
|
||||
|
||||
my %gets = (
|
||||
"id" => "",
|
||||
@ -1070,7 +1070,7 @@ sub OWXTHERM_GetValues($) {
|
||||
#-- NEW OWX interface
|
||||
}else{
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, undef, 0, $owx_dev, "\x44", 0, 0, undef, undef, $convtimes{AttrVal($name,"resolution",12)}*0.001);
|
||||
OWX_Qomplex($master, $hash, undef, 0, $owx_dev, "\x44", 0, 0, undef, undef, $convtimes{AttrVal($name,"resolution",12)}*0.001);
|
||||
}
|
||||
}
|
||||
#-- NOW ask the specific device
|
||||
@ -1090,8 +1090,8 @@ sub OWXTHERM_GetValues($) {
|
||||
return $@ ? $@ : undef;
|
||||
#-- NEW OWX interface
|
||||
}else{
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, undef, 0, $owx_dev, "\xBE", 0, 9, 10, \&OWXTHERM_BinValues, 0);
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, undef, 1, $owx_dev, "\xBE", 0, 9, 10, \&OWXTHERM_BinValues, 0.01);
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
@ -1150,7 +1150,7 @@ sub OWXTHERM_SetValues($$) {
|
||||
#-- NEW OWX interface
|
||||
}else{
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, undef, 0, $owx_dev, $select, 0, 3, 10, undef, 0);
|
||||
OWX_Qomplex($master, $hash, undef, 0, $owx_dev, $select, 0, 3, 10, undef, 0.05);
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
@ -1279,6 +1279,8 @@ sub OWXTHERM_PT_SetValues($$) {
|
||||
1;
|
||||
|
||||
=pod
|
||||
=item device
|
||||
=item summary to control 1-Wire temperature sensors DS1820, DS18S20, DS18B20, DS1822
|
||||
=begin html
|
||||
|
||||
<a name="OWTHERM"></a>
|
||||
|
@ -75,7 +75,7 @@ no warnings 'deprecated';
|
||||
sub Log3($$$);
|
||||
sub AttrVal($$$);
|
||||
|
||||
my $owx_version="6.0";
|
||||
my $owx_version="6.1";
|
||||
my $owg_channel = "";
|
||||
|
||||
my %gets = (
|
||||
@ -781,6 +781,7 @@ sub OWXVAR_BinValues($$$$$$$) {
|
||||
if( $main::owx_debug>2 );
|
||||
return undef;
|
||||
|
||||
#--- obsolete code - we have put all operations into the SetValues part. Leave in for now
|
||||
}elsif( $context eq "setstate" ) {
|
||||
my $val = ord($res);
|
||||
#$hash->{owg_val}=sprintf("%5.2f",(1-$val/255.0)*100);
|
||||
@ -796,8 +797,7 @@ sub OWXVAR_BinValues($$$$$$$) {
|
||||
if( $main::owx_debug>2 );
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
# 2 suppresses the initial bus reset, 16 inserts at top of queue
|
||||
OWX_Qomplex($master, $hash, "confirm", 18, $owx_dev, "\x96", 0, 0, 11, undef, 0);
|
||||
|
||||
#OWX_Qomplex($master, $hash, "confirm", 18, $owx_dev, "\x96", 0, 2, 11, undef, 0.01);
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
@ -839,7 +839,7 @@ sub OWXVAR_GetValues($) {
|
||||
#-- NEW OWX interface
|
||||
}else{
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "getstate", 0, $owx_dev, "\xF0", 0, 2, 10, \&OWXVAR_BinValues, 0);
|
||||
OWX_Qomplex($master, $hash, "getstate", 0, $owx_dev, "\xF0", 0, 2, 10, \&OWXVAR_BinValues, 0.01);
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
@ -890,7 +890,8 @@ sub OWXVAR_SetValues($$$) {
|
||||
#-- NEW OWX interface
|
||||
}else{
|
||||
#### master slave context proc owx_dev data crcpart numread startread callback delay
|
||||
OWX_Qomplex($master, $hash, "setstate", 0, $owx_dev, $select, $pos, 1, 11, \&OWXVAR_BinValues, 0);
|
||||
OWX_Qomplex($master, $hash, "setstate", 0, $owx_dev, $select, 0, 1, 0, undef, 0);
|
||||
OWX_Qomplex($master, $hash, "confirm", 3, $owx_dev, "\x96", 0, 1, 0, undef, 0);
|
||||
$hash->{owg_val}=sprintf("%5.2f",(1-$pos/255.0)*100);
|
||||
}
|
||||
return undef;
|
||||
@ -900,7 +901,9 @@ sub OWXVAR_SetValues($$$) {
|
||||
|
||||
1;
|
||||
|
||||
=pod
|
||||
=pod
|
||||
=item device
|
||||
=item summary to control 1-Wire variable resistor DS2890
|
||||
=begin html
|
||||
|
||||
<a name="OWVAR"></a>
|
||||
|
Loading…
x
Reference in New Issue
Block a user