HomeMatic Timerwerte
Homematic Timerzeiten
HM Aktoren beherrschen "on for-timer" im Aktor. Die Zeiten werden dabei in einem 8 Bit Wert übergeben. Obgleich dies besser ist als bei FS20, das nur 7 bit übermittelt, sind damit nur 512 Werte möglich. Um mit diesen Werten im unteren Bereich möglichst fein aufzulösen, andererseits aber auch lange Zeiten zu ermöglichen, ist die Verteilung nicht linear.
Die Timerwerte sind dabei so aufgebaut, dass die zur Verfügung stehenden 8 Bit in einen Bereich zu 5 Bit und einen zu 3 Bit aufgespalten werden. Der 5 Bit Anteil stellt die Sekundenwerte von 1-31 dar, der 3 Bit Anteil ist ein Multipikator. Da man mit 3 Bit 8 Werte darstellen kann, gibt es 8 Multiplikatorwerte, diese sind 0.1, 1, 5, 10, 60, 300, 600 und 3600.
Damit lassen sich die zur Verfügung stehenden Timerwerte bilden.
Daraus ergeben sich folgende mögliche Werte:
- 0.1s bis 3.1s (Werte 1-31 mit Multipikator 0,1 - Auflösung 0,1 Sekunden)
- 3.2 bis 31s (Werte 1-31 mit Multipikator 1 - Auflösung 1 Sekunde)
- 31.1 bis 155s = 2min35s (Werte 1-31 mit Multipikator 5 - Auflösung 5 Sekunde)
- 155.1 bis 310s = 5min10s (Werte 1-31 mit Multipikator 10 - Auflösung 5 Sekunde)
- 310.1s bis 31min (Werte 1-31 mit Multipikator 60 - Auflösung 1 Minute)
- 31min bis 155min = 2h35min (Werte 1-31 mit Multipikator 300 - Auflösung 5 Minuten)
- 155min bis 310min = 5h10min (Werte 1-31 mit Multipikator 600 - Auflösung 10 Minuten)
- 310min bis 30h (Werte 1-31 mit Multipikator 3600 - Auflösung 1 Stunde, wobei der letzte Wert 31 Sekunden x 3600 = 31 Stunden als "immer an" interpretiert wird.
Aufgrund der überlappenden Zeitbereiche ist die Codierung nicht eindeutig. 1800 Sekunden lassen sich z.b. sowohl als 6*300 also auch als 30*600 darstellen
In FHEM genutzten Timerwerte die nicht den darstellbaren Werte entsprechen werden gerundet. Dabei scheint FHEM nicht immer den Besten, also naheliegensten Wert zu verwenden. Möglicherweise verhindert ein Bug, dass der Zeitwert 31s verwendet wird. So wird von FHEM on-for-timer 1861 auf den der Wert 1800 (6x300) gerundet, obwohl 1860 (60x31) näher wäre.
cul_hm verwendet diese Funktion um die Teimerwerte umzusetzen:
sub CUL_HM_encodeTime16($) {#################### my $v = shift; return "0000" if($v !~ m/^[+-]?\d+(\.\d+)?$/ || $v < 0.05); my $ret = "FFFF"; my $mul = 10; for(my $i = 0; $i < 32; $i++) { if($v*$mul < 0x7ff) { $ret=sprintf("%04X", ((($v*$mul)<<5)+$i)); last; } $mul /= 2; } return ($ret); }