FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: shamal2008 am 22 Oktober 2020, 18:45:40

Titel: [gelöst:] DOIF Thermostate & Brennersteuerung
Beitrag von: shamal2008 am 22 Oktober 2020, 18:45:40
Hallo zusammen,

ich hänge mal wieder mit einem DOIF. Ich dachte ja schon, ich hätte es verstanden, aber irgendwo ist der Wurm drin.

Was soll das DOIF machen:
- Wenn in irgendeinem Raum die Temperatur um -0,5 zum desiredtemp abweicht (Deviation) UND wir zuhause sind (Eltern od. Teenager) und die Heizung nicht schon sowieso läuft, dann wirf den Brenner an. Erst wenn alle Deviations wieder im positiven Bereich bzw. unter -0,5 sind, dann schalte den Brenner wieder ab. Zur Sicherheit gibt es eine Wartezeit von 15 sec für an und 15 sec für aus. Das soll verhindern, dass wenn jemand aus Versehen eine desiredTemp verstellt, der Brenner sofort anläuft. So soll man 15 sec Zeit haben, die Temp richtig zu stellen.

Problem: Der Brenner läuft an, bekommt aber "ziemlich" schnell wieder die Nachricht, dass er ausgehen soll, weil die Temp angeblich erreicht ist. D.h. er springt aufgrund irgendeiner Bedingung (manchmal st.Felix, manchmal ein anderes Thermostat) wieder in den 2. Teil - "Brenner aus".

So sieht das Doif aus:
Internals:
   DEF        ((([hz.ve.sz.1:deviation] and [hz.ve.sz.1:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Anwesenheit] eq "present")) or
(([hz.wt.wz:deviation] and [hz.wt.wz:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Anwesenheit] eq "present")) or
(([hz.wt.bz:deviation] and [hz.wt.bz:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Anwesenheit] eq "present")) or
(([hz.wt.jz:deviation] and [hz.wt.jz:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Felix] eq "present")))
(set Bot message @T.Heizung wurde durch $DEVICE eingeschaltet!)
(set sw.bz.therme on)
DOELSE (set sw.bz.therme off) (set Bot message @T. Gewünschte Temperatur erreicht - Heizung wieder ausgeschalten!)
   FUUID      5e8dcb73-f33f-6c8f-92ef-6f207f8072e972f7
   MODEL      FHEM
   NAME       di.hz.mode2
   NOTIFYDEV  hz.wt.jz,hz.wt.wz,hz.ve.sz.1,global,hz.wt.bz
   NR         220
   NTFY_ORDER 50-di.hz.mode2
   STATE      initialized
   TYPE       DOIF
   VERSION    22781 2020-09-17 15:31:13
   READINGS:
     2020-10-22 18:39:38   cmd             0
     2020-10-22 18:39:38   mode            enabled
     2020-10-22 18:39:38   state           initialized
   Regex:
     accu:
     cond:
       hz.ve.sz.1:
         0:
           deviation  ^hz.ve.sz.1$:^deviation:
       hz.wt.bz:
         0:
           deviation  ^hz.wt.bz$:^deviation:
       hz.wt.jz:
         0:
           deviation  ^hz.wt.jz$:^deviation:
       hz.wt.wz:
         0:
           deviation  ^hz.wt.wz$:^deviation:
   attr:
     cmdState:
     wait:
       0:
         0
         15
       1:
         15
         0
     waitdel:
   condition:
     0          ((::ReadingValDoIf($hash,'hz.ve.sz.1','deviation') and ::ReadingValDoIf($hash,'hz.ve.sz.1','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Anwesenheit','STATE') eq "present")) or ((::ReadingValDoIf($hash,'hz.wt.wz','deviation') and ::ReadingValDoIf($hash,'hz.wt.wz','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Anwesenheit','STATE') eq "present")) or ((::ReadingValDoIf($hash,'hz.wt.bz','deviation') and ::ReadingValDoIf($hash,'hz.wt.bz','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Anwesenheit','STATE') eq "present")) or ((::ReadingValDoIf($hash,'hz.wt.jz','deviation') and ::ReadingValDoIf($hash,'hz.wt.jz','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Felix','STATE') eq "present"))
   do:
     0:
       0          set Bot message @T. Heizung wurde durch $DEVICE eingeschaltet!
       1          set sw.bz.therme on
     1:
       0          set sw.bz.therme off
       1          set Bot message @T.Gewünschte Temperatur erreicht - Heizung wieder ausgeschalten!
   helper:
     DEVFILTER  ^global$|^hz.wt.jz$|^hz.ve.sz.1$|^hz.wt.bz$|^hz.wt.wz$
     NOTIFYDEV  global|hz.wt.jz|hz.ve.sz.1|hz.wt.bz|hz.wt.wz
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
     all         sw.bz.therme:STATE st.Anwesenheit:STATE st.Felix:STATE
   readings:
     all         hz.ve.sz.1:deviation hz.wt.wz:deviation hz.wt.bz:deviation hz.wt.jz:deviation
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Heizung-Alle
   devStateIcon cmd_1:Heizung_Hauptschalter.on cmd_2:Heizung_Hauptschalter.off
   group      01_Schalten
   icon       sani_heating_temp
   room       30_Heizung
   verbose    1
   wait       0,15:15,0


