diff --git a/FHEM/71_XiaomiSmartHome.pm b/FHEM/71_XiaomiSmartHome.pm index bfac9a6..d6e96b1 100644 --- a/FHEM/71_XiaomiSmartHome.pm +++ b/FHEM/71_XiaomiSmartHome.pm @@ -52,7 +52,7 @@ sub XiaomiSmartHome_Notify($$); sub XiaomiSmartHome_updateSingleReading($$); my $iv="\x17\x99\x6d\x09\x3d\x28\xdd\xb3\xba\x69\x5a\x2e\x6f\x58\x56\x2e"; -my $version = "1.20"; +my $version = "1.21"; my %XiaomiSmartHome_gets = ( "getDevices" => ["get_id_list", '^.+get_id_list_ack' ], @@ -146,8 +146,16 @@ sub XiaomiSmartHome_Read($) { Log3 $name, 5, "$name: Read> " . $buf; my $rsid = $decoded->{'sid'}; if ($decoded->{'cmd'} eq 'read_ack' || $decoded->{'cmd'} eq 'report' && $decoded->{'model'} ne 'gateway'|| $decoded->{'cmd'} eq 'heartbeat' && $decoded->{'model'} ne 'gateway' || $decoded->{'cmd'} eq 'write_ack' && $decoded->{'model'} ne 'gateway') { - Log3 $name, 5, "$name: Read> Dispatch " . $buf; - Dispatch($hash, $buf, undef); + if ( $modules{XiaomiSmartHome_Device}{defptr}{$rsid}->{SID} = $rsid ){ + Log3 $name, 5, "$name: Read> Dispatch " . $buf; + my $devhash = $modules{XiaomiSmartHome_Device}{defptr}{$rsid}->{IODev}; + Dispatch($devhash, $buf, undef); + } + else { + Log3 $name, 5, "$name: Read> Dispatch " . $buf; + Dispatch($hash, $buf, undef); + + } } elsif ( $modules{XiaomiSmartHome}{defptr}{$rsid}->{SID} ne $hash->{SID} ){ $self = $modules{XiaomiSmartHome}{defptr}{$rsid}; @@ -244,11 +252,14 @@ sub XiaomiSmartHome_Reading ($@) { Log3 $name, 1, "$name: Reading> Error while request: $@"; return; } + my $all_sensors = ""; foreach my $sensor (@sensors) { Log3 $name, 4, "$name: Reading> PushRead:" . $sensor; XiaomiSmartHome_Write($hash, 'read', $sensor ); + $all_sensors = $all_sensors . $sensor . ","; } + $hash->{helper}{sensors} = $all_sensors; return; } } diff --git a/FHEM/71_XiaomiSmartHome_Device.pm b/FHEM/71_XiaomiSmartHome_Device.pm index 3b19e56..7dd1cc9 100644 --- a/FHEM/71_XiaomiSmartHome_Device.pm +++ b/FHEM/71_XiaomiSmartHome_Device.pm @@ -27,7 +27,7 @@ use warnings; -my $version = "1.20"; +my $version = "1.21"; sub XiaomiSmartHome_Device_updateSReading($); @@ -44,13 +44,12 @@ sub XiaomiSmartHome_Device_Initialize($) $hash->{UndefFn} = "XiaomiSmartHome_Device_Undef"; $hash->{ParseFn} = "XiaomiSmartHome_Device_Parse"; - $hash->{AttrList} = "IODev follow-on-for-timer:1,0 follow-on-timer ". + $hash->{AttrList} = "follow-on-for-timer:1,0 follow-on-timer ". "do_not_notify:1,0 ignore:1,0 dummy:1,0 showtime:1,0 valueFn:textField-long ". - - "rnd_tmp:1,2,3 ". - "rnd_hum:1,2,3 ". - "rnd_bat:1,2,3 ". - + "rnd_tmp:0,1,2,3 ". + "rnd_hum:0,1,2,3 ". + "rnd_bat:0,1,2,3 ". + "rnd_pres:0,1,2,3 ". $readingFnAttributes ; } ##################################### @@ -202,6 +201,7 @@ sub XiaomiSmartHome_Device_Read($$$){ my $XMIround_tmp = AttrVal( $hash->{NAME}, "rnd_tmp", "2" ); my $XMIround_hum = AttrVal( $hash->{NAME}, "rnd_hum", "2" ); my $XMIround_bat = AttrVal( $hash->{NAME}, "rnd_bat", "1" ); + my $XMIround_pres = AttrVal( $hash->{NAME}, "rnd_pres", "2" ); my $decoded = eval{decode_json($msg)}; if ($@) { @@ -247,7 +247,7 @@ sub XiaomiSmartHome_Device_Read($$$){ readingsBulkUpdate($hash, "battery", "ok", 1 ) } $bat = XiaomiSmartHome_round($bat, $XMIround_bat, $name ); - readingsBulkUpdate($hash, "battery_level", $bat, 1 ); + readingsBulkUpdate($hash, "batteryLevel", $bat, 1 ); } if (defined $data->{temperature}){ if ($data->{temperature} ne "10000"){ @@ -271,7 +271,8 @@ sub XiaomiSmartHome_Device_Read($$$){ if ($data->{pressure} ne "0"){ my $pres = $data->{pressure}; $pres =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1./g; - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Pressure: " . $pres; + $pres = XiaomiSmartHome_round($pres, $XMIround_pres, $name ); + Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Pressure: " . $pres . " Round: " . $XMIround_pres; readingsBulkUpdate($hash, "pressure", "$pres", 1 ); } } @@ -418,7 +419,8 @@ sub XiaomiSmartHome_Device_update($){ # Update delete old reading voltage & batterystate CommandDeleteReading( undef, "$name voltage" ) if(defined(ReadingsVal($name,"voltage",undef))); CommandDeleteReading( undef, "$name batterystate" ) if(defined(ReadingsVal($name,"batterystate",undef))); - CommandDeleteReading( undef, "$name round" ) if(defined(ReadingsVal($name,"round",undef))); + CommandDeleteReading( undef, "$name round" ) if(defined(ReadingsVal($name,"round",undef))); + CommandDeleteReading( undef, "$name battery_level" ) if(defined(ReadingsVal($name,"battery_level",undef))); } ##################################### diff --git a/controls_mish.txt b/controls_mish.txt index a42d017..2973f81 100644 --- a/controls_mish.txt +++ b/controls_mish.txt @@ -1,2 +1,2 @@ -UPD 2017-12-15_09:45:00 37305 FHEM/71_XiaomiSmartHome.pm -UPD 2017-12-15_09:46:40 28101 FHEM/71_XiaomiSmartHome_Device.pm +UPD 2017-12-18_13:56:43 38751 FHEM/71_XiaomiSmartHome.pm +UPD 2017-12-18_10:00:55 29125 FHEM/71_XiaomiSmartHome_Device.pm