Ich nutze ein DOIF, um einen dLAN-Adapter neu zu starten, der sich manchmal aufhängt. Dazu ist er mit einer HM-Steckdose verbunden, die ihn schalten kann. Das DOIF dazu sieht so aus:
Internals:
DEF ([FB_dLAN_Wintergarten] eq "absent")(set push msg title="FHEM" message="Der PowerLAN-Adapter im Wintergarten wurde neu gestartet!"; set HM_Switch_WiGa off; sleep 1; set HM_Switch_WiGa on) DOELSE ()
FUUID 5de59653-f33f-86b9-350b-37d449ff4f450659
MODEL FHEM
NAME doif_FB_dLAN_Wintergarten
NOTIFYDEV FB_dLAN_Wintergarten,global
NR 785
NTFY_ORDER 50-doif_FB_dLAN_Wintergarten
STATE cmd_2
TYPE DOIF
VERSION 20500 2019-11-12 17:54:48
READINGS:
2019-12-03 08:38:42 Device FB_dLAN_Wintergarten
2019-12-03 08:43:13 cmd 2
2019-12-03 08:43:13 cmd_event doif_FB_dLAN_Wintergarten
2019-12-03 08:43:13 cmd_nr 2
2019-12-03 08:38:42 e_FB_dLAN_Wintergarten_STATE present
2019-12-03 08:36:48 mode enabled
2019-12-03 08:43:13 state cmd_2
2019-12-03 08:38:42 wait_timer no timer
Regex:
accu:
cond:
FB_dLAN_Wintergarten:
0:
&STATE ^FB_dLAN_Wintergarten$
attr:
cmdState:
repeatcmd:
120
repeatsame:
5
wait:
waitdel:
condition:
0 ::InternalDoIf($hash,'FB_dLAN_Wintergarten','STATE') eq "absent"
do:
0:
0 set push msg title="FHEM" message="Der PowerLAN-Adapter im Wintergarten wurde neu gestartet!"; set HM_Switch_WiGa off; sleep 1; set HM_Switch_WiGa on
1:
0
helper:
DEVFILTER ^global$|^FB_dLAN_Wintergarten$
NOTIFYDEV global|FB_dLAN_Wintergarten
event present,presence: present
globalinit 1
last_timer 0
sleepdevice FB_dLAN_Wintergarten
sleepsubtimer 0
sleeptimer -1
timerdev
timerevent present,presence: present
timerevents
timereventsState
triggerDev
internals:
all FB_dLAN_Wintergarten:STATE
readings:
trigger:
uiState:
uiTable:
Attributes:
do always
repeatcmd 120
repeatsame 5
room System
Wie müsste ich das DOIF modifizieren, damit nach dem erreichen von repeatsame die Steckdose nur ausgeschaltet, aber nicht wieder eingeschaltet wird, wenn der dLAN-Adapter "absent" bleibt? Gibt es sowas wie eine "DOREPEATSAME", dass nach dem repeatsame=n+1. Mal ausgeführt wird?
Du musst es schaffen einen Zustandswechsel des Moduls zu provozieren, um repeadcmd zu unterbrechen. Dazu bräuchtest du eine zweite Bedingung, die wahr wird, wenn der Timer nicht mehr läuft, dafür kannst du das Reading wait_timer abfragen. Allerdings musst du das Attribut Selftrigger aktivieren, damit du auf eigene Events reagieren kannst.
Ich würde diese Aufgabe in DOIF-Perl programmieren.
([FB_dLAN_Wintergarten] eq "absent")
(set HM_Switch_WiGa off,set push msg title="FHEM" message="Der PowerLAN-Adapter im Wintergarten wurde neu gestartet!")
(set HM_Switch_WiGa on)
(set HM_Switch_WiGa off,set push msg title="FHEM" message="Der PowerLAN-Adapter im Wintergarten wurde deaktiviert!")
([FB_dLAN_Wintergarten] ne "absent")
attr wait 0,1,60:0
Nebenbei: Befehlstrenner bei DOIF ist das Komma (für sleep gilt eine Ausnahme, dort wird erst von Perl getrennt).
Vielen Dank Euch beiden für die raschen Antworten. Ich hatte gehofft, dass es in DOIF schon ein einfache Funktion gibt, die eine Reaktion auf diesen Moment im Entscheidungsbaum ermöglicht, zu dem repeatsame
führt.
Ich habe zuerst versucht, ein zweites DOIF aufzusetzen, welches aus cmd_count
und wait_timer
versucht, den Moment abzugreifen - aber das lief nicht wirklich rund, da ich da wohl noch was falsch gemacht habe.
Danach habe ich den Vorschlag von Per ausprobiert, wobei ich erstmal verstehen musste, wie der funktioniert. Habe ich es richtig verstanden, dass cmd_1_3 normalerweise nicht zur Ausführung kommt, da vorher der Adapter wieder online ist und während wait
läuft geschaut wird, ob das DOIF-Kriterium noch gültig ist? Klingt genau nach dem, was ich gerne machen würde. :D
In der Ausführung ist mir das allerdings noch nicht ganz gelungen, da stets alle drei commands nacheinander ausgeführt wurden (auch wenn ich den Zeitpuffer auf die notwendigen 2 Minuten erhöht habe). Vielleicht habe ich aber auch noch die falsche Kombination von Attributen genutzt?
attr wait 0,1,120:0
attr repeatsame 3
attr repeatcmd 120
attr do always
Danke Euch für Feedback
Zitat von: Rudibarani am 04 Dezember 2019, 13:16:15Habe ich es richtig verstanden
Zumindest war es von mir genauso gemeint ;)
Zitat von: Rudibarani am 04 Dezember 2019, 13:16:15da stets alle drei commands nacheinander ausgeführt wurden
Hast du auch die Klammern auf Befehlsseite richtig gesetzt?
Zitat von: Rudibarani am 04 Dezember 2019, 13:16:15Vielleicht habe ich aber auch noch die falsche Kombination von Attributen genutzt?
wait sollte ausreichen.
Danke, Per.
Ich habe das Device neu angelegt und dann lief es ;D
Damit ich attr repeatsame 3 replizieren kann, habe ich die Wiederholungen direkt eingebaut:
([FB_dLAN_Wintergarten] eq "absent")
(set HM_Switch_WiGa off,set push msg title="FHEM" message="Der PowerLAN-Adapter im Wintergarten wurde neu gestartet!")
(set HM_Switch_WiGa on)
(set HM_Switch_WiGa off,set push msg title="FHEM" message="Der PowerLAN-Adapter im Wintergarten wurde neu gestartet!")
(set HM_Switch_WiGa on)
(set HM_Switch_WiGa off,set push msg title="FHEM" message="Der PowerLAN-Adapter im Wintergarten wurde neu gestartet!")
(set HM_Switch_WiGa on)
(set HM_Switch_WiGa off,set push msg title="FHEM" message="Der PowerLAN-Adapter im Wintergarten wurde deaktiviert!")
([FB_dLAN_Wintergarten] ne "absent")
und wait ist als einziges Attribut gesetzt:
attr wait 0,1,120,1,120,1,120:0
Danke für die Hilfe!