So ein Beispiel aus den DOIF-Tools events - Hier sieht man gut, dass das Doif durch die hz.wt.wz (Wohnzimmer) auslöst, der Timer anspringt, aber nach kurzer Zeit eine andere der Bedingungen (in dem Fall st.Felix - Anwesenheit Jugend) das Teil wieder ausschaltet.)

2020-10-22 18:08:51 DOIF di.hz.mode2 cmd_nr: 1
2020-10-22 18:08:51 DOIF di.hz.mode2 cmd_seqnr: 1
2020-10-22 18:08:51 DOIF di.hz.mode2 cmd: 1.1
2020-10-22 18:08:51 DOIF di.hz.mode2 cmd_event: hz.wt.wz
2020-10-22 18:08:51 DOIF di.hz.mode2 cmd_1_1
2020-10-22 18:08:51 DOIF di.hz.mode2 wait_timer: 22.10.2020 18:09:06 cmd_1_2 hz.wt.wz
2020-10-22 18:09:06 DOIF di.hz.mode2 wait_timer: no timer
2020-10-22 18:09:06 DOIF di.hz.mode2 cmd_nr: 1
2020-10-22 18:09:06 DOIF di.hz.mode2 cmd_seqnr: 2
2020-10-22 18:09:06 DOIF di.hz.mode2 cmd: 1.2
2020-10-22 18:09:06 DOIF di.hz.mode2 cmd_event: hz.wt.wz
2020-10-22 18:09:06 DOIF di.hz.mode2 cmd_1
2020-10-22 18:10:05 DOIF di.hz.mode2 wait_timer: 22.10.2020 18:10:20 cmd_2_1 st.Felix
2020-10-22 18:10:20 DOIF di.hz.mode2 wait_timer: no timer
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd_nr: 2
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd_seqnr: 1
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd: 2.1
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd_event: st.Felix
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd_2_1
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd_nr: 2
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd_seqnr: 2
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd: 2.2
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd_event: st.Felix
2020-10-22 18:10:20 DOIF di.hz.mode2 cmd_2
2020-10-22 18:10:45 DOIF di.hz.mode2 cmd: 0
2020-10-22 18:10:45 DOIF di.hz.mode2 initialized
2020-10-22 18:10:45 DOIF di.hz.mode2 mode: enabled
2020-10-22 18:10:45 Global global MODIFIED di.hz.mode2


Ich nehme an, dass die Bedingungen wieder einmal viel zu kompliziert sind, und ich irgendwo wieder "event-trigger" und "zustand" und "?" verwechselt habe... - falls ihr eine Idee habt, wie ich das ganze auch "einfacher" gestalten kann, bitte gerne. Irgendwie bin ich da nach dem 30. Doif immer noch nicht firm..

Danke für eure Hilfe,
Thomas
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: amenomade am 22 Oktober 2020, 22:26:34
Warum verdoppelst Du jeden Trigger?

[hz.ve.sz.1:deviation] and [hz.ve.sz.1:deviation] <= -0.5

Und warum so viele Klammern?

MMn reicht:
(
   [hz.ve.sz.1:deviation] <= -0.5 and [?sw.bz.therme] eq "off" and [?st.Anwesenheit] eq "present"
or
   [hz.wt.wz:deviation] <= -0.5 and [?sw.bz.therme] eq "off" and [?st.Anwesenheit] eq "present"
or
   [hz.wt.bz:deviation] <= -0.5 and [?sw.bz.therme] eq "off" and [?st.Anwesenheit] eq "present"
or
  [hz.wt.jz:deviation] <= -0.5 and [?sw.bz.therme] eq "off" and [?st.Felix] eq "present"
)

