[gelöst] Zeit-Trigger als Variabel (Perl-Modus)

Begonnen von alru, 24 Mai 2019, 21:11:33

Vorheriges Thema - Nächstes Thema

alru

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.
Gruß,

Stefan
(Raspi 3B / HM-LGW / HomeMatic / MySensors)

Ellert


Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

alru

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.
Gruß,

Stefan
(Raspi 3B / HM-LGW / HomeMatic / MySensors)

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

alru

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.
Gruß,

Stefan
(Raspi 3B / HM-LGW / HomeMatic / MySensors)

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Prof. Dr. Peter Henning

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

alru

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.
Gruß,

Stefan
(Raspi 3B / HM-LGW / HomeMatic / MySensors)

Damian

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 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

alru

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?
Gruß,

Stefan
(Raspi 3B / HM-LGW / HomeMatic / MySensors)

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

alru

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"} }
Gruß,

Stefan
(Raspi 3B / HM-LGW / HomeMatic / MySensors)

Damian

#13
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).
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

alru

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.
Gruß,

Stefan
(Raspi 3B / HM-LGW / HomeMatic / MySensors)