2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-06 18:28:44 +00:00

MAX: 002_add_retry_on_missing_ack_MAX.patch by gero

Dieser Patch enthält eine Änderung, die ich bei mir schon länger
erfolgreich am Laufen habe:
Beim Versenden von Nachrichten kommt es immer mal wieder vor, dass eine
Nachricht von einer MAX-Komponente nicht empfangen wurde und daher kein
ACK geschickt wird. Leider bekommt die "obere" Ebene nichts davon mit,
kann also auch nicht darauf regieren. Als Workaround habe ich in
14_CUL_MAX.pm Retries bei einem missing ACK eingeführt (maximal 3). Dies
hat bei mir zu einer massiven Verbesserung der missing ACK Problematik
geführt.
Ob diese Änderung fhem-konform ist, kann ich nicht beurteilen und es
bleibt natürlich dir überlassen, ob du sie einpflegen magst.

git-svn-id: https://svn.fhem.de/fhem/trunk@5282 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
mgehre 2014-03-22 10:02:33 +00:00
parent c3257aece7
commit 693d778a91
2 changed files with 17 additions and 3 deletions

View File

@ -1,6 +1,8 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- SVN
- change: MAX: interpret SetTemperature command from WT to HT
- feature: MAX: retry packets 3 times if missing an ack
- feature: new module 98_cloneDummy.pm added (Joachim)
- feature: STACKABLE_CC (busware.de device for the RPi) added
- feature: configdb export/import added for data security (betateilchen)

View File

@ -19,6 +19,8 @@ my $pairmodeDuration = 60; #seconds
my $ackTimeout = 3; #seconds
my $maxRetryCnt = 3;
sub
CUL_MAX_Initialize($)
{
@ -497,6 +499,9 @@ CUL_MAX_SendQueueHandler($$)
$packet->{sent} = 1;
$packet->{sentTime} = gettimeofday();
if(!defined($packet->{retryCnt})){
$packet->{retryCnt} = $maxRetryCnt;
}
$timeout += 0.5; #recheck for Ack
}
} # $credit10ms ne "No answer"
@ -504,9 +509,16 @@ CUL_MAX_SendQueueHandler($$)
} elsif( $packet->{sent} == 1 ) { #Already sent it, got no Ack
if( $packet->{sentTime} + $ackTimeout < gettimeofday() ) {
# ackTimeout exceeded
if( $packet->{retryCnt} > 0 ) {
Log GetLogLevel($hash->{NAME}, 5), "CUL_MAX_SendQueueHandler: Retry $packet->{dst} for $packet->{packet} count: $packet->{retryCnt}";
$packet->{sent} = 0;
$packet->{retryCnt}--;
$timeout += 3;
} else {
Log 2, "CUL_MAX_SendQueueHandler: Missing ack from $packet->{dst} for $packet->{packet}";
splice @{$hash->{sendQueue}}, $pktIdx, 1; #Remove from array
readingsSingleUpdate($hash, "packetsLost", ReadingsVal($hash->{NAME}, "packetsLost", 0) + 1, 1);
}
} else {
# Recheck for Ack
$timeout += 0.5;