2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 03:06:37 +00:00

00_OW2S0SMSGUARD:add reading timeout

git-svn-id: https://svn.fhem.de/fhem/trunk@23734 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
Wzut 2021-02-13 17:12:02 +00:00
parent 38d4b11df0
commit e3beac353f

View File

@ -300,7 +300,7 @@ sub SetFn {
my $val = shift // .5; my $val = shift // .5;
my $dlist = ReadingsVal($name, '.ds2401' ,''); my $dlist = ReadingsVal($name, '.ds2401' ,'');
my $ds = ($dlist) ? ' deleteDS2401:'.$dlist : ''; my $ds = ($dlist) ? ' deleteDS2401:'.$dlist : '';
my $ret;
if ($cmd eq 'reset') { if ($cmd eq 'reset') {
DevIo_CloseDev($hash); DevIo_CloseDev($hash);
@ -311,30 +311,27 @@ sub SetFn {
if (($cmd eq 'deleteDS2401') && $dlist && (IsValidHex($val,16)) && (substr($val, 0, 2) eq '01')) { if (($cmd eq 'deleteDS2401') && $dlist && (IsValidHex($val,16)) && (substr($val, 0, 2) eq '01')) {
my ($ret , $rr, $r);
if (exists($hash->{helper}{OW}{100}{$val})) { if (exists($hash->{helper}{OW}{100}{$val})) {
my $reading = (defined($hash->{helper}{OW}{100}{$val}->{name})) ? $hash->{helper}{OW}{100}{$val}->{name} : ''; my $reading = (defined($hash->{helper}{OW}{100}{$val}->{name})) ? $hash->{helper}{OW}{100}{$val}->{name} : '';
$ret = CommandDeleteReading(undef, "$name $reading") if ($reading); CommandDeleteReading(undef, "$name $reading") if ($reading);
delete $hash->{helper}{OW}{100}{$val}; delete $hash->{helper}{OW}{100}{$val};
} }
# Sub Device löschen ? # Sub Device löschen ?
my $dname = (exists($modules{OW2S0SMSGUARD}{defptr}{$val})) ? $modules{OW2S0SMSGUARD}{defptr}{$val}->{NAME} : ''; my $dname = (exists($modules{OW2S0SMSGUARD}{defptr}{$val})) ? $modules{OW2S0SMSGUARD}{defptr}{$val}->{NAME} : '';
$r = CommandDelete(undef, $dname) if ($dname && AttrVal($name, 'useSubDevices', '')); $ret = CommandDelete(undef, $dname) if ($dname && AttrVal($name, 'useSubDevices', ''));
$ret .= ($ret && $r) ? ' '.$r : $r;
$dlist =~ s/$val//x; $dlist =~ s/$val//x;
$dlist =~ s/,,/,/x; # $val war in der Mitte des Strings $dlist =~ s/,,/,/x; # $val war in der Mitte des Strings
$dlist =~ s/(^,|,$)//x; # einzelens Komma am Anfang oder Ende ? $dlist =~ s/(^,|,$)//x; # einzelens Komma am Anfang oder Ende ?
readingsSingleUpdate($hash, '.ds2401', $dlist, 0) if ($dlist); # noch etwas übrig vom reading ? if ($dlist) {
readingsSingleUpdate($hash, '.ds2401', $dlist, 0); # noch etwas übrig vom reading ?
if (!$dlist) {
$rr = CommandDeleteReading(undef, "$name .ds2401");
$ret .= ($ret && $rr) ? ' '.$rr : $rr;
} }
Log3($name, 3, "$name, $ret") if ($ret); else {
CommandDeleteReading(undef, "$name .ds2401");
}
return $ret; return $ret;
} }
@ -506,19 +503,8 @@ sub decodeList {
return ErrorLog($hash, "got NOK for OW device $num [".$data[2].']') if (!$ok); return ErrorLog($hash, "got NOK for OW device $num [".$data[2].']') if (!$ok);
my $model = int(substr($data[2],0,2)); my $model = int(substr($data[2],0,2));
my $owid = substr($data[2],0,14);
my $owcrc = substr($data[2],14,2);
my $crc = 0;
for my $i (0,2,4,6,8,10,12) { # die ersten 7 Byte return ErrorLog($hash, "CRC error OW device $num [$data[2]]") if (!crc8($data[2]));
my $byte = substr($owid, $i , 2);
for (my $bit=1; $bit<256; $bit=$bit*2) {
my $cbit = ((hex($byte) & $bit) == $bit) ? 1 : 0;
$crc= (($crc & 1) != $cbit) ? ($crc >> 1)^0x8c : $crc >> 1;
}
}
return ErrorLog($hash, "CRC error OW device $num [$data[2]] : $owcrc != ". sprintf('%02x', $crc)) if ($crc != hex($owcrc));
if ($num == 0) { if ($num == 0) {
for my $i (1..63) {delete $hash->{'OW-Dev'.$i} if (exists($hash->{'OW-Dev'.$i})); } for my $i (1..63) {delete $hash->{'OW-Dev'.$i} if (exists($hash->{'OW-Dev'.$i})); }
@ -640,8 +626,9 @@ sub ParseFn {
my @arr = split(',', $msg); my @arr = split(',', $msg);
return if (!defined($arr[1]) || (!IsValidHex($arr[1],16))); return if (!defined($arr[1]) || (!IsValidHex($arr[1],16)));
my $model = $arr[2] // return; my $model = $arr[2] // return;
my $val = $arr[3] // return; my $val = $arr[3] // return;
my $timeout = $arr[5] // 0;
if (!exists($modules{OW2S0SMSGUARD}{defptr}{$arr[1]})) { if (!exists($modules{OW2S0SMSGUARD}{defptr}{$arr[1]})) {
@ -680,6 +667,7 @@ sub ParseFn {
} }
readingsBulkUpdate($dhash, 'last_absent', $dhash->{last_absent}) if ($val eq 'present'); readingsBulkUpdate($dhash, 'last_absent', $dhash->{last_absent}) if ($val eq 'present');
} }
readingsBulkUpdate($dhash, 'timeout', $timeout);
readingsBulkUpdate($dhash, 'state', $val); readingsBulkUpdate($dhash, 'state', $val);
readingsBulkUpdate($dhash, 'presence', $val); readingsBulkUpdate($dhash, 'presence', $val);
@ -713,26 +701,31 @@ sub UpdateReadings {
readingsBulkUpdate($hash, 'state', "A: $S0A - B: $S0B") if (($S0A ne '') && ($S0B ne '')); readingsBulkUpdate($hash, 'state', "A: $S0A - B: $S0B") if (($S0A ne '') && ($S0B ne ''));
readingsEndUpdate($hash, 1); readingsEndUpdate($hash, 1);
#if ($hash->{DS2401}) {
if (exists($hash->{helper}{OW}{100})) { if (exists($hash->{helper}{OW}{100})) {
$hash->{DS2401} //= ''; $hash->{DS2401} //= '';
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
foreach my $dev ( keys %{$hash->{helper}{OW}{100}} ) { foreach my $dev ( keys %{$hash->{helper}{OW}{100}} ) {
my $state = (index($hash->{DS2401}, $dev) != -1) ? 'present' : ''; my $timeout = AttrNum($hash->{NAME}, 'DS2401_Timeout', ($hash->{INTERVAL} * 1.5));
my $state = (index($hash->{DS2401}, $dev) != -1) ? 'present' : '';
my $t = 0;
if (!$state) { if (!$state) {
my $t = (defined($hash->{helper}{OW}{100}{$dev}{time})) ? int(gettimeofday() - time_str2num($hash->{helper}{OW}{100}{$dev}{time})) : 9999; $t = (defined($hash->{helper}{OW}{100}{$dev}{time})) ? int(gettimeofday() - time_str2num($hash->{helper}{OW}{100}{$dev}{time})) : 0;
my $to = AttrNum($hash->{NAME}, 'DS2401_Timeout', ($hash->{INTERVAL} * 1.5));
ErrorLog($hash, "DS2401 timeout ($to) is smaller as your interval ($hash->{INTERVAL}) !") if ($to < $hash->{INTERVAL}); ErrorLog($hash, "DS2401 timeout ($timeout) is smaller as your interval ($hash->{INTERVAL}) !") if ($timeout < $hash->{INTERVAL});
$state = ($t > $to) ? 'absent' : 'timeout'; $state = ($t > $timeout) ? 'absent' : 'timeout';
if ($state eq 'absent') {
$hash->{helper}{OW}{100}{$dev}{busid} = -1;
$t = 0;
}
} }
$hash->{helper}{OW}{100}{$dev}{presence} = $state; $hash->{helper}{OW}{100}{$dev}{presence} = $state;
readingsBulkUpdate($hash, $hash->{helper}{OW}{100}{$dev}{name}, $hash->{helper}{OW}{100}{$dev}{presence}); readingsBulkUpdate($hash, $hash->{helper}{OW}{100}{$dev}{name}, $state);
$hash->{helper}{OW}{100}{$dev}{busid} //= -1; $hash->{helper}{OW}{100}{$dev}{busid} //= -1;
push @arr, "OW,$dev,DS2401,$hash->{helper}{OW}{100}{$dev}{presence},$hash->{helper}{OW}{100}{$dev}{busid}"; push @arr, "OW,$dev,DS2401,$state,$hash->{helper}{OW}{100}{$dev}{busid},$t";
} }
readingsBulkUpdate($hash, '.ds2401', OW_uniq($hash->{NAME}, '.ds2401', $hash->{DS2401})) if ($hash->{DS2401}); readingsBulkUpdate($hash, '.ds2401', OW_uniq($hash->{NAME}, '.ds2401', $hash->{DS2401})) if ($hash->{DS2401});
@ -824,6 +817,7 @@ sub OW_uniq {
return join(',', @arr); return join(',', @arr);
} }
#####################################
sub IsValidHex { sub IsValidHex {
@ -851,6 +845,30 @@ sub ErrorLog {
return readingsSingleUpdate($hash, 'error', $txt, 1); return readingsSingleUpdate($hash, 'error', $txt, 1);
} }
#####################################
sub crc8 {
my $data = shift // return 0;
return 0 if (!IsValidHex($data, 16));
my $owid = substr($data,0,14);
my $owcrc = substr($data,14,2);
my $crc = 0;
for my $i (0,2,4,6,8,10,12) { # die ersten 7 Byte
my $byte = substr($owid, $i , 2);
for (my $bit=1; $bit<256; $bit=$bit*2) {
my $cbit = ((hex($byte) & $bit) == $bit) ? 1 : 0;
$crc= (($crc & 1) != $cbit) ? ($crc >> 1)^0x8c : $crc >> 1;
}
}
return 1 if ($crc == hex($owcrc));
return 0;
}
#####################################
1; 1;
@ -892,10 +910,14 @@ FHEM Forum : <a href='https://forum.fhem.de/index.php/topic,28447.0.html'>1Wire<
<a name="OW2S0SMSGUARDattr"></a> <a name="OW2S0SMSGUARDattr"></a>
<b>Attributes</b> <b>Attributes</b>
<ul>
<a name="DS2401_Timeout"></a><li>DS2401_Timeout ( master only ) , default 1.5 x Interval<br>
</li>
</ul>
<ul> <ul>
<a name="mapOWIDs"></a><li>mapOWIDs ( master only )<br> <a name="mapOWIDs"></a><li>mapOWIDs ( master only )<br>
Comma separeted list of ID=Name pairs<br> Comma separeted list of ID=Name pairs<br>
Example : <code>10D64CBF02080077=Badezimmer, 01E5D9370B00005D=Kellerfenster</code></li> Example : <code>10D64CBF02080077=Badezimmer, 01E5D9370B00005D=Kellerfenster</code><br></li>
</ul> </ul>
<ul> <ul>
<a name="model"></a><li>model<br> <a name="model"></a><li>model<br>
@ -906,7 +928,7 @@ FHEM Forum : <a href='https://forum.fhem.de/index.php/topic,28447.0.html'>1Wire<
create for each found device on the bus a separate subdevice<br></li> create for each found device on the bus a separate subdevice<br></li>
</ul> </ul>
<ul> <ul>
<a name="delay"></a><li>delay ( master only ) , default 0.5 seconds to read OW device values </li><br> <a name="delay"></a><li>delay ( master only ) , default 0.5 seconds to read OW device values<br></li>
</ul> </ul>
=end html =end html
@ -945,11 +967,17 @@ FHEM Forum : <a href='https://forum.fhem.de/index.php/topic,28447.0.html'>1Wire<
<a name="OW2S0SMSGUARDattr"></a> <a name="OW2S0SMSGUARDattr"></a>
<b>Attribute</b> <b>Attribute</b>
<ul>
<a name="DS2401_Timeout"></a><li>DS2401_Timeout in Sekunden ( nur Master Device ) , default 1.5 x interval<br>
Werte kleiner als Interval sind nicht zulässig.<br>
Wartezeit in Sekunden bis ein fehlender DS2401 seinen Status von timeout auf absent wechselt.
</li>
</ul>
<ul> <ul>
<a name="mapOWIDs"></a><li>mapOWIDs<br> <a name="mapOWIDs"></a><li>mapOWIDs<br>
Kommata getrennte Liste von ID=Name Paaren<br> Kommata getrennte Liste von ID=Name Paaren<br>
Beispiel : <code>10D64CBF02080077=Badezimmer, 01E5D9370B00005D=Kellerfenster</code><br> Beispiel : <code>10D64CBF02080077=Badezimmer, 01E5D9370B00005D=Kellerfenster</code><br>
Statt der OW ID wird Name als Reading verwendet.( nur Master Device )</li> Statt der OW ID wird Name als Reading verwendet.( nur Master Device )<br></li>
</ul> </ul>
<ul> <ul>
<a name="model"></a><li>model<br> <a name="model"></a><li>model<br>
@ -961,7 +989,7 @@ FHEM Forum : <a href='https://forum.fhem.de/index.php/topic,28447.0.html'>1Wire<
</ul> </ul>
<ul> <ul>
<a name="delay"></a><li>delay ( nur Master Device ) , default 0.5 Sekukunden<br> <a name="delay"></a><li>delay ( nur Master Device ) , default 0.5 Sekukunden<br>
Wartezeit in Sekunden zwischen dem Auslesen der Temperaturwerte wenn mehr als ein DS18XX am OW Bus angeschlosen ist</li><br> Wartezeit in Sekunden zwischen dem Auslesen der Temperaturwerte wenn mehr als ein DS18XX am OW Bus angeschlosen ist<br></li>
</ul> </ul>
=end html_DE =end html_DE