From 95bcff4dc6b89d5d9b135bdd0093891b732a2b66 Mon Sep 17 00:00:00 2001 From: Adimarantis <> Date: Wed, 3 Nov 2021 13:55:55 +0000 Subject: [PATCH] 58_RPI_1Wire: Improved behaviour when changing pollingInterval git-svn-id: https://svn.fhem.de/fhem/trunk@25174 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/58_RPI_1Wire.pm | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index daac19284..1f3f7c82b 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - bugfix: 58_RPI_1Wire: Improved behaviour when changing pollingInterval - change: 93_RFHEM: Moved to deprecated (use FHEM2FHEM) - bugfix: 93_DbRep: fix SQL statement if devspec can't be resolved, Forum:#/topic,53584.msg1184155.html#msg1184155 diff --git a/fhem/FHEM/58_RPI_1Wire.pm b/fhem/FHEM/58_RPI_1Wire.pm index fc1ea0f5f..5f65ec83b 100755 --- a/fhem/FHEM/58_RPI_1Wire.pm +++ b/fhem/FHEM/58_RPI_1Wire.pm @@ -12,7 +12,6 @@ use warnings; #use Data::Dumper; use Time::HiRes qw ( gettimeofday tv_interval ); use Scalar::Util qw(looks_like_number); -#use vars qw{%attr %defs}; eval "use RPi::DHT;1" or my $DHT_missing = "yes"; sub RPI_1Wire_Initialize { @@ -56,18 +55,20 @@ my %RPI_1Wire_Devices = ); sub RPI_1Wire_Notify { - my ($own_hash, $dev_hash) = @_; - my $ownName = $own_hash->{NAME}; # own name / hash + my ($hash, $dev_hash) = @_; + my $ownName = $hash->{NAME}; # own name / hash return "" if(IsDisabled($ownName)); # Return without any further action if the module is disabled my $devName = $dev_hash->{NAME}; # Device that created the events -# Log3 $ownName, 1, $ownName." Notify from $devName"; my $events = deviceEvents($dev_hash,1); if ($devName eq "global" and grep(m/^INITIALIZED|REREADCFG$/, @{$events})) { - my $def=$own_hash->{DEF}; + my $def=$hash->{DEF}; $def="" if (!defined $def); #GetDevices is triggering the autocreate calls, but this is not yet working (autocreate not ready?) so delay this by 10 seconds - RPI_1Wire_Init($own_hash,$def,0); - InternalTimer(gettimeofday()+10, "RPI_1Wire_GetDevices", $own_hash, 0) if $own_hash->{DEF} =~ /BUSMASTER/; + RPI_1Wire_Init($hash,$def,0); + InternalTimer(gettimeofday()+10, "RPI_1Wire_GetDevices", $hash, 0) if $hash->{DEF} =~ /BUSMASTER/; + } elsif ($devName eq "global" and grep(/^(DELETEATTR|ATTR).$ownName.pollingInterval/, @{$events})) { + #Restart timer with new pollingInterval + RPI_1Wire_DeviceUpdate($hash); } } @@ -147,11 +148,11 @@ sub RPI_1Wire_Init { # } else { if (!(-w "$w1_path/$arg/conv_time")) { delete($hash->{setList}{conv_time}); - $hash->{helper}{write}.="conv_time "; + $hash->{helper}{write}.="conv_time " if (-e "$w1_path/$arg/conv_time"); } if (!(-w "$w1_path/$arg/resolution")) { delete($hash->{setList}{precision}); - $hash->{helper}{write}.="resolution "; + $hash->{helper}{write}.="resolution " if (-e "$w1_path/$arg/resolution") ; } } #remove set commands that make no sense @@ -222,7 +223,6 @@ sub RPI_1Wire_DeviceUpdate { return RPI_1Wire_Init($hash,$hash->{DEF},0); } my $pollingInterval = AttrVal($name,"pollingInterval",60); - return if $pollingInterval<1; Log3 $name, 4 , $name.": DeviceUpdate($hash->{NAME}), pollingInterval:$pollingInterval"; my $mode=AttrVal($name,"mode","nonblocking"); @@ -246,14 +246,14 @@ sub RPI_1Wire_DeviceUpdate { #RPI_1Wire_FinishFn($ret); First result can be ignored RemoveInternalTimer($hash); #Table of reasonable conv_times? - InternalTimer(gettimeofday()+1.5, "RPI_1Wire_FromTimer", $hash, 0); + InternalTimer(gettimeofday()+1.5, "RPI_1Wire_FromTimer", $hash, 0) if $pollingInterval>0; return; } elsif ($mode eq "bulk_read") { $hash->{helper}{RUNNING_PID} = BlockingCall("RPI_1Wire_TriggerBulk", $hash,undef); Log3 $hash->{NAME}, 3, $hash->{NAME}.": Triggered bulk read"; } RemoveInternalTimer($hash); - InternalTimer(gettimeofday()+$pollingInterval, "RPI_1Wire_DeviceUpdate", $hash, 0); + InternalTimer(gettimeofday()+$pollingInterval, "RPI_1Wire_DeviceUpdate", $hash, 0) if $pollingInterval>0; return; } @@ -274,7 +274,7 @@ sub RPI_1Wire_FromTimer { RPI_1Wire_FinishFn($ret); RemoveInternalTimer($hash); my $pollingInterval = AttrVal($name,"pollingInterval",60); - InternalTimer(gettimeofday()+$pollingInterval, "RPI_1Wire_DeviceUpdate", $hash, 0); + InternalTimer(gettimeofday()+$pollingInterval, "RPI_1Wire_DeviceUpdate", $hash, 0) if $pollingInterval>0; } sub RPI_1Wire_SetPrecision { @@ -617,8 +617,7 @@ sub RPI_1Wire_Attr { # if (!looks_like_number($val) || $val < 0) { return "pollingInterval has to be a positive number or zero"; } - #Restart Timer - RPI_1Wire_DeviceUpdate($hash); + #RPI_1Wire_DeviceUpdate($hash); moved to NOTIFY, after the change has been done } elsif ($attr eq "mode") { if ($val ne "blocking" && $val ne "nonblocking" && $val ne "timer") { return "Unknown mode $val"; @@ -749,6 +748,7 @@ For German documentation see Wiki<
  • pollingInterval
    Defines how often the device is updated in seconds.
    + Setting the pollingInterval to 0 disables the automatic updates.
    Default: 60, valid values: integers
  • tempOffset