DOIF triggert sich selbst obwohl eine Uhrzeit hinterlegt ist

Begonnen von Thoffi1978, 23 April 2025, 12:26:36

Vorheriges Thema - Nächstes Thema

Thoffi1978

Hallo,
ich will meinen überschüssigen Strom im Bad verbrauchen.
Ich habe mir ein DOIF gebastelt und denke, dass es so gehen soll.
Der zweite Zweig löst allerdings das "off" aus, obwohl es noch gar nicht in der Uhrzeit ist, wo es schalten soll.
Übersehe ich eine Klammer oder?
Der Zweig löst "richtig" aus, denn der Wert ist nicht erreicht. Doch wieso ignoriert er die Uhrzeit?

([handy_da:state] eq "present" and [Alarm:state] eq "off" and (([08:00 - 13:00|7] or [06:00 - 13:00|8]) and [Bad_Heizung:temperature] < 25 and [Solar_Nebenhaus_Shelly:power] < -40))
(set Bad_Heizung_Shelly on)
DOELSEIF
([handy_da:state] eq "present" and [Alarm:state] eq "off" and [13:10 - 21:00] and [Bad_Heizung:temperature] < 25 and [Torsten_Strom:Active_Power_calculated] < -300)
(set Bad_Heizung_Shelly on)
DOELSE
(set Bad_Heizung_Shelly off)

List vom DOIF:
Internals:
   CFGFN     
   DEF        ([handy_da:state] eq "present" and [Alarm:state] eq "off" and (([08:00 - 13:00|7] or [06:00 - 13:00|8]) and [Bad_Heizung:temperature] < 25 and [Solar_Nebenhaus_Shelly:power] < -40))
