Hallo,
habe folgendes Problem:
Ich benutze manche fs20 - Schalter, in dem sie nicht direkt das/die Geräte ansteuern, sondern das der request über fhem läuft. Da ich zwei Antennen habe, kommt das event des Schalters auch zweimal an.
Das wäre nun kein so großes Problem:
my $dt = time() - time_str2num(OldTimestamp('device'));
return undef if($dt <= 1);
Somit wird das zweite Funksignal der Antennen ignoriert.
Nun möchte ich aber auch, bzw. habe das auch schon so im Betrieb, den "Doppelklick" am Schalter zulassen, d.h. kurzes zweimaliges Drücken des Schalters tut dann was anderes, als einfaches Drücken.
Mit der obigen Abfrage darf das zweite Drücken aber erst nach mind. 2 Sekunden kommen, sonst wird es ignoriert. 2 Sekunden ist aber für einen "Doppelklick" zu lang.
Der zeitliche Abstand der beiden Funksignale ist aber nur (sicher) im Millisekunden-Bereich.
fhem kennt aber als kleinste Zeiteinheit nur 1 Sekunde.
Nun meine Frage:
Ich meine, dass ich irgendwo vor einiger Zeit mal gelesen habe, dass man fhem so umstellen kann, dass es auch 0.1 Sekunden als minimale Zeit kann.
Aber ich kann es beim besten Suchen (bevor ich gleich hier wieder den Verweis auf "Such mal schön" bekomme), nicht finden.
Wenn dies möglich ist, auf welche Funktionen wirkt sich dies dann aus?
Alle Timestamps, auch time()?
Gruß
Elektrolurch
es gibt das attribut mseclog - ich glaube das wirkt sich aber nur auf filelog aus...
Wahrscheinlich hatte ich das auch irgendwo gesehen...
...daraus folgt aber, dass es intern wohl Millisekunden gibt. Nur wie kommt man da ran?
Zitat von: Elektrolurch am 16 Juni 2014, 10:07:18
Wenn dies möglich ist, auf welche Funktionen wirkt sich dies dann aus?
Alle Timestamps, auch time()?
time liefert doch timestamps (in Sekunden!) ohnehin mit 5 Nachkommastellen, das sollte normalerweise ausreichen.
ob time() nachkomma stellen liefert hängt von der plattform (und der perl version?) ab. auf dem mac liefert es z.b. keine nackomma stellen. dokumentiert ist nur das es die anzahl der sekunden liefert.
eine höhere auflösung bekommst du z.b. mit:
my ($seconds, $microseconds) = gettimeofday();
das ist auch was mseclog verwendet.
gruss
andre
Okay:
my ($seconds, $microseconds) = gettimeofday();
das ist auch was mseclog verwendet.
aber was ist mit ReadingsTimestamp und OldTimestamp?
Ich müsste dann ja eigene Zeitstempel als Readings hinterlegen, wenn die o.g. Funktionen weiterhin nur Sekunden liefern.
Zitat von: Elektrolurch am 16 Juni 2014, 13:28:13
Ich müsste dann ja eigene Zeitstempel als Readings hinterlegen, wenn die o.g. Funktionen weiterhin nur Sekunden liefern.
so siehts aus.
schau dir mal sequence an. das kommt auch mit timeouts von < 1 sekunde zurecht.
gruss
andre
André, funktioniert das auch mit Homematic?
use Time::HiRes; ?
man müßte mal in den code reinschauen in welchem kontext time aufgerufen wird, ob die nachkommastellen nicht ohnehin ignoriert werden.
habe leider weder ahnung vom fraglichen modul noch testhardware zur verfügung. beim code helfe ich gerne ;)
florian