Frage DOIF und manuelle Übersteuerung

Begonnen von howy-1, 06 Dezember 2022, 21:55:34

Vorheriges Thema - Nächstes Thema

howy-1

Hallo zusammen,

mich plagt seit neuestem die Frage der manuellen Übersteuerung eines schon länger funktionierenden DOIF.

Ich lasse in Abhängigkeit von 3 Anwesenheiten, Helligkeit und ob TV oder (WLAN-)Radio eingschaltet ist, mittels DOIF verschiedene Lampen schalten.
Das DOIF funktioniert seit bestimmt 2 Jahren sehr gut und schaltet, wie es soll.

Wenn ich allerdings manuell am TabletUI die jeweilige Lampe außerhalb der erfüllten Bedingungen schalte, ist klar, dass DOIF dazwischenfunkt und den "richtigen" Zustand wieder herstellt.
Im DOIF ist "do always" gesetzt.  Wenn ich es richtig verstanden habe, prüft dieses ja regelmäßig, ob die Bedingungen vorhanden sind und schaltet cmd1 oder cmd2.

Würde es mir zu manuellen Übersteuerung helfen, anstatt im TabletUI die Lampe selber zu schalten, dort beim DOIF auf cmd1 oder cmd2 setzen zu lassen und das "do always" rauszunehmen?

Mein Gedanke:   
- Lampe manuell einschalten am TabletUI -> im DOIF wird cmd1 gesetzt, Lampe leuchtet und bleibt auch an.

- irgendwann sind im DOIF auch die Bedingungen für cmd1 erfüllt -> cmd1 ist aber ja schon gesetzt -> es passiert nichts weiter.

- die Bedingungen für cmd2 sind irgendwann erfüllt -> Lampe wird von DOIF ausgeschaltet.     

Verstehe ich richtig, dass "do always" immer prüft, ob die Bedingungen wahr sind und wenn ich das rausnehme, greift DOIF nur wenn sich der Zustand einer der Bedingungen ändert? 

Grüße, Dirk

howy-1

Ich habe mal ein wenig probiert:

Nehme ich im DOIF das "do always" raus, und schalte das Device selber, per "set Lampe on", dann müsste sie doch eingeschaltet bleiben, bis beim DOIF die Bedingungen fürs ausschalten erfüllt sind (DOELSE). 
Und andersrum, wenn man ausschaltet, obwohl die DOIF-Bedingungen sagen, es müsste eigentlich eingeschaltet sein, bleibt es bis zum nächsten Mal aus.

Also ohne "do always" ändert sich der Status immer entsprechend der Bedingungen, aber der jeweilige Schaltbefehl wird nur einmal ausgeführt, bis sich die Bedingungen wieder ändern. Das heißt, dazwischen kann man manuell rumschalten, wie man möchte.

Ist das so richtig verstanden?


Damian

#2
Wenn du schon was probiert hast, dann poste mal deine Definition. Du merkst an der geringen Resonanz, dass die Leute mit deinen Fragen nicht viel anfangen können, wenn sie keine konkrete Ausgangsbasis in Form einer Definition haben - philosophieren kann man viel, die Zeit dafür ist aber viel zu kostbar :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

howy-1

Hallo Damian,

Zitat von: Damian am 07 Dezember 2022, 21:46:31
Wenn du schon was probiert hast, dann poste mal deine Definition. Du merkst an der geringen Resonanz, dass die Leute mit deinen Fragen nicht viel anfangen können, wenn sie keine konkrete Ausgangsbasis in Form einer Definition haben - philosophieren kann man viel, die Zeit dafür ist aber viel zu kostbar :)

mir gehts einfach nur um das Verständnis, was "do always" macht, und was nicht bzw. wie ich ein DOIF übersteuern kann.
In der Einsteiger-Doku steht irgendwo was, dass ohne "do always" es sein kann, dass nur ein Mal geschaltet wird und dann nicht wieder. So hab ich es verstanden. Deshalb überall das "do always" reingemacht. 
Wird nun das Device außerhalb der Schaltzeiten manuell am TabletUI geschaltet, korrigiert das DOIF das sofort wieder, so dass es zu den Bedingungen passt.

Nehme ich "do always" raus, kann ich zwischendurch manuell rumschalten wie ich will, DOIF greift erst ein, wenn sich in den Bedingungen was ändert.  Richtig?


Also praktisch ohne "do always":   
DOIF schaltet wenn der TV an ist die Lampe 18 Uhr ein und 23 Uhr wieder aus.

