Bei der Steuerung der Lüftungsanlage ist mir aufgefallen, dass alle Befehle etwa 15 Minuten zu spät erzeugt werden. Soll die Anlage zum Beispiel um 8:00 Uhr auf Stufe 2 laufen, so passiert das erst um 8:15 Uhr. Die Steuerung erfolgt in der 99_MyUtils.pm in einer eigenen Methode. Dort habe ich mir jetzt die Localtime ins Log schreiben lassen. Wird mein "at" um 8 Uhr ausgeführt, so ist die Uhrzeit in der Perlmethode erst 7:59:59. Daher wird die Lüftung nicht auf Stufe 2 gesetzt, weil es noch nicht 8:00 Uhr ist.
Warum weichen die Uhrzeiten voneinander ab? Und wie bekomme ich es hin, dass ich auch die vermeintlich korrekte Uhrzeit nutzen kann? Ich habe hier diverse Beispiele mit "localtime()" gesehen. Bei mir funktioniert das aber nicht.
Folgende Definition des "at" läuft bei mir:
Internals:
COMMAND {control_air();}
DEF +*00:15 {control_air();}
NAME control_air
NR 120
NTM 14:00:00
PERIODIC yes
RELATIVE yes
REP -1
STATE Next: 14:00:00
TIMESPEC 00:15
TRIGGERTIME 1417784400
TRIGGERTIME_FMT 2014-12-05 14:00:00
TYPE at
Attributes:
alignTime 00:15
room Timer
verbose 5
Im fhem-2014-12.log steht dann
2014.12.04 14:00:00 5: exec at command control_air
2014.12.04 14:00:00 3: Current Time: 13:59:59
2014.12.04 14:00:00 5: redefine at command control_air as +*00:15 {control_air();}
control_air() sieht so aus:
sub control_air() {
#wird alle 15 Minuten aufgerufen
my ($second, $minute, $hour, $Tag, $Monat,
$Jahr, $wday, $Jahrestag, $Sommerzeit) = localtime();
Log 3, "Current Time: $hour:$minute:$second";
#noch mehr Coding ....
}
es ist halt keine "Echtzeitanwendung"
mach deine AT doch einfach ein paar Sekunden später
Ja, das wäre ein Workaround. Aber wie sage ich das dem "at"? Der ist ja auf 00:15 aligned. Muss ich mal die Commandref befragen.
EDIT: Verstehe ich aber trotzdem noch nicht so ganz. 14 Uhr ist 14 Uhr und nicht 13:59 Uhr. Woher weiß FHEM denn, wie spät es ist?
Diese Sekundenabweichung ist kein Fehler, sondern technisch bedingt fest im Modul verankert. Das hat was mit Fällen zu tun, wo ein Tageswechsel Probleme machen könnte.
Wenn Du das attribut aligned auf 00:00:02 setzt sollte alles funktionieren wie Du möchtest.
Danke betateilchen. Funktioniert!