Interessanter als ein "list" vom DOIF im "Initialized" Status, wäre das gleiche "list" nachdem der Brenner wieder ausgegangen ist.
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: Ellert am 23 Oktober 2020, 05:51:52
Wenn eine Abweichung eingeschaltet hat ist der Brenner nicht mehr off, daher wird die Bedingung 1 beim nächsten Trigger unwahr und DOELSE schlägt zu     .

Ich halte DOELSE für eine schlechte Wahl, wenn man den kompletten Zustand nicht 100% im Blick hat, siehe https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche#Logische_Fehler

Daher würde ich vorzugsweise DOELSEIF mit einer genauen Ausschaltedingung verwenden.


Alternativ:
Zitatand [?sw.bz.therme] eq "off"
in der Bedingung weglassen und im Befehl als Filter angeben , siehe: https://commandref.fhem.de/commandref_DE.html#devspec
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: amenomade am 23 Oktober 2020, 07:58:01
Zitat von: Ellert am 23 Oktober 2020, 05:51:52
Wenn eine Abweichung eingeschaltet hat ist der Brenner nicht mehr off, daher wird die Bedingung 1 beim nächsten Trigger unwahr und DOELSE schlägt zu     .

Menno... wie habe ich das übersehen?
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: shamal2008 am 23 Oktober 2020, 11:07:56
Hallo Amenomade,

zu deinen Fragen: Die Klammern kommen daher, dass ich das Teil "nach und nach" aufgebaut habe und absolut sicher gehen wollte, dass die Bedingungen so ausgewertet werden, wie "zusammengefasst".

Aber zur grundsätzlichen Frage retour:
- Ja, ihr habt völlig recht, die Bedingung wird unwahr, sobald der Brenner läuft und damit -> zack Aus.

Somit habe ich eigentlich ein generelles Logikproblem in der "Schaltung".
Eigentlich müsste ich "unabhängig" vom Brennerwert (ein/aus) prüfen und dem Brenner ein "ein" schicken - was ja egal wäre, weil er eh schon läuft.

So gesehen wäre es doch besser (Ansatz), ich prüfe nur auf "present" und "deviation" und schalte den Brenner ein. Der würde dann nur angehen, wenn jemand zuhause ist und die Temperatur absinkt.

Für das Ausschalten müsste ich meiner Ansicht nach im Doelseif prüfen, ob $DEVICE:deviation > 1.0 ist (also temperatur erreicht) und dann den "off" command schicken. Sehe ich das richtig? Das habe ich auch probiert und folgende Bedingung eingesetzt:

DOELSEIF ([$DEVICE:deviation] >= 1.0) (set Bot message @T. Heizung wurde wieder ausgeschaltet!) (set sw.bz.therme off)

Die Verdoppelung der Trigger war meine Antwort auf eine Fehlermeldung (die jetzt übrigens nicht mehr kommt), dass das DOIF zu Beginn gemeint hat, dass deviation nicht numerisch ist und nicht verglichen werden kann. Da hab ich in den unendlichen Weiten des Forums mal gelesen, dass diese verdoppelung helfen soll - hat sie auch. (EDIT: macht es jetzt bei meinem DOELSEIF Ansatz unten auch wieder  ::))

Danke euch auf jeden Fall mal vorab und tüftle weiter.

lg Shamal
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: Ellert am 24 Oktober 2020, 00:24:02
ZitatEigentlich müsste ich "unabhängig" vom Brennerwert (ein/aus) prüfen und dem Brenner ein "ein" schicken - was ja egal wäre, weil er eh schon läuft.
Ja, deshalb die von mir erwähnte Alternative mit einem Filter im Befehlset <Gerät>:FILTER=STATE=off on dann wird nur gesendet wenn der STATE off ist.
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: shamal2008 am 24 Oktober 2020, 11:53:49
Hallo Ellert,

Danke für deine weitere Hilfe, dass mit dem Filter habe ich jetzt mal in den "on" command im ersten Zweig eingebaut.

Ich habe nur festgestellt, dass das DOELSEIF nicht "anspring" und ich eigentlich keine Idee habe, warum.

