2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-22 08:11:44 +00:00

added max send queue length checking and correct handling of 0xD2 Message type

git-svn-id: https://svn.fhem.de/fhem/trunk@6464 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
ststrobel 2014-08-26 16:27:29 +00:00
parent f69bfa186a
commit fac239fb38

View File

@ -33,6 +33,9 @@
# 2014-04-18 initial version # 2014-04-18 initial version
# 2014-05-17 added more protocol commands, changed logging settings # 2014-05-17 added more protocol commands, changed logging settings
# 2014-05-25 added hide- attributes # 2014-05-25 added hide- attributes
# 2014-07-07 corrected handling of 0xD2 Message (protocol is different than documented)
# 2014-07-24 added max queue length checking and attribute
#
package main; package main;
@ -158,9 +161,10 @@ my %parseInfo = (
{ name => "Proz_Abluft_hoch"}, { name => "Proz_Abluft_hoch"},
{ name => "Proz_Zuluft_hoch"}]}, { name => "Proz_Zuluft_hoch"}]},
"00d2" => { unpack => "CCCCCxC", "00d2" => { unpack => "CCCCCCC",
name => "Temperaturen", name => "Temperaturen",
request => "00d1", defaultpoll => 1, request => "00d1", defaultpoll => 1,
check => '($fields[5] & 15) == 15',
readings => [ { name => "Temp_Komfort", expr => '$val / 2 - 20', readings => [ { name => "Temp_Komfort", expr => '$val / 2 - 20',
set => "00D3:%02x", setexpr => '($val + 20) *2', set => "00D3:%02x", setexpr => '($val + 20) *2',
setmin => 12, setmax => 28, hint => "slider,12,1,28"}, setmin => 12, setmax => 28, hint => "slider,12,1,28"},
@ -169,6 +173,7 @@ my %parseInfo = (
{ name => "Temp_Zuluft" , expr => '$val / 2 - 20'}, { name => "Temp_Zuluft" , expr => '$val / 2 - 20'},
{ name => "Temp_Abluft" , expr => '$val / 2 - 20'}, { name => "Temp_Abluft" , expr => '$val / 2 - 20'},
{ name => "Temp_Fortluft", expr => '$val / 2 - 20'}, { name => "Temp_Fortluft", expr => '$val / 2 - 20'},
{ name => "Temp_Flag"},
{ name => "Temp_EWT", expr => '$val / 2 - 20'}]}, { name => "Temp_EWT", expr => '$val / 2 - 20'}]},
"00de" => { unpack => "H6H6H6S>S>S>S>H6", "00de" => { unpack => "H6H6H6S>S>S>S>H6",
@ -292,6 +297,7 @@ ComfoAir_Initialize($)
$hash->{AttrList}= "do_not_notify:1,0 " . $hash->{AttrList}= "do_not_notify:1,0 " .
"queueDelay " . "queueDelay " .
"timeout " . "timeout " .
"queueMax " .
#"minSendDelay " . #"minSendDelay " .
join (" ", @pollList) . " " . # Def der zyklisch abzufragenden Nachrichten join (" ", @pollList) . " " . # Def der zyklisch abzufragenden Nachrichten
$readingFnAttributes; $readingFnAttributes;
@ -560,9 +566,19 @@ ComfoAir_InterpretFrame($$)
# Definition für diesen Nachrichten-Typ gefunden # Definition für diesen Nachrichten-Typ gefunden
my %p = %{$parseInfo{$hexcmd}}; my %p = %{$parseInfo{$hexcmd}};
Log3 $name, 4, "$name: read got " . $p{"name"} . " (reply code $hexcmd) with data $hexdata"; Log3 $name, 4, "$name: read got " . $p{"name"} . " (reply code $hexcmd) with data $hexdata";
readingsBeginUpdate($hash);
# Definition der einzelnen Felder abarbeiten # Definition der einzelnen Felder abarbeiten
my @fields = unpack($p{"unpack"}, $data); my @fields = unpack($p{"unpack"}, $data);
my $filter = 0;
if ($p{check}) {
Log3 $name, 5, "$name: cmd $hexcmd check is " . eval($p{check}) .
', $fields[5] = ' . $fields[5] if ($fields[5] > 15);
if (!eval($p{check})) {
Log3 $name, 5, "$name: filter data for failed check: @fields";
$filter = 1;
}
}
if (!$filter) {
readingsBeginUpdate($hash);
for (my $i = 0; $i < scalar(@fields); $i++) { for (my $i = 0; $i < scalar(@fields); $i++) {
# einzelne Felder verarbeiten # einzelne Felder verarbeiten
my $reading = $p{"readings"}[$i]{"name"}; my $reading = $p{"readings"}[$i]{"name"};
@ -583,6 +599,7 @@ ComfoAir_InterpretFrame($$)
} }
readingsEndUpdate($hash, 1); readingsEndUpdate($hash, 1);
} }
}
} else { } else {
my $level = ($hash->{INTERVAL} ? 4 : 5); my $level = ($hash->{INTERVAL} ? 4 : 5);
Log3 $name, $level, "$name: read: unknown cmd $hexcmd, len " . unpack ('C', $len) . Log3 $name, $level, "$name: read: unknown cmd $hexcmd, len " . unpack ('C', $len) .
@ -723,7 +740,7 @@ sub
ComfoAir_GetUpdate($$) { ComfoAir_GetUpdate($$) {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "ComfoAir_GetUpdate", $hash, 1) InternalTimer(gettimeofday()+$hash->{INTERVAL}, "ComfoAir_GetUpdate", $hash, 0)
if ($hash->{INTERVAL}); if ($hash->{INTERVAL});
foreach my $msgHashRef (values %parseInfo) { foreach my $msgHashRef (values %parseInfo) {
@ -763,8 +780,13 @@ ComfoAir_Send($$$;$$){
$entry{DATA} = $frame; $entry{DATA} = $frame;
$entry{EXPECT} = $expectReply; $entry{EXPECT} = $expectReply;
if(!$hash->{QUEUE} || 0 == scalar(@{$hash->{QUEUE}})) { my $qlen = ($hash->{QUEUE} ? scalar(@{$hash->{QUEUE}}) : 0);
Log3 $name, 5, "$name: send queue length : $qlen";
if(!$qlen) {
$hash->{QUEUE} = [ \%entry ]; $hash->{QUEUE} = [ \%entry ];
} else {
if ($qlen > AttrVal($name, "queueMax", 20)) {
Log3 $name, 3, "$name: send queue too long, dropping request";
} else { } else {
if ($first) { if ($first) {
unshift (@{$hash->{QUEUE}}, \%entry); unshift (@{$hash->{QUEUE}}, \%entry);
@ -772,6 +794,7 @@ ComfoAir_Send($$$;$$){
push(@{$hash->{QUEUE}}, \%entry); push(@{$hash->{QUEUE}}, \%entry);
} }
} }
}
ComfoAir_HandleSendQueue("direct:".$name); ComfoAir_HandleSendQueue("direct:".$name);
} }
@ -1030,6 +1053,8 @@ ComfoAir_SendAck($)
please note that this attribute doesn't delete already existing readings.<br> please note that this attribute doesn't delete already existing readings.<br>
<li><b>queueDelay</b></li> <li><b>queueDelay</b></li>
modify the delay used when sending requests to the device from the internal queue, defaults to 1 second <br> modify the delay used when sending requests to the device from the internal queue, defaults to 1 second <br>
<li><b>queueMax</b></li>
max length of the send queue, defaults to 50<br>
<li><b>timeout</b></li> <li><b>timeout</b></li>
set the timeout for reads, defaults to 2 seconds <br> set the timeout for reads, defaults to 2 seconds <br>
</ul> </ul>