Merge branch 'devel'

This commit is contained in:
2019-03-21 08:12:11 +01:00
3 changed files with 170 additions and 100 deletions

View File

@@ -45,13 +45,10 @@ return "\nERROR: Please install Net::Ping" if($@);
use Color; use Color;
use SetExtensions; use SetExtensions;
sub XiaomiSmartHome_Notify($$);
sub XiaomiSmartHome_updateSingleReading($$); sub XiaomiSmartHome_updateSingleReading($$);
my $iv="\x17\x99\x6d\x09\x3d\x28\xdd\xb3\xba\x69\x5a\x2e\x6f\x58\x56\x2e"; my $iv="\x17\x99\x6d\x09\x3d\x28\xdd\xb3\xba\x69\x5a\x2e\x6f\x58\x56\x2e";
my $version = "1.30"; my $version = "1.40";
my %XiaomiSmartHome_gets = ( my %XiaomiSmartHome_gets = (
"getDevices" => ["get_id_list", '^.+get_id_list_ack' ], "getDevices" => ["get_id_list", '^.+get_id_list_ack' ],
@@ -76,7 +73,7 @@ my %sets = (
sub XiaomiSmartHome_Initialize($) { sub XiaomiSmartHome_Initialize($) {
my ($hash) = @_; my ($hash) = @_;
$hash->{Clients} = "XiaomiSmartHome_Device"; $hash->{Clients} = 'XiaomiSmartHome_Device';
$hash->{DefFn} = 'XiaomiSmartHome_Define'; $hash->{DefFn} = 'XiaomiSmartHome_Define';
$hash->{UndefFn} = 'XiaomiSmartHome_Undef'; $hash->{UndefFn} = 'XiaomiSmartHome_Undef';
$hash->{NotifyFn} = 'XiaomiSmartHome_Notify'; $hash->{NotifyFn} = 'XiaomiSmartHome_Notify';
@@ -84,8 +81,9 @@ sub XiaomiSmartHome_Initialize($) {
$hash->{GetFn} = 'XiaomiSmartHome_Get'; $hash->{GetFn} = 'XiaomiSmartHome_Get';
$hash->{AttrFn} = 'XiaomiSmartHome_Attr'; $hash->{AttrFn} = 'XiaomiSmartHome_Attr';
$hash->{ReadFn} = 'XiaomiSmartHome_Read'; $hash->{ReadFn} = 'XiaomiSmartHome_Read';
$hash->{WriteFn} = "XiaomiSmartHome_Write"; $hash->{ReadyFn} = 'XiaomiSmartHome_Ready';
$hash->{AttrList} = "disable:1,0 " . $hash->{WriteFn} = 'XiaomiSmartHome_Write';
$hash->{AttrList} = 'disable:1,0 ' .
$readingFnAttributes; $readingFnAttributes;
$hash->{MatchList} = { "1:XiaomiSmartHome_Device" => ".*magnet.*", $hash->{MatchList} = { "1:XiaomiSmartHome_Device" => ".*magnet.*",
@@ -107,7 +105,11 @@ sub XiaomiSmartHome_Initialize($) {
"17:XiaomiSmartHome_Device" => "^.+smoke", "17:XiaomiSmartHome_Device" => "^.+smoke",
"18:XiaomiSmartHome_Device" => "^.+weather.v1", "18:XiaomiSmartHome_Device" => "^.+weather.v1",
"19:XiaomiSmartHome_Device" => "^.+sensor_motion.aq2", "19:XiaomiSmartHome_Device" => "^.+sensor_motion.aq2",
"20:XiaomiSmartHome_Device" => "^.+sensor_wleak.aq1"}; "20:XiaomiSmartHome_Device" => "^.+sensor_wleak.aq1",
"21:XiaomiSmartHome_Device" => "^.+vibration",
"22:XiaomiSmartHome_Device" => "^.*b186acn01",
"23:XiaomiSmartHome_Device" => "^.*b286acn01",
"24:XiaomiSmartHome_Device" => "^.*b1acn01"};
FHEM_colorpickerInit(); FHEM_colorpickerInit();
} }
##################################### #####################################
@@ -130,7 +132,7 @@ sub XiaomiSmartHome_Read($) {
InternalTimer(gettimeofday() + 2, "XiaomiSmartHome_connect", $hash, 0); InternalTimer(gettimeofday() + 2, "XiaomiSmartHome_connect", $hash, 0);
return; return;
} }
my $json = $hash->{helper}{JSON}->incr_parse($buf); my $json = $hash->{helper}{JSON}->incr_parse($buf);
my $decoded = eval{decode_json($buf)}; my $decoded = eval{decode_json($buf)};
if ($@) { if ($@) {
Log3 $name, 1, "$name: Read> Error while request: $@"; Log3 $name, 1, "$name: Read> Error while request: $@";
@@ -145,6 +147,7 @@ sub XiaomiSmartHome_Read($) {
Log3 $name, 5, "$name: Read> [PLAIN] " . $buf; Log3 $name, 5, "$name: Read> [PLAIN] " . $buf;
my $rsid = $decoded->{'sid'}; 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') { 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') {
# devices does not exist yet
if (!$modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME}){ if (!$modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME}){
Log3 $name, 5, "$name: Read> XiaomiSmartHome_Device unknown trying autocreate" ; Log3 $name, 5, "$name: Read> XiaomiSmartHome_Device unknown trying autocreate" ;
my $def=$modules{XiaomiSmartHome}{defptr}; my $def=$modules{XiaomiSmartHome}{defptr};
@@ -155,35 +158,55 @@ sub XiaomiSmartHome_Read($) {
Log3 $value->{NAME}, 5, "$value->{NAME}: $rsid is sensor from $value->{NAME}"; Log3 $value->{NAME}, 5, "$value->{NAME}: $rsid is sensor from $value->{NAME}";
Dispatch($value, $buf, undef); Dispatch($value, $buf, undef);
return; return;
} }
} }
} }
if ($modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME} eq $hash->{NAME}) { # devices available with proper and HEARTBEAT gw
Log3 $name, 5, "$name: Read> XiaomiSmartHome_Device known! " . "SID: " . $rsid . " " . $modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME} . " " . $hash->{NAME}; elsif ($decoded->{'cmd'} eq 'heartbeat' && $modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME} eq $hash->{NAME}) {
} Log3 $name, 5, "$name: Read> Dispatching! " . "SID: " . $rsid . " " . $modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME} . " " . $hash->{NAME};
elsif ($modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME} ne $hash->{NAME}) { Dispatch($hash, $buf, undef);
Log3 $name, 5, "$name: Read> Wrong Modul HASH Trying to find the right one " . $modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME} . " <> " . $hash->{NAME} ;
$hash = $modules{XiaomiSmartHome_Device}{defptr}{$rsid}->{IODev};
Log3 $name, 5, "$name: Read> Using this GW " . $hash->{NAME};
}
Log3 $name, 5, "$name: Read> Dispatching " . $buf . " " . $hash->{NAME};
Dispatch($hash, $buf, undef);
}
elsif (!$modules{XiaomiSmartHome}{defptr}{$rsid}){
Log3 $name, 1, "$name: Read> GW not defined " . $buf;
return; return;
}
elsif ($decoded->{'cmd'} eq 'report' && $modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME} eq $hash->{NAME}) {
Log3 $name, 5, "$name: Read> Dispatching! " . "SID: " . $rsid . " " . $modules{XiaomiSmartHome_Device}{defptr}{$rsid}{IODev}->{NAME} . " " . $hash->{NAME};
Dispatch($hash, $buf, undef);
return;
}
# Senosoren check change to right GW
elsif ($decoded->{'cmd'} eq 'read_ack') {
$hash = $modules{XiaomiSmartHome_Device}{defptr}{$rsid}->{IODev};
Log3 $name, 4, "$name: Read> Dispatching using this GW " . $hash->{NAME} ;
Dispatch($hash, $buf, undef);
return;
}
}
# gateway sensor list
elsif ($decoded->{'cmd'} eq 'get_id_list_ack'){
$self = $modules{XiaomiSmartHome}{defptr}{$rsid};
Log3 $name, 5, "$name: Read> Reading Sensorlist with $self->{NAME}" ;
XiaomiSmartHome_Reading ($self, $buf);
return;
} }
# gateway not definded
elsif (!$modules{XiaomiSmartHome}{defptr}{$rsid}){
Log3 $name, 1, "$name: Read> GW not defined " . $buf;
return;
}
# gateway defined but not the right modul instance - change
elsif ( $modules{XiaomiSmartHome}{defptr}{$rsid}->{SID} ne $hash->{SID} ){ elsif ( $modules{XiaomiSmartHome}{defptr}{$rsid}->{SID} ne $hash->{SID} ){
$self = $modules{XiaomiSmartHome}{defptr}{$rsid}; $self = $modules{XiaomiSmartHome}{defptr}{$rsid};
Log3 $name, 5, "$name: Read> Change HASH Ref to $self->{NAME}"; Log3 $name, 5, "$name: Read> Wrong Modul HASH skipping $self->{NAME}";
XiaomiSmartHome_Reading ($self, $buf); #XiaomiSmartHome_Reading ($self, $buf); no reading anymore!
return;
} }
else #gateway defined and the right modul instance - nothing to change
{ elsif ( $modules{XiaomiSmartHome}{defptr}{$rsid}->{SID} eq $hash->{SID} ){
Log3 $name, 5, "$name: Read> HASH correctly"; Log3 $name, 5, "$name: Read> HASH correctly";
XiaomiSmartHome_Reading ($hash, $buf); XiaomiSmartHome_Reading ($hash, $buf);
} return;
} }
}
} }
##################################### #####################################
sub XiaomiSmartHome_Reading ($@) { sub XiaomiSmartHome_Reading ($@) {
@@ -547,6 +570,22 @@ sub XiaomiSmartHome_EncryptKey($)
} }
##################################### #####################################
sub XiaomiSmartHome_Ready($)
{
my ($hash) = @_;
# Versuch eines Verbindungsaufbaus, sofern die Verbindung beendet ist.
return DevIo_OpenDev($hash, 1, undef ) if ( $hash->{STATE} eq "disconnected" );
# This is relevant for Windows/USB only
if(defined($hash->{USBDev})) {
my $po = $hash->{USBDev};
my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po->status;
return ( $InBytes > 0 );
}
}
#####################################
sub XiaomiSmartHome_Get($@) sub XiaomiSmartHome_Get($@)
{ {
my ($hash , $name, $opt, $args ) = @_; my ($hash , $name, $opt, $args ) = @_;
@@ -574,7 +613,18 @@ sub XiaomiSmartHome_Notify($$)
{ {
my ($hash, $dev_hash) = @_; my ($hash, $dev_hash) = @_;
my $ownName = $hash->{NAME}; # own name / hash my $ownName = $hash->{NAME}; # own name / hash
Log3 $ownName, 5, "$ownName: Notify> NotifyStart"; #my $evName = $dev_hash->{NAME}; # triggered device
#my $rsid = $dev_hash->{SID};
Log3 $ownName, 5, "$ownName: Notify> NotifyStart";# . $rsid . " " . $evName;
# gateway defined but not the right modul instance
#if ( $modules{XiaomiSmartHome}{defptr}{$rsid}->{SID} ne $hash->{SID} ){
# Log3 $ownName, 5, "$ownName: Notify> Wrong Event-Modul HASH skipping " . $evName;
# #XiaomiSmartHome_Reading ($self, $buf);
# return;
#}
return "" if(IsDisabled($ownName)); # Return without any further action if the module is disabled return "" if(IsDisabled($ownName)); # Return without any further action if the module is disabled
$attr{$hash->{NAME}}{webCmd} = "pct:rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:on:off" if ( ! $attr{$hash->{NAME}}{webCmd} || $attr{$hash->{NAME}}{webCmd} eq "rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:on:off" ); $attr{$hash->{NAME}}{webCmd} = "pct:rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:on:off" if ( ! $attr{$hash->{NAME}}{webCmd} || $attr{$hash->{NAME}}{webCmd} eq "rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:on:off" );
readingsSingleUpdate($hash, "pct", 100, 1) if ( ! $hash->{READINGS}{pct}{VAL}); readingsSingleUpdate($hash, "pct", 100, 1) if ( ! $hash->{READINGS}{pct}{VAL});
@@ -921,17 +971,17 @@ sub XiaomiSmartHome_updateAllReadings($)
<li>smoke: smoke alarm detector</li> <li>smoke: smoke alarm detector</li>
<ul> <ul>
<li>0: disarm</li> <li>0: disarm</li>
<li>1: arlarm</li> <li>1: alarm</li>
<li>8: battery arlarm</li> <li>8: battery alarm</li>
<li>64: arlarm sensitivity</li> <li>64: alarm sensitivity</li>
<li>32768: ICC communication failure</li> <li>32768: ICC communication failure</li>
</ul> </ul>
<li>gas: gas alarm detector</li> <li>gas: gas alarm detector</li>
<ul> <ul>
<li>0: disarm</li> <li>0: disarm</li>
<li>1: arlarm</li> <li>1: alarm</li>
<li>2: analog arlarm</li> <li>2: analog alarm</li>
<li>64: arlarm sensitivity</li> <li>64: alarm sensitivity</li>
<li>32768: ICC communication failure</li> <li>32768: ICC communication failure</li>
</ul> </ul>
</ul> </ul>
@@ -979,9 +1029,9 @@ sub XiaomiSmartHome_updateAllReadings($)
<i>XiaomiSmartHome</i> Steuern des XiaomiSmartHome Gateway und deren verbundener Sensoren. <i>XiaomiSmartHome</i> Steuern des XiaomiSmartHome Gateway und deren verbundener Sensoren.
<a name="XiaomiSmartHome"></a> <a name="XiaomiSmartHome"></a>
<br/> <br/>
<b>Vorraussetzungen</b> <b>Voraussetzungen</b>
<ul> <ul>
<li>Diese Pakete m&uumlssen installiert sein: apt-get install libio-socket-multicast-perl libjson-perl libcrypt-cbc-perl</li> <li>Diese Pakete m&uuml;ssen installiert sein: apt-get install libio-socket-multicast-perl libjson-perl libcrypt-cbc-perl</li>
<li>Und mit CPAN: cpan Crypt::Cipher::AES</li> <li>Und mit CPAN: cpan Crypt::Cipher::AES</li>
</ul> </ul>
<br/> <br/>
@@ -993,11 +1043,11 @@ sub XiaomiSmartHome_updateAllReadings($)
<br><br> <br><br>
</ul> </ul>
<br/> <br/>
<b>Entwicklermodus am Gatway setzen!</b> <b>Entwicklermodus am Gateway setzen!</b>
<ul> <ul>
<p>Ohne Entwicklermodus ist keine Komunikation mit dem Gateway m&oumlglich. <p>Ohne Entwicklermodus ist keine Kommunikation mit dem Gateway m&ouml;glich.
<br/>Zum setzen des Entwicklermoduses braucht man ein android oder ios Ger&aumlt mit installierter MI APP. <br/>Zum setzen des Entwicklermodusses braucht man ein android oder ios Ger&auml;t mit installierter MI APP.
<br/>Um das versteckte Men&uuml zu &oumlffnen muss man mehrmals auf die Versionsnummer der MI APP klicken. <br/>Um das versteckte Men&uuml; zu &ouml;ffnen muss man mehrmals auf die Versionsnummer der MI APP klicken.
<br/>Hier finden Sie eine Anleitung mit Bildern. <br/>Hier finden Sie eine Anleitung mit Bildern.
<br/>Android -> https://louiszl.gitbooks.io/lumi-gateway-local-api/content/device_discover.html <br/>Android -> https://louiszl.gitbooks.io/lumi-gateway-local-api/content/device_discover.html
<br/>IOS -> https://github.com/fooxy/homeassistant-aqara/wiki/Enable-dev-mode <br/>IOS -> https://github.com/fooxy/homeassistant-aqara/wiki/Enable-dev-mode
@@ -1006,33 +1056,33 @@ sub XiaomiSmartHome_updateAllReadings($)
<br/> <br/>
<b>Unterstütze Sensoren</b> <b>Unterstütze Sensoren</b>
<ul> <ul>
<li>magnet: Magnetischer Fenster/T&uumlr Sensor</li> <li>magnet: Magnetischer Fenster/T&uuml;r Sensor</li>
<li>motion: Bewegungsmelder</li> <li>motion: Bewegungsmelder</li>
<li>sensor_ht: Temperatur und Luftdruck</li> <li>sensor_ht: Temperatur und Luftdruck</li>
<li>switch: Funkschalter</li> <li>switch: Funkschalter</li>
<li>plug & 86plug: Schaltbare Funksteckdose</li> <li>plug & 86plug: Schaltbare Funksteckdose</li>
<li>cube: W&uumlrfel Sensor</li> <li>cube: W&uuml;rfel Sensor</li>
<li>86sw1: Einfacher Wandfunkschalter</li> <li>86sw1: Einfacher Wandfunkschalter</li>
<li>86sw2: Wandfunkschalter doppelt</li> <li>86sw2: Wandfunkschalter doppelt</li>
<li>ctrl_neutral1: Einfacher Wandschalter schaltbar</li> <li>ctrl_neutral1: Einfacher Wandschalter schaltbar</li>
<li>ctrl_neutral2: Doppelter Wandschalter schaltbar</li> <li>ctrl_neutral2: Doppelter Wandschalter schaltbar</li>
<li>rgbw_light: RBGW Lampe (nur Anzeige)</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>curtain: Vorhangmotor (ohne dass das Device den curtain_level gemeldet hat ist ein Steuern nicht m&ouml;glich)</li>
<li>water: Wasser Sensor</li> <li>water: Wasser Sensor</li>
<li>smoke: Rauchmelder</li> <li>smoke: Rauchmelder</li>
<ul> <ul>
<li>0: disarm</li> <li>0: disarm</li>
<li>1: arlarm</li> <li>1: alarm</li>
<li>8: battery arlarm</li> <li>8: battery alarm</li>
<li>64: arlarm sensitivity</li> <li>64: alarm sensitivity</li>
<li>32768: ICC communication failure</li> <li>32768: ICC communication failure</li>
</ul> </ul>
<li>gas: Gasmelder</li> <li>gas: Gasmelder</li>
<ul> <ul>
<li>0: disarm</li> <li>0: disarm</li>
<li>1: arlarm</li> <li>1: alarm</li>
<li>2: analog arlarm</li> <li>2: analog alarm</li>
<li>64: arlarm sensitivity</li> <li>64: alarm sensitivity</li>
<li>32768: ICC communication failure</li> <li>32768: ICC communication failure</li>
</ul> </ul>
</ul> </ul>
@@ -1041,29 +1091,29 @@ sub XiaomiSmartHome_updateAllReadings($)
<ul> <ul>
<li>Das XiaomiSmartHome Gateway sendet alle 10 seconds einen heartbeat</li> <li>Das XiaomiSmartHome Gateway sendet alle 10 seconds einen heartbeat</li>
<li>Jedes XiaomiSmartHome Devices sendet alle 60 Minuten einen heartbeat</li> <li>Jedes XiaomiSmartHome Devices sendet alle 60 Minuten einen heartbeat</li>
<li>Das Reading heartbeat wird mit der SID des jeweiligen Gerätes beim empfang eines Heartbeat aktualisiert</li> <li>Das Reading heartbeat wird mit der SID des jeweiligen Gerätes beim Empfang eines Heartbeat aktualisiert</li>
</ul> </ul>
<br/> <br/>
<b>Set: Gateway</b> <b>Set: Gateway</b>
<ul> <ul>
<li>password: Ohne Passwort ist ein Schalten des GATEWAY nicht m&oumlglich. Das Passwort findet man in der MI APP</li> <li>password: Ohne Passwort ist ein Schalten des GATEWAY nicht m&ouml;glich. Das Passwort findet man in der MI APP</li>
<li>RGB(Colorpicker): Einstellen der LED Farbe des Gateways</li> <li>RGB(Colorpicker): Einstellen der LED Farbe des Gateways</li>
<li>PCT(Slider): Einstellen der Helligkeit des Gateways</li> <li>PCT(Slider): Einstellen der Helligkeit des Gateways</li>
<li>intervals: Einschalten des gateway für einen Zeitraum zb. set intervals 07:00-08:00</li> <li>intervals: Einschalten des Gateways für einen Zeitraum zb. set intervals 07:00-08:00</li>
<li>ringtone: Wiedergeben eines Arlarmtones 0-8,13,21-29,10001-.. Benutzerdefinierte| 10000 = aus</li> <li>ringtone: Wiedergeben eines Alarmtones 0-8,13,21-29,10001-.. Benutzerdefinierte| 10000 = aus</li>
<li>volume: Einstellen der Lautst&aumlrke des Arlarmtones 1-100, (100 ist sehr laut!)</li> <li>volume: Einstellen der Lautst&auml;rke des Alarmtones 1-100, (100 ist sehr laut!)</li>
<li>ringvol: Wiedergeben eines Arlamtones und gleichzeitiges ver&aumlndern der Lautst&aumlrke set [GWNAME] ringvol 21 10</li> <li>ringvol: Wiedergeben eines Arlamtones und gleichzeitiges ver&auml;ndern der Lautst&auml;rke set [GWNAME] ringvol 21 10</li>
<li>learn: Anlernen neuer Sensoren, nach dem Set an dem neuem Sensor den Button dr&uumlcken</li> <li>learn: Anlernen neuer Sensoren, nach dem Set an dem neuen Sensor den Button dr&uuml;cken</li>
</ul> </ul>
<br/> <br/>
<b>Set: Devices</b> <b>Set: Devices</b>
<ul> <ul>
<li>motionOffTimer: (nur Bewegungsmelder) <li>motionOffTimer: (nur Bewegungsmelder)
<br/>Durch setzen des Parameters ist es m&oumlglich das das Reading des Bewegungsmelder nach 1, 5 oder 10 Sekunden <br/>Durch setzen des Parameters ist es m&ouml;glich, dass das Reading des Bewegungsmelder nach 1, 5 oder 10 Sekunden
<br/>automatisch wieder auf off gestellt wird. <br/>automatisch wieder auf off gestellt wird.
<br/>Hintergrund: Der Bewegungsmelder sendet kein selber kein off. <br/>Hintergrund: Der Bewegungsmelder sendet selber kein off.
<br/>Der Bewegungsmelder sendet no_motion nach 120, 180, 300, 600, 1200 Sekunden wenn keine Bewegung festgestellt wurde.</li> <br/>Der Bewegungsmelder sendet no_motion nach 120, 180, 300, 600, 1200 Sekunden, wenn keine Bewegung festgestellt wurde.</li>
<li>Power: (nur Funksteckdose) on off Funktsteckdose ein oder ausschalten</li> <li>Power: (nur Funksteckdose) on off Funksteckdose ein oder ausschalten</li>
<li>ctrl: (nur Funkschalter) on off Funkschalter </li> <li>ctrl: (nur Funkschalter) on off Funkschalter </li>
<li>channel_0: (nur Doppelter Wandschalter schaltbar) ein oder ausschalten </li> <li>channel_0: (nur Doppelter Wandschalter schaltbar) ein oder ausschalten </li>
<li>channel_1: (nur Doppelter Wandschalter schaltbar) ein oder ausschalten </li> <li>channel_1: (nur Doppelter Wandschalter schaltbar) ein oder ausschalten </li>
@@ -1074,3 +1124,4 @@ sub XiaomiSmartHome_updateAllReadings($)
=cut =cut

View File

@@ -27,7 +27,7 @@ use warnings;
my $version = "1.30"; my $version = "1.40";
sub XiaomiSmartHome_Device_updateSReading($); sub XiaomiSmartHome_Device_updateSReading($);
@@ -38,11 +38,12 @@ sub XiaomiSmartHome_Device_Initialize($)
{ {
my ($hash) = @_; 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|sensor_wleak.aq1"; $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|vibration|remote.b186acn01|remote.b286acn01|remote.b1acn01";
$hash->{DefFn} = "XiaomiSmartHome_Device_Define"; $hash->{DefFn} = "XiaomiSmartHome_Device_Define";
$hash->{SetFn} = "XiaomiSmartHome_Device_Set"; $hash->{SetFn} = "XiaomiSmartHome_Device_Set";
$hash->{UndefFn} = "XiaomiSmartHome_Device_Undef"; $hash->{UndefFn} = "XiaomiSmartHome_Device_Undef";
$hash->{ParseFn} = "XiaomiSmartHome_Device_Parse"; $hash->{ParseFn} = "XiaomiSmartHome_Device_Parse";
$hash->{FingerprintFn} = "XiaomiSmartHome_Device_Fingerprint";
$hash->{AttrList} = "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 ". "do_not_notify:1,0 ignore:1,0 dummy:1,0 showtime:1,0 valueFn:textField-long ".
@@ -359,14 +360,23 @@ sub XiaomiSmartHome_Device_Read($$$){
#curtain start #curtain start
if (defined $data->{curtain_level}){ if (defined $data->{curtain_level}){
Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Curtain: " . $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 ); readingsBulkUpdate($hash, "alarm", "$data->{curtain_level}", 1 );
} }
#curtain end #curtain end
#vibration Start
if (defined $data->{'coordination'}){
Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Coordination: " . $data->{coordination};
readingsBulkUpdate($hash, "coordination", "$data->{coordination}", 1 );
}
if (defined $data->{'final_tilt_angle'}){
Log3 $name, 3, "$name: DEV_Read>" . " Name: " . $hash->{NAME} . " SID: " . $sid . " Type: " . $hash->{MODEL} . " Final tilt angle: " . $data->{final_tilt_angle};
readingsBulkUpdate($hash, "final_tilt_angle", "$data->{final_tilt_angle}", 1 );
}
#vibration end
if ($decoded->{'cmd'} eq 'heartbeat'){ if ($decoded->{'cmd'} eq 'heartbeat'){
readingsBulkUpdate($hash, 'heartbeat', $decoded->{'sid'} , 1 ); readingsBulkUpdate($hash, 'heartbeat', $decoded->{'sid'} , 1 );
} }
readingsEndUpdate( $hash, 1 ); readingsEndUpdate( $hash, 1 );
XiaomiSmartHome_Device_update($hash); XiaomiSmartHome_Device_update($hash);
return $hash->{NAME}; return $hash->{NAME};
@@ -477,6 +487,14 @@ sub XiaomiSmartHome_Device_Define($$) {
} }
return undef; return undef;
} }
#####################################
sub XiaomiSmartHome_Device_Fingerprint($$){
my ($io_name, $msg) = @_;
Log3 $io_name, 4, "$io_name: Fingerprint> for $msg";
return ($io_name, $msg );
}
##################################### #####################################
sub XiaomiSmartHome_Device_updateSReading($) { sub XiaomiSmartHome_Device_updateSReading($) {
@@ -578,17 +596,17 @@ sub XiaomiSmartHome_round {
<li>smoke: smoke alarm detector</li> <li>smoke: smoke alarm detector</li>
<ul> <ul>
<li>0: disarm</li> <li>0: disarm</li>
<li>1: arlarm</li> <li>1: alarm</li>
<li>8: battery arlarm</li> <li>8: battery alarm</li>
<li>64: arlarm sensitivity</li> <li>64: alarm sensitivity</li>
<li>32768: ICC communication failure</li> <li>32768: ICC communication failure</li>
</ul> </ul>
<li>gas: gas alarm detector</li> <li>gas: gas alarm detector</li>
<ul> <ul>
<li>0: disarm</li> <li>0: disarm</li>
<li>1: arlarm</li> <li>1: alarm</li>
<li>2: analog arlarm</li> <li>2: analog alarm</li>
<li>64: arlarm sensitivity</li> <li>64: alarm sensitivity</li>
<li>32768: ICC communication failure</li> <li>32768: ICC communication failure</li>
</ul> </ul>
</ul> </ul>
@@ -636,9 +654,9 @@ sub XiaomiSmartHome_round {
<i>XiaomiSmartHome</i> Steuern des XiaomiSmartHome Gateway und deren verbundener Sensoren. <i>XiaomiSmartHome</i> Steuern des XiaomiSmartHome Gateway und deren verbundener Sensoren.
<a name="XiaomiSmartHome"></a> <a name="XiaomiSmartHome"></a>
<br/> <br/>
<b>Vorraussetzungen</b> <b>Voraussetzungen</b>
<ul> <ul>
<li>Diese Pakete m&uumlssen installiert sein: apt-get install libio-socket-multicast-perl libjson-perl libcrypt-cbc-perl</li> <li>Diese Pakete m&uuml;ssen installiert sein: apt-get install libio-socket-multicast-perl libjson-perl libcrypt-cbc-perl</li>
<li>Und mit CPAN: cpan Crypt::Cipher::AES</li> <li>Und mit CPAN: cpan Crypt::Cipher::AES</li>
</ul> </ul>
<br/> <br/>
@@ -650,11 +668,11 @@ sub XiaomiSmartHome_round {
<br><br> <br><br>
</ul> </ul>
<br/> <br/>
<b>Entwicklermodus am Gatway setzen!</b> <b>Entwicklermodus am Gateway setzen!</b>
<ul> <ul>
<p>Ohne Entwicklermodus ist keine Komunikation mit dem Gateway m&oumlglich. <p>Ohne Entwicklermodus ist keine Kommunikation mit dem Gateway m&ouml;glich.
<br/>Zum setzen des Entwicklermoduses braucht man ein android oder ios Ger&aumlt mit installierter MI APP. <br/>Zum setzen des Entwicklermodusses braucht man ein android oder ios Ger&auml;t mit installierter MI APP.
<br/>Um das versteckte Men&uuml zu &oumlffnen muss man mehrmals auf die Versionsnummer der MI APP klicken. <br/>Um das versteckte Men&uuml; zu &ouml;ffnen muss man mehrmals auf die Versionsnummer der MI APP klicken.
<br/>Hier finden Sie eine Anleitung mit Bildern. <br/>Hier finden Sie eine Anleitung mit Bildern.
<br/>Android -> https://louiszl.gitbooks.io/lumi-gateway-local-api/content/device_discover.html <br/>Android -> https://louiszl.gitbooks.io/lumi-gateway-local-api/content/device_discover.html
<br/>IOS -> https://github.com/fooxy/homeassistant-aqara/wiki/Enable-dev-mode <br/>IOS -> https://github.com/fooxy/homeassistant-aqara/wiki/Enable-dev-mode
@@ -663,33 +681,33 @@ sub XiaomiSmartHome_round {
<br/> <br/>
<b>Unterstütze Sensoren</b> <b>Unterstütze Sensoren</b>
<ul> <ul>
<li>magnet: Magnetischer Fenster/T&uumlr Sensor</li> <li>magnet: Magnetischer Fenster/T&uuml;r Sensor</li>
<li>motion: Bewegungsmelder</li> <li>motion: Bewegungsmelder</li>
<li>sensor_ht: Temperatur und Luftdruck</li> <li>sensor_ht: Temperatur und Luftdruck</li>
<li>switch: Funkschalter</li> <li>switch: Funkschalter</li>
<li>plug & 86plug: Schaltbare Funksteckdose</li> <li>plug & 86plug: Schaltbare Funksteckdose</li>
<li>cube: W&uumlrfel Sensor</li> <li>cube: W&uuml;rfel Sensor</li>
<li>86sw1: Einfacher Wandfunkschalter</li> <li>86sw1: Einfacher Wandfunkschalter</li>
<li>86sw2: Wandfunkschalter doppelt</li> <li>86sw2: Wandfunkschalter doppelt</li>
<li>ctrl_neutral1: Einfacher Wandschalter schaltbar</li> <li>ctrl_neutral1: Einfacher Wandschalter schaltbar</li>
<li>ctrl_neutral2: Doppelter Wandschalter schaltbar</li> <li>ctrl_neutral2: Doppelter Wandschalter schaltbar</li>
<li>rgbw_light: RBGW Lampe (nur Anzeige)</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 glich)</li> <li>curtain: Vorhangmotor (ohne dass das Device den curtain_level gemeldet hat ist ein Steuern nicht &ouml;glich)</li>
<li>water: Wasser Sensor</li> <li>water: Wasser Sensor</li>
<li>smoke: Rauchmelder</li> <li>smoke: Rauchmelder</li>
<ul> <ul>
<li>0: disarm</li> <li>0: disarm</li>
<li>1: arlarm</li> <li>1: alarm</li>
<li>8: battery arlarm</li> <li>8: battery alarm</li>
<li>64: arlarm sensitivity</li> <li>64: alarm sensitivity</li>
<li>32768: ICC communication failure</li> <li>32768: ICC communication failure</li>
</ul> </ul>
<li>gas: Gasmelder</li> <li>gas: Gasmelder</li>
<ul> <ul>
<li>0: disarm</li> <li>0: disarm</li>
<li>1: arlarm</li> <li>1: alarm</li>
<li>2: analog arlarm</li> <li>2: analog alarm</li>
<li>64: arlarm sensitivity</li> <li>64: alarm sensitivity</li>
<li>32768: ICC communication failure</li> <li>32768: ICC communication failure</li>
</ul> </ul>
</ul> </ul>
@@ -698,29 +716,29 @@ sub XiaomiSmartHome_round {
<ul> <ul>
<li>Das XiaomiSmartHome Gateway sendet alle 10 seconds einen heartbeat</li> <li>Das XiaomiSmartHome Gateway sendet alle 10 seconds einen heartbeat</li>
<li>Jedes XiaomiSmartHome Devices sendet alle 60 Minuten einen heartbeat</li> <li>Jedes XiaomiSmartHome Devices sendet alle 60 Minuten einen heartbeat</li>
<li>Das Reading heartbeat wird mit der SID des jeweiligen Gerätes beim empfang eines Heartbeat aktualisiert</li> <li>Das Reading heartbeat wird mit der SID des jeweiligen Gerätes beim Empfang eines Heartbeat aktualisiert</li>
</ul> </ul>
<br/> <br/>
<b>Set: Gateway</b> <b>Set: Gateway</b>
<ul> <ul>
<li>password: Ohne Passwort ist ein Schalten des GATEWAY nicht m&oumlglich. Das Passwort findet man in der MI APP</li> <li>password: Ohne Passwort ist ein Schalten des GATEWAY nicht m&ouml;glich. Das Passwort findet man in der MI APP</li>
<li>RGB(Colorpicker): Einstellen der LED Farbe des Gateways</li> <li>RGB(Colorpicker): Einstellen der LED Farbe des Gateways</li>
<li>PCT(Slider): Einstellen der Helligkeit des Gateways</li> <li>PCT(Slider): Einstellen der Helligkeit des Gateways</li>
<li>intervals: Einschalten des gateway für einen Zeitraum zb. set intervals 07:00-08:00</li> <li>intervals: Einschalten des Gateways für einen Zeitraum zb. set intervals 07:00-08:00</li>
<li>ringtone: Wiedergeben eines Arlarmtones 0-8,13,21-29,10001-.. Benutzerdefinierte| 10000 = aus</li> <li>ringtone: Wiedergeben eines Alarmtones 0-8,13,21-29,10001-.. Benutzerdefinierte| 10000 = aus</li>
<li>volume: Einstellen der Lautst&aumlrke des Arlarmtones 1-100, (100 ist sehr laut!)</li> <li>volume: Einstellen der Lautst&auml;rke des Alarmtones 1-100, (100 ist sehr laut!)</li>
<li>ringvol: Wiedergeben eines Arlamtones und gleichzeitiges ver&aumlndern der Lautst&aumlrke set [GWNAME] ringvol 21 10</li> <li>ringvol: Wiedergeben eines Arlamtones und gleichzeitiges ver&auml;ndern der Lautst&auml;rke set [GWNAME] ringvol 21 10</li>
<li>learn: Anlernen neuer Sensoren, nach dem Set an dem neuem Sensor den Button dr&uumlcken</li> <li>learn: Anlernen neuer Sensoren, nach dem Set an dem neuen Sensor den Button dr&uuml;cken</li>
</ul> </ul>
<br/> <br/>
<b>Set: Devices</b> <b>Set: Devices</b>
<ul> <ul>
<li>motionOffTimer: (nur Bewegungsmelder) <li>motionOffTimer: (nur Bewegungsmelder)
<br/>Durch setzen des Parameters ist es m&oumlglich das das Reading des Bewegungsmelder nach 1, 5 oder 10 Sekunden <br/>Durch setzen des Parameters ist es m&ouml;glich, dass das Reading des Bewegungsmelder nach 1, 5 oder 10 Sekunden
<br/>automatisch wieder auf off gestellt wird. <br/>automatisch wieder auf off gestellt wird.
<br/>Hintergrund: Der Bewegungsmelder sendet kein selber kein off. <br/>Hintergrund: Der Bewegungsmelder sendet selber kein off.
<br/>Der Bewegungsmelder sendet no_motion nach 120, 180, 300, 600, 1200 Sekunden wenn keine Bewegung festgestellt wurde.</li> <br/>Der Bewegungsmelder sendet no_motion nach 120, 180, 300, 600, 1200 Sekunden, wenn keine Bewegung festgestellt wurde.</li>
<li>Power: (nur Funksteckdose) on off Funktsteckdose ein oder ausschalten</li> <li>Power: (nur Funksteckdose) on off Funksteckdose ein oder ausschalten</li>
<li>ctrl: (nur Funkschalter) on off Funkschalter </li> <li>ctrl: (nur Funkschalter) on off Funkschalter </li>
<li>channel_0: (nur Doppelter Wandschalter schaltbar) ein oder ausschalten </li> <li>channel_0: (nur Doppelter Wandschalter schaltbar) ein oder ausschalten </li>
<li>channel_1: (nur Doppelter Wandschalter schaltbar) ein oder ausschalten </li> <li>channel_1: (nur Doppelter Wandschalter schaltbar) ein oder ausschalten </li>
@@ -730,3 +748,4 @@ sub XiaomiSmartHome_round {
=end html_DE =end html_DE
=cut =cut

View File

@@ -1,2 +1,2 @@
UPD 2018-06-22_13:29:31 38872 FHEM/71_XiaomiSmartHome.pm UPD 2019-03-20 11:54:55 40740 FHEM/71_XiaomiSmartHome.pm
UPD 2018-06-22_12:45:46 29142 FHEM/71_XiaomiSmartHome_Device.pm UPD 2019-03-20 11:32:54 30100 FHEM/71_XiaomiSmartHome_Device.pm