DOELSEIF ([?sw.bz.therme] eq "on" and [$DEVICE:deviation] >= 0.5) (set Bot message @T. Heizung wurde durch $DEVICE wieder ausgeschaltet!) (set sw.bz.therme off)

Soweit ich das verstanden habe, müsste ja durch die Änderung im Reading "deviation" (event-on-change ist eingeschalten), ja die ganze Abfrage nochmal gemacht werden, der erste Zweig ist "unwahr", daher zum DOELSEIF weiter -> hier sollte ja die Bedingung "wahr" sein -> d.h. Therme läuft (wird nur geprüft), Deviation des Gerätes, welches das DOIF eingeschalten hat ist nun höher als Soll -> damit "Therme aus". Macht es aber nicht.

hab mal ein Listing des DOIF zur Laufzeit (Condition 1) angehängt, finde da aber irgendwie auch keinen Anhaltspunkt, warum er auf den Event "deviation >0.5" nicht anspringt:

Internals:
   DEF        ((([hz.ve.sz.1:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Anwesenheit] eq "present")) or
(([hz.wt.wz:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Anwesenheit] eq "present")) or
(([hz.wt.bz:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Anwesenheit] eq "present")) or
(([hz.wt.jz:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Felix] eq "present")))
(set MaLaBot message @T._Lachi Heizung wurde durch $DEVICE eingeschaltet!)
(set sw.bz.therme:FILTER=STATE=off on)
DOELSEIF ([?sw.bz.therme] eq "on" and [$DEVICE:deviation] and [$DEVICE:deviation] >= 0.5) (set Bot message @T. Heizung wurde durch $DEVICE wieder ausgeschaltet!) (set sw.bz.therme off)
   FUUID      5e8dcb73-f33f-6c8f-92ef-6f207f8072e972f7
   MODEL      FHEM
   NAME       di.hz.mode2
   NOTIFYDEV  hz.ve.sz.1,hz.wt.wz,hz.wt.jz,hz.wt.bz,global
   NR         220
   NTFY_ORDER 50-di.hz.mode2
   STATE      cmd_1
   TYPE       DOIF
   VERSION    22781 2020-09-17 15:31:13
   READINGS:
     2020-10-24 11:52:29   Device          hz.wt.wz
     2020-10-24 11:51:03   cmd             1.2
     2020-10-24 11:51:03   cmd_event       hz.wt.bz
     2020-10-24 11:51:03   cmd_nr          1
     2020-10-24 11:51:03   cmd_seqnr       2
     2020-10-24 11:51:02   e_hz.wt.bz_deviation -1.7
     2020-10-24 11:52:29   e_hz.wt.wz_deviation 0.5
     2020-10-24 11:48:52   mode            enabled
     2020-10-24 11:51:03   state           cmd_1
   Regex:
     accu:
     cond:
       hz.ve.sz.1:
         0:
           deviation  ^hz.ve.sz.1$:^deviation:
       hz.wt.bz:
         0:
           deviation  ^hz.wt.bz$:^deviation:
       hz.wt.jz:
         0:
           deviation  ^hz.wt.jz$:^deviation:
       hz.wt.wz:
         0:
           deviation  ^hz.wt.wz$:^deviation:
         1:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ((::ReadingValDoIf($hash,'hz.ve.sz.1','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Anwesenheit','STATE') eq "present")) or ((::ReadingValDoIf($hash,'hz.wt.wz','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Anwesenheit','STATE') eq "present")) or ((::ReadingValDoIf($hash,'hz.wt.bz','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Anwesenheit','STATE') eq "present")) or ((::ReadingValDoIf($hash,'hz.wt.jz','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Felix','STATE') eq "present"))
     1          ::InternalDoIf($hash,'sw.bz.therme','STATE') eq "on" and ::ReadingValDoIf($hash,'$DEVICE','deviation') and ::ReadingValDoIf($hash,'$DEVICE','deviation') >= 0.5
   do:
     0:
       0          set Bot message @T.Heizung wurde durch $DEVICE eingeschaltet!
       1          set sw.bz.therme:FILTER=STATE=off on
     1:
       0          set Bot message @T. Heizung wurde durch $DEVICE wieder ausgeschaltet!
       1          set sw.bz.therme off
     2:
   helper:
     DEVFILTER  ^global$|^hz.wt.jz$|^hz.ve.sz.1$|^hz.wt.bz$|^hz.wt.wz$
     NOTIFYDEV  global|hz.wt.jz|hz.ve.sz.1|hz.wt.bz|hz.wt.wz
     event      temperature: 23.5,deviation: 0.5
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   hz.wt.bz
     timerevent deviation: -1.7,desiredTemperature: 25.0
     triggerDev hz.wt.wz
     timerevents:
       deviation: -1.7
       desiredTemperature: 25.0
     timereventsState:
       deviation: -1.7
       desiredTemperature: 25.0
     triggerEvents:
       temperature: 23.5
       deviation: 0.5
     triggerEventsState:
       temperature: 23.5
       deviation: 0.5
   internals:
     all         sw.bz.therme:STATE st.Anwesenheit:STATE st.Felix:STATE
   readings:
     all         hz.ve.sz.1:deviation hz.wt.wz:deviation hz.wt.bz:deviation hz.wt.jz:deviation
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Heizung-Alle
   devStateIcon cmd_1:Heizung_Hauptschalter.on cmd_2:Heizung_Hauptschalter.off
   group      01_Schalten
   icon       sani_heating_temp
   room       30_Heizung
   verbose    5


