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;