Somes Bugfixes, Support for Smoke, Gas and new Plugs (Proto version 1.07)

fix: Find the right module instance for received UDP packet
add: support smoke sensor
add: support gas sensor
add: support curtain sensor
add: support 86plug (same as plug?)
add: support ctrl_ln1 & ctrl_ln2
This commit is contained in:
2017-06-15 19:28:37 +02:00
parent 581476b899
commit 895dfcb829
3 changed files with 238 additions and 92 deletions

View File

@@ -49,7 +49,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.01";
my $version = "1.06";
my %XiaomiSmartHome_gets = (
"getDevices" => ["get_id_list", '^.+get_id_list_ack' ],
@@ -94,14 +94,22 @@ sub XiaomiSmartHome_Initialize($) {
"8:XiaomiSmartHome_Device" => "^.+86sw2",
"9:XiaomiSmartHome_Device" => "^.+ctrl_neutral1",
"10:XiaomiSmartHome_Device" => "^.+ctrl_neutral2",
"11:XiaomiSmartHome_Device" => "^.+rgbw_light"};
"11:XiaomiSmartHome_Device" => "^.+rgbw_light",
"12:XiaomiSmartHome_Device" => "^.+curtain",
"13:XiaomiSmartHome_Device" => "^.+ctrl_ln1",
"14:XiaomiSmartHome_Device" => "^.+ctrl_ln2",
"15:XiaomiSmartHome_Device" => "^.+86plug",
"16:XiaomiSmartHome_Device" => "^.+natgas",
"17:XiaomiSmartHome_Device" => "^.+smoke"};
FHEM_colorpickerInit();
}
#####################################
sub XiaomiSmartHome_Read($) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $self = {}; # my new hash
my $new_hash = {};
Log3 $name, 5, "$name: Read> Read start";
my $buf = "";
my $ret = sysread($hash->{CD}, $buf, 1024);
@@ -112,7 +120,6 @@ sub XiaomiSmartHome_Read($) {
InternalTimer(gettimeofday() + 2, "XiaomiSmartHome_connect", $hash, 0);
return;
}
my $json = $hash->{helper}{JSON}->incr_parse($buf);
my $decoded = eval{decode_json($buf)};
if ($@) {
@@ -126,90 +133,117 @@ sub XiaomiSmartHome_Read($) {
if ($json)
{
Log3 $name, 5, "$name: Read> " . $buf;
if ($decoded->{'cmd'} eq 'report' && $decoded->{'model'} eq 'gateway' || $decoded->{'cmd'} eq 'heartbeat' && $decoded->{'model'} eq 'gateway' || $decoded->{'cmd'} eq 'write_ack'){
if ($decoded->{'sid'} ne $hash->{SID} ){
Log3 $name, 5, "$name: Read> $decoded->{'sid'} not matching with my SID $hash->{SID} skipping";
return;
}
readingsBeginUpdate( $hash );
if ($decoded->{'model'} && $decoded->{'model'} eq 'gateway' ){
if ($decoded->{'cmd'} eq 'report'){
my $data = eval{decode_json($decoded->{data})};
if ($@) {
Log3 $name, 1, "$name: Read> Error while request: $@";
return;
}
if (defined $data->{rgb}){
Log3 $name, 3, "$name: Read>" . " SID: " . $decoded->{'sid'} . " Type: Gateway" . " RGB: " . $data->{rgb} ;
readingsBulkUpdate($hash, "RGB", $data->{rgb} , 1 );
}
if (defined $data->{illumination}){
Log3 $name, 3, "$name: Read>" . " SID: " . $decoded->{'sid'} . " Type: Gateway" . " Illumination: " . $data->{illumination} ;
readingsBulkUpdate($hash, "illumination", $data->{illumination} , 1 );
}
}
elsif ($decoded->{'cmd'} eq 'heartbeat'){
my $data = eval{decode_json($decoded->{data})};
if ($@) {
Log3 $name, 1, "$name: Read> Error while request: $@";
return;
}
if ($data->{ip} eq $hash->{GATEWAY_IP}){
readingsBulkUpdate($hash, 'heartbeat', $decoded->{'sid'}, 1 );
readingsBulkUpdate($hash, 'token', $decoded->{'token'}, 1 );
Log3 $name, 4, "$name: Read> Heartbeat from $data->{ip} received with $decoded->{'sid'}";
#$hash->{SID} = $decoded->{'sid'};
}
else {
Log3 $name, 4, "$name: Read> IP-Heartbeat Data didnt match! $data->{ip} " . $hash->{GATEWAY_IP} ;
}
}
}
if ($decoded->{'cmd'} eq 'write_ack'){
if ($decoded->{'sid'} ne $hash->{SID} ){
Log3 $name, 5, "$name: Read> $decoded->{'sid'} not matching with my SID $hash->{SID} skipping";
return;
}
Log3 $name, 4, "$name: Read> Write answer " . $hash->{GATEWAY} ;
my $data = eval{decode_json($decoded->{data})};
if ($@) {
Log3 $name, 1, "$name: Read> Error while request: $@";
return;
}
if ($data->{error}){
readingsBulkUpdate($hash, 'heartbeat', $data->{error}, 1 );
}
else {
readingsBulkUpdate($hash, 'heartbeat', "Write_OK", 1 );
readingsBulkUpdate($hash, "proto_version", $data->{proto_version} , 1 );
}
}
readingsEndUpdate( $hash, 1 );
return;
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 ($decoded->{'cmd'} eq 'get_id_list_ack'){
elsif ( $modules{XiaomiSmartHome}{defptr}{$rsid}->{SID} ne $hash->{SID} ){
$self = $modules{XiaomiSmartHome}{defptr}{$rsid};
Log3 $name, 5, "$name: Read> Change HASH Ref to $self->{NAME}";
XiaomiSmartHome_Reading ($self, $buf);
}
else
{
Log3 $name, 5, "$name: Read> HASH correctly";
XiaomiSmartHome_Reading ($hash, $buf);
}
}
}
#####################################
sub XiaomiSmartHome_Reading ($@) {
my ($hash, $buf) = @_;
my $name = $hash->{NAME};
Log3 $name, 5, "$name: Reading> Reading start";
my $json = $hash->{helper}{JSON}->incr_parse($buf);
my $decoded = eval{decode_json($buf)};
if ($@) {
Log3 $name, 1, "$name: Reading> Error while request: $@";
return;
}
if ($json){
if ($decoded->{'cmd'} eq 'report' && $decoded->{'model'} eq 'gateway' || $decoded->{'cmd'} eq 'heartbeat' && $decoded->{'model'} eq 'gateway' || $decoded->{'cmd'} eq 'write_ack'){
if ($decoded->{'sid'} ne $hash->{SID} ){
Log3 $name, 5, "$name: Reading> $decoded->{'sid'} not matching with my SID $hash->{SID} skipping $hash->{SID} TT";
return;
}
readingsBeginUpdate( $hash );
if ($decoded->{'model'} && $decoded->{'model'} eq 'gateway' ){
if ($decoded->{'cmd'} eq 'report'){
my $data = eval{decode_json($decoded->{data})};
if ($@) {
Log3 $name, 1, "$name: Reading> Error while request: $@";
return;
}
if (defined $data->{rgb}){
Log3 $name, 3, "$name: Reading>" . " SID: " . $decoded->{'sid'} . " Type: Gateway" . " RGB: " . $data->{rgb} ;
readingsBulkUpdate($hash, "RGB", $data->{rgb} , 1 );
}
if (defined $data->{illumination}){
Log3 $name, 3, "$name: Reading>" . " SID: " . $decoded->{'sid'} . " Type: Gateway" . " Illumination: " . $data->{illumination} ;
readingsBulkUpdate($hash, "illumination", $data->{illumination} , 1 );
}
}
elsif ($decoded->{'cmd'} eq 'heartbeat'){
my $data = eval{decode_json($decoded->{data})};
if ($@) {
Log3 $name, 1, "$name: Reading> Error while request: $@";
return;
}
if ($data->{ip} eq $hash->{GATEWAY_IP}){
readingsBulkUpdate($hash, 'heartbeat', $decoded->{'sid'}, 1 );
readingsBulkUpdate($hash, 'token', $decoded->{'token'}, 1 );
Log3 $name, 4, "$name: Reading> Heartbeat from $data->{ip} received with $decoded->{'sid'}";
#$hash->{SID} = $decoded->{'sid'};
}
else {
Log3 $name, 4, "$name: Reading> IP-Heartbeat Data didnt match! $data->{ip} " . $hash->{GATEWAY_IP} ;
}
}
}
if ($decoded->{'cmd'} eq 'write_ack'){
if ($decoded->{'sid'} ne $hash->{SID} ){
Log3 $name, 5, "$name: Reading> $decoded->{'sid'} not matching with my SID $hash->{SID} skipping";
return;
}
Log3 $name, 4, "$name: Reading> Write answer " . $hash->{GATEWAY} ;
my $data = eval{decode_json($decoded->{data})};
if ($@) {
Log3 $name, 1, "$name: Reading> Error while request: $@";
return;
}
if ($data->{error}){
readingsBulkUpdate($hash, 'heartbeat', $data->{error}, 1 );
}
else {
readingsBulkUpdate($hash, 'heartbeat', "Write_OK", 1 );
readingsBulkUpdate($hash, "proto_version", $data->{proto_version} , 1 );
}
}
readingsEndUpdate( $hash, 1 );
return;
}
elsif ($decoded->{'cmd'} eq 'get_id_list_ack'){
if ($decoded->{'sid'} ne $hash->{SID} ){
Log3 $name, 5, "$name: Read> $decoded->{'sid'} not matching with my SID $hash->{SID} skipping";
Log3 $name, 5, "$name: Reading> $decoded->{'sid'} not matching with my SID $hash->{SID} skipping $hash";
return;
}
my @sensors = eval{ @{decode_json($decoded->{data})}};
if ($@) {
Log3 $name, 1, "$name: Read> Error while request: $@";
Log3 $name, 1, "$name: Reading> Error while request: $@";
return;
}
foreach my $sensor (@sensors)
{
Log3 $name, 4, "$name: Read> PushRead:" . $sensor;
Log3 $name, 4, "$name: Reading> PushRead:" . $sensor;
XiaomiSmartHome_Write($hash, 'read', $sensor );
}
return;
}
}
Log3 $name, 5, "$name: Read> Dispatch " . $buf;
Dispatch($hash, $buf, undef);
}
Log3 $name, 5, "$name: Reading> Dispatch " . $buf;
Dispatch($hash, $buf, undef);
}
#####################################
@@ -253,6 +287,7 @@ sub XiaomiSmartHome_getGatewaySID($){
Log3 $name, 4, "$name: getGatewaySID> Find SID for Gateway: $decoded->{sid}";
$sidsock->close();
$hash->{SID} = $decoded->{sid};
$modules{XiaomiSmartHome}{defptr}{$decoded->{sid}} = $hash;
return $decoded->{sid};
}
else {
@@ -302,7 +337,7 @@ sub XiaomiSmartHome_Define($$) {
$hash->{helper}{JSON} = JSON->new->utf8();
$hash->{FHEMIP} = XiaomiSmartHome_getLocalIP();
$hash->{STATE} = "initialized";
$hash->{helper}{host} = $definition;
$hash->{helper}{host} = $definition;
if( $hash->{GATEWAY} !~ m/^\d+\.\d+\.\d+\.\d+$/ ){
eval {
$GATEWAY_IP = inet_ntoa(inet_aton($hash->{GATEWAY})) ;
@@ -317,6 +352,7 @@ sub XiaomiSmartHome_Define($$) {
}
}
$hash->{GATEWAY_IP} = $GATEWAY_IP;
$modules{XiaomiSmartHome}{defptr}{$GATEWAY_IP} = $hash;
#$hash->{SID} = XiaomiSmartHome_getGatewaySID($hash);
Log3 $name, 5, "$name: Define> $definition";
@@ -391,10 +427,18 @@ sub XiaomiSmartHome_Write($@)
{
$msg = '{"cmd":"write","model":"plug","sid":"' . $iohash->{SID} . '","data":"{\"status\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
if ($cmd eq '86power')
{
$msg = '{"cmd":"write","model":"86plug","sid":"' . $iohash->{SID} . '","data":"{\"status\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
if ($cmd eq 'ctrl')
{
$msg = '{"cmd":"write","model":"ctrl_neutral1","sid":"' . $iohash->{SID} . '","data":"{\"channel_0\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
if ($cmd eq 'ctrl_ln1')
{
$msg = '{"cmd":"write","model":"ctrl_ln1","sid":"' . $iohash->{SID} . '","data":"{\"channel_0\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
if ($cmd eq 'channel_0')
{
$msg = '{"cmd":"write","model":"ctrl_neutral2","sid":"' . $iohash->{SID} . '","data":"{\"channel_0\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
@@ -403,6 +447,14 @@ sub XiaomiSmartHome_Write($@)
{
$msg = '{"cmd":"write","model":"ctrl_neutral2","sid":"' . $iohash->{SID} . '","data":"{\"channel_1\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
if ($cmd eq 'ctrl_ln2_0')
{
$msg = '{"cmd":"write","model":"ctrl_ln2","sid":"' . $iohash->{SID} . '","data":"{\"channel_0\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
if ($cmd eq 'ctrl_ln2_1')
{
$msg = '{"cmd":"write","model":"ctrl_ln2","sid":"' . $iohash->{SID} . '","data":"{\"channel_1\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
if ($cmd eq 'ringtone')
{
my $vol = $hash->{READINGS}{volume}{VAL};
@@ -413,6 +465,14 @@ sub XiaomiSmartHome_Write($@)
my $rt = $hash->{READINGS}{ringtone}{VAL};
$msg = '{"cmd":"write","model":"gateway","sid":"' . $hash->{SID} . '","short_id":0,"key":"8","data":"{\"mid\":' . $rt . ',\"vol\":' .$val . ',\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
if ($cmd eq 'status')
{
$msg = '{"cmd":"write","model":"curtain","sid":"' . $iohash->{SID} . '","data":"{\"status\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
if ($cmd eq 'level')
{
$msg = '{"cmd":"write","model":"curtain","sid":"' . $iohash->{SID} . '","data":"{\"curtain_level\":\"' . $val . '\",\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';
}
}
}
return Log3 $name, 4, "$name: Write> - socket not connected" unless($hash->{CD});
@@ -800,13 +860,30 @@ sub XiaomiSmartHome_updateAllReadings($)
<li>motion: Human body motion sensor</li>
<li>sensor_ht: Temperatur and humidity sensor</li>
<li>switch: Wireless sensor switch</li>
<li>plug: Smart socket</li>
<li>plug & 86plug: Smart socket</li>
<li>cube: Cube sensor</li>
<li>86sw1: Wireless switch single</li>
<li>86sw2: Wireless switch double</li>
<li>ctrl_neutral1: Single bond ignition switch</li>
<li>ctrl_neutral2: Double bond ignition switch</li>
<li>rgbw_light: Smart lights (report only)</li>
<li>curtain: Curtain (Control only if device has reporte curtain_level)</li>
<li>smoke: smoke alarm detector</li>
<ul>
<li>0: disarm</li>
<li>1: arlarm</li>
<li>8: battery arlarm</li>
<li>64: arlarm sensitivity</li>
<li>32768: ICC communication failure</li>
</ul>
<li>gas: gas alarm detector</li>
<ul>
<li>0: disarm</li>
<li>1: arlarm</li>
<li>2: analog arlarm</li>
<li>64: arlarm sensitivity</li>
<li>32768: ICC communication failure</li>
</ul>
</ul>
<br/>
<b>Heartbeat</b>
@@ -881,13 +958,30 @@ sub XiaomiSmartHome_updateAllReadings($)
<li>motion: Bewegungsmelder</li>
<li>sensor_ht: Temperatur und Luftdruck</li>
<li>switch: Funkschalter</li>
<li>plug: Schaltbare Funksteckdose</li>
<li>plug & 86plug: Schaltbare Funksteckdose</li>
<li>cube: W&uumlrfel Sensor</li>
<li>86sw1: Einfacher Wandfunkschalter</li>
<li>86sw2: Wandfunkschalter doppelt</li>
<li>ctrl_neutral1: Einfacher Wandschalter schaltbar</li>
<li>ctrl_neutral2: Doppelter Wandschalter schaltbar</li>
<li>rgbw_light: RBGW Lampe (nur Anzeige)</li>
<li>curtain: Vorhangmotor (ohne das das device den curtain_level gemeldet hat ist ein steuern nicht möglich)</li>
<li>smoke: Rauchmelder</li>
<ul>
<li>0: disarm</li>
<li>1: arlarm</li>
<li>8: battery arlarm</li>
<li>64: arlarm sensitivity</li>
<li>32768: ICC communication failure</li>
</ul>
<li>gas: Gasmelder</li>
<ul>
<li>0: disarm</li>
<li>1: arlarm</li>
<li>2: analog arlarm</li>
<li>64: arlarm sensitivity</li>
<li>32768: ICC communication failure</li>
</ul>
</ul>
<br/>
<b>Heartbeat</b>

View File

@@ -25,7 +25,7 @@ package main;
use strict;
use warnings;
my $version = "1.00";
my $version = "1.05";
sub XiaomiSmartHome_Device_updateSReading($);
@@ -35,7 +35,7 @@ sub XiaomiSmartHome_Device_Initialize($)
{
my ($hash) = @_;
$hash->{Match} = "^.+magnet|motion|sensor_ht|switch|plug|cube|86sw1|86sw2|ctrl_neutral1|ctrl_neutral2|rgbw_light";
$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";
$hash->{DefFn} = "XiaomiSmartHome_Device_Define";
$hash->{SetFn} = "XiaomiSmartHome_Device_Set";
$hash->{UndefFn} = "XiaomiSmartHome_Device_Undef";
@@ -66,19 +66,25 @@ sub XiaomiSmartHome_Device_Set($@)
$setlist .= "motionOffTimer:1,5,10 " if ($hash->{MODEL} eq 'motion');
#$setlist = "open:noArg close:noArg " if ($hash->{MODEL} eq 'magnet');
$setlist .= "power:on,off " if ($hash->{MODEL} eq 'plug');
$setlist .= "power:on,off " if ($hash->{MODEL} eq '86plug');
$setlist .= "ctrl:on,off " if ($hash->{MODEL} eq 'ctrl_neutral1');
$setlist .= "ctrl:on,off " if ($hash->{MODEL} eq 'ctrl_ln1');
$setlist .= "channel_0:on,off channel_1:on,off " if ($hash->{MODEL} eq 'ctrl_neutral2');
$setlist .= "channel_0:on,off channel_1:on,off " if ($hash->{MODEL} eq 'ctrl_ln2');
$setlist .= "status:open,close,stop,auto level:slider,1,1,100 " if ($hash->{MODEL} eq 'curtain');
if($cmd eq "power")
{
if($args[0] eq "on")
{
IOWrite($hash,"power","on",$hash);
IOWrite($hash,"power","on",$hash) if ($hash->{MODEL} eq 'plug');
IOWrite($hash,"86power","on",$hash) if ($hash->{MODEL} eq '86plug');
return;
}
elsif($args[0] eq "off")
{
IOWrite($hash,"power","off",$hash);
IOWrite($hash,"power","off",$hash) if ($hash->{MODEL} eq 'plug');
IOWrite($hash,"86power","off",$hash) if ($hash->{MODEL} eq '86plug');
return;
}
}
@@ -86,12 +92,14 @@ sub XiaomiSmartHome_Device_Set($@)
{
if($args[0] eq "on")
{
IOWrite($hash,"ctrl","on",$hash);
IOWrite($hash,"ctrl","on",$hash) if ($hash->{MODEL} eq 'ctrl_neutral1');
IOWrite($hash,"ctrl_ln1","on",$hash) if ($hash->{MODEL} eq 'ctrl_ln1');
return;
}
elsif($args[0] eq "off")
{
IOWrite($hash,"ctrl","off",$hash);
IOWrite($hash,"ctrl","off",$hash) if ($hash->{MODEL} eq 'ctrl_neutral1');
IOWrite($hash,"ctrl_ln1","off",$hash) if ($hash->{MODEL} eq 'ctrl_ln1');
return;
}
}
@@ -99,12 +107,14 @@ sub XiaomiSmartHome_Device_Set($@)
{
if($args[0] eq "on")
{
IOWrite($hash,"channel_0","on",$hash);
IOWrite($hash,"channel_0","on",$hash) if ($hash->{MODEL} eq 'ctrl_neutral2');
IOWrite($hash,"ctrl_ln2_0","on",$hash) if ($hash->{MODEL} eq 'ctrl_ln2');
return;
}
elsif($args[0] eq "off")
{
IOWrite($hash,"channel_0","off",$hash);
IOWrite($hash,"channel_0","off",$hash) if ($hash->{MODEL} eq 'ctrl_neutral2');
IOWrite($hash,"ctrl_ln2_0","off",$hash) if ($hash->{MODEL} eq 'ctrl_ln2');
return;
}
}
@@ -112,15 +122,45 @@ sub XiaomiSmartHome_Device_Set($@)
{
if($args[0] eq "on")
{
IOWrite($hash,"channel_1","on",$hash);
IOWrite($hash,"channel_1","on",$hash) if ($hash->{MODEL} eq 'ctrl_neutral2');
IOWrite($hash,"ctrl_ln2_1","on",$hash) if ($hash->{MODEL} eq 'ctrl_ln2');
return;
}
elsif($args[0] eq "off")
{
IOWrite($hash,"channel_1","off",$hash);
IOWrite($hash,"channel_1","off",$hash) if ($hash->{MODEL} eq 'ctrl_neutral2');
IOWrite($hash,"ctrl_ln2_1","off",$hash) if ($hash->{MODEL} eq 'ctrl_ln2');
return;
}
}
if($cmd eq "status")
{
if($args[0] eq "open")
{
IOWrite($hash,"status","open",$hash) ;
return;
}
elsif($args[0] eq "close")
{
IOWrite($hash,"status","close",$hash) ;
return;
}
elsif($args[0] eq "stop")
{
IOWrite($hash,"status","stop",$hash) ;
return;
}
elsif($args[0] eq "auto")
{
IOWrite($hash,"status","auto",$hash) ;
return;
}
}
if($cmd eq "level")
{
IOWrite($hash,"level", $args[0] ,$hash) ;
return;
}
# if($cmd eq "open")
# {
# readingsSingleUpdate($hash, "state", "open", 1 );
@@ -209,7 +249,7 @@ sub XiaomiSmartHome_Device_Read($$$){
readingsBulkUpdate($hash, "channel_1", "$data->{channel_1}", 1 );
}
#86sw1 + 86sw2 + ctrl_neutral1 + ctrl_neutral2 end
#plug start
#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};
readingsBulkUpdate($hash, "LOAD_Voltage", "$data->{load_voltage}", 1 );
@@ -226,7 +266,7 @@ sub XiaomiSmartHome_Device_Read($$$){
Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " InUse: " . $data->{inuse};
readingsBulkUpdate($hash, "inuse", "$data->{inuse}", 1 );
}
#plug end
#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};
@@ -260,6 +300,18 @@ sub XiaomiSmartHome_Device_Read($$$){
readingsBulkUpdate($hash, "state", "rotate", 1 );
}
#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 );
}
#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};
readingsBulkUpdate($hash, "arlarm", "$data->{curtain_level}", 1 );
}
#curtain end
if ($decoded->{'cmd'} eq 'heartbeat'){
readingsBulkUpdate($hash, 'heartbeat', $decoded->{'sid'} , 1 );
}
@@ -280,10 +332,10 @@ sub XiaomiSmartHome_Device_Parse($$) {
}
my $sid = $decoded->{'sid'};
my $model = $decoded->{'model'};
if (my $io_hash = $modules{XiaomiSmartHome_Device}{defptr}{$sid})
if (my $hash = $modules{XiaomiSmartHome_Device}{defptr}{$sid})
{
Log3 $name, 4, "$name: DEV_Parse> IS DEFINED " . $model . " : " .$sid;
XiaomiSmartHome_Device_Read($io_hash, $msg, $name);
XiaomiSmartHome_Device_Read($hash, $msg, $name);
}
else
{

View File

@@ -1,2 +1,2 @@
UPD 2017-05-28_09:43:07 32000 FHEM/71_XiaomiSmartHome.pm
UPD 2017-05-18_11:38:12 21164 FHEM/71_XiaomiSmartHome_Device.pm
UPD 2017-06-15_17:31:21 36080 FHEM/71_XiaomiSmartHome.pm
UPD 2017-06-13_10:28:27 23503 FHEM/71_XiaomiSmartHome_Device.pm