From 19567d607035376c3b55e192033051138c4988ae Mon Sep 17 00:00:00 2001
From: rudolfkoenig <>
Date: Mon, 7 Sep 2015 18:56:00 +0000
Subject: [PATCH] 00_FBAHA: Compare the id with the stored FBNAME (Forum
#40396)
git-svn-id: https://svn.fhem.de/fhem/trunk@9212 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/FHEM/00_FBAHA.pm | 81 ++++++++++++++++++++++++++++++++++++++----
fhem/FHEM/10_FBDECT.pm | 18 +++++++---
fhem/FHEM/HttpUtils.pm | 4 ++-
3 files changed, 91 insertions(+), 12 deletions(-)
diff --git a/fhem/FHEM/00_FBAHA.pm b/fhem/FHEM/00_FBAHA.pm
index 3b8c23738..db762abaa 100644
--- a/fhem/FHEM/00_FBAHA.pm
+++ b/fhem/FHEM/00_FBAHA.pm
@@ -28,6 +28,7 @@ FBAHA_Initialize($)
$hash->{UndefFn} = "FBAHA_Undef";
$hash->{ShutdownFn} = "FBAHA_Undef";
$hash->{ReadAnswerFn} = "FBAHA_ReadAnswer";
+ $hash->{NotifyFn} = "FBAHA_Notify";
# Normal devices
$hash->{DefFn} = "FBAHA_Define";
@@ -62,6 +63,17 @@ FBAHA_Define($$)
return $ret;
}
+#####################################
+sub
+FBAHA_Notify($$)
+{
+ my ($ntfy, $dev) = @_;
+ return if($dev->{NAME} ne "global" ||
+ !grep(m/^INITIALIZED$/, @{$dev->{CHANGED}}));
+ delete $modules{telnet}{NotifyFn};
+ FBAHA_reassign($ntfy);
+ return;
+}
#####################################
sub
@@ -162,6 +174,7 @@ FBAHA_getDevList($$)
my $data = "";
for(;;) {
my ($err, $buf) = FBAHA_ReadAnswer($hash, "CONFIG_RSP", "^06");
+ last if($err && $err =~ m/Timeout/);
return ($err) if($err);
$data .= substr($buf, 32);
last if($buf =~ m/^060[23]/);
@@ -213,6 +226,45 @@ FBAHA_configInd($$)
return @answer;
}
+#####################################
+# Check all FBDECTs, reorg them if the id has changed and FBNAME is set.
+sub
+FBAHA_reassign($)
+{
+ my ($me) = @_;
+ my $myname = $me->{NAME};
+
+ my $devList = FBAHA_Get($me, ($myname, "devList"));
+ my %fbdata;
+ foreach my $l (split("\n", $devList)) {
+ next if($l !~ m/NAME:(.*), ID:(.*), (.*), TYPE:(.*) PROP:(.*)/);
+ if($fbdata{$1}) {
+ Log 1, "FBAHA: multiple devices are using the same name, wont reorder";
+ return;
+ }
+ $fbdata{$1} = $2;
+ }
+
+ foreach my $sdev (devspec2array("TYPE=FBDECT")) {
+ my $hash = $defs{$sdev};
+ my $name = $hash->{NAME};
+ my $fbname = ReadingsVal($name, "FBNAME", "");
+ my $fbid = $fbdata{$fbname};
+ my $oldid = $hash->{id};
+
+ next if(!$fbid || $oldid eq $fbid || $hash->{IODev}{NAME} ne $myname);
+ Log 2, "FBAHA: changing the id of $name/$fbname from $oldid to $fbid";
+
+ delete $modules{FBDECT}{defptr}{"$myname:$oldid"};
+ $modules{FBDECT}{defptr}{"$myname:$fbid"} = $hash;
+ $hash->{DEF} =~ s/^$myname:$oldid /$myname:$fbid /; # New syntax
+ $hash->{DEF} =~ s/^$oldid /$myname:$fbid /; # Old Syntax
+ $hash->{id} = $fbid;
+ }
+
+ return;
+}
+
#####################################
sub
FBAHA_DoInit($)
@@ -221,6 +273,7 @@ FBAHA_DoInit($)
my $name = $hash->{NAME};
delete $hash->{HANDLE}; # else reregister fails / RELEASE is deadly
my $ret = FBAHA_Set($hash, ($name, "reregister"));
+ FBAHA_reassign($hash) if(!$ret && $init_done);
return $ret;
}
@@ -314,8 +367,8 @@ FBAHA_ReadAnswer($$$)
if($nfound <= 0) {
next if ($! == EAGAIN() || $! == EINTR());
my $err = ($! ? $! : "Timeout");
- $hash->{TIMEOUT} = 1;
- DevIo_Disconnected($hash);
+ #$hash->{TIMEOUT} = 1;
+ #DevIo_Disconnected($hash);
return("FBAHA_ReadAnswer $arg: $err", undef);
}
my $buf = DevIo_SimpleRead($hash);
@@ -361,8 +414,8 @@ FBAHA_Ready($)
(fritz.box or localhost), and <port> 2002, or
UNIX:SEQPACKET:/var/tmp/me_avm_home_external.ctl, the latter only works on
the fritz.box. With FRITZ!OS 5.50 the network port is available, on some
- Labor variants only the UNIX socket is available.
-
+ Labor variants only the UNIX socket is available.
+
Example:
define fb1 FBAHA fritz.box:2002
define fb1 FBAHA fritz.box:2002