Hier das Listing, wenn deviation geändert wurde, hier sehe ich doch, dass Triggerevents auf 2.3 steht.

Internals:
   DEF        ((([hz.ve.sz.1:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Anwesenheit] eq "present")) or
(([hz.wt.wz:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Anwesenheit] eq "present")) or
(([hz.wt.bz:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Anwesenheit] eq "present")) or
(([hz.wt.jz:deviation] <= -0.5) and ([?sw.bz.therme] eq "off") and ([?st.Felix] eq "present")))
(set Bot message @T. Heizung wurde durch $DEVICE eingeschaltet!)
(set sw.bz.therme:FILTER=STATE=off on)
DOELSEIF ([?sw.bz.therme] eq "on" and [$DEVICE:deviation] and [$DEVICE:deviation] >= 0.5) (set Bot message @T. Heizung wurde durch $DEVICE wieder ausgeschaltet!) (set sw.bz.therme off)
   FUUID      5e8dcb73-f33f-6c8f-92ef-6f207f8072e972f7
   MODEL      FHEM
   NAME       di.hz.mode2
   NOTIFYDEV  hz.ve.sz.1,hz.wt.wz,hz.wt.jz,hz.wt.bz,global
   NR         220
   NTFY_ORDER 50-di.hz.mode2
   STATE      cmd_1
   TYPE       DOIF
   VERSION    22781 2020-09-17 15:31:13
   READINGS:
     2020-10-24 11:59:33   Device          hz.wt.bz
     2020-10-24 11:51:03   cmd             1.2
     2020-10-24 11:51:03   cmd_event       hz.wt.bz
     2020-10-24 11:51:03   cmd_nr          1
     2020-10-24 11:51:03   cmd_seqnr       2
     [b]2020-10-24 11:59:33   e_hz.wt.bz_deviation 2.3[/b]
     2020-10-24 11:58:08   e_hz.wt.wz_deviation 0.4
     2020-10-24 11:48:52   mode            enabled
     2020-10-24 11:51:03   state           cmd_1
   Regex:
     accu:
     cond:
       hz.ve.sz.1:
         0:
           deviation  ^hz.ve.sz.1$:^deviation:
       hz.wt.bz:
         0:
           deviation  ^hz.wt.bz$:^deviation:
         1:
       hz.wt.jz:
         0:
           deviation  ^hz.wt.jz$:^deviation:
       hz.wt.wz:
         0:
           deviation  ^hz.wt.wz$:^deviation:
         1:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ((::ReadingValDoIf($hash,'hz.ve.sz.1','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Anwesenheit','STATE') eq "present")) or ((::ReadingValDoIf($hash,'hz.wt.wz','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Anwesenheit','STATE') eq "present")) or ((::ReadingValDoIf($hash,'hz.wt.bz','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Anwesenheit','STATE') eq "present")) or ((::ReadingValDoIf($hash,'hz.wt.jz','deviation') <= -0.5) and (::InternalDoIf($hash,'sw.bz.therme','STATE') eq "off") and (::InternalDoIf($hash,'st.Felix','STATE') eq "present"))
     1          ::InternalDoIf($hash,'sw.bz.therme','STATE') eq "on" and ::ReadingValDoIf($hash,'$DEVICE','deviation') and ::ReadingValDoIf($hash,'$DEVICE','deviation') >= 0.5
   do:
     0:
       0          set Bot message @T. Heizung wurde durch $DEVICE eingeschaltet!
       1          set sw.bz.therme:FILTER=STATE=off on
     1:
       0          set Bot message @T. Heizung wurde durch $DEVICE wieder ausgeschaltet!
       1          set sw.bz.therme off
     2:
   helper:
     DEVFILTER  ^global$|^hz.wt.jz$|^hz.ve.sz.1$|^hz.wt.bz$|^hz.wt.wz$
     NOTIFYDEV  global|hz.wt.jz|hz.ve.sz.1|hz.wt.bz|hz.wt.wz
     event      deviation: 2.3,desiredTemperature: 21.0
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   hz.wt.bz
     timerevent deviation: -1.7,desiredTemperature: 25.0
     triggerDev hz.wt.bz
     timerevents:
       deviation: -1.7
       desiredTemperature: 25.0
     timereventsState:
       deviation: -1.7
       desiredTemperature: 25.0
   [b]  triggerEvents:
       deviation: 2.3
       desiredTemperature: 21.0
     triggerEventsState:
       deviation: 2.3
       desiredTemperature: 21.0[/b]
   internals:
     all         sw.bz.therme:STATE st.Anwesenheit:STATE st.Felix:STATE
   readings:
     all         hz.ve.sz.1:deviation hz.wt.wz:deviation hz.wt.bz:deviation hz.wt.jz:deviation
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Heizung-Alle
   devStateIcon cmd_1:Heizung_Hauptschalter.on cmd_2:Heizung_Hauptschalter.off
   group      01_Schalten
   icon       sani_heating_temp
   room       30_Heizung
   verbose    5


