Hallo Rudolf,
hier mal die diff Variante. Nur die relevanten Änderungen sind drin, da ich ja in der Version schon hinterher hänge:
30c30
< # $Id: fhem.pl 5663 2014-04-26 09:13:54Z rudolfkoenig $
---
> # $Id: fhem.pl 5728 2014-05-03 09:41:12Z rudolfkoenig $
519,521d524
< # handle device not sending data until a timeout defined by the device module
< my $acttime = gettimeofday();
<
524,577d526
<
< # handle device not sending data until a timeout defined by the device module
< # shows also a little statistics for execution of the device ReadFn
< #
< # in device module do
< # define $hash->{LastReadTimeout} with the read timeout in seconds
< # define $hash->{ReadTimeoutFn} with the reference to the handler function for read timeouts
< #
< # example for CUL:
< #
< # add timeout function
< # sub CUL_ReadTimeoutFn($)
< # {
< # my ($hash) = @_;
< # my $name = $hash->{NAME};
< #
< # Log3 $name, 1, "CUL_ReadTimeoutFn: $name Read timeout seen on serial port";
< #
< # DevIo_Disconnected($hash);
< #
< # return undef;
< # }
< #
< # in CUL_Define function add
< # $hash->{ReadTimeoutFn} = \&CUL_ReadTimeoutFn;
< # $hash->{LastReadTimeout} = 300; # 300 seconds timeout, resonable for e.g. Homematic TH Sensors which continously send data in about 2 minutes interval
< #
< # in CUL_Undef function add
< # delete($hash->{ReadTimeoutFn});
< # delete($hash->{LastReadTime});
< # delete($hash->{LastReadTimeout});
< # delete($hash->{LastReadTDmax});
< # delete($hash->{LastReadTDmean});
< # delete($hash->{LastReadTDN});
< # delete($hash->{LastReadTD});
< # delete($hash->{LastReadTimeoutDetected});
<
< if(defined($hash->{LastReadTimeout}))
< {
< if (defined($hash->{LastReadTime}))
< {
< # handle timeout of receiving data from device
< my $td = $acttime - $hash->{LastReadTime};
< if($td > $hash->{LastReadTimeout})
< {
< Log 1, "Try ReadTimeoutFn $hash->{NAME}";
< $hash->{LastReadTimeoutDetected}++;
< $hash->{ReadTimeoutFn}->($hash) if(defined($hash->{ReadTimeoutFn}));
< $hash->{LastReadTime} = $acttime; #needed, else timeout forever after timeout
< next;
< }
< }
< }
<
627,630d575
<
< # handle device not sending data until a timeout defined by the device module
< $acttime = gettimeofday();
<
638,664d582
<
< # handle device not sending data until a timeout defined by the device module
< if(defined($hash->{LastReadTimeout}))
< {
< # do ReadFn statistics
< if(defined($hash->{LastReadTime}))
< {
< my $td = $acttime - $hash->{LastReadTime};
< my $mean = $hash->{LastReadTDmean} * $hash->{LastReadTDN};
< $hash->{LastReadTDN}++;
< if ($hash->{LastReadTDN} > 0)
< {
< $mean /= $hash->{LastReadTDN};
< $mean += $td / $hash->{LastReadTDN};
< $hash->{LastReadTDmean} = $mean;
< }
< else
< {
< $hash->{LastReadTDN} = 0;
< }
< $hash->{LastReadTD} = $td;
< $hash->{LastReadTDmax} = $td if($td > $hash->{LastReadTDmax});
< }
< # set last ReadFn time stamp
< $hash->{LastReadTime} = $acttime;
< }
<
Ich hatte es erst mit Farben im Code versucht, aber leider will Code nicht mit Farbe. Ob der Diff nun besser ist?
- ich bin leider kein diff/patch experte, also berichtige mich bitte, wenn ich eine wichtige Option nicht verwendet habe
- ich wollte die Ergänzungen irgendwie im Zusammenhang darstellen, damit direkt klar wird, was es bedeutet
- select timeout hilft in diesem Fall leider nicht. Der timeout bei select führt zum Blockieren von select bis was (von einem der gewählten Geräte) kommt oder der timeout abläuft. Wenn bis zum select timeout nichts von irgendeinem Gerät kommt, steht FHEM so lange. Ich halte es für keine gute Idee, FHEM für in diesem Fall 5 Minuten anzuhalten, wenn keine Daten kommen (ein Thread!).
- Wenn nichts kommt, wird ReadFn nicht aufgerufen. Auch keine andere Funktion. Also kann ich im CUL Modul nicht feststellen dass nichts kommt, höchstens über einen Timer in der ReadFn Funktion. Den kann ich aber nicht selektiv löschen (es werden immer alle Timer für einen Hash gelöscht), wenn doch was kommt (ReadFn wird aufgerufen), ohne alle laufenden CUL Timer mit ins Nirvana zu reißen
- Oder ein ständig pollender Timer im CUL Modul. Auch nicht fein und wehe es werden doch mal in einer zukünftigen Version die Timer gelöscht.
- in meinem Fall wird auch kein Fehler von select geliefert, ich kann auf nichts reagieren, weil einfach gar nichts passiert
- mir ist nicht klar, wie ich solch eine Timeout Funktionalität sinnvoll mit watchdog o.ae. ausserhalb von fhem.pl erreichen kann???
- so ist es allgemein nutzbar. Habe ich auch gleich für USBWX genutzt.
- klar kann man Timing Statistik auch anders ermitteln. Muss auch nicht sein. Ich brauche nur den Zeitstempel. Ich fand es halt praktisch so, weil direkt beim Gerät im Blick.
Gruß, Ansgar.