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:
parent
f69bfa186a
commit
fac239fb38
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user