Danke für deine/eure weitere Hilfe,
Shamal
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: Ellert am 24 Oktober 2020, 13:20:08
ZitatIch habe nur festgestellt, dass das DOELSEIF nicht "anspring" und ich eigentlich keine Idee habe, warum.
[$DEVICE:deviation] interessante Syntax, wo ist das nochmal beschrieben?
Die Erwartung, dass DOIF die Zukunft kennt halte ich für äusserst gewagt.

Bei der Verwendung des Filters könnte es vermutlich beim DOELSE bleiben, da unwahr nicht mehr vom Brennerstatus abhängt.

Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: shamal2008 am 24 Oktober 2020, 13:42:23
Hallo Ellert,

jetzt bin ich komplett daneben und verwirrt. Ich bin eigentlich davon ausgegangen, dass (wie hier beschrieben: https://forum.fhem.de/index.php?topic=68397.0), ich ein Reading mit $DEVICE auswerten kann - in meinem Fall, das $DEVICE, welches das DOIF ausgelöst hat.

Da bei einigen Versuchen auch wieder mal die Fehlermeldung:
PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 6152642) line 1.
kam, habe ich dann noch diese Variante versucht:

DOELSEIF ([?sw.bz.therme] eq "on" and (ReadingsNum("$DEVICE","deviation",0) >= 0.5))
(set Bot message @T.i Heizung wurde durch $DEVICE wieder ausgeschaltet!) (set sw.bz.therme off)


Da kam mal die Meldung nicht mehr, funktioniert aber auch nicht.

Ebenso habe ich jetzt versucht, alle Prüfungen auf therme on/off wegzulassen - hilft leider auch nicht.

Warum meinst du "die Zukunft kennen"? Ich denke gelesen zu haben, dass DOIF bei einem Event prüft. Wenn jetzt also das DOIF läuft, und deviation einen Änderungsevent triggert, müsste doch das DOIF checken, dass sich die Bedingung geändert hat und in die zweite Condition springen.

Irgendwie setzt es jetzt bei mir aus  :'(
lg Shamal
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: Damian am 24 Oktober 2020, 15:39:22
[$DEVICE...] kannst du nur sinnvoll in der gleichen Bedingung Abfragen, dein DOELSEIF-Zweig hat keinen Trigger, denn die Angabe mit $DEVICE ist nicht triggernd.

So etwas kannst du sinnvoll nur im DOIF Perl-Modus machen, denn dort gilt ein Trigger innerhalb eines gesamten Blockes mit allen elsif-Zweigen.
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: shamal2008 am 24 Oktober 2020, 20:59:40
Hallo,

