mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-22 02:10:32 +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:
parent
f69bfa186a
commit
fac239fb38
@ -33,6 +33,9 @@
|
||||
# 2014-04-18 initial version
|
||||
# 2014-05-17 added more protocol commands, changed logging settings
|
||||
# 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;
|
||||
|
||||
@ -158,9 +161,10 @@ my %parseInfo = (
|
||||
{ name => "Proz_Abluft_hoch"},
|
||||
{ name => "Proz_Zuluft_hoch"}]},
|
||||
|
||||
"00d2" => { unpack => "CCCCCxC",
|
||||
"00d2" => { unpack => "CCCCCCC",
|
||||
name => "Temperaturen",
|
||||
request => "00d1", defaultpoll => 1,
|
||||
check => '($fields[5] & 15) == 15',
|
||||
readings => [ { name => "Temp_Komfort", expr => '$val / 2 - 20',
|
||||
set => "00D3:%02x", setexpr => '($val + 20) *2',
|
||||
setmin => 12, setmax => 28, hint => "slider,12,1,28"},
|
||||
@ -169,6 +173,7 @@ my %parseInfo = (
|
||||
{ name => "Temp_Zuluft" , expr => '$val / 2 - 20'},
|
||||
{ name => "Temp_Abluft" , expr => '$val / 2 - 20'},
|
||||
{ name => "Temp_Fortluft", expr => '$val / 2 - 20'},
|
||||
{ name => "Temp_Flag"},
|
||||
{ name => "Temp_EWT", expr => '$val / 2 - 20'}]},
|
||||
|
||||
"00de" => { unpack => "H6H6H6S>S>S>S>H6",
|
||||
@ -292,6 +297,7 @@ ComfoAir_Initialize($)
|
||||
$hash->{AttrList}= "do_not_notify:1,0 " .
|
||||
"queueDelay " .
|
||||
"timeout " .
|
||||
"queueMax " .
|
||||
#"minSendDelay " .
|
||||
join (" ", @pollList) . " " . # Def der zyklisch abzufragenden Nachrichten
|
||||
$readingFnAttributes;
|
||||
@ -560,9 +566,19 @@ ComfoAir_InterpretFrame($$)
|
||||
# Definition für diesen Nachrichten-Typ gefunden
|
||||
my %p = %{$parseInfo{$hexcmd}};
|
||||
Log3 $name, 4, "$name: read got " . $p{"name"} . " (reply code $hexcmd) with data $hexdata";
|
||||
readingsBeginUpdate($hash);
|
||||
# Definition der einzelnen Felder abarbeiten
|
||||
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++) {
|
||||
# einzelne Felder verarbeiten
|
||||
my $reading = $p{"readings"}[$i]{"name"};
|
||||
@ -583,6 +599,7 @@ ComfoAir_InterpretFrame($$)
|
||||
}
|
||||
readingsEndUpdate($hash, 1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
my $level = ($hash->{INTERVAL} ? 4 : 5);
|
||||
Log3 $name, $level, "$name: read: unknown cmd $hexcmd, len " . unpack ('C', $len) .
|
||||
@ -723,7 +740,7 @@ sub
|
||||
ComfoAir_GetUpdate($$) {
|
||||
my ($hash) = @_;
|
||||
my $name = $hash->{NAME};
|
||||
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "ComfoAir_GetUpdate", $hash, 1)
|
||||
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "ComfoAir_GetUpdate", $hash, 0)
|
||||
if ($hash->{INTERVAL});
|
||||
|
||||
foreach my $msgHashRef (values %parseInfo) {
|
||||
@ -763,8 +780,13 @@ ComfoAir_Send($$$;$$){
|
||||
$entry{DATA} = $frame;
|
||||
$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 ];
|
||||
} else {
|
||||
if ($qlen > AttrVal($name, "queueMax", 20)) {
|
||||
Log3 $name, 3, "$name: send queue too long, dropping request";
|
||||
} else {
|
||||
if ($first) {
|
||||
unshift (@{$hash->{QUEUE}}, \%entry);
|
||||
@ -772,6 +794,7 @@ ComfoAir_Send($$$;$$){
|
||||
push(@{$hash->{QUEUE}}, \%entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
ComfoAir_HandleSendQueue("direct:".$name);
|
||||
}
|
||||
|
||||
@ -1030,6 +1053,8 @@ ComfoAir_SendAck($)
|
||||
please note that this attribute doesn't delete already existing readings.<br>
|
||||
<li><b>queueDelay</b></li>
|
||||
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>
|
||||
set the timeout for reads, defaults to 2 seconds <br>
|
||||
</ul>
|
||||
|
Loading…
x
Reference in New Issue
Block a user