From 0e0087260323f0cdcf4f7581f97cc9f70f1dc7fa Mon Sep 17 00:00:00 2001 From: borisneubert <> Date: Sat, 23 Nov 2013 20:31:46 +0000 Subject: [PATCH] improvements for OWServer: - autocreate improvements for OWDevice: - internal timer remove from define to avoid multiple timers in case of modify - first call of OWDevice_UpdateValues occurs after global:INITIALIZED to assure polls is set git-svn-id: https://svn.fhem.de/fhem/trunk@4279 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/10_OWServer.pm | 61 ++++++++++++++++++---------------------- fhem/FHEM/11_OWDevice.pm | 30 +++++++++++++++++++- 3 files changed, 58 insertions(+), 34 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index b5ceb9f56..68d041e06 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,6 +1,7 @@ # 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. - SVN + - change: improvements for OWDevice and OWServer (justme1968) - feature: new attribute resolution for 1-wire temperature readings (justme1968 & Boris) - feature: new layout commands moveto, moveby and relative positioning diff --git a/fhem/FHEM/10_OWServer.pm b/fhem/FHEM/10_OWServer.pm index 2b1eb1e52..8c337080c 100644 --- a/fhem/FHEM/10_OWServer.pm +++ b/fhem/FHEM/10_OWServer.pm @@ -129,12 +129,14 @@ OWServer_Define($$) } my $protocol = $a[2]; - - OWServer_CloseDev($hash); $hash->{fhem}{protocol}= $protocol; - OWServer_OpenDev($hash); + if( $init_done ) { + delete $modules{OWServer}{NotifyFn}; + OWServer_OpenDev($hash); + } + return undef; } @@ -209,7 +211,10 @@ OWServer_Notify($$) delete $modules{OWServer}{NotifyFn}; delete $hash->{NTFY_ORDER} if($hash->{NTFY_ORDER}); - OWServer_DoInit($hash); + foreach my $d (keys %defs) { + next if($defs{$d}{TYPE} ne "OWServer"); + OWServer_OpenDev($hash); + } return undef; } @@ -228,7 +233,7 @@ OWServer_DoInit($) readingsEndUpdate($hash,1); } readingsSingleUpdate($hash, "state", "Initialized", 1); - OWServer_Autocreate($hash) if($init_done); + OWServer_Autocreate($hash); return undef; } @@ -346,17 +351,17 @@ OWServer_Autocreate($) next if($defs{$d}{TYPE} ne "autocreate"); return undef if(AttrVal($defs{$d}{NAME},"disable",undef)); } - + my $owserver= $hash->{fhem}{owserver}; my @dir= split(",", $owserver->dir("/")); my @devices= grep { m/^\/[0-9a-f]{2}.[0-9a-f]{12}$/i } @dir; - my @defined = (); + my %defined = (); foreach my $d (keys %defs) { next if($defs{$d}{TYPE} ne "OWDevice"); if(defined($defs{$d}{fhem}) && defined($defs{$d}{fhem}{address})) { - push(@defined,$defs{$d}{fhem}{address}); + $defined{$defs{$d}{fhem}{address}} = $d; } } @@ -372,31 +377,21 @@ OWServer_Autocreate($) if($owtype !~ m/$type/) { Log3 $name, 2, "$name: Autocreate: type '$type' not defined in familycode '$family'. Please report this!"; next; + } elsif( defined($defined{$address}) ) { + Log3 $name, 5, "$name address '$address' already defined as '$defined{$address}'"; + next; } else { - foreach my $d (keys %defs) { - next if($defs{$d}{TYPE} ne "OWDevice"); - if(defined($defs{$d}{fhem}) && - defined($defs{$d}{fhem}{address}) && $defs{$d}{fhem}{address} eq $address) { - Log3 $name, 5, "$name address '$address' already defined as '$defs{$d}{NAME}'"; - next; - } else { - my $id= substr($address,3); - my $devname= $type . "_" . $id; - if(defined($defs{$devname}) || grep {$_ eq $address} @defined) { - next; - } else { - Log3 $name, 5, "$name create new device '$devname' for address '$address'"; - my $interval= ($family eq "81") ? "" : " 60"; - my $define= "$devname OWDevice $address" . $interval; - my $cmdret; - $cmdret= CommandDefine(undef,$define); - if($cmdret) { - Log3 $name, 1, "$name: Autocreate: An error occurred while creating device for address '$address': $cmdret"; - } else { - $cmdret= CommandAttr(undef,"$devname room OWDevice"); - } - } - } + my $id= substr($address,3); + my $devname= $type . "_" . $id; + Log3 $name, 5, "$name create new device '$devname' for address '$address'"; + my $interval= ($family eq "81") ? "" : " 60"; + my $define= "$devname OWDevice $address" . $interval; + my $cmdret; + $cmdret= CommandDefine(undef,$define); + if($cmdret) { + Log3 $name, 1, "$name: Autocreate: An error occurred while creating device for address '$address': $cmdret"; + } else { + $cmdret= CommandAttr(undef,"$devname room OWDevice"); } } } @@ -530,7 +525,7 @@ OWServer_Set($@) to the owserver configuration file on the remote host.

- + diff --git a/fhem/FHEM/11_OWDevice.pm b/fhem/FHEM/11_OWDevice.pm index a5cf303e5..0023486c7 100644 --- a/fhem/FHEM/11_OWDevice.pm +++ b/fhem/FHEM/11_OWDevice.pm @@ -349,6 +349,7 @@ OWDevice_Initialize($) $hash->{GetFn} = "OWDevice_Get"; $hash->{SetFn} = "OWDevice_Set"; $hash->{DefFn} = "OWDevice_Define"; + $hash->{NotifyFn} = "OWDevice_Notify"; $hash->{UndefFn} = "OWDevice_Undef"; $hash->{AttrFn} = "OWDevice_Attr"; @@ -505,6 +506,7 @@ OWDevice_UpdateValues($) { readingsBulkUpdate($hash,"state",$state,0); readingsEndUpdate($hash,1); } + RemoveInternalTimer($hash); InternalTimer(int(gettimeofday())+$hash->{fhem}{interval}, "OWDevice_UpdateValues", $hash, 0) if(defined($hash->{fhem}{interval})); @@ -664,10 +666,36 @@ OWDevice_Define($$) readingsBulkUpdate($hash,"location",$location); readingsEndUpdate($hash,1); } - OWDevice_UpdateValues($hash) if(defined($hash->{fhem}{interval})); + + if( $init_done ) { + delete $modules{OWDevice}{NotifyFn}; + OWDevice_UpdateValues($hash) if(defined($hash->{fhem}{interval})); + } return undef; } + +sub +OWDevice_Notify($$) +{ + my ($hash,$dev) = @_; + my $name = $hash->{NAME}; + my $type = $hash->{TYPE}; + + return if($dev->{NAME} ne "global" || + !grep(m/^INITIALIZED$/, @{$dev->{CHANGED}})); + + return if($attr{$name} && $attr{$name}{disable}); + + delete $modules{OWDevice}{NotifyFn}; + + foreach my $d (keys %defs) { + next if($defs{$d}{TYPE} ne "OWDevice"); + OWDevice_UpdateValues($defs{$d}) if(defined($defs{$d}->{fhem}{interval})); + } + + return undef; +} ################################### 1;