ich habe jetzt mal ein PERL-Doif versucht (*schwitz*, mein zweiter Versuch) und ein kleines Test-DOIF angelegt:

{
if ([hz.wt.bz:desiredTemperature] <= 22)
{fhem_set "sw.thermetest:FILTER=STATE!=on on"}
elsif ([hz.wt.bz:desiredTemperature] >= 24)
{fhem_set "sw.thermetest:FILTER=STATE!=off off"}
}


FHEM meckert zwar nicht, löst aber auch nicht aus. D.h. Wenn ich desiredTemperature verstelle, bekomme ich im Eventlog einen Event angezeigt, allerdings interessiert das mein DOIF überhaupt nicht. Erst wenn ich "set block_01" sage, macht es auch was es soll. Es kann auch nicht daran liegen (imho), dass die desiredTemperature evtl. keine Zahl ist, das hätte ich in einer Variante mit [ht.wt.bz:desiredTemperature:d] abgefangen.

ein bei jedem Schritt mehr ratloser,
Shamal

Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: Damian am 24 Oktober 2020, 21:12:41
Zitat von: shamal2008 am 24 Oktober 2020, 20:59:40
Hallo,

ich habe jetzt mal ein PERL-Doif versucht (*schwitz*, mein zweiter Versuch) und ein kleines Test-DOIF angelegt:

{
if ([hz.wt.bz:desiredTemperature] <= 22)
{fhem_set "sw.thermetest:FILTER=STATE!=on on"}
elsif ([hz.wt.bz:desiredTemperature] >= 24)
{fhem_set "sw.thermetest:FILTER=STATE!=off off"}
}


FHEM meckert zwar nicht, löst aber auch nicht aus. D.h. Wenn ich desiredTemperature verstelle, bekomme ich im Eventlog einen Event angezeigt, allerdings interessiert das mein DOIF überhaupt nicht. Erst wenn ich "set block_01" sage, macht es auch was es soll. Es kann auch nicht daran liegen (imho), dass die desiredTemperature evtl. keine Zahl ist, das hätte ich in einer Variante mit [ht.wt.bz:desiredTemperature:d] abgefangen.

ein bei jedem Schritt mehr ratloser,
Shamal

In den Readings des DOIFs siehst du an den Readings, die mit e_ beginnen, ob die Events beim DOIF ankommen. Wenn es keine Zahlen sind, dann musst du mit :d arbeiten, sonst macht dein Vergleich keinen Sinn. Bei Problemen immer list-Ausgabe des Moduls liefern.
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: shamal2008 am 24 Oktober 2020, 23:27:36
Hallo Damian,

danke für deine Geduld. Irgendwie verstehe ich die Welt nicht mehr.

Jetzt habe ich das Teil dazu gebracht, dass es triggert (frage mich bitte nicht wie), und die ursprüngliche Variante mit der deviation wieder eingesetzt. Funktioniert nach wie vor.

Was ist jetzt noch brauche ist ein "Stupser" in die richtige Richtung, was die Aggregatslogik an sich angeht. Die Verknüpfung mit dem Anwesenheitsstatus sollte dann ja eigentlich funktionieren.

Ich versuche im elsif "alle" WT und den Schlafzimmer-HT abzufragen. Wenn alle 0.5 Grad über desiredTemperature sind, soll der Brenner abschalten.  Dies geschieht derzeit so:

Internals:
   CFGFN     
   DEF        {
if ([hz.ve.sz.1:deviation:d] <= -0.5 or [hz.wt.wz:deviation:d] <= -0.5 or
[hz.wt.bz:deviation:d] <= -0.5 or [hz.wt.jz:deviation:d] <= -0.5)
{fhem_set "sw.thermetest:FILTER=STATE!=on on"}
elsif ([hz.ve.sz.1:deviation:d] >= 0.5 or [hz.wt.wz:deviation:d] >= 0.5 or
[hz.wt.bz:deviation:d] >= 0.5 or [hz.wt.jz:deviation:d] >= 0.5)
{fhem_set "sw.thermetest:FILTER=STATE!=off off"}
}

   FUUID      5f944424-f33f-6c8f-3029-1695f88dd3d4c62a
   MODEL      Perl
   NAME       di.hz.mode1
   NOTIFYDEV  hz.wt.bz,global,hz.wt.jz,hz.wt.wz,hz.ve.sz.1
   NR         114642
   NTFY_ORDER 50-di.hz.mode1
   STATE      initialized
   TYPE       DOIF
   VERSION    22781 2020-09-17 15:31:13
   READINGS:
     2020-10-24 23:31:34   mode            enabled
     2020-10-24 23:31:35   state           initialized
   Regex:
     accu:
     cond:
       hz.ve.sz.1:
         0:
           deviation  ^hz.ve.sz.1$:^deviation:
       hz.wt.bz:
         0:
           deviation  ^hz.wt.bz$:^deviation:
       hz.wt.jz:
         0:
           deviation  ^hz.wt.jz$:^deviation:
       hz.wt.wz:
         0:
           deviation  ^hz.wt.wz$:^deviation:
   condition:
     0         