(set Bad_Heizung_Shelly on)
DOELSEIF
([handy_da:state] eq "present" and [Alarm:state] eq "off" and [13:10 - 21:00] and [Bad_Heizung:temperature] < 25 and [Torsten_Strom:Active_Power_calculated] < -300)
(set Bad_Heizung_Shelly on)
DOELSE
(set Bad_Heizung_Shelly off)
   FUUID      6808accb-f33f-7e98-b881-087584f18c6f50a9
   MODEL      FHEM
   NAME       Badezimmer_Decken_Heizung
   NOTIFYDEV  Solar_Nebenhaus_Shelly,global,Alarm,Torsten_Strom,Bad_Heizung,handy_da
   NR         593
   NTFY_ORDER 50-Badezimmer_Decken_Heizung
   STATE      initialized
   TYPE       DOIF
   VERSION    29460 2024-12-29 20:25:48
   eventCount 157
   .attraggr:
   .attrminint:
   READINGS:
     2025-04-23 12:24:01   Device          Torsten_Strom
     2025-04-23 12:15:41   cmd             0
     2025-04-23 12:23:05   e_Bad_Heizung_temperature 22.4
     2025-04-23 12:23:03   e_Solar_Nebenhaus_Shelly_power -279.7
     2025-04-23 12:24:01   e_Torsten_Strom_Active_Power_calculated -73.8 ( -4427 Ws = -1.23 Wh in 60 s )
     2025-04-23 12:15:41   mode            enabled
     2025-04-23 12:15:41   state           initialized
     2025-04-23 12:15:41   timer_01_c01    24.04.2025 08:00:00|7
     2025-04-23 12:15:41   timer_02_c01    23.04.2025 13:00:00|7
     2025-04-23 12:15:41   timer_03_c01    24.04.2025 06:00:00|8
     2025-04-23 12:15:41   timer_04_c01    23.04.2025 13:00:00|8
     2025-04-23 12:15:41   timer_05_c02    23.04.2025 13:10:00
     2025-04-23 12:15:41   timer_06_c02    23.04.2025 21:00:00
     2025-04-23 12:24:01   wait_timer      23.04.2025 12:28:01 cmd_3 Torsten_Strom
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       Alarm:
         0:
           state      ^Alarm$:^state:
         1:
           state      ^Alarm$:^state:
       Bad_Heizung:
         0:
           temperature ^Bad_Heizung$:^temperature:
         1:
           temperature ^Bad_Heizung$:^temperature:
       Solar_Nebenhaus_Shelly:
         0:
           power      ^Solar_Nebenhaus_Shelly$:^power:
       Torsten_Strom:
         0:
         1:
           Active_Power_calculated ^Torsten_Strom$:^Active_Power_calculated:
       handy_da:
         0:
           state      ^handy_da$:^state:
         1:
           state      ^handy_da$:^state:
   attr:
     cmdState:
     wait:
       0:
         240
       1:
         240
       2:
         240
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'handy_da','state') eq "present" and ::ReadingValDoIf($hash,'Alarm','state') eq "off" and ((::DOIF_time($hash,0,1,$wday,$hms,"7") or ::DOIF_time($hash,2,3,$wday,$hms,"8")) and ::ReadingValDoIf($hash,'Bad_Heizung','temperature') < 25 and ::ReadingValDoIf($hash,'Solar_Nebenhaus_Shelly','power') < -40)
     1          ::ReadingValDoIf($hash,'handy_da','state') eq "present" and ::ReadingValDoIf($hash,'Alarm','state') eq "off" and ::DOIF_time($hash,4,5,$wday,$hms) and ::ReadingValDoIf($hash,'Bad_Heizung','temperature') < 25 and ::ReadingValDoIf($hash,'Torsten_Strom','Active_Power_calculated') < -300
   days:
     0          7
     1          7
     2          8
     3          8
   do:
     0:
       0          set Bad_Heizung_Shelly on
     1:
       0          set Bad_Heizung_Shelly on
     2:
       0          set Bad_Heizung_Shelly off
   helper:
     NOTIFYDEV  Solar_Nebenhaus_Shelly,global,Alarm,Torsten_Strom,Bad_Heizung,handy_da
     event      Purchased_Energy_A: 13555.96,Purchased_Energy_B: 26320.9,Returned_Energy_C: 60645.65,Purchased_Energy_S: 71592.98,Returned_Energy_S: 137462.06,Total_Energy_S: -65869.08,Active_Power_calculated: -73.8 ( -4427 Ws = -1.23 Wh in 60 s ),Active_Power_integrated: -78.3  (1 values),Active_Power_integratedNeg: 78.3  (4698 Ws =  1.31 Wh),kWh_Gesamt: -1350198280150415.2,kWh_Rein_Gesamt: 5794443338031510.0,kWh_Back_Gesamt: 7144641618181925.0
     globalinit 1
     last_timer 6
     sleepdevice Torsten_Strom
     sleepsubtimer 0
     sleeptimer 2
     timerdev   Torsten_Strom
     timerevent Purchased_Energy_A: 13555.96,Purchased_Energy_B: 26320.9,Returned_Energy_C: 60645.65,Purchased_Energy_S: 71592.98,Returned_Energy_S: 137462.06,Total_Energy_S: -65869.08,Active_Power_calculated: -73.8 ( -4427 Ws = -1.23 Wh in 60 s ),Active_Power_integrated: -78.3  (1 values),Active_Power_integratedNeg: 78.3  (4698 Ws =  1.31 Wh),kWh_Gesamt: -1350198280150415.2,kWh_Rein_Gesamt: 5794443338031510.0,kWh_Back_Gesamt: 7144641618181925.0
     triggerDev Torsten_Strom
     timerevents:
       Purchased_Energy_A: 13555.96
       Purchased_Energy_B: 26320.9
       Returned_Energy_C: 60645.65
       Purchased_Energy_S: 71592.98
       Returned_Energy_S: 137462.06
       Total_Energy_S: -65869.08
       Active_Power_calculated: -73.8 ( -4427 Ws = -1.23 Wh in 60 s )
       Active_Power_integrated: -78.3  (1 values)
       Active_Power_integratedNeg: 78.3  (4698 Ws =  1.31 Wh)
       kWh_Gesamt: -1350198280150415.2
       kWh_Rein_Gesamt: 5794443338031510.0
       kWh_Back_Gesamt: 7144641618181925.0
     timereventsState:
       Purchased_Energy_A: 13555.96
       Purchased_Energy_B: 26320.9
       Returned_Energy_C: 60645.65
       Purchased_Energy_S: 71592.98
       Returned_Energy_S: 137462.06
       Total_Energy_S: -65869.08
       Active_Power_calculated: -73.8 ( -4427 Ws = -1.23 Wh in 60 s )
       Active_Power_integrated: -78.3  (1 values)
       Active_Power_integratedNeg: 78.3  (4698 Ws =  1.31 Wh)
       kWh_Gesamt: -1350198280150415.2
       kWh_Rein_Gesamt: 5794443338031510.0
       kWh_Back_Gesamt: 7144641618181925.0
     triggerEvents:
       Purchased_Energy_A: 13555.96
       Purchased_Energy_B: 26320.9
       Returned_Energy_C: 60645.65
       Purchased_Energy_S: 71592.98
       Returned_Energy_S: 137462.06
       Total_Energy_S: -65869.08
       Active_Power_calculated: -73.8 ( -4427 Ws = -1.23 Wh in 60 s )
       Active_Power_integrated: -78.3  (1 values)
       Active_Power_integratedNeg: 78.3  (4698 Ws =  1.31 Wh)
       kWh_Gesamt: -1350198280150415.2
       kWh_Rein_Gesamt: 5794443338031510.0
       kWh_Back_Gesamt: 7144641618181925.0
     triggerEventsState:
       Purchased_Energy_A: 13555.96
       Purchased_Energy_B: 26320.9
       Returned_Energy_C: 60645.65
       Purchased_Energy_S: 71592.98
       Returned_Energy_S: 137462.06
       Total_Energy_S: -65869.08
       Active_Power_calculated: -73.8 ( -4427 Ws = -1.23 Wh in 60 s )
       Active_Power_integrated: -78.3  (1 values)
       Active_Power_integratedNeg: 78.3  (4698 Ws =  1.31 Wh)
       kWh_Gesamt: -1350198280150415.2
       kWh_Rein_Gesamt: 5794443338031510.0
       kWh_Back_Gesamt: 7144641618181925.0
   internals:
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
   intervalfunc:
   localtime:
     0          1745474400
     1          1745406000
     2          1745467200
     3          1745406000
     4          1745406600
     5          1745434800
   readings:
     all         handy_da:state Alarm:state Bad_Heizung:temperature Solar_Nebenhaus_Shelly:power Torsten_Strom:Active_Power_calculated
   realtime:
     0          08:00:00
     1          13:00:00
     2          06:00:00
     3          13:00:00
     4          13:10:00
     5          21:00:00
   time:
     0          08:00:00
     1          13:00:00
     2          06:00:00
     3          13:00:00
     4          13:10:00
     5          21:00:00
   timeCond:
     0          0
     1          0
     2          0
     3          0
     4          1
     5          1
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timers:
     0           0  1  2  3
     1           4  5
   trigger:
   triggertime:
     1745406000:
       localtime  1745406000
       hash:
     1745406600:
       localtime  1745406600
       hash:
     1745434800:
       localtime  1745434800
       hash:
     1745467200:
       localtime  1745467200
       hash:
     1745474400:
       localtime  1745474400
       hash:
   uiState:
   uiTable:
Attributes:
   wait       240:240:240

Vielen Dank schon einmal,
Hoffi

Thoffi1978

Ich habe die Uhrzeiten geändert/gestrichen.
Ich weiß zwar immer noch nicht, wo mein Gedankenfehler war, aber so läuft es erstmal für mich.
(([handy_da:state] eq "present" and [Alarm:state] eq "off" and [06:00-13:00] and [Bad_Heizung:temperature] < 25 and [Solar_Nebenhaus_Shelly:power] < -40 and [Torsten_Strom:Active_Power_S] < 50)
or
([handy_da:state] eq "present" and [Alarm:state] eq "off" and [13:10-21:00] and [Bad_Heizung:temperature] < 25 and [Torsten_Strom:Active_Power_S] < -300 ))
DOELSEIF
([Solar_Nebenhaus_Shelly:power] < -30 or [Torsten_Strom:Active_Power_S] > 50)
(set Bad_Heizung_Shelly off)

tobi01001

Zitat von: Thoffi1978 am 23 April 2025, 12:26:36DOELSE
(set Bad_Heizung_Shelly off)
Das DOELSE löst immer aus (m.W. wenn ein Trigger zutrifft wie z.B. temperature oder power...) wenn keine der vorherigen Bedingungen erfüllt sind. du hattest:
Wenn (handy_da und keine alarm un Uhrzeit und < 25° und power < -40)
--> mach an
Sonst Wenn ( ... ... )
--> mach an
und ansonsten (in allen übrigen Fällen)
--> mach aus

Daher wird ständig ausgeschalten und nur wenn alle Bedigungen des jeweiligen Zweigs zutreffen an.

Diesen Ausschaltzweig kannst du (so wie jetzt erfolgt) an Bedingungen knüpfen damit der nicht ständig auslöst.
Oft lohnt es sich in solchen Fällen die Logik umzudrehen, da sich damit häufig Bedinungen vereinfachen lassen.

Nach dem Motto "De-Morgan stirbt nie" helfen dir dabei die de-morganschen Gesetze  ;)
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

Thoffi1978

Wird aber nicht durch das DOELSEIF gesagt, "löse nur aus, wenn so dann aus"?
Bei einem DOELSE heißt es dich "Wenn nicht wie oben, dann aus"

Oder bin ich da gerade völlig falsch vor?

tobi01001

Ja, DOELSEIF hat Bedingung(en).

Wenn das vorherige (DOELSE)IF Nicht zutrifft, prüfe die Bedingungen und wenn die zutrifft, wird ausgeführt.
So hattest du es ja bereits angepasst.

Ein DOELSE hat aber keine weiteren Bedingungen und wird immer ausgeführt wenn keine der vorherigen (DOELSE)IF zutrifft und das ist dann eben alles andere...

Und gerade wenn im IF viele Bedingungen mit und verknüpft vorkommen, genügt es wenn eine nicht mehr zutrifft und der DOELSE Zweig wird ausgeführt...
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.