mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-07 19:04:20 +00:00
CUL_MAX: parse some messages (ShutterState/HeatingThermostatState)
git-svn-id: https://svn.fhem.de/fhem/trunk@2202 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
828242f03a
commit
18c534358c
@ -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 <name> CUL_MAX <srdAddr>" if(@a<2);
|
||||
return "wrong syntax: define <name> CUL_MAX <srdAddr>" 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($$)
|
||||
<ul>
|
||||
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 <code>attr CUL0 rfmode MAX</code>.<br>
|
||||
You should also set a (random) source address for this module by <code>attr CUL0 srcAddrMAX <6-digit-hex></code>
|
||||
<br><br>
|
||||
|
||||
<a name="CUL_MAXdefine"></a>
|
||||
<b>Define</b>
|
||||
<ul>N/A</ul>
|
||||
<ul>
|
||||
<code>define <name> CUL_MAX <addr></code>
|
||||
<br><br>
|
||||
|
||||
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.
|
||||
</ul>
|
||||
<br>
|
||||
|
||||
<a name="CUL_MAXset"></a>
|
||||
|
Loading…
x
Reference in New Issue
Block a user