Schalte ich vorher manuell die Lampe ein, wird sie 23 Uhr automatisch von DOIF wieder ausgeschaltet.

Schalte ich die Lampe 21 Uhr aus, bleibt sie aus und wird erst am nächsten Tag 18 Uhr wieder eingeschaltet, wenn der TV an ist.

Richtig?

Vielleicht ist diese Frage auch zu banal, meine Suche diesbezüglich brachte mir nur Lösungen zu viel komplizierteren Problemen.

Damian

Zitat von: howy-1 am 07 Dezember 2022, 22:22:44

Wird nun das Device außerhalb der Schaltzeiten manuell am TabletUI geschaltet, korrigiert das DOIF das sofort wieder, so dass es zu den Bedingungen passt.


Nein. DOIF korrigiert nichts von alleine, wenn es in der Bedingung nicht vorkommt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

howy-1

Zitat von: Damian am 07 Dezember 2022, 22:32:18
Nein. DOIF korrigiert nichts von alleine, wenn es in der Bedingung nicht vorkommt.

Wenn ich "do always" im DOIF drin habe, die Bedingungen zum einschalten der Lampe gegeben sind, schaltet DOIF sie ein. Schalte ich sie wieder manuell aus, schaltet DOIF sie gleich wieder ein.  Das meinte ich mit "korrigieren".

Nach nochmaligen lesen in der Doku, denke ich, dass ich es nun verstanden habe:

Zitatdo always

Ohne do always gilt:Die Befehle eines Bedingungszweiges werden ohne vorherigen Statuswechsel nur einmal ausgeführt.

Das Attribut setzt diese Regel ausser Kraft. Befehle werden wiederholt im bestehenden Status ausgeführt.

Also wird ohne "do always" genau ein Mal von DOIF eingeschaltet. Schalte ich manuell wieder aus, bleibt es ausgeschaltet.
DOELSE schaltet den Status auf cmd2, der (Aus-)Schaltbefehl wird abgeschickt, die Lampe ist aber schon aus und bleibt aus.
Werden beim nächsten Mal die Bedingungen wahr, schaltet DOIF wieder auf cmd1 und der Schaltbefehl wird abgeschickt, genau ein Mal, und das Licht geht wieder an. War es vorher schon an (manuell geschaltet), dann wars halt so und gut.

Ok?

Damian

Zitat von: howy-1 am 07 Dezember 2022, 22:46:37
Wenn ich "do always" im DOIF drin habe, die Bedingungen zum einschalten der Lampe gegeben sind, schaltet DOIF sie ein. Schalte ich sie wieder manuell aus, schaltet DOIF sie gleich wieder ein.  Das meinte ich mit "korrigieren".

Nach nochmaligen lesen in der Doku, denke ich, dass ich es nun verstanden habe:

Also wird ohne "do always" genau ein Mal von DOIF eingeschaltet. Schalte ich manuell wieder aus, bleibt es ausgeschaltet.
DOELSE schaltet den Status auf cmd2, der (Aus-)Schaltbefehl wird abgeschickt, die Lampe ist aber schon aus und bleibt aus.
Werden beim nächsten Mal die Bedingungen wahr, schaltet DOIF wieder auf cmd1 und der Schaltbefehl wird abgeschickt, genau ein Mal, und das Licht geht wieder an. War es vorher schon an (manuell geschaltet), dann wars halt so und gut.

Ok?

Nein. Du merkst wie philosophieren schon.

Wenn du die Lampe aus machst und in der Bedingung der Zustand der Lampe nicht abgefragt wird, dann passiert auch bei do always gar nichts.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

howy-1

Zitat von: Damian am 07 Dezember 2022, 22:51:27
Nein. Du merkst wie philosophieren schon.

Wenn du die Lampe aus machst und in der Bedingung der Zustand der Lampe nicht abgefragt wird, dann passiert auch bei do always gar nichts.

Achso?  Wer macht denn dann mit gesetztem "do always" immer das Licht wieder aus, wenn ich es eingeschaltet habe und andersrum auch?

