[Solved] Befehl ausführen, wenn "repeatsame" erreicht ist

Begonnen von Rudibarani, 03 Dezember 2019, 09:07:10

Vorheriges Thema - Nächstes Thema

Rudibarani

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?

Damian

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

Per

([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).

Rudibarani

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

Per

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.

Rudibarani

#5
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!