FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Gisbert am 31 Dezember 2020, 13:05:59

Titel: repeatsame
Beitrag von: Gisbert am 31 Dezember 2020, 13:05:59
Hallo Damian,

gibt es im Ausführungsteil eine Möglichkeit die Ausführung mehrfach, aber unterschiedlich oft auszuführen? repeatsame führt alle Ausführungen gleich oft aus, und es gibt anscheinend nicht sowas repeatsame 2,1,1,...:1:...

Viele​ Grüße​ Gisbert​
Titel: Antw:repeatsame
Beitrag von: Frank_Huber am 31 Dezember 2020, 14:05:29
Hallo Gisbert,

Das geht pro Zweig: https://fhem.de/commandref_DE.html#DOIF_repeatsame
Aber wenn ich deinen Post richtig verstehe brauchst Du es auch pro Kommando IM Zweig, richtig?
Das geht imho nicht.

Grüße & guten Rutsch
Frank
Titel: Antw:repeatsame
Beitrag von: Gisbert am 31 Dezember 2020, 14:56:14
Zitat von: Frank_Huber am 31 Dezember 2020, 14:05:29
Hallo Gisbert,

Das geht pro Zweig: https://fhem.de/commandref_DE.html#DOIF_repeatsame
Aber wenn ich deinen Post richtig verstehe brauchst Du es auch pro Kommando IM Zweig, richtig?
Das geht imho nicht.

Grüße & guten Rutsch
Frank

Hallo Frank,
ja, das ist richtig.
In der Zwischenzeit habe ich eine Lösung gefunden, die getestet bei mir funktioniert. Ich frage im Ausführungsteil ab, ob cmd_count kleiner als die gewünschte Zahl ist. Das hört sich ohne Beispiel etwas verdrechselt an, ein Beispiel sieht so aus:
defmod Bad.Alarm DOIF (($md le "06-01" or $md ge "09-01") and (0.1*[?Temp.OG:Badezimmer]+1.75*[Temp.OG:Badezimmer:diff20]) <= 0 or [Temp.OG:Badezimmer] < 20.0) \
((set Pushover.Nachricht msg 'Badezimmer' 'Das Fenster im Bad steht wahrscheinlich offen')) \
((set PushNotifier.Nachricht message Badezimmer_Das Fenster im Bad steht wahrscheinlich offen)) \
(set Pushbullet.Nachricht message Das Fenster im Bad steht wahrscheinlich offen | Badezimmer) \
(IF ([$SELF:cmd_count] < 2) (set DLNA_f47b5e48e6d6 channel 5)) \
(IF ([$SELF:cmd_count] < 2) (define temp.TV.exit at +00:00:12 set DLNA_f47b5e48e6d6 stop)) \
DOELSEIF ((0.1*[?Temp.OG:Badezimmer]+1.75*[Temp.OG:Badezimmer:diff20]) > 0 or [Temp.OG:Badezimmer] >= 20.0)
attr Bad.Alarm devStateIcon cmd_1:fts_window_2w_open@red cmd_2:fts_window_2w@gray
attr Bad.Alarm do always
attr Bad.Alarm event_Readings diff20: {round([Temp.OG:Badezimmer:diff20],2)}
attr Bad.Alarm repeatsame 2:1

Damit werden die Push-Nachrichten zweimal aufs Handy geschickt (;) doppelt hält besser, also hier insgesamt 6 Nachrichten, da 3 Dienste bemüht werden ;D), aber auf dem Fernseher kommt die Nachricht nur einmal an. Ich weiß, der Spieltrieb ist mal wieder mit mir durchgegangen.

Viele Grüße Gisbert

PS: Falls jemand noch eine elegantere Lösung einfällt, dann gerne posten.
Edit: Um mögliche, clevere Vorschläge nicht zu verhindern, warte ich noch etwas mit dem [Gelöst] im Eingangs-Thread.
Titel: Antw:repeatsame
Beitrag von: Damian am 31 Dezember 2020, 17:46:50
Wie schon erkannt: repeatsame funktioniert nicht mit Befehlssequenzen.

Ich würde Wiederholungen mit zeitlicher Verzögerung mit set_Exec realisieren. Für Wiederholungen ohne zeitliche Verzögerung, würde ich mir fhem_set_repeat("<Befehl>",<Anzahl) als Perlfunktion basteln. Dafür müsste man DOIF im Perlmodus sinnvollerweise nutzen.