Moin,
ich bin dabei ein DOIF zu schreiben, das mehrere if-Hierarchien benötigt. Deshalb will ich es einmal im Perl-Modus versuchen.
Mein erstes Problem: Zu Begin wird ein Zeitstempel in einer Variablen gespeichert:
init { $_timer = POSIX::strftime("%H:%M:%S",localtime(time+1800))}
Die Variable soll dann als Trigger in einer if Anweisung genutzt werden.Also wie im commadref beschrieben:
DOIF
...
{[08:00];...}
...
Also an Stelle der 8:00 soll dann die Variable $_time genutzt werden. Ich verzweifle allerdings am Syntax, der Trigger löst nicht aus.
Wie muss der Code dafür lauten?
Alternativ wäre es auch möglich den Zeitstempel in einem Reading abzulegen.
DOIF -> indirekte Zeitangaben
Indirekte Zeiten gehen nur über Readings: https://fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben
Moin,
danke für die Hinweise. Es funktioniert jetzt.
Entscheidend war jetzt tatsächlich, dass ein Reading genutzt werden muss. Ich speichere den Zeitstempel also erst gar nicht erst in einer Variablen, sondern gleich im Reading
Das reicht aber noch nicht, beim Schreiben in das Reading muss auch der Trigger auf 1 gesetzt werden, sonst wird der Timer nicht aktualisiert.
Das sieht jetzt so aus:
defmod Schalter DOIF
## Schalter an, Timer setzen
{ if ([Schalter] eq "on")
{set_Reading("time_off",POSIX::strftime("%H:%M:%S",localtime(time+10)),1)}
}
## Timer zur Überprüfung ist abgelaufen, Aktor aus
{[[Schalter:time_off]];fhem_set"Aktor off"}
Wichtig ist ebenfalls auch, dass die Zeitangabe mit dem Devicenamen ("Schalter:time_off") erfolgen muss, dass Reading alleine reicht nicht.
Das scheint mir aber die komplizierteste Art und Weise zu sein, etwas verzögert auszuführen ;)
bessere Alternativen:
Perl-Mode
defmod Schalter DOIF {if ([Schalter] eq "on") {set_Exec("timer",10,'fhem_set"Aktor off"')}}
FHEM-Mode
defmod Schalter DOIF ([Schalter] eq "on") (set Aktor off)
attr Schalter wait 10
Zitat von: Damian am 25 Mai 2019, 18:41:52
Das scheint mir aber die komplizierteste Art und Weise zu sein, etwas verzögert auszuführen ;)
Das ist richtig.
Aber wie ich eingangs schon geschrieben habe, kommen da jetzt noch mehrere if-Hierarchien nach dem Timer. Das DOIF wird wächst also gerade noch ..., dies war nur meine erste Hürde, nun geht es weiter.
Zitat von: alru am 25 Mai 2019, 18:48:05
Das ist richtig.
Aber wie ich eingangs schon geschrieben habe, kommen da jetzt noch mehrere if-Hierarchien nach dem Timer. Das DOIF wird wächst also gerade noch ..., dies war nur meine erste Hürde, nun geht es weiter.
Gerade dann solltest du für Verzögerungen im Perl-Mode mit set_Exec arbeiten und die Hierarchien in eine Routine auslagern: https://fhem.de/commandref_DE.html#DOIF_Anwendungsbeispiele_im_Perlmodus
Zitatkommen da jetzt noch mehrere if-Hierarchien nach dem Timer
So etwas gehört in ein richtiges Perl-Unterprogramm, um es einigermaßen wartbar zu machen.
LG
pah
OK, ok, aber sooooo groß wird das (hoffentlich) doch nicht. Derzeit ist bei 2 x 3 if-Stufen (plus jeweiliger else Verzweigung) schluss. Viel mehr kann da eigentlich nicht dazu kommen.
Aber ich schau mir die Alternativen in jedem Fall an. Ich mache bisher nur "zaghafte Ausflüge" in Perl.
Zitat von: alru am 25 Mai 2019, 19:02:59
OK, ok, aber sooooo groß wird das (hoffentlich) doch nicht. Derzeit ist bei 2 x 3 if-Stufen (plus jeweiliger else Verzweigung) schluss. Viel mehr kann da eigentlich nicht dazu kommen.
Aber ich schau mir die Alternativen in jedem Fall an. Ich mache bisher nur "zaghafte Ausflüge" in Perl.
kein Problem, allerdings würde deine Lösung nicht gut funktionieren, weil du einen Zeittrigger setzt, der jeden Tag wiederholt wird ;)
Das hätte ich jetzt glatt übersehen, da im Timer-Reading das Datum mitgeschrieben wird.
Ich schreibe jetzt also noch das Datum in das Reading "time_off", dann sollte es funktionieren, oder?
Zitat von: alru am 25 Mai 2019, 19:11:52
Das hätte ich jetzt glatt übersehen, da im Timer-Reading das Datum mitgeschrieben wird.
Ich schreibe jetzt also noch das Datum in das Reading "time_off", dann sollte es funktionieren, oder?
Leider nein. Diese Zeittrigger werden ohne Datum definiert und wiederholen sich täglich. Sie sind für dein Vorhaben ungeeignet.
Zitat von: Damian am 25 Mai 2019, 19:22:43
Leider nein. Diese Zeittrigger werden ohne Datum definiert und wiederholen sich täglich. Sie sind für dein Vorhaben ungeeignet.
OK, ich schreibe jetzt zusätzlich zur Trigger-Zeit auch noch das Datum in ein Reading. Das wird dann zusätzlich abgefragt:
defmod Schalter DOIF
## Schalter an, Timer und Datum setzen
{ if ([Schalter] eq "on")
{set_Reading("time_off",POSIX::strftime("%H:%M:%S",localtime(time+10)),1);
set_Reading("date_off",$ymd,0)}
}
## Timer zur Überprüfung ist abgelaufen, Aktor aus
{ if ([[Schalter:time_off]] and $ymd = [Schalter:date_off]) {fhem_set"Aktor off"} }
OK, kann man machen. Jetzt muss du mir noch den Vorteil deiner Vorgehensweise erklären, denn abgesehen von den Nachteilen, dass man statt einer Zeile mehrere braucht und unnötig einmal pro Tag der Zeittrigger triggert, sehe ich keinen (das Auslagern in eigene Funktionen haben wir schon geklärt).
Zitat von: Damian am 25 Mai 2019, 21:41:33
OK, kann man machen. Jetzt muss du mir noch den Vorteil deiner Vorgehensweise erklären, ...
In der Tat, das ist nun alles andere als elegant. Ich werde mich wohl doch mal mit den o.g. Lösungen beschäftigen müssen.
Moin,
mein Ansatz hat mich nun doch nicht mehr überzeugt.
Ich habe das DOIF jetzt umgeschrieben (war selbst für mich gar nicht so schwer) und die Funktionen
verwendet. Für den Einsatz von Timern ist das tatsächlich eine richtig gute Lösung. Danke noch mal für die Hinweise.
Zitat von: alru am 26 Mai 2019, 12:05:26
Moin,
mein Ansatz hat mich nun doch nicht mehr überzeugt.
Ich habe das DOIF jetzt umgeschrieben (war selbst für mich gar nicht so schwer) und die Funktionen
verwendet. Für den Einsatz von Timern ist das tatsächlich eine richtig gute Lösung. Danke noch mal für die Hinweise.
Es kommt drauf an, was man will. Will man eine typische "Zeitschaltuhr" bauen, dann sind natürlich DOIF-Zeittrigger-Angaben die bessere Wahl, wie z. B. hier für die Vorwahl von Temperaturen: https://forum.fhem.de/index.php/topic,84969.msg848315.html#msg848315