diff --git a/fhem/FHEM/14_CUL_MAX.pm b/fhem/FHEM/14_CUL_MAX.pm index 58eaa5332..e16892b69 100644 --- a/fhem/FHEM/14_CUL_MAX.pm +++ b/fhem/FHEM/14_CUL_MAX.pm @@ -16,6 +16,11 @@ CUL_MAX_Initialize($) $hash->{Match} = "^Z"; $hash->{DefFn} = "CUL_MAX_Define"; + $hash->{Clients} = ":MAX:"; + my %mc = ( + "1:MAX" => "^MAX", + ); + $hash->{MatchList} = \%mc; $hash->{UndefFn} = "CUL_MAX_Undef"; $hash->{ParseFn} = "CUL_MAX_Parse"; $hash->{AttrList} = "IODev do_not_notify:1,0 ignore:0,1 " . @@ -29,12 +34,17 @@ CUL_MAX_Define($$) my ($hash, $def) = @_; my @a = split("[ \t][ \t]*", $def); - return "wrong syntax: define CUL_MAX " if(@a<2); + return "wrong syntax: define CUL_MAX " if(@a<3); - $hash->{addr} = $a[1]; + if(exists($modules{CUL_MAX}{defptr})) { + Log 1, "There is already on CUL_MAX defined"; + return "There is already on CUL_MAX defined"; + } + $modules{CUL_MAX}{defptr} = $hash; + + $hash->{addr} = $a[2]; $hash->{STATE} = "Defined"; $hash->{cnt} = 0; - Log 4, "CUL_MAX defined"; AssignIoPort($hash); #This interface is shared with 00_MAXLAN.pm @@ -57,15 +67,38 @@ my @culHmCmdFlags = ("WAKEUP", "WAKEMEUP", "BCAST", "Bit3", sub CUL_MAX_Parse($$) { - my ($hash, $msg) = @_; - $msg =~ m/Z(..)(..)(..)(..)(......)(......)(.*)/; - my ($len,$msgcnt,$msgFlag,$msgType,$src,$dst,$p) = ($1,$2,$3,$4,$5,$6,$7); - Log 1, "CUL_MAX_Parse: len mismatch" . (length($msg)/2-1) . " != ". hex($len) if(hex($len) != length($msg)/2-1); + my ($hash, $rmsg) = @_; + + if(!exists($modules{CUL_MAX}{defptr})) { + Log 5, "No CUL_MAX defined"; + return "UNDEFINED CULMAX0 CUL_MAX 123456"; + } + my $shash = $modules{CUL_MAX}{defptr}; + + $rmsg =~ m/Z(..)(..)(..)(..)(......)(......)(..)(.*)/; + my ($len,$msgcnt,$msgFlag,$msgType,$src,$dst,$zero,$payload) = ($1,$2,$3,$4,$5,$6,$7,$8); + Log 1, "CUL_MAX_Parse: len mismatch" if(2*hex($len)+3 != length($rmsg)); #+3 = +1 for 'Z' and +2 for len field in hex + Log 1, "CUL_MAX_Parse zero = $zero" if($zero != 0); + my $msgFlLong = ""; for(my $i = 0; $i < @culHmCmdFlags; $i++) { $msgFlLong .= ",$culHmCmdFlags[$i]" if(hex($msgFlag) & (1<<$i)); } - Log 5, "CUL_MAX_Parse: len $len, msgcnt $msgcnt, msgflag $msgFlLong, msgType $msgType, src $src, dst $dst, payload $p"; + + #convert adresses to lower case + $src = lc($src); + $dst = lc($dst); + + Log 5, "CUL_MAX_Parse: len $len, msgcnt $msgcnt, msgflag $msgFlLong, msgType $msgType, src $src, dst $dst, payload $payload"; + if($msgType eq "30") { + Dispatch($shash, "MAX,ShutterContactState,$src,$payload", {RAWMSG => $rmsg}); + } elsif($msgType eq "60") { + Dispatch($shash, "MAX,HeatingThermostatState,$src,$payload", {RAWMSG => $rmsg}); + } elsif($msgType eq "02") { #Ack + Log 5, "Got Ack"; + } else { + Log 2, "Got unhandled message type $msgType"; + } return undef; } @@ -73,10 +106,8 @@ sub CUL_MAX_SendDeviceCmd($$) { my ($hash,$payload) = @_; - my $srcAddr = AttrVal($hash->{NAME},"srcAddrMAX","123456"); - $hash->{cnt} += 1; - substr($payload,3,3) = pack("H6",$srcAddr); + substr($payload,3,3) = pack("H6",$hash->{addr}); substr($payload,1,0) = pack("C",$hash->{cnt}); $payload = pack("C",length($payload)) . $payload; @@ -94,12 +125,17 @@ sub CUL_MAX_SendDeviceCmd($$)
    The CUL_MAX module interprets MAX! messages received by the CUL. It will be automatically created by autocreate, just make sure that you set the right rfmode like attr CUL0 rfmode MAX.
    - You should also set a (random) source address for this module by attr CUL0 srcAddrMAX <6-digit-hex>

    Define -
      N/A
    +
      + define <name> CUL_MAX <addr> +

      + + Defines an CUL_MAX device of type <type> and rf address <addr>. The rf address + must not be in use by any other MAX device. +