FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Muschelpuster am 10 Oktober 2021, 22:35:58

Titel: Zeit eines cmd schreiben und auswerten
Beitrag von: Muschelpuster am 10 Oktober 2021, 22:35:58
Moin zusammen,

Ich möchte, dass eine Bedingung nur gültig ist, wenn Ausführung eines anderen CMD schon eine festgelegte Zeit her ist. Es soll also z.B. erst 15 Minuten nach dem Abschalten wieder Eingeschaltet werden, wenn aber später die eigentlichen Bedingungen passen sollen die entsprechenden Kommandos sofort ausgeführt werden.
Mein Gedanke ist es ein User-Reading zu schaffen, in welches ich durch ein zusätzliches Kommando einen Zeitstempel schreibe. Das Schreiben der Unix-Zeit ist mir gelungen, wobei es da schön einfach ist gleich X Sekunden zu addieren. Aber ich verzweifle daran, diese Informationen  in einer Bedingung auszuwerten. Zum Debugging wäre es natürlich besser mit lesbaren Zeitstempeln zu arbeiten. Aber die bekomme ich nicht einmal geschrieben...
Wer kann mich da mal bitte in die richtige Richtung treten?

Niels
Titel: Antw:Zeit eines cmd schreiben und auswerten
Beitrag von: betateilchen am 10 Oktober 2021, 23:06:01
Kannst Du nicht einfach mit ReadingsAge() arbeiten, um festzustellen, wie lange die letzte Änderung des zugehörigen (Status-)Readings her ist?

EDIT: achso, DOIF... davon hab ich keine Ahnung.
Titel: Antw:Zeit eines cmd schreiben und auswerten
Beitrag von: Damian am 11 Oktober 2021, 10:33:57
Ich würde es im Perl-Modus realisieren:

Mit set_Exec einen Timer  auf 15 Minuten setzen. Beim zweiten Schalten mit get_Exec Restzeit übernehmen und neuen set_Exec zum Einschalten setzen.
Titel: Antw:Zeit eines cmd schreiben und auswerten
Beitrag von: Muschelpuster am 13 Oktober 2021, 22:17:44
Vielen Dank an Euch!

Leider bin ich damit nicht wirklich weiter gekommen, die Ursache sitzt aber primär in Form meiner Person vor dem PC. ReadingsAge() finde ich elegant, jedoch könnte noch eine andere Bedingung dazwischen funken. Und den Perl-Modus finde ich spannend, gerade mit Sicht auf Performance, etc., doch leider fehlt es gerade an Zeit und Grundlagen mich da einzuarbeiten. Die 'normale' Übersetzung ist nicht das Thema, aber der Einbau der weiteren Anforderungen...

Aber durch mein Posting und Eure Antworten habe ich jetzt eine rustikale Lösung gebaut, die funktioniert. Ich 'ziehe einfach eine Eieruhr auf':
defmod di_einschaltsperre DOIF ([di_einschaltsperre:state] eq "cmd_2") ()\
DOELSEIF\
([di_einschaltsperre:state] eq "cmd_X") ()
attr di_einschaltsperre wait 20:0

Im eigentlichen DOIF kommt eine zusätzliche Bedingung rein, dass das Einschalten nur erfolgt, wenn der State meiner Eieruhr nicht auf cmd_2 steht und beim Ausschalten kommt ein Befehl rein, der die Eieruhr auf cmd_2 setzt.

rustikale Grüße
Niels
Titel: Antw:Zeit eines cmd schreiben und auswerten
Beitrag von: Damian am 14 Oktober 2021, 10:55:53
Zitat von: Muschelpuster am 13 Oktober 2021, 22:17:44
Vielen Dank an Euch!

Leider bin ich damit nicht wirklich weiter gekommen, die Ursache sitzt aber primär in Form meiner Person vor dem PC. ReadingsAge() finde ich elegant, jedoch könnte noch eine andere Bedingung dazwischen funken. Und den Perl-Modus finde ich spannend, gerade mit Sicht auf Performance, etc., doch leider fehlt es gerade an Zeit und Grundlagen mich da einzuarbeiten. Die 'normale' Übersetzung ist nicht das Thema, aber der Einbau der weiteren Anforderungen...

Aber durch mein Posting und Eure Antworten habe ich jetzt eine rustikale Lösung gebaut, die funktioniert. Ich 'ziehe einfach eine Eieruhr auf':
defmod di_einschaltsperre DOIF ([di_einschaltsperre:state] eq "cmd_2") ()\
DOELSEIF\
([di_einschaltsperre:state] eq "cmd_X") ()
attr di_einschaltsperre wait 20:0

Im eigentlichen DOIF kommt eine zusätzliche Bedingung rein, dass das Einschalten nur erfolgt, wenn der State meiner Eieruhr nicht auf cmd_2 steht und beim Ausschalten kommt ein Befehl rein, der die Eieruhr auf cmd_2 setzt.

rustikale Grüße
Niels

Normalerweise reagiert DOIF im FHEM-Modus nicht auf eigene Trigger. Deswegen setzen von cmd_2 und gleichzeitiges Abfragen von cmd_2 - dürfte nicht funktionieren.

Hier hier ein Vorschlag für eine Sperre im Perl-Modus:


DOIF {if ([<Trigger zum Einschalten>] and get_Exec("timer") == 0) {fhem_set("lampe on");set_Exec("timer",900,'fhem_set("lampe off")')}}

Bedeutet: Wenn Einschalttrigger kommt und Sperrtimer nicht läuft, dann Lampe einschalten und Timer auf 900 Sekunden zum Ausschalten der Lampe setzen.
Titel: Antw:Zeit eines cmd schreiben und auswerten
Beitrag von: Muschelpuster am 14 Oktober 2021, 22:00:29
Danke Damian,

Zitat von: Damian am 14 Oktober 2021, 10:55:53
Normalerweise reagiert DOIF im FHEM-Modus nicht auf eigene Trigger. Deswegen setzen von cmd_2 und gleichzeitiges Abfragen von cmd_2 - dürfte nicht funktionieren.
Ok, also nutze ich einen Bug und kein Feature  ;)
Aktuell funktioniert es, aber Du wirst den Bug schon beheben  8)

Zitat von: Damian am 14 Oktober 2021, 10:55:53
Hier hier ein Vorschlag für eine Sperre im Perl-Modus...
Ich werde das am Wochenende mal austesten, das Ziel-DOIF ist doch recht umfangreich. Ich habe bei fast jedem CMD mehrere Befehle, die ich auch mit etwas Verzögerung zueinander ausführe. Wie mache ich dass denn im Perl-Modus?

Niels
Titel: Antw:Zeit eines cmd schreiben und auswerten
Beitrag von: Damian am 15 Oktober 2021, 12:38:09
Zitat von: Muschelpuster am 14 Oktober 2021, 22:00:29
Danke Damian,
Ok, also nutze ich einen Bug und kein Feature  ;)
Aktuell funktioniert es, aber Du wirst den Bug schon beheben  8)
Ich werde das am Wochenende mal austesten, das Ziel-DOIF ist doch recht umfangreich. Ich habe bei fast jedem CMD mehrere Befehle, die ich auch mit etwas Verzögerung zueinander ausführe. Wie mache ich dass denn im Perl-Modus?

Niels

Es ist wohl kein Bug, sondern eher die Tatsache, dass du Befehle verzögerst - dann geht das.

Im Perl-Modus muss man schon umdenken. Verzögerungen gehen nur über die set_Exec-Funktion. Wenn aber deine Lösung funktioniert, dann kannst du natürlich bei ihr bleiben.