if (::ReadingValDoIf($hash,'hz.ve.sz.1','deviation','','d') <= -0.5 or ::ReadingValDoIf($hash,'hz.wt.wz','deviation','','d') <= -0.5 or
::ReadingValDoIf($hash,'hz.wt.bz','deviation','','d') <= -0.5 or ::ReadingValDoIf($hash,'hz.wt.jz','deviation','','d') <= -0.5)
{fhem_set "sw.thermetest:FILTER=STATE!=on on"}
elsif (::ReadingValDoIf($hash,'hz.ve.sz.1','deviation','','d') >= 0.5 or ::ReadingValDoIf($hash,'hz.wt.wz','deviation','','d') >= 0.5 or
::ReadingValDoIf($hash,'hz.wt.bz','deviation','','d') >= 0.5 or ::ReadingValDoIf($hash,'hz.wt.jz','deviation','','d') >= 0.5)
{fhem_set "sw.thermetest:FILTER=STATE!=off off"}

   helper:
     DEVFILTER  ^global$|^hz.ve.sz.1$|^hz.wt.bz$|^hz.wt.wz$|^hz.wt.jz$
     NOTIFYDEV  global|hz.ve.sz.1|hz.wt.bz|hz.wt.wz|hz.wt.jz
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
     0          block_01
   readings:
     all         hz.ve.sz.1:deviation hz.wt.wz:deviation hz.wt.bz:deviation hz.wt.jz:deviation
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Heizung-Test
   group      01_Schalten
   icon       sani_heating_temp
   room       30_Heizung
   verbose    5



Meine Versuche mit "Aggregieren" der WT (Wandthermostate) sind kläglich gescheitert, obwohl ich die commandref samt Anwendungsbespielen gelesen habe. Irgendwie schaffe ich es nicht, den DOIF-Modus in den Perl-Modus zu transferieren. Mit der wäre es natürlich wesentlich cooler...

Hier z.B. ein Versuch:
(["^hz.wt":deviation:d] >= 0.5 and [hz.ve.sz.1:deviation:d] >= 0.5)

Die anderen 10 Varianten spare ich euch..

lg
Shamal
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: amenomade am 24 Oktober 2020, 23:36:54
ZitatWenn alle 0.5 Grad über desiredTemperature sind
Das heisst AND und nicht OR in deinem elsif
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: shamal2008 am 25 Oktober 2020, 00:00:24
Hallo,

ja, sorry da war noch ein Listing "before" drin. In meinem aktuellen ist es schon ausgebessert.

Kannst du mir bei den Aggregationen noch auf die Sprünge helfen, ich kapiers einfach nicht. Siehe oben.

Danke,
shamal
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: amenomade am 25 Oktober 2020, 00:06:06
([#"^hz.wt":deviation:$_ > 0.5] == 3 ) für 3 hz Devices
Heisst: (Anzahl von hz.wt Devices mit deviation > 0.5) gleich 3
Titel: Antw:DOIF Thermostate & Brennersteuerung
Beitrag von: shamal2008 am 25 Oktober 2020, 00:29:48
Hallo Amenomade,

DANKE!!!! ??? :-[ - es fällt mir gerade wie Schuppen aus den Haaren!

Die Aggregatsfunktion bewirkt ja eine "Berechnung", agiert also wie eine Funktion in C; -> und liefert ein Ergebnis zurück gegen das ich prüfen muss.

*omg*.... es ist viel zu spät für sowas!

DANKE nochmal!

lg aus Wien,
Shamal