Moin Leute,
ich bin gerade dabei meine Steuerung für die Gartenbewässerung fertig zu stellen.
Dazu verwende ich einen Shelly1 (MQTT) um die Pumpe anzuschalten und einen Sonoff 4CH Pro (Tasmota MQTT) um 4 Hunter Magnetventile anzusteuern.
Beide unterstützen meines Wissens nach kein on-for-timer, deshalb benutze ich sleep im DOIF.
Das DOIF welches ich bis jetzt benutzt habe und welches funktioniert:
([05:50] and [Beregnungsautomatik:state] eq "An") (
set Garten_Pumpe on;
set Sonoff_Hunter_Ventil1 ON; sleep 600; set Sonoff_Hunter_Ventil1 OFF;
IF ([RegenwarscheinlickeitProTag:STATE] > 50) {
set Sonoff_Hunter_Ventil2 ON; sleep 1200; set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 ON; sleep 600; set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 ON; sleep 600; set Sonoff_Hunter_Ventil4 OFF;
}
) DOELSEIF ([06:50]) (
set Garten_Pumpe OFF;
set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 OFF;)
Jetzt habe ich mir für die einzelnen Kreise einen Dummy angelegt, an dem ich die Dauer der Bewässerung in Minuten einstellen will und habe das DOIF entsprechend umgebaut:
([05:50] and [Beregnungsautomatik:state] eq "An") (
set Garten_Pumpe on;
set Sonoff_Hunter_Ventil1 ON; sleep ([Dauer_Gewaechshaus:state]*60); set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 ON; sleep ([Dauer_Hochbeet:state]*60); set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 ON; sleep ([Dauer_Gemuese:state]*60); set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 ON; sleep ([Dauer_FeWo_Einfahrt:state]*60); set Sonoff_Hunter_Ventil4 OFF;
) DOELSEIF ([06:50]) (
set Sonoff_Garten_Pumpe OFF;
set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 OFF;)
Ich bekomme aber die Meldung: Cannot interpret (5*60) as seconds
Kann mir vielleicht jemand auf die Sprünge helfen, wie ich das hinbekomme?
Danke schon mal im voraus.
versuch mal geschweifte Klammern https://commandref.fhem.de/commandref_DE.html#DOIF_Berechnungen_im_Ausfuehrungsteil
Moin,
Bonn mir gerade nicht sicher, ob ich das nicht schon getestet habe. Aber ich werde das heute Abend mal testen.
Zitat von: Starsurfer am 05 April 2019, 09:02:08
Moin,
Bonn mir gerade nicht sicher, ob ich das nicht schon getestet habe. Aber ich werde das heute Abend mal testen.
Sonst kannst Du auch die Variante 3 der Befehlsausführung nutzen, s. https://commandref.fhem.de/commandref_DE.html#command
Moin,
kurze Rückmeldung, so funktioniert es jetzt anscheinend:
([05:50] and [Beregnungsautomatik:state] eq "An") (
set Garten_Pumpe on;
set Sonoff_Hunter_Ventil1 ON; sleep {([Dauer_Gewaechshaus:state])*60}; set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 ON; sleep {([Dauer_Hochbeet:state])*60}; set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 ON; sleep {([Dauer_Gemuese:state])*60}; set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 ON; sleep {([Dauer_FeWo_Einfahrt:state])*60}; set Sonoff_Hunter_Ventil4 OFF;
set Garten_Pumpe off;
)DOELSEIF (
set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 OFF;
set Sonoff_Garten_Pumpe OFF;
)
Jetzt muss ich nur noch ein if dazwischen bekommen um die Aussenbeete nur bei schonen Wetter und kein Regen zu bewässern.
Danke erstmal
Moin,
so ich habe mal wieder ein bißchen gebastelt und so scheint es jetzt zu funktionieren:
([05:50] and [Beregnungsautomatik:state] eq "An") (
set Garten_Pumpe on;
set Sonoff_Hunter_Ventil1 ON; sleep {([Dauer_Gewaechshaus:state])*60}; set Sonoff_Hunter_Ventil1 OFF;
set Garten_Pumpe off;
IF ([RegenwarscheinlickeitProTag:state] < 50) (
set Garten_Pumpe on,
set Sonoff_Hunter_Ventil2 ON, sleep {([Dauer_Hochbeet:state])*60}, set Sonoff_Hunter_Ventil2 OFF,
set Sonoff_Hunter_Ventil3 ON, sleep {([Dauer_Gemuese:state])*60}, set Sonoff_Hunter_Ventil3 OFF,
set Sonoff_Hunter_Ventil4 ON, sleep {([Dauer_FeWo_Einfahrt:state])*60}, set Sonoff_Hunter_Ventil4 OFF,
set Garten_Pumpe off)
)DOELSE (
set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 OFF;
set Garten_Pumpe off;
)
Die Tücke ist, dass Komma hinter sleep blockiert. Nur bei IF funktioniert es mit Komma korrekt, dort wird es erkannt und intern in ein Semikolon gewandelt.
Aber so wie ich es jetzt gemacht habe, ist es korrekt?
Zitat von: Starsurfer am 06 April 2019, 11:37:13
Aber so wie ich es jetzt gemacht habe, ist es korrekt?
Im Prinzip ja.
Verzögerungen ohne IF kann man elegant auch mit wait definieren.
Wie bekomme ich den die Variablen sleeps ins wait? Das sind ja einstellbare Dummys.
Zitat von: Starsurfer am 06 April 2019, 12:15:18
Wie bekomme ich den die Variablen sleeps ins wait? Das sind ja einstellbare Dummys.
so, wie es in der Commanref zu wait steht, schon gelesen? ;) https://fhem.de/commandref_DE.html#DOIF_wait
Hm habe ich wohl irgendwie überlesen :-[
Also müsste ich mir ein notify basteln, welches sich die Zeiten der einzelnen Kreise holt und diese zu einem wait zusammen setzt.
Mal sehen ob ich das hinbekomme...
Danke
Zitat von: Starsurfer am 06 April 2019, 12:39:12
Hm habe ich wohl irgendwie überlesen :-[
Also müsste ich mir ein notify basteln, welches sich die Zeiten der einzelnen Kreise holt und diese zu einem wait zusammen setzt.
Mal sehen ob ich das hinbekomme...
Danke
Du brauchst kein notify, der ist schon in DOIF eingebaut :)
Bevor wir hier noch lange diskutieren:
([05:50] and [Beregnungsautomatik:state] eq "An")
(set Garten_Pumpe on; set Sonoff_Hunter_Ventil1 ON)
(set Sonoff_Hunter_Ventil1 OFF;
set Garten_Pumpe off;
IF ([RegenwarscheinlickeitProTag:state] < 50) (
set Garten_Pumpe on,
set Sonoff_Hunter_Ventil2 ON, sleep {([Dauer_Hochbeet:state])*60}, set Sonoff_Hunter_Ventil2 OFF,
set Sonoff_Hunter_Ventil3 ON, sleep {([Dauer_Gemuese:state])*60}, set Sonoff_Hunter_Ventil3 OFF,
set Sonoff_Hunter_Ventil4 ON, sleep {([Dauer_FeWo_Einfahrt:state])*60}, set Sonoff_Hunter_Ventil4 OFF,
set Garten_Pumpe off)
)DOELSE (
set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 OFF;
set Garten_Pumpe off;
)
attr wait 0,[Dauer_Gewaechshaus:state]*60
Es wird immer der aktuelle Wert aus [Dauer_Gewaechshaus:state] genommen.
Thema Bewässerung und tausend Bedingungen? Wurde schon mal (https://forum.fhem.de/index.php/topic,70043.msg633894.html#msg633894) abgearbeitet ;)
Ich brauche doch noch einmal Hilfe.
Und zwar habe ich mein DOIF jetzt auf on-for-timer umgebaut, aber irgendwie scheint die Syntax der Berechnung falsch zu sein:
Zitat
set Garten_Pumpe on-for-timer {1+1+1+1*60}; set Sonoff_Hunter_Ventil1 on-for-timer 60; set Sonoff_Hunter_Ventil2 on-for-timer 60; set Sonoff_Hunter_Ventil3 on-for-timer 60; set Sonoff_Hunter_Ventil4 on-for-timer 60; : on-for-timer requires a number as argument
([05:50] && [Beregnungsautomatik:state] eq "An" && [RegenwarscheinlickeitProTag:state] > 50) (
set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state])*60};
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
)
DOELSEIF([05:50] && [Beregnungsautomatik:state] eq "An" && [RegenwarscheinlickeitProTag:state] < 51) (
set Garten_Pumpe on-for-timer {[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state]*60};
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
set Sonoff_Hunter_Ventil2 on-for-timer {([Dauer_Hochbeet:state])*60};
set Sonoff_Hunter_Ventil3 on-for-timer {([Dauer_Gemuese:state])*60};
set Sonoff_Hunter_Ventil4 on-for-timer {([Dauer_FeWo_Einfahrt:state])*60};
)DOELSE (
set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 OFF;
set Garten_Pumpe off;
)
Und ein List:
Internals:
DEF ([05:50] && [Beregnungsautomatik:state] eq "An" && [RegenwarscheinlickeitProTag:state] > 50) (
set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state])*60};
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
)
DOELSEIF([05:50] && [Beregnungsautomatik:state] eq "An" && [RegenwarscheinlickeitProTag:state] < 51) (
set Garten_Pumpe on-for-timer {[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state]*60};
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
set Sonoff_Hunter_Ventil2 on-for-timer {([Dauer_Hochbeet:state])*60};
set Sonoff_Hunter_Ventil3 on-for-timer {([Dauer_Gemuese:state])*60};
set Sonoff_Hunter_Ventil4 on-for-timer {([Dauer_FeWo_Einfahrt:state])*60};
)DOELSE (
set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 OFF;
set Garten_Pumpe off;
)
FUUID 5ca51125-f33f-f054-804b-7798348fef637871
MODEL FHEM
NAME do_Bewaesserung
NR 350
NTFY_ORDER 50-do_Bewaesserung
STATE cmd_3
TYPE DOIF
VERSION 18890 2019-03-13 18:56:41
READINGS:
2019-05-09 01:00:00 Device RegenwarscheinlickeitProTag
2019-05-08 20:48:41 cmd 3
2019-05-08 20:48:41 cmd_event Beregnungsautomatik
2019-05-08 20:48:41 cmd_nr 3
2019-05-08 20:48:40 e_Beregnungsautomatik_state Aus
2019-05-09 01:00:00 e_RegenwarscheinlickeitProTag_state 40
2019-05-08 18:59:06 mode enabled
2019-05-08 20:48:41 state cmd_3
2019-05-09 05:50:00 timer_01_c01 10.05.2019 05:50:00
2019-05-09 05:50:00 timer_02_c02 10.05.2019 05:50:00
Regex:
accu:
attr:
cmdState:
wait:
0:
wait 0
1; 0
1
[Dauer_Gewaechshaus:state]*60
[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]*60
[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]*60
[Dauer_Gewaechshaus:state]*60+[Dauer_Hochbeet:state]*60+[Dauer_Gemuese:state]*60+[Dauer_FeWo_Einfahrt:state]*60
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday) && ::ReadingValDoIf($hash,'Beregnungsautomatik','state') eq "An" && ::ReadingValDoIf($hash,'RegenwarscheinlickeitProTag','state') > 50
1 ::DOIF_time_once($hash,1,$wday) && ::ReadingValDoIf($hash,'Beregnungsautomatik','state') eq "An" && ::ReadingValDoIf($hash,'RegenwarscheinlickeitProTag','state') < 51
days:
devices:
0 Beregnungsautomatik RegenwarscheinlickeitProTag
1 Beregnungsautomatik RegenwarscheinlickeitProTag
all Beregnungsautomatik RegenwarscheinlickeitProTag
do:
0:
0 set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state])*60}; set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
1:
0 set Garten_Pumpe on-for-timer {[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state]*60}; set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60}; set Sonoff_Hunter_Ventil2 on-for-timer {([Dauer_Hochbeet:state])*60}; set Sonoff_Hunter_Ventil3 on-for-timer {([Dauer_Gemuese:state])*60}; set Sonoff_Hunter_Ventil4 on-for-timer {([Dauer_FeWo_Einfahrt:state])*60};
2:
0 set Sonoff_Hunter_Ventil1 OFF; set Sonoff_Hunter_Ventil2 OFF; set Sonoff_Hunter_Ventil3 OFF; set Sonoff_Hunter_Ventil4 OFF; set Garten_Pumpe off;
helper:
event timer_2
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent timer_2
triggerDev
DOIF_eventas:
cmd_nr: 3
cmd: 3
cmd_event: Beregnungsautomatik
state: cmd_3
timerevents:
timer_2
timereventsState:
state: 40
triggerEvents:
timer_2
triggerEventsState:
state: 40
internals:
interval:
intervalfunc:
itimer:
localtime:
0 1557460200
1 1557460200
readings:
0 Beregnungsautomatik:state RegenwarscheinlickeitProTag:state
1 Beregnungsautomatik:state RegenwarscheinlickeitProTag:state
all Beregnungsautomatik:state RegenwarscheinlickeitProTag:state
realtime:
0 05:50:00
1 05:50:00
time:
0 05:50:00
1 05:50:00
timeCond:
0 0
1 1
timer:
0 0
1 0
timers:
0 0
1 1
trigger:
triggertime:
1557460200:
localtime 1557460200
hash:
uiState:
uiTable:
Attributes:
DbLogExclude .*
cmdIcon cmd_1:audio_play
group Bewässerung
icon control_arrow_turn_right
room Garten
verbose 5
wait wait 0,1; 0,1,[Dauer_Gewaechshaus:state]*60,[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]*60,[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]*60,[Dauer_Gewaechshaus:state]*60+[Dauer_Hochbeet:state]*60+[Dauer_Gemuese:state]*60+[Dauer_FeWo_Einfahrt:state]*60
webCmd cmd_1
set Garten_Pumpe on-for-timer {[...
und
set Sonoff_Hunter_Ventil1 on-for-timer {([...
fällt dir was auf?
Hm habe gestern wohl zuviel probiert :o
Ich werde das nachher mal testen
Ok so scheint es jetzt zu funktionieren:
([05:50] && [Beregnungsautomatik:state] eq "An" && [RegenwarscheinlickeitProTag:state] > 50) (
set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state])*60};
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
)
DOELSEIF([05:50] && [Beregnungsautomatik:state] eq "An" && [RegenwarscheinlickeitProTag:state] < 51) (
set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state]*60)};
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
set Sonoff_Hunter_Ventil2 on-for-timer {([Dauer_Hochbeet:state])*60};
set Sonoff_Hunter_Ventil3 on-for-timer {([Dauer_Gemuese:state])*60};
set Sonoff_Hunter_Ventil4 on-for-timer {([Dauer_FeWo_Einfahrt:state])*60};
)DOELSE (
set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 OFF;
set Garten_Pumpe off;
)
Ich habe aber noch ein Problem mit dem Wait, das funktioniert noch nicht richtig. Beim cmd_2 Event schaltet er die Pumpe an und dann laufen die Ventile 1-3 einmal schnell durch nur Ventil 4 bleibt die angegebene Zeit an. Der Sonoff 4CH PRo kann nur einen Kanal gleichzeitig, deshalb sollen die nacheinander die gewünschte Zeit angehen.
cmd_1 funktioniert so wie es soll.
0,1:0,1,[Dauer_Gewaechshaus:state]*60,[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]*60,[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]*60,[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state]*60
List:
Internals:
DEF ([05:50] && [Beregnungsautomatik:state] eq "An" && [RegenwarscheinlickeitProTag:state] > 50) (
set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state])*60};
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
)
DOELSEIF([05:50] && [Beregnungsautomatik:state] eq "An" && [RegenwarscheinlickeitProTag:state] < 51) (
set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state]*60)};
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
set Sonoff_Hunter_Ventil2 on-for-timer {([Dauer_Hochbeet:state])*60};
set Sonoff_Hunter_Ventil3 on-for-timer {([Dauer_Gemuese:state])*60};
set Sonoff_Hunter_Ventil4 on-for-timer {([Dauer_FeWo_Einfahrt:state])*60};
)DOELSE (
set Sonoff_Hunter_Ventil1 OFF;
set Sonoff_Hunter_Ventil2 OFF;
set Sonoff_Hunter_Ventil3 OFF;
set Sonoff_Hunter_Ventil4 OFF;
set Garten_Pumpe off;
)
FUUID 5ca51125-f33f-f054-804b-7798348fef637871
MODEL FHEM
NAME do_Bewaesserung
NR 350
NTFY_ORDER 50-do_Bewaesserung
STATE cmd_3
TYPE DOIF
VERSION 18890 2019-03-13 18:56:41
READINGS:
2019-05-09 18:38:55 cmd 3
2019-05-09 18:38:55 cmd_event do_Bewaesserung
2019-05-09 18:38:55 cmd_nr 3
2019-05-09 18:32:18 mode enabled
2019-05-09 18:38:55 state cmd_3
2019-05-09 18:32:18 timer_01_c01 10.05.2019 05:50:00
2019-05-09 18:32:18 timer_02_c02 10.05.2019 05:50:00
Regex:
accu:
attr:
cmdState:
wait:
0:
0
1
1:
0
1
[Dauer_Gewaechshaus:state]*60
[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]*60
[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]*60
[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state]*60
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday) && ::ReadingValDoIf($hash,'Beregnungsautomatik','state') eq "An" && ::ReadingValDoIf($hash,'RegenwarscheinlickeitProTag','state') > 50
1 ::DOIF_time_once($hash,1,$wday) && ::ReadingValDoIf($hash,'Beregnungsautomatik','state') eq "An" && ::ReadingValDoIf($hash,'RegenwarscheinlickeitProTag','state') < 51
days:
devices:
0 Beregnungsautomatik RegenwarscheinlickeitProTag
1 Beregnungsautomatik RegenwarscheinlickeitProTag
all Beregnungsautomatik RegenwarscheinlickeitProTag
do:
0:
0 set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state])*60}; set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};
1:
0 set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state]*60)}; set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60}; set Sonoff_Hunter_Ventil2 on-for-timer {([Dauer_Hochbeet:state])*60}; set Sonoff_Hunter_Ventil3 on-for-timer {([Dauer_Gemuese:state])*60}; set Sonoff_Hunter_Ventil4 on-for-timer {([Dauer_FeWo_Einfahrt:state])*60};
2:
0 set Sonoff_Hunter_Ventil1 OFF; set Sonoff_Hunter_Ventil2 OFF; set Sonoff_Hunter_Ventil3 OFF; set Sonoff_Hunter_Ventil4 OFF; set Garten_Pumpe off;
helper:
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent
timerevents
timereventsState
triggerDev
DOIF_eventas:
cmd_nr: 3
cmd: 3
cmd_event: do_Bewaesserung
state: cmd_3
internals:
intervalfunc:
itimer:
localtime:
0 1557460200
1 1557460200
readings:
0 Beregnungsautomatik:state RegenwarscheinlickeitProTag:state
1 Beregnungsautomatik:state RegenwarscheinlickeitProTag:state
all Beregnungsautomatik:state RegenwarscheinlickeitProTag:state
realtime:
0 05:50:00
1 05:50:00
time:
0 05:50:00
1 05:50:00
timeCond:
0 0
1 1
timer:
0 0
1 0
timers:
0 0
1 1
triggertime:
1557460200:
localtime 1557460200
hash:
uiState:
uiTable:
Attributes:
DbLogExclude .*
cmdIcon cmd_1:audio_play
group Bewässerung
icon control_arrow_turn_right
room Garten
verbose 5
wait 0,1:0,1,[Dauer_Gewaechshaus:state]*60,[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]*60,[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]*60,[Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state]*60
webCmd cmd_1
Hallo Starsurfer,
ich bin auf diesen sehr interessanten Beitrag gestoßen. Ich bin bei weitem nicht so ein Profi um folgende Aufgabe zu lösen. Vielleicht kannst Du mir ein paar Tipps geben.
Ich habe ein Sonoff 4CH pro zur Steuerung der 4 Hunterventile. Außerdem habe ich ein Sonoff switch um einfach die Stromversorgung sicherzustellen, was in Deinem Fall die Gartenpumpe ist. (soll bei mir später auch noch integriert werden) Der Wunsch ist es ein DOIF zu kreieren und in einer bestimmten Reihenfolge zu einer bestimmten Zeit, besser noch in Abhängigkeit von Wetterdaten (eben bei Regen nicht) die 4 Hunter Ventile 2 gleichzeitig für 10 Minuten, danach das 3. für 10 Minuten und dann das 4. am Schluss für 10 Minuten anzusteuern.
Vielleicht kannst Du mir Deine Definitionszeile senden, damit ich diese auf meine Gegebenheiten anpassen kann.
Vielen Dank im Voraus ;-)
Moin,
beim Sonoff 4ch pro kann bei 24V nur ein Kanal gleichzeitig an sein, 2 Kreise zur gleichen Zeit geht nicht.
Ich versuche das mal raus zu suchen.
So hier mal ein paar Details, aber gleich vorweg, es gibt da bestimmt noch Verbesserungsbedarf und teile davon sind hier im Forum zusammen gesammelt.
Der Dummy Beregnungsautomatik:
Hier wird die Automatik an und aus geschaltet.
defmod Beregnungsautomatik dummy
attr Beregnungsautomatik DbLogExclude .*
attr Beregnungsautomatik devStateIcon An:rc_GREEN:Aus Aus:rc_RED:An
attr Beregnungsautomatik eventMap An:An Aus:Aus
attr Beregnungsautomatik group Bewässerung
attr Beregnungsautomatik icon humidity
attr Beregnungsautomatik room Garten
attr Beregnungsautomatik sortby 1
attr Beregnungsautomatik userReadings Automatik_Aktiv,Aktiver_Regner
attr Beregnungsautomatik webCmd An:Aus
Regenmenge Gestern, Daten von Proplanta:
defmod RegenMengeGestern dummy
attr RegenMengeGestern DbLogExclude .*
attr RegenMengeGestern group Bewässerung
attr RegenMengeGestern room Garten
attr RegenMengeGestern stateFormat state mm
Regenmenge gestern:
defmod RegenMengeHeute dummy
attr RegenMengeHeute DbLogExclude .*
attr RegenMengeHeute group Bewässerung
attr RegenMengeHeute room Garten
attr RegenMengeHeute stateFormat state mm
Regenwarscheinlichkeit:
defmod RegenwarscheinlickeitProTag dummy
attr RegenwarscheinlickeitProTag DbLogExclude .*
attr RegenwarscheinlickeitProTag DbLogInclude state
attr RegenwarscheinlickeitProTag group Bewässerung
attr RegenwarscheinlickeitProTag room Garten
attr RegenwarscheinlickeitProTag stateFormat state %
at um die Regendummys zu füllen:
defmod Regendummy at *01:00:00 {myWeatherData()}
attr Regendummy DbLogExclude .*
attr Regendummy group Bewässerung
attr Regendummy room Garten
99_myUtils.pm:
#Wetterdaten generieren und auslesen
#myWeatherData();
sub myWeatherData(){
my $faktor;
my $RegenMengeGestern = (ReadingsVal("RegenMengeHeute", "state", 0));
fhem("set RegenMengeGestern $RegenMengeGestern");
my $RegenMengeHeute = (ReadingsVal("WetterProplanta","fc0_rain",0));
fhem("set RegenMengeHeute $RegenMengeHeute");
my $w1 = ReadingsVal("WetterProplanta","fc0_weather00",0);
my $w2 = ReadingsVal("WetterProplanta","fc0_weather03",0);
my $w3 = ReadingsVal("WetterProplanta","fc0_weather06",0);
my $w4 = ReadingsVal("WetterProplanta","fc0_weather09",0);
my $w5 = ReadingsVal("WetterProplanta","fc0_weather12",0);
my $w6 = ReadingsVal("WetterProplanta","fc0_weather15",0);
my $w7 = ReadingsVal("WetterProplanta","fc0_weather18",0);
my $w8 = ReadingsVal("WetterProplanta","fc0_weather20",0);
$faktor += ($w1 =~ m/leichter Reg/i)? 20: 0;
$faktor += ($w2 =~ m/leichter Reg/i)? 20: 0;
$faktor += ($w3 =~ m/leichter Reg/i)? 20: 0;
$faktor += ($w4 =~ m/leichter Reg/i)? 20: 0;
$faktor += ($w5 =~ m/leichter Reg/i)? 20: 0;
$faktor += ($w6 =~ m/leichter Reg/i)? 20: 0;
$faktor += ($w7 =~ m/leichter Reg/i)? 20: 0;
$faktor += ($w8 =~ m/leichter Reg/i)? 20: 0;
my $regenwarscheinlichkeit = ($faktor > 0)? ((ReadingsVal("WetterProplanta","fc0_chOfRainDay",0)) /100) * $faktor : (ReadingsVal("WetterProplanta","fc0_chOfRainDay",0));
fhem("set RegenwarscheinlickeitProTag $regenwarscheinlichkeit");
return $regenwarscheinlichkeit;
}
Und die Dauer der einzelnen Kreise einstellbar, hier nur ein Kreis als Beispiel:
defmod Dauer_Gewaechshaus dummy
attr Dauer_Gewaechshaus DbLogExclude .*
attr Dauer_Gewaechshaus group Bewässerungsdauer Kreise
attr Dauer_Gewaechshaus icon hourglass
attr Dauer_Gewaechshaus readingList state
attr Dauer_Gewaechshaus room Garten
attr Dauer_Gewaechshaus setList state:0,1,5,7,10,12,14,16,18,20,25,30,35,40,45,50,55,60
attr Dauer_Gewaechshaus sortby 1
attr Dauer_Gewaechshaus webCmd state
Das DOIF für die Bewässerung (Optimierungsbedürftig -> sleep -> wait)
defmod do_Bewaesserung DOIF ([05:50] and [Beregnungsautomatik:state] eq "An" and (([RegenMengeGestern:state]+[RegenMengeHeute:state]) > 10) and ([RegenwarscheinlickeitProTag:state] >= 40)) \
(set Telegram msg Gewächshaus Bewasserung wird gestartet;; \
set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state])*60};;\
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state])*60};; sleep {([Dauer_Gewaechshaus:state])*60};;\
set $SELF cmd_3;;\
)\
DOELSEIF\
([05:50] and [Beregnungsautomatik:state] eq "An" and (([RegenMengeGestern:state]+[RegenMengeHeute:state]) < 10) and ([RegenwarscheinlickeitProTag:state] < 40)) \
(set Telegram msg Außen Bewasserung wird gestartet;;\
set Garten_Pumpe on-for-timer {([Dauer_Gewaechshaus:state]+[Dauer_Hochbeet:state]+[Dauer_Gemuese:state]+[Dauer_FeWo_Einfahrt:state])*60};;\
set Sonoff_Hunter_Ventil1 on-for-timer {([Dauer_Gewaechshaus:state]*60)};; sleep {([Dauer_Gewaechshaus:state])*60};;\
set Sonoff_Hunter_Ventil2 on-for-timer {([Dauer_Hochbeet:state])*60};; sleep {([Dauer_Hochbeet:state])*60};;\
set Sonoff_Hunter_Ventil3 on-for-timer {([Dauer_Gemuese:state])*60};; sleep {([Dauer_Gemuese:state])*60};;\
set Sonoff_Hunter_Ventil4 on-for-timer {([Dauer_FeWo_Einfahrt:state])*60};; sleep {([Dauer_FeWo_Einfahrt:state])*60};;\
set $SELF cmd_3;;\
)\
DOELSE \
(\
set Sonoff_Hunter_Ventil1 OFF;;\
set Sonoff_Hunter_Ventil2 OFF;;\
set Sonoff_Hunter_Ventil3 OFF;;\
set Sonoff_Hunter_Ventil4 OFF;;\
set Garten_Pumpe off;;\
)
attr do_Bewaesserung DbLogExclude .*
attr do_Bewaesserung cmdIcon cmd_1:audio_play
attr do_Bewaesserung do always
attr do_Bewaesserung group Bewässerung
attr do_Bewaesserung icon control_arrow_turn_right
attr do_Bewaesserung room Garten
attr do_Bewaesserung verbose 5
attr do_Bewaesserung webCmd cmd_1
Sollte am Ende dann ungefähr, wie auf dem Screenshot aussehen.
Hi Starsurfer,
Deine Implementierung gefällt mir!
Ich habe mir Deine myUtil installiert und auch in Betrieb genommen. Ich würde einen Teil davon verwenden, vorallem die Proplanta Integration fehlt bei mir komplett und könnte ich leicht dazubauen.
Ich habe aber eine Frage zu:
$faktor += ($w1 =~ m/leichter Reg/i)? 20: 0;
Wenn ich das richtig verstehe, ignorierst Du damit "Regen" und "Regenschauer" oder was macht dieser Code? Hat das einen bestimmten Grund?
lg,
Matthias
Vielen Dank Starsurfer für die vielen Informationen. Dann werde ich mich da mal heranwagen.
Beste Grüße :)
Zitat von: baerm am 30 April 2020, 22:43:13
Hi Starsurfer,
Deine Implementierung gefällt mir!
Ich habe mir Deine myUtil installiert und auch in Betrieb genommen. Ich würde einen Teil davon verwenden, vorallem die Proplanta Integration fehlt bei mir komplett und könnte ich leicht dazubauen.
Ich habe aber eine Frage zu:
$faktor += ($w1 =~ m/leichter Reg/i)? 20: 0;
Wenn ich das richtig verstehe, ignorierst Du damit "Regen" und "Regenschauer" oder was macht dieser Code? Hat das einen bestimmten Grund?
lg,
Matthias
Der Code stammt hier irgendwo aus dem Forum, ich kann dir gar nicht sagen, ob das so richtig ist.
Hier der orignal Code: https://blog.moneybag.de/fhem-automatische-gartenbewaesserung-mit-fhem-und-gardena-laufendes-projekt-gastbeitrag/ (https://blog.moneybag.de/fhem-automatische-gartenbewaesserung-mit-fhem-und-gardena-laufendes-projekt-gastbeitrag/)
Danke. Irgenwann war ich auch schon auf der Seite, habe aber den Code nie betrachtet. Laut der Beschreibung kann ich nicht ganz nachvollziehen, warum das so gemacht wurde. Ich denke ich werde das hernehmen und entsprechend umbauen.
Ich möchte eigentlich die Regenwahrscheinlichkeit und Regenmenge zur Berechnung der Bewässerungsdauer verwenden. Aktuell noch manuell gesteuert. bereits gefallene Regenmenge nehme ich von der Netatmo Seite (ist noch einzubauen). Hier mein aktueller Code:
defmod Intensitaet dummy
attr Intensitaet alias Bewässerungs Intensität
attr Intensitaet group Bewässerung
attr Intensitaet icon weather_rain_gauge
attr Intensitaet setList state:slider,0,1,100
attr Intensitaet sortby 1
attr Intensitaet stateFormat state%</br>Kreis 1: Kreis1 min</br>Kreis 2: Kreis2 min</br>Kreis 3: Kreis3 min</br>Kreis 4: Kreis4 min
attr Intensitaet userReadings Kreis1 {sprintf("%1.f",(60/100*ReadingsVal("Intensitaet","state",100)))}, Kreis2 {sprintf("%1.f",(120/100*ReadingsVal("Intensitaet","state",100)))}, Kreis3 {sprintf("%1.f",(180/100*ReadingsVal("Intensitaet","state",100)))}, Kreis4 {sprintf("%1.f",(240/100*ReadingsVal("Intensitaet","state",100)))}, Last
attr Intensitaet webCmd state
defmod di_Bewaesserung_Test DOIF ([([Startzeit_BW2])] and [Bewaesserung2] eq "an" and [Temperatur:WERT] > 10 and [RegenwahrscheinlichkeitProTag:state] < 80) (set MessageTxt Bewaesserung_Test Start ) \
DOELSEIF ([([Startzeit_BW2] + ReadingsVal("Intensitaet","Kreis1",100))] and [Bewaesserung2] eq "an" ) (set MessageTxt Bewaesserung_Test) \
DOELSEIF ([([Startzeit_BW2] + ReadingsVal("Intensitaet","Kreis2",100))] and [Bewaesserung2] eq "an" ) (set MessageTxt Bewaesserung_Test) \
DOELSEIF ([([Startzeit_BW2] + ReadingsVal("Intensitaet","Kreis3",100))] and [Bewaesserung2] eq "an" ) (set MessageTxt Bewaesserung_Test) \
DOELSEIF ([([Startzeit_BW2] + ReadingsVal("Intensitaet","Kreis4",100))] and [Bewaesserung2] eq "an" ) (set MessageTxt Bewaesserung_Test Ende )
attr di_Bewaesserung_Test cmdIcon cmd_1:audio_play
attr di_Bewaesserung_Test group Bewässerung
attr di_Bewaesserung_Test icon control_arrow_turn_right
attr di_Bewaesserung_Test room AUSSEN,KG->Maschinenraum
attr di_Bewaesserung_Test webCmd cmd_1
Hallo Starsurfer,
ich habe jetzt mal versucht den DOIF auf meine Geräte anzupassen, aber irgendwie sind da wohl Fehler drin. Ich kann den DOIF nicht in Fhem integrieren. Vielleicht kann Du mal ein Auge darauf werfen wo der Fehler ist. Ich muss natürlich noch etwas umbauen, weil Bewaesserung_vorn_1 und Bewaesserung_vorn_3 mit einem kurzen wait zur gleichen Zeit auf Timer laufen sollen. Vielen Dank
defmod do_Bewaesserung DOIF ([05:50] and [Beregnungsautomatik:state] eq "An" and (([RegenMengeGestern:state]+[RegenMengeHeute:state]) > 10) and ([RegenwarscheinlickeitProTag:state] >= 40)) \
(set Telegram msg Bewasserung wird gestartet;; \
set Gartenwasser on-for-timer {([Dauer_Gartenwasser_an :state])*60};;\
set Bewaesserung_vorn_1 on-for-timer {([Dauer_Bewaesserung_vorn_1:state])*60};; sleep {([Dauer_Bewaesserung_vorn_1:state])*60};;\
set $SELF cmd_3;;\
)\
DOELSEIF\
([05:50] and [Beregnungsautomatik:state] eq "An" and (([RegenMengeGestern:state]+[RegenMengeHeute:state]) < 10) and ([RegenwarscheinlickeitProTag:state] < 40)) \
(set Telegram msg Außen Bewasserung wird gestartet;;\
set Gartenwasser on-for-timer {([Dauer_Gartenwasser_an :state]+[ Dauer_Bewaesserung_vorn_1:state]+[ Dauer_Bewaesserung_vorn_2:state]+[ Dauer_Bewaesserung_vorn_3:state])*60};;\
set Bewaesserung_vorn_1 on-for-timer {([ Dauer_Bewaesserung_vorn_1:state]*60)};; sleep {([Dauer_Bewaesserung_vorn_1:state])*60};;\
set Bewaesserung_vorn_2 on-for-timer {([ Dauer_Bewaesserung_vorn_1:state])*60};; sleep {([Dauer_Bewaesserung_vorn_1:state])*60};;\
set Bewaesserung_vorn_3 on-for-timer {([ Dauer_Bewaesserung_vorn_2:state])*60};; sleep {([Dauer_Bewaesserung_vorn_2:state])*60};;\
set Bewaesserung_vorn_4 on-for-timer {([ Dauer_Bewaesserung_vorn_3:state])*60};; sleep {([Dauer_Bewaesserung_vorn_3:state])*60};;\
set $SELF cmd_3;;\
)\
DOELSE\
(\
set Bewaesserung_vorn_1 OFF;;\
set Bewaesserung_vorn_2 OFF;;\
set Bewaesserung_vorn_3 OFF;;\
set Bewaesserung_vorn_4 OFF;;\
set Gartenwasser off;;\
)
attr do_Bewaesserung DbLogExclude .*
attr do_Bewaesserung cmdIcon cmd_1:audio_play
attr do_Bewaesserung do always
attr do_Bewaesserung group Bewässerung
attr do_Bewaesserung icon control_arrow_turn_right
attr do_Bewaesserung room Garten
attr do_Bewaesserung verbose 5
attr do_Bewaesserung webCmd cmd_1
Da sind meiner Meinung nach Leerzeichen, wo keine sein sollten.
Z.b. ([Dauer_Gartenwasser_an :state]