From 82c0aceb2b88a15a16e0aa94c8ca792c5a49716f Mon Sep 17 00:00:00 2001 From: ntruchsess <> Date: Fri, 24 Oct 2014 06:12:17 +0000 Subject: [PATCH] MYSENSORS: fix perl-warning on unparsable data, add attribute 'last-sensorid' git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@6803 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/00_MYSENSORS.pm | 64 +++++++++++++++------------- FHEM/lib/Device/MySensors/Message.pm | 18 ++++---- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/FHEM/00_MYSENSORS.pm b/FHEM/00_MYSENSORS.pm index bedf87885..adb048345 100644 --- a/FHEM/00_MYSENSORS.pm +++ b/FHEM/00_MYSENSORS.pm @@ -59,6 +59,7 @@ sub MYSENSORS_Initialize($) { "autocreate:1 ". "requestAck:1 ". "first-sensorid ". + "last-sensorid ". "stateFormat"; } @@ -235,36 +236,39 @@ sub Read { my $txt; ($txt,$data) = split("\n", $data, 2); $txt =~ s/\r//; - my $msg = parseMsg($txt); - Log3 ($name,5,"MYSENSORS Read: ".dumpMsg($msg)); + if (my $msg = parseMsg($txt)) { + Log3 ($name,5,"MYSENSORS Read: ".dumpMsg($msg)); - if ($msg->{ack}) { - delete $hash->{messages}->{$txt}; - $hash->{outstandingAck} = keys %{$hash->{messages}}; - } + if ($msg->{ack}) { + delete $hash->{messages}->{$txt}; + $hash->{outstandingAck} = keys %{$hash->{messages}}; + } - my $type = $msg->{cmd}; - MESSAGE_TYPE: { - $type == C_PRESENTATION and do { - onPresentationMsg($hash,$msg); - last; - }; - $type == C_SET and do { - onSetMsg($hash,$msg); - last; - }; - $type == C_REQ and do { - onRequestMsg($hash,$msg); - last; - }; - $type == C_INTERNAL and do { - onInternalMsg($hash,$msg); - last; - }; - $type == C_STREAM and do { - onStreamMsg($hash,$msg); - last; - }; + my $type = $msg->{cmd}; + MESSAGE_TYPE: { + $type == C_PRESENTATION and do { + onPresentationMsg($hash,$msg); + last; + }; + $type == C_SET and do { + onSetMsg($hash,$msg); + last; + }; + $type == C_REQ and do { + onRequestMsg($hash,$msg); + last; + }; + $type == C_INTERNAL and do { + onInternalMsg($hash,$msg); + last; + }; + $type == C_STREAM and do { + onStreamMsg($hash,$msg); + last; + }; + } + } else { + Log3 ($name,5,"MYSENSORS Read: ".$txt."is no parsable mysensors message"); } } $hash->{PARTIAL} = $data; @@ -338,13 +342,13 @@ sub onInternalMsg($$) { }; $type == I_ID_REQUEST and do { if ($hash->{'inclusion-mode'}) { - my %nodes = map {$_ => 1} (AttrVal($hash->{NAME},"first-sensorid",20) ... 254); + my %nodes = map {$_ => 1} (AttrVal($hash->{NAME},"first-sensorid",20) ... AttrVal($hash->{NAME},"last-sensorid",254)); GP_ForallClients($hash,sub { my $client = shift; delete $nodes{$client->{radioId}}; }); if (keys %nodes) { - my $newid = (keys %nodes)[0]; + my $newid = (sort keys %nodes)[0]; sendMessage($hash,radioId => 255, childId => 255, cmd => C_INTERNAL, ack => 0, subType => I_ID_RESPONSE, payload => $newid); Log3($hash->{NAME},4,"MYSENSORS $hash->{NAME} assigned new nodeid $newid"); } else { diff --git a/FHEM/lib/Device/MySensors/Message.pm b/FHEM/lib/Device/MySensors/Message.pm index f81eb04fa..fe3168f19 100644 --- a/FHEM/lib/Device/MySensors/Message.pm +++ b/FHEM/lib/Device/MySensors/Message.pm @@ -12,14 +12,16 @@ use warnings; sub parseMsg($) { my $txt = shift; - my @fields = split(/;/,$txt); - my $msgRef = { radioId => $fields[0], - childId => $fields[1], - cmd => $fields[2], - ack => $fields[3], - subType => $fields[4], - payload => $fields[5] }; - return $msgRef; + if ($txt =~ /^(\d+);(\d+);(\d+);(\d+);(\d+);(.*)$/) { + return { radioId => $1, + childId => $2, + cmd => $3, + ack => $4, + subType => $5, + payload => $6 }; + } else { + return undef; + }; } sub createMsg(%) {