[gelöst] DOIF + wait will nicht

Begonnen von Waldmensch, 08 Juli 2019, 10:08:52

Vorheriges Thema - Nächstes Thema

Waldmensch

Ich habe ein DOIF für meine Gartensprenger, was abhängig von Umgebungsparametern (Photovoltaik etc.)das Magnetventil steuert.

(([09:45-10:30,+:01] or [14:00-15:00,+:01])
and [?Counter_Strang4:pulseTimePerDay] < (2 * 3600)
and [?Wetterstation:rainRate] == 0
and [?Wetterstation:Niederschlag] <= 10
and ([?Solarwatt:Einspeisung] + [?Solarwatt:ChargeBAT]) > 800
and [?Wetterstation:isBrightness_above_30k] eq 1
and [?Rainstop:state] eq "on") 
(set ESPEasy_gartensprinkler_Strang4 on)

DOELSEIF ([Rainstop:state] eq "off")
(set ESPEasy_gartensprinkler_Strang4 off)

DOELSE (set ESPEasy_gartensprinkler_Strang4 off)


als Atribut ist wait 60:0:150 gesetzt (sonst keine Atribute die den Ablauf beeinflussen. Leider wird das wait komplett ignoriert. Das DOIF ansich funktioniert, nur wird cmd_1, cmd_2, cmd_3 sofort ohne Verzögerung geschaltet. Wo ist der Fehler?

Der Hintergrund ist, dass ich noch eine zweite Pumpe als großen Stromverbraucher habe, die mit ziemlich dem gleichen DOIF gesteuert wird, allerdings anderen wait Werten. Dadurch soll verhindert werden, dass, wenn der PV Strom nur für eine Pumpe reicht, die zweite Pumpe gar nicht eingeschaltet wird. Im Gegenzug, wenn der PV Strom zu gering wird, sollte erstmal eine Pumpe abgeschaltet werden. Wenn es für die zweite pumpe dann reicht, soll diese anbleiben.

Hier das DOIF für die 2. Pumpe

DEF
(([09:30-10:30,+:01] or [13:00-13:30,+:01] or [15:00-15:30,+:01] or [17:00-17:30,+:01])
and [?Counter_Strang0:pulseTimePerDay] < (2 * 3600)
and [?Wetterstation:rainRate] == 0
and [?Wetterstation:Niederschlag] <= 10
and ([?Solarwatt:Einspeisung] + [?Solarwatt:ChargeBAT]) > 800
and [?Wetterstation:isBrightness_above_30k] eq 1 
and [?Rainstop:state] eq "on")
(set stadtweg.ga.gartenpumpe on)

DOELSEIF ([Rainstop:state] eq "off")
(set stadtweg.ga.gartenpumpe off)

DOELSE
(set stadtweg.ga.gartenpumpe off)


Atribut wait ist hier auf 180:0:120 gesetzt und wird genauso ignoriert

Dadurch schalten jetzt BEIDE Pumpen immer im Minutentakt an und aus, wenn der PV Strom zuwenig für 2 Pumpen aber ausreichend für eine Pumpe ist.

Otto123

Hi,

ein list würde bei der Fehlersuche ev. mehr helfen als ein Auszug der DEF

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Waldmensch

#2
Zitat von: Otto123 am 08 Juli 2019, 10:25:10
ein list würde bei der Fehlersuche ev. mehr helfen als ein Auszug der DEF

Nochmal zum Besseren Verständnis. Die beiden DOIF sollen quasi gegeneinander arbeiten. Nehmen wir an ([?Solarwatt:Einspeisung] + [?Solarwatt:ChargeBAT]) ist 1000. Beide Doif lösen zur gleichen Zeit (Minutentakt). Die Erste Pumpe geht nach 60 Sekunden wait in Betrieb die Zweite Pumpe wartet noch wait 180. Da Pumpe 1 ungefähr 800 Watt verbraucht, ändert sich nun die Condition für Pumpe 2 während sie noch wartet (längeres wait). Dadurch müsste Pumpe 2 automatisch in cmd_3 fallen weil ([?Solarwatt:Einspeisung] + [?Solarwatt:ChargeBAT]) > 800 nicht mehr erfüllt ist. Ebenso sollte es beim Abschalten funktionieren. Erstmal die eine Pumpe aus, eventuell reicht der Strom noch für Pumpe 2, dann bleibt sie an, weil die Bedingung wieder erfüllt ist.

Gerne DOIF Nr 1:
Internals:
   DEF        (([09:45-10:30,+:01] or [14:00-15:00,+:01])
and [?Counter_Strang4:pulseTimePerDay] < (2 * 3600)
and [?Wetterstation:rainRate] == 0
and [?Wetterstation:Niederschlag] <= 10
and ([?Solarwatt:Einspeisung] + [?Solarwatt:ChargeBAT]) > 800
and [?Wetterstation:isBrightness_above_30k] eq 1
and [?Rainstop:state] eq "on") 
(set ESPEasy_gartensprinkler_Strang4 on)

DOELSEIF ([Rainstop:state] eq "off")
(set ESPEasy_gartensprinkler_Strang4 off)

DOELSE (set ESPEasy_gartensprinkler_Strang4 off)
   FUUID      5ceadaac-f33f-d6b4-5ad9-5e006a85d2cf28f7
   MODEL      FHEM
   NAME       Sprinkler_Strang4
   NR         240
   NTFY_ORDER 50-Sprinkler_Strang4
   STATE      cmd_1
   TYPE       DOIF
   Helper:
     DBLOG:
       mode:
         logdb:
           TIME       1562572195.52905
           VALUE      enabled
       state:
         logdb:
           TIME       1562574420.05692
           VALUE      cmd_1
       wait_timer:
         logdb:
           TIME       1562524350.2529
           VALUE      no timer
   READINGS:
     2019-07-08 10:27:00   cmd             1
     2019-07-08 10:27:00   cmd_event       timer_3
     2019-07-08 10:27:00   cmd_nr          1
     2019-07-08 09:49:55   mode            enabled
     2019-07-08 10:27:00   state           cmd_1
     2019-07-08 09:49:55   timer_01_c01    09.07.2019 09:45:00
     2019-07-08 09:49:55   timer_02_c01    08.07.2019 10:30:00
     2019-07-08 10:27:00   timer_03_c01    08.07.2019 10:28:00
     2019-07-08 09:49:55   timer_04_c01    08.07.2019 14:00:00
     2019-07-08 09:49:55   timer_05_c01    08.07.2019 15:00:00
   Regex:
   attr:
     cmdState:
     wait:
       0:
         60
       1:
         0
       2:
         150
     waitdel:
   condition:
     0          (::DOIF_time($hash,0,1,$wday,$hms) or ::DOIF_time($hash,3,4,$wday,$hms))  and ::ReadingValDoIf($hash,'Counter_Strang4','pulseTimePerDay') < (2 * 3600) and ::ReadingValDoIf($hash,'Wetterstation','rainRate') == 0  and ::ReadingValDoIf($hash,'Wetterstation','Niederschlag') <= 10  and (::ReadingValDoIf($hash,'Solarwatt','Einspeisung') + ::ReadingValDoIf($hash,'Solarwatt','ChargeBAT')) > 800  and ::ReadingValDoIf($hash,'Wetterstation','isBrightness_above_30k') eq 1 and ::ReadingValDoIf($hash,'Rainstop','state') eq "on"
     1          ::ReadingValDoIf($hash,'Rainstop','state') eq "off"
   days:
   devices:
     1           Rainstop
     all         Rainstop
   do:
     0:
       0          set ESPEasy_gartensprinkler_Strang4 on
     1:
       0          set ESPEasy_gartensprinkler_Strang4 off
     2:
       0          set ESPEasy_gartensprinkler_Strang4 off
   helper:
     event      timer_3
     globalinit 1
     last_timer 6
     sleeptimer -1
     timerdev   
     timerevent timer_3
     timereventsState
     triggerDev
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: timer_3
       state: cmd_1
     timerevents:
       timer_3
     triggerEvents:
       timer_3
   internals:
   interval:
     0          -1
     1          0
     3          -1
     4          3
   intervalfunc:
     2          ::DOIF_time($hash,0,1,$wday,$hms)
     5          ::DOIF_time($hash,3,4,$wday,$hms)
   intervaltimer:
     0          2
     1          2
     3          5
     4          5
   itimer:
   localtime:
     0          1562658300
     1          1562574600
     2          1562574480
     3          1562587200
     4          1562590800
   readings:
     1           Rainstop:state
     all         Rainstop:state
   realtime:
     0          09:45:00
     1          10:30:00
     2          10:28:00
     3          14:00:00
     4          15:00:00
   time:
     0          09:45:00
     1          10:30:00
     2          +:01
     3          14:00:00
     4          15:00:00
     5          +:01
   timeCond:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timers:
     0           0  1  2  3  4  5
   triggertime:
     1562574480:
       localtime  1562574480
       hash:
     1562574600:
       localtime  1562574600
       hash:
     1562587200:
       localtime  1562587200
       hash:
     1562590800:
       localtime  1562590800
       hash:
     1562658300:
       localtime  1562658300
       hash:
   uiState:
   uiTable:
Attributes:
   DbLogExclude cmd_nr,cmd,cmd_event
   alias      DOIF Sprinkler Strang 4
   group      Garten Control
   room       Garten
   wait       60:0:150


DOIF Nr 2 (eigentlich das Gleiche, nur dass mehr Zeitfenster sind, das wait Atribut anders ist, und eine andere Pumpe gesteuert wird:
Internals:
   DEF        (([09:30-10:30,+:01] or [13:00-13:30,+:01] or [15:00-15:30,+:01] or [17:00-17:30,+:01])
and [?Counter_Strang0:pulseTimePerDay] < (2 * 3600)
and [?Wetterstation:rainRate] == 0
and [?Wetterstation:Niederschlag] <= 10
and ([?Solarwatt:Einspeisung] + [?Solarwatt:ChargeBAT]) > 800
and [?Wetterstation:isBrightness_above_30k] eq 1 
and [?Rainstop:state] eq "on")
(set stadtweg.ga.gartenpumpe on)

DOELSEIF ([Rainstop:state] eq "off")
(set stadtweg.ga.gartenpumpe off)

DOELSE
(set stadtweg.ga.gartenpumpe off)
   FUUID      5ceadab3-f33f-d6b4-c562-429cbb3e83e3a5b8
   MODEL      FHEM
   NAME       Sprinkler_Strang0
   NR         322
   NTFY_ORDER 50-Sprinkler_Strang0
   STATE      cmd_3
   TYPE       DOIF
   Helper:
     DBLOG:
       error:
         logdb:
           TIME       1561894200.02066
           VALUE      set ESPEasy_gartensprinkler_Strang0 off
       mode:
         logdb:
           TIME       1562572150.3327
           VALUE      enabled
       state:
         logdb:
           TIME       1562574480.05067
           VALUE      cmd_3
       wait_timer:
         logdb:
           TIME       1562524320.27236
           VALUE      no timer
   READINGS:
     2019-07-08 10:28:00   cmd             3
     2019-07-08 10:28:00   cmd_event       timer_3
     2019-07-08 10:28:00   cmd_nr          3
     2019-07-08 09:49:10   mode            enabled
     2019-07-08 10:28:00   state           cmd_3
     2019-07-08 10:30:00   timer_01_c01    09.07.2019 09:30:00
     2019-07-08 10:30:00   timer_02_c01    09.07.2019 10:30:00
     2019-07-08 09:49:10   timer_04_c01    08.07.2019 13:00:00
     2019-07-08 09:49:10   timer_05_c01    08.07.2019 13:30:00
     2019-07-08 09:49:10   timer_07_c01    08.07.2019 15:00:00
     2019-07-08 09:49:10   timer_08_c01    08.07.2019 15:30:00
     2019-07-08 09:49:10   timer_10_c01    08.07.2019 17:00:00
     2019-07-08 09:49:10   timer_11_c01    08.07.2019 17:30:00
   Regex:
   attr:
     cmdState:
     wait:
       0:
         180
       1:
         0
       2:
         120
     waitdel:
   condition:
     0          (::DOIF_time($hash,0,1,$wday,$hms) or ::DOIF_time($hash,3,4,$wday,$hms) or ::DOIF_time($hash,6,7,$wday,$hms) or ::DOIF_time($hash,9,10,$wday,$hms))  and ::ReadingValDoIf($hash,'Counter_Strang0','pulseTimePerDay') < (2 * 3600) and ::ReadingValDoIf($hash,'Wetterstation','rainRate') == 0  and ::ReadingValDoIf($hash,'Wetterstation','Niederschlag') <= 10  and (::ReadingValDoIf($hash,'Solarwatt','Einspeisung') + ::ReadingValDoIf($hash,'Solarwatt','ChargeBAT')) > 800  and ::ReadingValDoIf($hash,'Wetterstation','isBrightness_above_30k') eq 1    and ::ReadingValDoIf($hash,'Rainstop','state') eq "on"
     1          ::ReadingValDoIf($hash,'Rainstop','state') eq "off"
   days:
   devices:
     1           Rainstop
     all         Rainstop
   do:
     0:
       0          set stadtweg.ga.gartenpumpe on
     1:
       0          set stadtweg.ga.gartenpumpe off
     2:
       0          set stadtweg.ga.gartenpumpe off
   helper:
     event      timer_2
     globalinit 1
     last_timer 12
     sleeptimer -1
     timerdev   
     timerevent timer_2
     timereventsState
     triggerDev
     DOIF_eventas:
       cmd_nr: 3
       cmd: 3
       cmd_event: timer_3
       state: cmd_3
     timerevents:
       timer_2
     triggerEvents:
       timer_2
   internals:
   interval:
     0          -1
     1          0
     10         9
     3          -1
     4          3
     6          -1
     7          6
     9          -1
   intervalfunc:
     11         ::DOIF_time($hash,9,10,$wday,$hms)
     2          ::DOIF_time($hash,0,1,$wday,$hms)
     5          ::DOIF_time($hash,3,4,$wday,$hms)
     8          ::DOIF_time($hash,6,7,$wday,$hms)
   intervaltimer:
     0          2
     1          2
     10         11
     3          5
     4          5
     6          8
     7          8
     9          11
   itimer:
   localtime:
     0          1562657400
     1          1562661000
     10         1562599800
     3          1562583600
     4          1562585400
     6          1562590800
     7          1562592600
     9          1562598000
   readings:
     1           Rainstop:state
     all         Rainstop:state
   realtime:
     0          09:30:00
     1          10:30:00
     10         17:30:00
     3          13:00:00
     4          13:30:00
     6          15:00:00
     7          15:30:00
     9          17:00:00
   time:
     0          09:30:00
     1          10:30:00
     10         17:30:00
     11         +:01
     2          +:01
     3          13:00:00
     4          13:30:00
     5          +:01
     6          15:00:00
     7          15:30:00
     8          +:01
     9          17:00:00
   timeCond:
     0          0
     1          0
     10         0
     11         0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
     8          0
     9          0
   timer:
     0          0
     1          0
     10         0
     11         0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
     8          0
     9          0
   timers:
     0           0  1  2  3  4  5  6  7  8  9  10  11
   triggertime:
     1562583600:
       localtime  1562583600
       hash:
     1562585400:
       localtime  1562585400
       hash:
     1562590800:
       localtime  1562590800
       hash:
     1562592600:
       localtime  1562592600
       hash:
     1562598000:
       localtime  1562598000
       hash:
     1562599800:
       localtime  1562599800
       hash:
     1562657400:
       localtime  1562657400
       hash:
     1562661000:
       localtime  1562661000
       hash:
   uiState:
   uiTable:
Attributes:
   DbLogExclude cmd_nr,cmd,cmd_event
   alias      DOIF Sprinkler Strang 0
   group      Garten Control
   room       Garten
   wait       180:0:120

Otto123

Hi,

Du solltest das besser nach Automatisierung/DOIF verschieben. Ich denke da müssen die Spezies was dazu sagen.
Ich meine, das Problem könnte dein Minutentakt sein:
ZitatDie Verzögerungen werden nur auf Events angewandt und nicht auf Zeitsteuerung. Eine bereits ausgelöste Verzögerung wird zurückgesetzt, wenn während der Wartezeit ein Kommando eines anderen DO-Falls, ausgelöst durch ein neues Ereignis, ausgeführt werden soll.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Waldmensch

Zitat von: Otto123 am 08 Juli 2019, 11:12:05

Ich meine, das Problem könnte dein Minutentakt sein:
Gruß Otto

Klasse!!!! Goldrichtig! Ich habe das jetzt wie folgt umgeschrieben (die rainRate kommt eh alle Minute) und es tut was es soll :)


([Wetterstation:rainRate] == 0
and ([?09:45-10:30] or [?14:00-15:00])
and [?Counter_Strang4:pulseTimePerDay] < (2 * 3600)
and [?Wetterstation:rainRate] == 0
and [?Wetterstation:Niederschlag] <= 10
and ([?Solarwatt:Einspeisung] + [?Solarwatt:ChargeBAT]) > 800
and [?Wetterstation:isBrightness_above_30k] eq 1
and [?Rainstop:state] eq "on") 
(set ESPEasy_gartensprinkler_Strang4 on)

DOELSEIF ([Rainstop:state] eq "off")
(set ESPEasy_gartensprinkler_Strang4 off)

DOELSE (set ESPEasy_gartensprinkler_Strang4 off)