ZitatInternals:
   CFGFN     
   DEF        (([Wohnzimmer_TV:state] eq "on" or [pr_KaRadio2:state] eq "present" or [pr_KaRadio3:state] eq "present"or [pr_KaRadio5:state] eq "present") and [T:light] < 5)  (set Testlampe on) DOELSE (set Testlampe off)
   FUUID      6390ef8b-f33f-2ba6-ad6e-861d2f69db6d3396
   MODEL      FHEM
   NAME       di_Testlampe
   NOTIFYDEV  pr_KaRadio3,pr_KaRadio2,global,pr_KaRadio5,Wohnzimmer_TV,T
   NR         314251
   NTFY_ORDER 50-di_Testlampe
   STATE      cmd_2
   TYPE       DOIF
   VERSION    26703 2022-11-14 16:43:41
   eventCount 59
   READINGS:
     2022-12-08 06:53:02   Device          pr_KaRadio3
     2022-12-08 06:53:03   cmd             2
     2022-12-08 06:53:03   cmd_event       pr_KaRadio3
     2022-12-08 06:53:03   cmd_nr          2
     2022-12-08 06:40:46   e_T_light       2
     2022-12-07 21:49:59   e_Wohnzimmer_TV_state off
     2022-12-08 06:52:27   e_pr_KaRadio2_state absent
     2022-12-08 06:53:02   e_pr_KaRadio3_state absent
     2022-12-08 06:52:27   e_pr_KaRadio5_state absent
     2022-12-07 21:20:57   mode            enabled
     2022-12-08 06:53:03   state           cmd_2
     2022-12-08 06:53:03   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       T:
         0:
           light      ^T$:^light:
       Wohnzimmer_TV:
         0:
           state      ^Wohnzimmer_TV$:^state:
       pr_KaRadio2:
         0:
           state      ^pr_KaRadio2$:^state:
       pr_KaRadio3:
         0:
           state      ^pr_KaRadio3$:^state:
       pr_KaRadio5:
         0:
           state      ^pr_KaRadio5$:^state:
   attr:
     cmdState:
     wait:
       0:
         0
       1:
         1
     waitdel:
   condition:
     0          (::ReadingValDoIf($hash,'Wohnzimmer_TV','state') eq "on" or ::ReadingValDoIf($hash,'pr_KaRadio2','state') eq "present" or ::ReadingValDoIf($hash,'pr_KaRadio3','state') eq "present"or ::ReadingValDoIf($hash,'pr_KaRadio5','state') eq "present") and ::ReadingValDoIf($hash,'T','light') < 5
   do:
     0:
       0          set Testlampe on
     1:
       0          set Testlampe off
   helper:
     NOTIFYDEV  pr_KaRadio3,pr_KaRadio2,global,pr_KaRadio5,Wohnzimmer_TV,T
     event      absent,presence: absent
     globalinit 1
     last_timer 0
     sleepdevice pr_KaRadio3
     sleepsubtimer -1
     sleeptimer -1
     timerdev   pr_KaRadio3
     timerevent absent,presence: absent
     triggerDev pr_KaRadio3
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: pr_KaRadio3
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: pr_KaRadio3
       state: cmd_2
     timerevents:
       absent
       presence: absent
     timereventsState:
       state: absent
       presence: absent
     triggerEvents:
       absent
       presence: absent
     triggerEventsState:
       state: absent
       presence: absent
   internals:
   readings:
     all         Wohnzimmer_TV:state pr_KaRadio2:state pr_KaRadio3:state pr_KaRadio5:state T:light
   trigger:
   uiState:
   uiTable:
Attributes:
   disable    0
   do         always
   room       Lampentest
   wait       0:1

Ich habe keine Bedingung definiert, die den Staus der Lampe abfragt, trotzdem wird sie nach kurzer Zeit wieder ausgeschaltet, wenn ich sie einschalte.

Nehme ich "do always" raus, bleibt die Lampe erstmal an.  Jetzt ist sie (manuell) ausgeschaltet und ich warte ab, ob sie auch automatisch wieder einschaltet, wenn die Bedingungen erfüllt sind.

Damian

#8
So, da haben wir etwas worüber wir reden können:

   DEF        (([Wohnzimmer_TV:state] eq "on" or [pr_KaRadio2:state] eq "present" or [pr_KaRadio3:state] eq "present"or [pr_KaRadio5:state] eq "present") and [T:light] < 5)  (set Testlampe on) DOELSE (set Testlampe off)

