2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 18:59:33 +00:00

53_GHoma.pm: added support for more plug types (outdoor plug, uk plug, etc.)

git-svn-id: https://svn.fhem.de/fhem/trunk@15573 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
klausw 2017-12-08 22:35:46 +00:00
parent d2c2e7072e
commit d4622ec8f6

View File

@ -1,4 +1,4 @@
##############################################
##############################################
# $Id$
#
# Protokoll:
@ -6,36 +6,43 @@
# Antwort von Dose hat immer die letzen 3 Bloecke der MAC vom 11-13 Byte
#
# Payload immer in "|"
# Init1 (vom Server):
#
#Init1 (vom Server):
# 5a a5 00 07|02 05 0d 07 05 07 12|c6 5b b5
# ** ** ** ** ** ** ** scheinen zufaellig zu sein
# 5a a5 00 01|02|fd 5b b5
# Antwort auf Init1 von Dose:
#Antwort auf Init1 von Dose:
# 5A A5 00 0B|03 01 0A C0 32 23 62 8A 7E 01 C2|AF 5B B5
# MM MM MM ** MM: letzte 3 Stellen der MAC, ** scheinbar eine Checksumme basierend auf den 6 zufaelligen Bytes von Init1
# Init2 (vom Server):
# ?? ?? ??: Unterschiedlich bei verschiedenen Steckermodellen
#Init2 (vom Server):
# 5a a5 00 02|05 01|f9 5b b5
# Antwort auf Init2 von Dose:
#Antwort auf Init2 von Dose:
# 5A A5 00 12|07 01 0A C0 32 23 62 8A 7E 00 01 06 AC CF 23 62 8A 7E|5F 5B B5
# MM MM MM MM: letzte 3 Stellen der MAC
# MM MM MM MM MM MM MM: komplette MAC
# ?? ?? ??: Unterschiedlich bei verschiedenen Steckermodellen
# 5A A5 00 12|07 01 0A C0 32 23 62 8A 7E 00 02 05 00 01 01 08 11|4C 5B B5 Anzahl Bytes stimmt nicht! ist aber immer so
# 5A A5 00 15|90 01 0A E0 32 23 62 8A 7E 00 00 00 81 11 00 00 01 00 00 00 00|32 5B B5 Status der Dose (wird auch immer bei Zustandsaenderung geschickt)
# MM MM MM MM: letzte 3 Stellen der MAC
# qq qq: Schaltquelle 81=lokal geschaltet, 11=remote geschaltet
# oo oo: Schaltzustand ff=an, 00=aus
# ?? ?? ??: Unterschiedlich bei verschiedenen Steckermodellen
# Danach kommt alle x Sekunden ein Heartbeat von der Dose:
# 5A A5 00 09|04 01 0A C0 32 23 62 8A 7E|71 5B B5
# MM MM MM
# ?? ?? ??: Unterschiedlich bei verschiedenen Steckermodellen
# Antwort vom Server (wenn die nicht kommt blinkt Dose wieder und muss neu initialisiert werden):
# 5a a5 00 01|06|f9 5b b5
#---------------------------------------------------------------------------------------------------------
# Einschalten der Dose:
# 5a a5 00 17|10 01 01 0a e0 32 23 62 8a 7e ff fe 00 00 10 11 00 00 01 00 00 00 ff|26 5b b5
# MM MM MM
# ?? ?? ??: Unterschiedlich bei verschiedenen Steckermodellen
# Ausschalten der Dose
# 5a a5 00 17|10 01 01 0a e0 32 23 62 8a 7e ff fe 00 00 10 11 00 00 01 00 00 00 00|25 5b b5
# MM MM MM
# ?? ?? ??: Unterschiedlich bei verschiedenen Steckermodellen
# beides wird quittiert (ebenso wird auch bei lokaler betaetigung quittiert) -> siehe 3. Antwort auf Init 2
package main;
use strict;
@ -43,10 +50,6 @@ use warnings;
use SetExtensions;
use TcpServerUtils;
use constant { PREFIX => pack('C*', (0x5a,0xa5)),
POSTFIX => pack('C*', (0x5b,0xb5)),
INIT1A => pack('C*', (0x02,0x05,0x0d,0x07,0x05,0x07,0x12)), };
my $prefix = pack('C*', (0x5a,0xa5));
my $postfix = pack('C*', (0x5b,0xb5));
@ -54,13 +57,13 @@ my $init1a = pack('C*', (0x02,0x05,0x0d,0x07,0x05,0x07,0x12));
my $init1b = pack('C*', (0x02));
my $init2 = pack('C*', (0x05,0x01));
my $hbeat = pack('C*', (0x06));
my $switch1 = pack('C*', (0x10,0x01,0x01,0x0a,0xe0,0x32,0x23));
my $switch1 = pack('C*', (0x10,0x01,0x01,0x0a,0xe0));
my $switch2 = pack('C*', (0xff,0xfe,0x00,0x00,0x10,0x11,0x00,0x00,0x01,0x00,0x00,0x00));
my $dosehb = pack('C*', (0x00,0x09,0x04,0x01,0x0A,0xC0,0x32,0x23));
my $cinit1 = pack('C*', (0x03,0x01,0x0a,0xc0,0x32,0x23));
my $cmac = pack('C*', (0x07,0x01,0x0a,0xc0,0x32,0x23));
my $cswitch = pack('C*', (0x90,0x01,0x0a,0xe0,0x32,0x23));
my $dosehb = pack('C*', (0x00,0x09,0x04,0x01,0x0a,0xc0));
my $cinit1 = pack('C*', (0x03,0x01,0x0a,0xc0));
my $cmac = pack('C*', (0x07,0x01,0x0a,0xc0));
my $cswitch = pack('C*', (0x90,0x01,0x0a,0xe0));
my $timeout = 60;
@ -247,11 +250,11 @@ sub GHoma_Read($) { # wird von der globalen loop aufgerufen (ueber $hash->{F
return;
}
if ( substr($buf,0,10) eq ($prefix . $dosehb )) { # Heartbeat (Dosen Id wird nicht ueberprueft)
#DevIo_SimpleWrite($hash, GHoma_BuildString($hbeat) , undef);
if ( substr($buf,0,8) eq ($prefix . $dosehb )) { # Heartbeat (Dosen Id wird nicht ueberprueft)
#DevIo_SimpleWrite($hash, GHoma_BuildString($hbeat) , undef);
RemoveInternalTimer($hash);
$buf =~ s/(.|\n)/sprintf("%.2X ",ord($1))/eg; #empfangene Zeichen in Hexwerte wandeln
Log3 $name, 5, "$name empfangen: $buf";
Log3 $name, 5, "$name Heartbeatanfrage empfangen: $buf";
syswrite( $hash->{CD}, GHoma_BuildString($hbeat) );
Log3 $hash, 5, "$hash->{NAME} Heartbeat gesendet";
InternalTimer(gettimeofday()+ $timeout, "GHoma_Timer", $hash,0);
@ -274,8 +277,9 @@ sub GHoma_Read($) { # wird von der globalen loop aufgerufen (ueber $hash->{F
(my $smsg = $_) =~ s/(.|\n)/sprintf("%.2X ",ord($1))/eg; # empfangene Zeichen in Hexwerte wandeln
Log3 $hash, 5, "$hash->{NAME} RX: 5A A5 $smsg"; # ...und ins Log schreiben
if ( substr($_,2,6) eq ($cinit1)) { # Antwort auf erstes Init
#$hash->{Id} = substr($_,8,3);
$hash->{Pattern} = unpack('H*', substr($_,6,2) ) unless defined $hash->{Pattern};
if ( substr($_,2,4) eq ($cinit1)) { # Antwort auf erstes Init
$hash->{Id} = unpack('H*', substr($_,8,3) );
unless ($hash->{isClient}) {
# fuer Server Loesung bei erster Antwort von Dose nach bestehendem Device mit gleicher Id suchen und Verbindung auf dieses Modul uebertragen
@ -289,10 +293,6 @@ sub GHoma_Read($) { # wird von der globalen loop aufgerufen (ueber $hash->{F
}
}
unless ( defined $clientdefined) { # ...ein Neues anlegen, falls keins existiert
#my $id = unpack('H*', $hash->{Id} );
#Log3 $name, 4, "GHoma Unknown device $id, please define it";
#DoTrigger("global", "UNDEFINED GHoma_$id GHoma $id");
#GHoma_moveclient($hash, $defs{"GHoma_$id"}) if ($defs{"GHoma_$id"});
Log3 $name, 4, "GHoma Unknown device $hash->{Id}, please define it";
DoTrigger("global", "UNDEFINED GHoma_$hash->{Id} GHoma $hash->{Id}");
GHoma_moveclient($hash, $defs{"GHoma_$hash->{Id}"}) if ($defs{"GHoma_$hash->{Id}"});
@ -303,7 +303,7 @@ sub GHoma_Read($) { # wird von der globalen loop aufgerufen (ueber $hash->{F
RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+ $timeout, "GHoma_Timer", $hash,0);
}
} elsif ( substr($_,2,6) eq $cmac && substr($_,8,3) eq substr($_,17,3) ) { # Nachricht mit MAC (kommt unter Anderem als Antwort auf Init2)
} elsif ( substr($_,2,4) eq $cmac && substr($_,8,3) eq substr($_,17,3) ) { # Nachricht mit MAC (kommt unter Anderem als Antwort auf Init2)
my $mac;
for my $i (0...5) { # MAC formattieren
$mac .= sprintf("%.2X",ord( substr($_,14+$i,1) ));
@ -311,7 +311,7 @@ sub GHoma_Read($) { # wird von der globalen loop aufgerufen (ueber $hash->{F
$mac .= ":";
}
$hash->{MAC} = $mac;
} elsif ( substr($_,2,6) eq $cswitch && (( length($_) - 5 ) == 0x15 ) ) { # An oder Aus
} elsif ( substr($_,2,4) eq $cswitch && (( length($_) - 5 ) == 0x15 ) ) { # An oder Aus
my $id = unpack('H*', substr($_,8,3) );
my $rstate = hex(unpack('H*', substr($_,22,1))) == 0xFF ? "on" : "off";
my $src = hex(unpack('H*', substr($_,14,1))) == 0x81 ? "local" : "remote";
@ -396,7 +396,8 @@ sub GHoma_Set($@) { #
return SetExtensions($hash, $slist, @a);
}
if (defined $hash->{CD}) {
syswrite( $hash->{CD}, GHoma_BuildString($switch1 . pack('C*', ( hex(substr($hash->{Id},0,2)), hex(substr($hash->{Id},2,2)), hex(substr($hash->{Id},4,2)) ) ) . $switch2 . $type) );
Log3 $hash, 2, "$hash->{NAME}: Pattern noch nicht empfangen" unless defined $hash->{Pattern};
syswrite( $hash->{CD}, GHoma_BuildString($switch1 . pack('C*', ( hex(substr($hash->{Pattern},0,2)), hex(substr($hash->{Pattern},2,2)) ) ) . pack('C*', ( hex(substr($hash->{Id},0,2)), hex(substr($hash->{Id},2,2)), hex(substr($hash->{Id},4,2)) ) ) . $switch2 . $type) );
}
return undef;
}
@ -648,4 +649,4 @@ sub GHoma_udpbroad {
=end html_DE
=cut
=cut