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.
Hi,
ein list würde bei der Fehlersuche ev. mehr helfen als ein Auszug der DEF
Gruß Otto
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
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
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)