Definitionen am besten in Code-Tags (#-Button) setzen.

Grundsätzlich zum Verständnis: Das Modul arbeitet, wie die meisten FHEM-Module, ereignisgesteuert.

Deine Ereignisse hast du in der Bedingung angegeben. Das bedeutet, wenn eines der angegebenen Devices zum Reading ein Event sendet, wird das DOIF-Device wach und wertet die Bedingung aus.

Wenn z. B. Wohnzimmer_TV das Status-Reading auf off setzt, wird das DOIF-Device getriggert und prüft die gesamte Bedingung, wenn diese wahr ist, wird Lampe eingeschaltet, sonst wird sie ausgeschaltet.

Der einzige Unterschied bei do always ist, dass wenn der Zweig cmd1 ausgeführt wurde, weil die Bedingung beim Trigger wahr war, diese wiederholt wird (Lampe einschalten), wenn wieder ein Trigger der angegebenen Devices kommt und die Bedingung wieder wahr ist.

Insbesondere hast du [T:light] < 5 in der Bedingung angegeben, das wird wohl ein Helligkeitssensor sein, der regelmäßig die Helligkeit sendet. Wenn du  do always definierst, wird jedes mal wenn T:light die Helligkeit sendet die Lampe z. B. eingeschaltet, obwohl das Modul sie beim vorherigen Trigger vielleicht bereits schon eingeschaltet hat. Ohne do always wird die Lampe erst dann eingeschaltet (cmd1), wenn das Modul zuvor die Lampe per cmd2 ausgeschaltet hat.

Wenn du dagegen selbst die Lampe eingeschaltet hast, bekommt das DOIF-Device das nicht mit und macht auch nichts - der tatsächliche Zustand der Lampe ist dem DOIF-Device nicht bekannt. Das DOIF-Device kennt nur den eigenen Zustand cmd1/cmd2.

Das kannst du nur sauber lösen, indem du die Lampe nicht direkt schaltest, sondern nur über die DOIF-Definition, das kannst du z. B. per set di_testlampe cmd1 machen, oder du nimmst deinen Schalter in die Bedingung der Definition mit auf, dann darf aber der Schalter die Lampe nicht selbst schalten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

howy-1

Hallo Damian

Zitat von: Damian am 08 Dezember 2022, 07:58:57

Grundsätzlich zum Verständnis: Das Modul arbeitet, wie die meisten FHEM-Module, ereignisgesteuert.

Deine Ereignisse hast du in der Bedingung angegeben. Das bedeutet, wenn eines der angegebenen Devices zum Reading ein Event sendet, wird das DOIF-Device wach und wertet die Bedingung aus.

Okay, das habe ich jetzt verstanden.

Zitat
Der einzige Unterschied bei do always ist, dass wenn der Zweig cmd1 ausgeführt wurde, weil die Bedingung beim Trigger wahr war, diese wiederholt wird (Lampe einschalten), wenn wieder ein Trigger der angegebenen Devices kommt und die Bedingung wieder wahr ist.

Das verstehe ich jetzt auch, also immer wenn ein Trigger kommt und die Bedingungen sind wieder oder noch wahr, wird der Befehl ausgeführt.
Zitat
Insbesondere hast du [T:light] < 5 in der Bedingung angegeben, das wird wohl ein Helligkeitssensor sein, der regelmäßig die Helligkeit sendet. Wenn du  do always definierst, wird jedes mal wenn T:light die Helligkeit sendet die Lampe z. B. eingeschaltet, obwohl das Modul sie beim vorherigen Trigger vielleicht bereits schon eingeschaltet hat. Ohne do always wird die Lampe erst dann eingeschaltet (cmd1), wenn das Modul zuvor die Lampe per cmd2 ausgeschaltet hat.

Ja, es wird die Helligkeit sein (von Twilight) und wohl auch der TV. 

Zitat
Wenn du dagegen selbst die Lampe eingeschaltet hast, bekommt das DOIF-Device das nicht mit und macht auch nichts - der tatsächliche Zustand der Lampe ist dem DOIF-Device nicht bekannt. Das DOIF-Device kennt nur den eigenen Zustand cmd1/cmd2.

Das reicht mir auch erstmal so. DOIF soll die Lampe einschalten und später wieder ausschalten, das sind quasi feste Grenzen.  Was dazwischen passiert, davor oder danach, hat DOIF nicht zu interessieren. Für meine Bedürfnisse reicht das momentan.


Vielen Dank für die Erleuchtung. Einem Doofen muss man es halt manchmal bissl aufwendiger erklären.  ;-)

Grüße, Dirk

Damian

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

moskito

Nur der Vollständigkeit halber:
Manchmal kann es auch weiterhelfen, wenn man in den triggernden Devices mit dem Attribut "event-on-change-reading" arbeitet, womöglich sogar noch mit Threshold.
https://wiki.fhem.de/wiki/Event-on-change-reading
Denn ohne Event passiert auch nichts.   ;)

Gruß
Danny
FHEM auf Intel NUC/Proxmox & Debian 12 + HM-CFG-USB + zigbee2mqtt + Zwave + Enocean