From 52ff120e11ad3fe4455a9dbb928c19cb850079a3 Mon Sep 17 00:00:00 2001 From: Torte Date: Fri, 15 Sep 2017 08:27:47 +0200 Subject: [PATCH 1/8] Add files via upload --- images/7.PNG | Bin 0 -> 21154 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/7.PNG diff --git a/images/7.PNG b/images/7.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d4a7314da16f9df82712587d72a39b309fb3df64 GIT binary patch literal 21154 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 PK@PN z`n$trzXHpCJZTY$VlkRmF=R3MOIYaFZPa)fBS?p;Ubza?OyLsWy?<}HgXWsn2H$7B z!;ss79CpWyrSxhEESTiyn|Bfk-O(}hui z&$~%vA#Cz?8uh=cs7~v$o>=y*H|MXz?Qr{}RPSQP zg|5~&+19kLm!)_6F7&?|GMzLAvDN*Beyiw8K24#wM29{?$8&unqGN9?coc_&+PC83>Op#2WCQxKf4igS zd1RfOim{ilSlex4SpDkzH5=z6RB``KWmc@;a0f^rP5-HBjb)mXu%kkEo%6_>&c<6W zEx`P1xz>)Td{isJo~*%4fa0(@uQ-BmIzA?waCJjRKyu?DR<5jG$a7|)_lT6bb#w6x z6$5(t5v9eljx3CuRAI4HXGVnzBAv~He16f8{>kO{nd4wJE^y)!z(t$W!{4yWUIbl3 zeP&tve}o1Nd4_QFODjgP0G2z%d>s@_s&K}W)VA<3;!LYMupJIqOW zLp=1sHM5p>jE#3}{Re@SP!Q9Ti?$S(-afh)Fn;UjgHH-yRV$G>lWO`ePCxbKj%x6+ zk;84{+2+-;t}Ds4Pp*I~ULS2)zrX*|&RhXj+MmZoZF&?&EYL+-m^3{kVN+7gDD0$_ zVl0RSz7^eaDjZ`EA-l9Jt{#o*q4P^A&y$A*5uDdT2OH^N!z~#=T5%e$3gK*y})O(P*-NYFV_)Du}ow? z7zh{Q!>-HvI_Cs&*||+tTul6>jh%LQ*4HNU#*6}!>m;mu$!Jnc0U;{!YWh5gmfRb> z@2Xum5Ur()hyQg>9myQ(TABjwR7Zi;Vw$^v1$02QLc3B$zN_7|NB-RmtSjttd|sUA zr{|M2Rn;7FID<=G78vYYtSV6Z4FzsrRdM(K*j0LwbZo#6FmhJC?3-JzUF&R25Ui@w?dx1xWg?Wp^+2>%GUbJ;7!*$|I z2Sg5%9o0czW_;8<|L~jTp2ftU;Yf5<0L5OLGxp>;&SZvGw(7WeiVkB?ZcZOPQv)y> z7bHW~uvc5{?g?NN0H|wo;KHF#9UUUoViLONP}bLfA#BlzXg|cU!S{Zf=nB^6R_EG> zbAvwx9OMrR{u|A@)x?$oBpgZ-Mpy-MY0D{Kl5{K%+UiZTA$%(mto!YAFZ?rz}7b$~r?jR#uU8dKr6hclZCn_pnZNj&Gd zdZXi!%{>xhbN>I*F;BnxH;%uBrT?D-fdBT!`~tw`@2|Hz?f&n{nR_}<;|6eI=0ZN- zAwjxn1rd`INTLRC`+QgQHEzG&Og7+hM1i^)%ApDAF521u#^KshCH|xp%iVbj9r
$5ha*39@1^W;CHN831 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 aXLI8*wOv{36mvi%u6uXy|BAa~_wrwCX(qt{ literal 0 HcmV?d00001 From 3e2dd99769d2e72aaac7395a6c4f739f01b50edb Mon Sep 17 00:00:00 2001 From: Torte Date: Wed, 4 Oct 2017 18:38:54 +0200 Subject: [PATCH 2/8] Update README.md --- README.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a4caeba..f2ff09e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,34 @@ # fhem-XiaomiSmartHome Gateway -With this module, the XiaomiGateway is bound to Fhem. The module listens for multicast messages from the gateway. Currently only for the sensortype Magnet, Motion, Temperature-Humidity, Switch, Cube, Curtain, Smoke and Gas. +With this module, the XiaomiGateway is bound to Fhem. The module listens for multicast messages from the gateway. Changing and switching the led of the gateway and changing ringtone and volume of the gateway is also possible * Please read the Wiki !! you need to install some Perl modules. * https://github.com/T0RST3N/fhem-XiaomiSmartHome/wiki + +# Supported Sensors +* magnet: Window/Door magnetic sensor +* motion: Human body motion sensor +* sensor_motion.aq2: Aqara Human body motion sensor with lux readings +* sensor_ht: Temperature and humidity sensor +* weather.v1: Aqara Temperature, pressure and humidity sensor +* switch: Wireless sensor switch +* plug & 86plug: Smart socket +* cube: Cube sensor +* 86sw1: Wireless switch single +* 86sw2: Wireless switch double +* ctrl_neutral1: Single bond ignition switch +* ctrl_neutral2: Double bond ignition switch +* rgbw_light: Smart lights (report only) +* curtain: Curtain (Control only if device has reporte curtain_level) +* smoke: smoke alarm detector +* * 0: disarm +* * 1: arlarm +* * 8: battery arlarm +* * 64: arlarm sensitivity +* * 32768: ICC communication failure +* gas: gas alarm detector +* * 0: disarm +* * 1: arlarm +* * 2: analog arlarm +* * 64: arlarm sensitivity +* * 32768: ICC communication failure From 3b5be4a8c5bf16de1320871716e250ed0904f4f3 Mon Sep 17 00:00:00 2001 From: Torte Date: Wed, 4 Oct 2017 18:45:05 +0200 Subject: [PATCH 3/8] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index f2ff09e..69020b9 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,6 @@ Changing and switching the led of the gateway and changing ringtone and volume o * * 2: analog arlarm * * 64: arlarm sensitivity * * 32768: ICC communication failure + +# A big ThankYOU to my Supporters +* StefanB from Coburg From ca97220d0950d76c5d6aff41ad830393713923fe Mon Sep 17 00:00:00 2001 From: Torte Date: Mon, 16 Oct 2017 07:21:43 +0200 Subject: [PATCH 4/8] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 69020b9..7ff4b8c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # fhem-XiaomiSmartHome Gateway -With this module, the XiaomiGateway is bound to Fhem. The module listens for multicast messages from the gateway. -Changing and switching the led of the gateway and changing ringtone and volume of the gateway is also possible +With this module, the Xiaomi Smarthome Gateway is bound to FHEM. The module listens for multicast messages from the gateway. +Changing and switching the LED from the gateway and changing ringtone and volume of the gateway is also possible * Please read the Wiki !! you need to install some Perl modules. * https://github.com/T0RST3N/fhem-XiaomiSmartHome/wiki @@ -33,5 +33,5 @@ Changing and switching the led of the gateway and changing ringtone and volume o * * 64: arlarm sensitivity * * 32768: ICC communication failure -# A big ThankYOU to my Supporters +# A BIG ThankYOU to my Supporters * StefanB from Coburg From a0f59fd96e9372219a36fa18243651e8fc3595b7 Mon Sep 17 00:00:00 2001 From: Torte Date: Tue, 24 Oct 2017 09:02:30 +0200 Subject: [PATCH 5/8] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7ff4b8c..36a6ef9 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Changing and switching the LED from the gateway and changing ringtone and volume * ctrl_neutral2: Double bond ignition switch * rgbw_light: Smart lights (report only) * curtain: Curtain (Control only if device has reporte curtain_level) +* wleak: Watersensor * smoke: smoke alarm detector * * 0: disarm * * 1: arlarm From 3f9b1bc7457501807d650a1fcd46b902727a66fc Mon Sep 17 00:00:00 2001 From: T0RST3N Date: Tue, 24 Oct 2017 09:25:31 +0200 Subject: [PATCH 6/8] New sensor wleak(water), learning sensors, some fixes and improvments NEW PERL MODULE MATH ROUND IS NECESSARY - added: new Wleak.aq1 Water sensor - added: learn, learning sensors with fhem - added: round, temperature and humidity can now be rounded - added: new reading batterystate (low or ok) - change: on verbose 3 only status messages will be logged - change: new sensors will inherit his room from gateway - fix: smoke and gas sensor copy and paste error --- FHEM/71_XiaomiSmartHome.pm | 25 +++++++++--- FHEM/71_XiaomiSmartHome_Device.pm | 65 +++++++++++++++++++------------ controls_mish.txt | 4 +- 3 files changed, 63 insertions(+), 31 deletions(-) diff --git a/FHEM/71_XiaomiSmartHome.pm b/FHEM/71_XiaomiSmartHome.pm index 213adbe..cb6fd0d 100644 --- a/FHEM/71_XiaomiSmartHome.pm +++ b/FHEM/71_XiaomiSmartHome.pm @@ -40,6 +40,8 @@ eval "use Crypt::CBC"; return "\nERROR: Please install Crypt::CBC" if($@); eval "use Net::Ping"; return "\nERROR: Please install Net::Ping" if($@); +eval "use Math::Round"; +return "\nERROR: Please install libmath-round-perl" if($@); use Color; use SetExtensions; @@ -49,7 +51,7 @@ use SetExtensions; 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.08"; +my $version = "1.12"; my %XiaomiSmartHome_gets = ( "getDevices" => ["get_id_list", '^.+get_id_list_ack' ], @@ -64,6 +66,7 @@ my %sets = ( "volume:slider,1,1,100" => 1, "ringtone:0,1,2,3,4,5,6,7,8,13,21,22,23,24,25,26,27,28,29,10000,10001" => 1, "ringvol" => 2, + "learn" => 0, ); @@ -102,7 +105,8 @@ sub XiaomiSmartHome_Initialize($) { "16:XiaomiSmartHome_Device" => "^.+natgas", "17:XiaomiSmartHome_Device" => "^.+smoke", "18:XiaomiSmartHome_Device" => "^.+weather.v1", - "19:XiaomiSmartHome_Device" => "^.+sensor_motion.aq2"}; + "19:XiaomiSmartHome_Device" => "^.+sensor_motion.aq2", + "20:XiaomiSmartHome_Device" => "^.+sensor_wleak.aq1"}; FHEM_colorpickerInit(); } ##################################### @@ -344,7 +348,7 @@ sub XiaomiSmartHome_Define($$) { eval { $GATEWAY_IP = inet_ntoa(inet_aton($hash->{GATEWAY})) ; $hash->{GATEWAY_IP} = $GATEWAY_IP; - Log3 $name, 1, "$name: Define> Set GATEWAYs IP: " . $GATEWAY_IP; + Log3 $name, 5, "$name: Define> Set GATEWAYs IP: " . $GATEWAY_IP; }; if ($@) { Log3 $name, 1, "$name: Define> Error $@\n"; @@ -475,6 +479,11 @@ sub XiaomiSmartHome_Write($@) { $msg = '{"cmd":"write","model":"curtain","sid":"' . $iohash->{SID} . '","data":"{\"curtain_level\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }'; } + if ($cmd eq 'learn') + { + my $t = '"yes"'; + $msg = '{"cmd":"write","model":"gateway","sid":"' . $hash->{SID} . '","data":"{\"join_permission\":' . $t . ',\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }'; + } } } return Log3 $name, 4, "$name: Write> - socket not connected" unless($hash->{CD}); @@ -620,6 +629,10 @@ sub XiaomiSmartHome_Set($@) } readingsEndUpdate( $hash, 1 ); } + elsif($cmd eq "learn") + { + XiaomiSmartHome_Write($hash,'learn', 1); + } elsif($cmd eq "pct") { my $ownName = $hash->{NAME}; @@ -710,7 +723,7 @@ sub XiaomiSmartHome_connect($) $sock->setsockopt(SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 30, 0)) or die "setsockopt: $!"; if ($sock) { - Log3 $name, 3, "$name: connect> Connected"; + Log3 $name, 4, "$name: connect> Connected"; $sock->mcast_add('224.0.0.50', $hash->{fhemIP} ) || die "Couldn't set group: $!\n"; #$hash->{fhemIP} $sock->mcast_ttl(32); $sock->mcast_loopback(1); @@ -748,7 +761,7 @@ sub XiaomiSmartHome_disconnect($) } return if (!$hash->{CD}); - Log3 $name, 3, "$name: disconnect> disconnecting"; + Log3 $name, 1, "$name: disconnect> disconnecting"; close($hash->{CD}) if($hash->{CD}); delete($hash->{FD}); @@ -872,6 +885,7 @@ sub XiaomiSmartHome_updateAllReadings($)
  • ctrl_neutral2: Double bond ignition switch
  • rgbw_light: Smart lights (report only)
  • curtain: Curtain (Control only if device has reporte curtain_level)
  • +
  • water: water detector
  • smoke: smoke alarm detector
    • 0: disarm
    • @@ -970,6 +984,7 @@ sub XiaomiSmartHome_updateAllReadings($)
    • ctrl_neutral2: Doppelter Wandschalter schaltbar
    • rgbw_light: RBGW Lampe (nur Anzeige)
    • curtain: Vorhangmotor (ohne das das device den curtain_level gemeldet hat ist ein steuern nicht möglich)
    • +
    • water: Wasser Sensor
    • smoke: Rauchmelder
      • 0: disarm
      • diff --git a/FHEM/71_XiaomiSmartHome_Device.pm b/FHEM/71_XiaomiSmartHome_Device.pm index 427b00a..757b2e4 100644 --- a/FHEM/71_XiaomiSmartHome_Device.pm +++ b/FHEM/71_XiaomiSmartHome_Device.pm @@ -24,8 +24,9 @@ package main; use strict; use warnings; +use Math::Round qw/nearest/; -my $version = "1.08"; +my $version = "1.12"; sub XiaomiSmartHome_Device_updateSReading($); @@ -35,7 +36,7 @@ sub XiaomiSmartHome_Device_Initialize($) { my ($hash) = @_; - $hash->{Match} = ".*magnet.*|.*motion.*|sensor_ht|.*switch.*|plug|cube|86sw1|86sw2|ctrl_neutral1|ctrl_neutral2|rgbw_light|curtain|ctrl_ln1|ctrl_ln2|86plug|natgas|smoke|weather.v1"; + $hash->{Match} = ".*magnet.*|.*motion.*|sensor_ht|.*switch.*|plug|cube|86sw1|86sw2|ctrl_neutral1|ctrl_neutral2|rgbw_light|curtain|ctrl_ln1|ctrl_ln2|86plug|natgas|smoke|weather.v1|sensor_wleak.aq1"; $hash->{DefFn} = "XiaomiSmartHome_Device_Define"; $hash->{SetFn} = "XiaomiSmartHome_Device_Set"; $hash->{UndefFn} = "XiaomiSmartHome_Device_Undef"; @@ -43,6 +44,7 @@ sub XiaomiSmartHome_Device_Initialize($) $hash->{AttrList} = "IODev 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 ". + "round:1,2,3 ". $readingFnAttributes ; } ##################################### @@ -190,6 +192,8 @@ sub XiaomiSmartHome_Device_on_timeout($){ ##################################### sub XiaomiSmartHome_Device_Read($$$){ my ($hash, $msg, $name) = @_; + my @arround = ("0.1","0.01","0.001"); + my $round = AttrVal( $hash->{NAME}, "round", "2" ); my $decoded = eval{decode_json($msg)}; if ($@) { Log3 $name, 1, "$name: DEV_Read> Error while request: $@"; @@ -215,27 +219,35 @@ sub XiaomiSmartHome_Device_Read($$$){ } } if (defined $data->{no_motion}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " NO_motion: " . $data->{no_motion}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " NO_motion: " . $data->{no_motion}; readingsBulkUpdate($hash, "no_motion", "$data->{no_motion}", 1 ); } if (defined $data->{no_close}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " NO_close: " . $data->{no_close}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " NO_close: " . $data->{no_close}; readingsBulkUpdate($hash, "no_close", "$data->{no_close}", 1 ); } if (defined $data->{voltage}){ my $bat = ($data->{voltage}/1000); - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Voltage: " . $data->{voltage}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Voltage: " . $data->{voltage}; readingsBulkUpdate($hash, "battery", $bat, 1 ); + if ($bat < 2.2) { + readingsBulkUpdate($hash, "batterystate", "low", 1 ); + } + else { + readingsBulkUpdate($hash, "batterystate", "ok", 1 ) + } } if (defined $data->{temperature}){ my $temp = $data->{temperature}; - $temp =~ s/(^[-+]?\d+?(?=(?>(?:\d{2})+)(?!\d))|\G\d{2}(?=\d))/$1./g; - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Temperature: " . $temp; + $temp =~ s/(^[-+]?\d+?(?=(?>(?:\d{2})+)(?!\d))|\G\d{3}(?=\d))/$1./g; + $temp = nearest(@arround[$round-1] ,$temp ); + Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Temperature: " . $temp . " Round: " . $round; readingsBulkUpdate($hash, "temperature", "$temp", 1 ); } if (defined $data->{humidity}){ my $hum = $data->{humidity}; $hum =~ s/(^[-+]?\d+?(?=(?>(?:\d{2})+)(?!\d))|\G\d{2}(?=\d))/$1./g; + $hum = nearest(@arround[$round-1] ,$hum ); Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Humidity: " . $hum; readingsBulkUpdate($hash, "humidity", "$hum", 1 ); } @@ -262,45 +274,45 @@ sub XiaomiSmartHome_Device_Read($$$){ #86sw1 + 86sw2 + ctrl_neutral1 + ctrl_neutral2 end #plug & 86plug start if (defined $data->{load_voltage}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " LOAD_Voltage: " . $data->{load_voltage}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " LOAD_Voltage: " . $data->{load_voltage}; readingsBulkUpdate($hash, "LOAD_Voltage", "$data->{load_voltage}", 1 ); } if (defined $data->{load_power}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " LOAD_Power: " . $data->{load_power}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " LOAD_Power: " . $data->{load_power}; readingsBulkUpdate($hash, "LOAD_Power", "$data->{load_power}", 1 ); } if (defined $data->{power_consumed}){ - Log3 $name, 3, "$name:" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " POWER_Consumed: " . $data->{power_consumed}; + Log3 $name, 4, "$name:" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " POWER_Consumed: " . $data->{power_consumed}; readingsBulkUpdate($hash, "POWER_Consumed", "$data->{power_consumed}", 1 ); } if (defined $data->{inuse}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " InUse: " . $data->{inuse}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " InUse: " . $data->{inuse}; readingsBulkUpdate($hash, "inuse", "$data->{inuse}", 1 ); } #plug & 86plug end #rgbw_light start if (defined $data->{level}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Level: " . $data->{level}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Level: " . $data->{level}; readingsBulkUpdate($hash, "level", "$data->{level}", 1 ); } if (defined $data->{hue}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Hue: " . $data->{hue}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Hue: " . $data->{hue}; readingsBulkUpdate($hash, "hue", "$data->{hue}", 1 ); } if (defined $data->{saturation}){ - Log3 $name, 3, "$name:" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Saturation: " . $data->{saturation}; + Log3 $name, 4, "$name:" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Saturation: " . $data->{saturation}; readingsBulkUpdate($hash, "saturation", "$data->{saturation}", 1 ); } if (defined $data->{color_temperature}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Color_temperature: " . $data->{color_temperature}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Color_temperature: " . $data->{color_temperature}; readingsBulkUpdate($hash, "color_temperature", "$data->{color_temperature}", 1 ); } if (defined $data->{x}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " X: " . $data->{x}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " X: " . $data->{x}; readingsBulkUpdate($hash, "x", "$data->{x}", 1 ); } if (defined $data->{y}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Y: " . $data->{y}; + Log3 $name, 4, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Y: " . $data->{y}; readingsBulkUpdate($hash, "y", "$data->{y}", 1 ); } #rgbw_light end @@ -313,13 +325,17 @@ sub XiaomiSmartHome_Device_Read($$$){ #cube end #smoke & natgast start if (defined $data->{alarm}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Rotate: " . $data->{arlarm}; - readingsBulkUpdate($hash, "arlarm", "$data->{arlarm}", 1 ); + Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Alarm: " . $data->{alarm}; + readingsBulkUpdate($hash, "alarm", "$data->{alarm}", 1 ); + } + if (defined $data->{density}){ + Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Density: " . $data->{density}; + readingsBulkUpdate($hash, "density", "$data->{density}", 1 ); } #smoke & natgast end #curtain start if (defined $data->{curtain_level}){ - Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Rotate: " . $data->{curtain_level}; + Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Curtain: " . $data->{curtain_level}; readingsBulkUpdate($hash, "arlarm", "$data->{curtain_level}", 1 ); } #curtain end @@ -369,7 +385,7 @@ sub XiaomiSmartHome_Device_update($){ my $LASTCMD = ReadingsVal($name,"lastCmd",undef); my $value_fn = eval $value_fn; - Log3 $name, 3, $name .": DEV_Update valueFn: ". $@ if($@); + Log3 $name, 4, $name .": DEV_Update valueFn: ". $@ if($@); return undef if( !defined($value_fn) ); } if( $model =~ /motion/) { @@ -392,6 +408,7 @@ sub XiaomiSmartHome_Device_Define($$) { $hash->{STATE} = 'initialized'; $modules{XiaomiSmartHome_Device}{defptr}{$sid} = $hash; AssignIoPort($hash,$iodev); + my $room = $attr{$iodev}{room}; if(defined($hash->{IODev}->{NAME})) { my $IOname = $hash->{IODev}->{NAME}; @@ -406,7 +423,7 @@ sub XiaomiSmartHome_Device_Define($$) { return "XiaomiSmartHome device $hash->{SID} on XiaomiSmartHome $iodev already defined as $d->{NAME}." if( defined($d) && $d->{IODev} == $hash->{IODev} && $d->{NAME} ne $name ); Log3 $name, 4, $iodev . ": DEV_Define> " . $name . ": defined as ". $hash->{MODEL}; - $attr{$name}{room} = "MiSmartHome" if( !defined( $attr{$name}{room} ) ); + $attr{$name}{room} = $room if( !defined( $attr{$name}{room} ) ); if( $type =~ /motion/) { $attr{$name}{devStateIcon} = 'motion:motion_detector@red off:motion_detector@green no_motion:motion_detector@green' if( !defined( $attr{$name}{devStateIcon} ) ); } @@ -431,7 +448,7 @@ sub XiaomiSmartHome_Device_updateSReading($) { my $hash = shift; my $name = $hash->{NAME}; - Log3 $name, 3, "$name: DEV_updateSReading> for $hash->{SID}"; + Log3 $name, 4, "$name: DEV_updateSReading> for $hash->{SID}"; RemoveInternalTimer($hash,'XiaomiSmartHome_Device_updateSReading'); IOWrite($hash,'read',"$hash->{SID}"); } @@ -445,7 +462,7 @@ sub XiaomiSmartHome_Device_Undef($) my $iodev = $hash->{IODev}->{NAME}; RemoveInternalTimer($hash); delete($modules{XiaomiSmartHome_Device}{defptr}{$hash->{SID}}); - Log3 $name, 3, "$iodev: DEV_Undef> $name - device deleted"; + Log3 $name, 4, "$iodev: DEV_Undef> $name - device deleted"; return undef; } diff --git a/controls_mish.txt b/controls_mish.txt index 68e1752..3f7e79b 100644 --- a/controls_mish.txt +++ b/controls_mish.txt @@ -1,2 +1,2 @@ -UPD 2017-08-13_17:46:25 36385 FHEM/71_XiaomiSmartHome.pm -UPD 2017-08-13_17:46:25 24517 FHEM/71_XiaomiSmartHome_Device.pm +UPD 2017-10-24_08:55:31 37955 FHEM/71_XiaomiSmartHome.pm +UPD 2017-10-24_08:44:58 25854 FHEM/71_XiaomiSmartHome_Device.pm From cca119e3fcb378c5176572ea6ca6dce65aa1c794 Mon Sep 17 00:00:00 2001 From: T0RST3N Date: Tue, 24 Oct 2017 09:32:18 +0200 Subject: [PATCH 7/8] FIX --- controls_mish.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controls_mish.txt b/controls_mish.txt index 3f7e79b..8659e4a 100644 --- a/controls_mish.txt +++ b/controls_mish.txt @@ -1,2 +1,2 @@ -UPD 2017-10-24_08:55:31 37955 FHEM/71_XiaomiSmartHome.pm +UPD 2017-10-24_08:55:31 36922 FHEM/71_XiaomiSmartHome.pm UPD 2017-10-24_08:44:58 25854 FHEM/71_XiaomiSmartHome_Device.pm From eb3dddcdc2246975cc1b94676cf615d0f1ccd218 Mon Sep 17 00:00:00 2001 From: T0RST3N Date: Tue, 24 Oct 2017 09:38:26 +0200 Subject: [PATCH 8/8] FIX --- controls_mish.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controls_mish.txt b/controls_mish.txt index 8659e4a..91a4a2b 100644 --- a/controls_mish.txt +++ b/controls_mish.txt @@ -1,2 +1,2 @@ UPD 2017-10-24_08:55:31 36922 FHEM/71_XiaomiSmartHome.pm -UPD 2017-10-24_08:44:58 25854 FHEM/71_XiaomiSmartHome_Device.pm +UPD 2017-10-24_08:44:58 25216 FHEM/71_XiaomiSmartHome_Device.pm