From 1c1c6d9a7bcddeff1b73ac80014e5a091d30f9d5 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Sun, 1 Oct 2017 13:18:29 +0200 Subject: [PATCH] fix error handling --- 74_XiaomiFlowerSens.pm | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/74_XiaomiFlowerSens.pm b/74_XiaomiFlowerSens.pm index 386f878..daa8734 100644 --- a/74_XiaomiFlowerSens.pm +++ b/74_XiaomiFlowerSens.pm @@ -30,6 +30,7 @@ #$cmd = "qx(gatttool -i $hci -b $mac --char-write-req -a 0x33 -n A01F"; #$cmd = "qx(gatttool -i $hci -b $mac --char-read -a 0x35"; # Sensor Daten #$cmd = "qx(gatttool -i $hci -b $mac --char-read -a 0x38"; # Firmware und Batterie +# e8 00 00 58 0f 00 00 34 f1 02 02 3c 00 fb 34 9b @@ -46,7 +47,7 @@ use JSON; use Blocking; -my $version = "1.1.47"; +my $version = "1.1.50"; my %readings = (); my %CallBatteryFirmwareAge = ( '8h' => 28800, '16h' => 57600, @@ -392,12 +393,12 @@ sub XiaomiFlowerSens_ExecGatttool_Run($) { Log3 $name, 4, "XiaomiFlowerSens ($name) - ExecGatttool_Run: gatttool result ".join(",", @gtResult); - $gtResult[1] = 'none response data' + $gtResult[1] = 'no data response' unless( defined($gtResult[1]) ); my $json_notification = XiaomiFlowerSens_encodeJSON($gtResult[1]); - if($gtResult[0] ne 'connect error') { + if($gtResult[1] =~ /^([0-9a-f]{2}(\s?))*$/) { return "$name|$mac|ok|$gattCmd|$handle|$json_notification"; } else { return "$name|$mac|error|$gattCmd|$handle|$json_notification"; @@ -427,14 +428,16 @@ sub XiaomiFlowerSens_ExecGatttool_Done($) { Log3 $name, 5, "XiaomiFlowerSens ($name) - ExecGatttool_Done: JSON error while request: $@"; } - XiaomiFlowerSens_ProcessingNotification($hash,$handle,$decode_json->{gtResult}) - if( $respstate eq 'ok' and $gattCmd eq 'read' and $decode_json->{gtResult} ne 'none response data' ); - XiaomiFlowerSens_ProcessingErrors($hash,$decode_json->{gtResult}) - if( ($respstate eq 'error') or ($respstate eq 'ok' and $decode_json->{gtResult} eq 'none response data' and $gattCmd eq 'read') ); - - XiaomiFlowerSens_CallSensData($hash) - unless( $gattCmd eq 'read' ); + if( $respstate eq 'ok' ) { + XiaomiFlowerSens_ProcessingNotification($hash,$handle,$decode_json->{gtResult}); + + } elsif( $respstate eq 'error' and $gattCmd ne 'write' ) { + XiaomiFlowerSens_ProcessingErrors($hash,$decode_json->{gtResult}); + + } elsif( $gattCmd eq 'write' ) { + XiaomiFlowerSens_CallSensData($hash); + } } sub XiaomiFlowerSens_ExecGatttool_Aborted($) { @@ -444,8 +447,11 @@ sub XiaomiFlowerSens_ExecGatttool_Aborted($) { delete($hash->{helper}{RUNNING_PID}); readingsSingleUpdate($hash,"state","unreachable", 1); + + $readings{'lastGattError'} = 'The BlockingCall Process terminated unexpectedly. Timedout'; + XiaomiFlowerSens_WriteReadings($hash); - Log3 $name, 3, "XiaomiFlowerSens ($name) - ExecGatttool_Aborted: The BlockingCall Process terminated unexpectedly. Timedout"; + Log3 $name, 4, "XiaomiFlowerSens ($name) - ExecGatttool_Aborted: The BlockingCall Process terminated unexpectedly. Timedout"; } sub XiaomiFlowerSens_ProcessingNotification($@) { @@ -539,10 +545,9 @@ sub XiaomiFlowerSens_WriteReadings($) { readingsBeginUpdate($hash); while( my ($r,$v) = each %readings ) { - readingsBulkUpdateIfChanged($hash,$r,$v); + readingsBulkUpdate($hash,$r,$v); } - #readingsBulkUpdateIfChanged($hash, "state", "active"); readingsBulkUpdateIfChanged($hash, "state", ($readings{'lastGattError'}?'unreachable':'active')); readingsEndUpdate($hash,1);