FHT: Datum und Zeit von FHEM setzen lassen

Aus FHEMWiki

Läuft FHEM auf einem Rechner mit aktuellem Datum, bietet es sich an, Datum und Uhrzeit regelmäßig an alle FHTs zu senden.

Variante A

define fht_setdate notify fht_setdate { \
 if ( $year gt 2010 ) {\
  my @fhts=devspec2array("TYPE=FHT");; \
  foreach(@fhts) { \
   my $cmd="set ".$_." date time";;\
   fhem $cmd;;\
   Log 4, "sent cmd ".$cmd;;\
  } \
 } else {\
   Log 1, "error setting date for fhts: year <= 2010 - date invalid?!"\
 }\
}
define t_fht_setdate at *02:00:00 trigger fht_setdate

Die Abfrage $year gt 2010 ist eine Überprüfung, ob das Datum des FHEM Hostrechners noch stimmt oder (z.B. bei einer Fritzbox direkt nach einem Neustart) das Datum falsch ist.

Variante B

Da die Funkbefehle mit einem gewissen Zeitversatz verschickt werden, kann es unter ungünstigen Umständen passieren, dass der "time"-Befehl erst in der nächsten Stunde ausgeführt wird. Nur die Minuten werden von FHEM automatisch nachgezogen. Sofern man die Uhr jeweils zur vollen Stunde stellt wie im vorgenannten Beispiel, sollte es nie Probleme geben. Andernfalls kann man mit folgendem Code die korrekte Stunde sicherstellen:

define n_Uhrvergleich notify .*:hour.* { \
 my $zeit="$EVTPART1";; \
 if($zeit==$hour) { \
  Log(4,"Uhrzeit für $NAME erfolgreich nachgestellt.") \
 } else { \
  Log(2,"Uhr stellen bei $NAME fehlgeschlagen!");; \
  fhem("set $NAME time") \
 } \
}

Dieser notify überwacht die "hour"-Meldungen aller Geräte und vergleicht diese mit der Systemzeit. Sofern diese ungleich ist, wird der "time"-Befehl an den falsch gestellten FHT erneut abgesetzt.

Variante C

Eine recht unaufwändige Variante ist möglich, wenn alle FHTs so benannt sind, dass der Name gleich anfängt, z.B. mit "hzg" (Heizung). In diesem Fall kann das Datum aller FHTs zugleich gesetzt werden mit:

set hzg.* date

und die Zeit mit

set hzg.* time

Auch hier ist darauf zu achten, den set … time nicht kurz vor einem Stundenwechsel abzusetzen, da das ausführen von vielen FHT Befehlen durchaus einige Minuten in Anspruch nehmen kann. set … time besser kurz nach der vollen Stunde absetzen.

Variante D

Statt des Gerätename(präfixes) kann auch der Gerätetyp zur Adressierung aller FHTs verwendet werden. Die Anweisungen zum Setzen des Datums und der Zeit sehen dann folgendermaßen aus:

set TYPE=FHT date
set TYPE=FHT time

Mögliche Probleme

Vorsicht ist geboten, wenn die gesamte FHT-Installation schon mit Funkproblemen behaftet ist (siehe dazu auch Kommunikationsprobleme mit FHT). Dann kann dieses Makro eine zusätzliche Belastung darstellen, die die Kommunikation vollends zusammenbrechen lässt.

Es ist daher sinnvoll, die Datums- und Uhrzeitupdates in Zeiten zu legen, die funklastarm sind. Eine zusätzliche Entlastung kann man erreichen, indem Datum und Uhrzeit jeweils nur einmal pro Woche und an unterschiedlichen Tagen erledigt werden. Unter Verwendung der Methode aus Variante D würde das z.b. so aussehen:

define fht_dateupdate at *04:00:01 {if ($wday == 4)  { fhem("set TYPE=FHT date") } }
define fht_timeupdate at *04:00:01 {if ($wday == 5)  { fhem("set TYPE=FHT time") } }

Eine solche Entzerrung ist insbesondere dann sinnvoll, wenn viele FHT80 (mehr als ca. sechs) betrieben werden. Um das unter Variante B genannte Problem der Uhrzeit (time Befehl erst in der nächsten Stunde) zu entschärfen, ist es sinnvoll, als Ausführungsuhrzeit immer die erste Sekunde einer Stunde zu wählen, also z.b. xy:00:01

Zur zusätzlichen Funkentlastung kann das FHT Attribute "lazymode" verwendet werden. Dann wird das Datum nicht neu gesendet, wenn das am FHT80b bereits eingestellte Datum mit dem neuen Datum übereinstimmt.