Hauptmenü

Bewässerungssteuerung

Begonnen von arthur_dent_2015, 19 Mai 2020, 20:43:27

Vorheriges Thema - Nächstes Thema

arthur_dent_2015

Hallo Leute,
ich brauche mal Ideen...
Ich betreibe eine Bewässerung mit 6 Strängen. Die Pumpe wird über eine Homematic Steckdose geschaltet, die Stränge mit einem 6-Wege Verteiler von Gardena mechanisch per Druck gesteuert. 2 Stränge sollen morgens, die anderen 4 Abends laufen. Das ganze abhängig von der Tagestemperatur und der Regenmenge. Dafür habe ich mir ein DOIF ausgedacht:

([({sunrise("CIVIL")}+3600)] and [?Bewaesserung:state] eq "on" and [Wetter:fc0_rain] <= 5 and [Wetter:fc0_tempMax] >= 20) (set HM_Steckdose_Sw on-for-timer 3600) DOELSEIF ([([myAstro:SunSet]-[7200])] and [?Bewaesserung:state] eq "on" and [Wetter:fc0_rain] <= 5 and [Wetter:fc0_tempMax] >= 20) (set HM_Steckdose_Sw on-for-timer 3600) DOELSEIF ([({sunrise("CIVIL")}+3600)] and [?Bewaesserung:state] eq "on" and [Wetter:fc0_rain] <= 5 and [Wetter:fc0_tempMax] >= 15 and [Wetter:fc0_tempMax] < 20) (set HM_Steckdose_Sw on-for-timer 1800) DOELSEIF ([([myAstro:SunSet]-[7200])] and [?Bewaesserung:state] eq "on" and [Wetter:fc0_rain] <= 5 and [Wetter:fc0_tempMax] >= 15 and [Wetter:fc0_tempMax] < 20) (set HM_Steckdose_Sw on-for-timer 1800)
do always
repeatcmd 3660:3660:1860:1860
repeatsame 2:4:2:4
wait 60:60:60:60

Bewaesserung ist ein dummy um die Steuerung dauerhaft abzuschalten. Das Problem ist nun, dass, wenn die morgendliche oder abendliche Bewässerung z.B. wegen Regen ausfällt, die ganze Steuerung durcheinander ist. Der mechanische Schalter bekommt davon ja nichts mit. Beispiel: der Druckschalter steht auf Strang 1, die morgendliche Bewässerung findet nicht statt. Die abendlich Bewässerung erwartet das Wasser aber auf Strang 3. Heißt, ich müsste dafür sorgen dass der Schalter um 2 Positionen vorgerückt wird (die Pumpe müsste für eine Zeit x trotzdem eingeschaltet werden) oder aber die abendliche ebenfalls nicht durchgeführt wird.
Jetzt fehlen mir die Ideen wie ich das umsetzen könnte :(
Wenn jemand eine Idee hat, her damit!
Danke & Gruß
Arthur

duke-f

So einen 6-Wege-Verteiler hatte ich auch mal. Wahrscheinlich aber eine Vorgängerversion, die immer einmal die 6 Positionen nacheinander im Kreis ansteuert. Ich hatte gelegentlich das Problem, dass der Verteiler nicht eine Position weiter geschalten hat. Habe mir dann 6 möglichst identische Bereiche eingerichtet, wobei ein etwa doppelt so großer Bereich  zweimal angesteuert wurde. Schlussendlich bin ich jetzt aber dabei, das ganze durch mehrere einzelne Ventile zu ersetzen.

Kannst Du für den Fall, dass beispielsweise morgens wegen Regen keine Bewässerung stattfindet so programmieren, dass trotzdem beispielsweise eine Minute gewässert wird? So wurde es seinerzeit von meinem Gardena-Bewässerungscomputer gehandhabt.
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

arthur_dent_2015

Zitat von: duke-f am 19 Mai 2020, 21:51:47
So einen 6-Wege-Verteiler hatte ich auch mal. Wahrscheinlich aber eine Vorgängerversion, die immer einmal die 6 Positionen nacheinander im Kreis ansteuert. Ich hatte gelegentlich das Problem, dass der Verteiler nicht eine Position weiter geschalten hat.
Es ist der Vorgänger des derzeit aktuellem, also das rund Ding. Der funktioniert eigentlich ganz zuverlässig.
Die Version mit einzelnen Ventilen wäre natürlich die Beste, geht aber nicht weil Funk nicht in Frage kommt und ich keine Kabel vergraben will.
Zitat von: duke-f am 19 Mai 2020, 21:51:47
Kannst Du für den Fall, dass beispielsweise morgens wegen Regen keine Bewässerung stattfindet so programmieren, dass trotzdem beispielsweise eine Minute gewässert wird? So wurde es seinerzeit von meinem Gardena-Bewässerungscomputer gehandhabt.
Die Idee hatte ich ja auch schon. Nur, wie in das DOIF integrieren?

duke-f

In der sachgemäßen Anwendung des DOIF-Moduls stecke ich leider absolut nicht drin, daher kann ich Dir nicht mehr als mit diesem Ansatz dienen. Aber wie wäre es als erster Versuch mit einem zweiten, nahezu identischen DOIF mit eben der umgekehrten Abfrage und entsprechend kurzer Bewässerungsdauer?

Btw: Dann ist das der Verteiler, den auch ich habe/hatte.
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

amenomade

ZitatDie Idee hatte ich ja auch schon. Nur, wie in das DOIF integrieren?
([({sunrise("CIVIL")}+3600)] and [?Bewaesserung:state] eq "on")
    (IF ([Wetter:fc0_tempMax] >= 20 and [Wetter:fc0_rain] <= 5 and [Wetter:fc0_tempMax] >= 20)
        (set HM_Steckdose_Sw on-for-timer 3600)
     ELSE
        (set HM_Steckdose_Sw on-for-timer 60))
DOELSEIF .... usw...
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

arthur_dent_2015

hmm, IF im DOIF wäre auch ein Ansatz. Ich teste gerade mal eine Aufteilung auf morgens und abends, sprich reiner DOIF Ansatz mit 2 DOIF's und jeweils DOELSE. In der Hoffnung dass repeatcmd, repeatsame und wait auch beim DOELSE ziehen.
Wenn das nicht funktioniert komm ich auf den Vorschlag von amenomade zurück und teste den.
Weitere Vorschläge aber weiterhin willkommen.
Danke & Gruß
Arthur

amenomade

#6
ZitatIch teste gerade mal eine Aufteilung auf morgens und abends, sprich reiner DOIF Ansatz mit 2 DOIF's und jeweils DOELSE.
Ich verstehe nicht ganz, was Du machen willst. Das DOELSE wird auch nach Sunset greifen

Eigentlich willst Du, dass beim Sunset IMMER gewäessert wird, und nur die Länge abhängig von den anderen Bedingungen ändern. Deswegen den IF Vorschlag. Eine Alternative wäre, ein kalkuliertes wait Attribut fürs Ausschalten.

ZitatIn der Hoffnung dass repeatcmd, repeatsame und wait auch beim DOELSE ziehen.
Ja, die greifen auch

Aber es gibt viele Möglichkeiten. Du könntest auch kurz nach Sunset+3600 testen, ob der Zustand des DOIFs bei cmd_1 liegt, und wenn nicht dann die 60Sekunden Bewässerung starten.

Mann kann auch mit einer Zeitspanne bewässern, und bielibige zusätzliche Bedingungen einbauen.
Oder... einfach zusätzliche DOELSEIF Zweige

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

#7
ZB folgendes sollte auch funktionieren:
DOIF Sunset and ?fc0rain < 5 and ?fc0temp >20
    3600
DOELSIF Sunset and ?fc0rain < 5 and ?fc0temp > 15
    1800
DOELSIF Sunset
    60
DOELSIF Sunrise and ?fc0rain < 5 and ?fc0temp >20
    3600
DOELSIF Sunrise and  ?fc0rain < 5 and ?fc0temp > 15
    1800
DOELSIF Sunrise
    60
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

arthur_dent_2015

Ich hab das jetzt so realisiert:

([({sunrise("CIVIL")}+3600)] and [?Bewaesserung:state] eq "on" and [Wetter:fc0_rain] <= 5 and [Wetter:fc0_tempMax] >= 20) ({Log 3,"Bewässerung Bedingung 1 ausgeführt"}) DOELSEIF ([({sunrise("CIVIL")}+3600)] and [?Bewaesserung:state] eq "on" and [Wetter:fc0_rain] <= 5 and [Wetter:fc0_tempMax] >= 15 and [Wetter:fc0_tempMax] < 20) ({Log 3,"Bewässerung Bedingung 2 ausgeführt"}) DOELSE ({Log 3,"Bewässerung Bedingung 3 ausgeführt"})
do always
repeatcmd 3660:1860:60
repeatsame 2:2:2
wait 60:60:60

Mal sehen was morgen im Log steht

arthur_dent_2015

okay, falscher Ansatz :(
Mal sehen was jetzt mit dem IF im DOIF passiert....

arthur_dent_2015

ich habe das jetzt über 2 DOIF realisiert:

Internals:
   DEF        ([({sunrise("CIVIL")}+3600)] and [?Bewaesserung:state] eq "on" and [?Wetter:fc0_rain] <= 5 and [?Wetter:fc0_temp06] >= 15) (set HM_Steckdose_Sw on-for-timer 3600, {Log 3, "Bedingung 1 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_temp06]"}) DOELSEIF ([({sunrise("CIVIL")}+3600)] and [?Bewaesserung:state] eq "on" and [?Wetter:fc0_rain] <= 3 and [?Wetter:fc0_temp06] > 10 and [?Wetter:fc0_temp06] < 15) (set HM_Steckdose_Sw on-for-timer 1800, {Log 3, "Bedingung 2 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_temp06]"}) DOELSEIF ([({sunrise("CIVIL")}+3600)] and [?Bewaesserung:state] eq "off") ({Log 3, "Bewässerung:off"}) DOELSE (set HM_Steckdose_Sw on-for-timer 300, {Log 3, "Bedingung 3 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_temp06]"})
   FUUID      5ec7d64b-f33f-7c8d-2773-9d512c820839e870
   FVERSION   98_DOIF.pm:0.219790/2020-05-20
   MODEL      FHEM
   NAME       Bewaesserung_AM
   NOTIFYDEV  global
   NR         203
   NTFY_ORDER 50-Bewaesserung_AM
   STATE      cmd_2
   TYPE       DOIF
   VERSION    21979 2020-05-20 08:36:23
   READINGS:
     2020-05-25 05:56:59   cmd             2
     2020-05-25 05:56:59   cmd_event       timer_2
     2020-05-25 05:56:59   cmd_nr          2
     2020-05-22 16:21:24   mode            enabled
     2020-05-25 05:56:59   state           cmd_2
     2020-05-25 05:25:59   timer_01_c01    26.05.2020 05:24:37
     2020-05-25 05:25:59   timer_02_c02    26.05.2020 05:24:37
     2020-05-25 05:25:59   timer_03_c03    26.05.2020 05:24:37
     2020-05-25 06:27:59   wait_timer      no timer
   Regex:
     accu:
   attr:
     cmdState:
     repeatcmd:
       3660
       1860
       30
       360
     repeatsame:
       2
       2
       2
       2
     wait:
       0:
         60
       1:
         60
       2:
         60
       3:
         60
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday) and ::ReadingValDoIf($hash,'Bewaesserung','state') eq "on" and ::ReadingValDoIf($hash,'Wetter','fc0_rain') <= 5 and ::ReadingValDoIf($hash,'Wetter','fc0_temp06') >= 15
     1          ::DOIF_time_once($hash,1,$wday) and ::ReadingValDoIf($hash,'Bewaesserung','state') eq "on" and ::ReadingValDoIf($hash,'Wetter','fc0_rain') <= 3 and ::ReadingValDoIf($hash,'Wetter','fc0_temp06') > 10 and ::ReadingValDoIf($hash,'Wetter','fc0_temp06') < 15
     2          ::DOIF_time_once($hash,2,$wday) and ::ReadingValDoIf($hash,'Bewaesserung','state') eq "off"
   days:
   do:
     0:
       0          set HM_Steckdose_Sw on-for-timer 3600, {Log 3, "Bedingung 1 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_temp06]"}
     1:
       0          set HM_Steckdose_Sw on-for-timer 1800, {Log 3, "Bedingung 2 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_temp06]"}
     2:
       0          {Log 3, "Bewässerung:off"}
     3:
       0          set HM_Steckdose_Sw on-for-timer 300, {Log 3, "Bedingung 3 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_temp06]"}
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_2
     globalinit 1
     last_timer 3
     sleepdevice timer_2
     sleepsubtimer -1
     sleeptimer -1
     timerdev   
     timerevent timer_2
     triggerDev
     timerevents:
       timer_2
     timereventsState:
       timer_2
     triggerEvents:
       timer_2
     triggerEventsState:
       timer_2
   interval:
   intervalfunc:
   localtime:
     0          1590463477
     1          1590463477
     2          1590463477
   perlblock:
   realtime:
     0          05:24:37
     1          05:24:37
     2          05:24:37
   time:
     0          ({sunrise("CIVIL")}+3600)
     1          ({sunrise("CIVIL")}+3600)
     2          ({sunrise("CIVIL")}+3600)
   timeCond:
     0          0
     1          1
     2          2
   timer:
     0          0
     1          0
     2          0
   timers:
     0           0
     1           1
     2           2
   triggertime:
     1590463477:
       localtime  1590463477
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   repeatcmd  3660:1860:30:360
   repeatsame 2:2:2:2
   wait       60:60:60:60


Internals:
   DEF        ([([myAstro:SunSet]-[7200])] and [?Bewaesserung:state] eq "on" and [?Wetter:fc0_rain] <= 5 and [?Wetter:fc0_tempMax] >= 15) (set HM_Steckdose_Sw on-for-timer 3600, {Log 3, "Bedingung 1 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_tempMax]"}) DOELSEIF ([([myAstro:SunSet]-[7200])] and [?Bewaesserung:state] eq "on" and [?Wetter:fc0_rain] <= 3 and [?Wetter:fc0_tempMax] > 10 and [?Wetter:fc0_tempMax] < 15) (set HM_Steckdose_Sw on-for-timer 1800, {Log 3, "Bedingung 2 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_tempMax]"}) DOELSEIF ([([myAstro:SunSet]-[7200])] and [?Bewaesserung:state] eq "off") ({Log 3, "Bewässerung:off"}) DOELSE (set HM_Steckdose_Sw on-for-timer 300, {Log 3, "Bedingung 3 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_tempMax]"})
   FUUID      5ec7e09a-f33f-7c8d-7279-c436574beff0f830
   FVERSION   98_DOIF.pm:0.219790/2020-05-20
   MODEL      FHEM
   NAME       Bewaesserung_PM
   NOTIFYDEV  myAstro,global
   NR         204
   NTFY_ORDER 50-Bewaesserung_PM
   STATE      cmd_1
   TYPE       DOIF
   VERSION    21979 2020-05-20 08:36:23
   READINGS:
     2020-05-24 22:26:00   cmd             1
     2020-05-24 22:26:00   cmd_event       timer_1
     2020-05-24 22:26:00   cmd_nr          1
     2020-05-22 16:28:38   mode            enabled
     2020-05-24 22:26:00   state           cmd_1
     2020-05-25 01:30:16   timer_01_c01    25.05.2020 19:24:00
     2020-05-25 01:30:16   timer_02_c02    25.05.2020 19:24:00
     2020-05-25 01:30:16   timer_03_c03    25.05.2020 19:24:00
   Regex:
     accu:
     itimer:
       myAstro:
         itimer:
           SunSet     ^myAstro$:^SunSet:
   attr:
     repeatcmd:
       3660
       1860
       30
       360
     repeatsame:
       4
       4
       4
       4
     wait:
       0:
         60
       1:
         60
       2:
         60
       3:
         60
   condition:
     0          ::DOIF_time_once($hash,0,$wday) and ::ReadingValDoIf($hash,'Bewaesserung','state') eq "on" and ::ReadingValDoIf($hash,'Wetter','fc0_rain') <= 5 and ::ReadingValDoIf($hash,'Wetter','fc0_tempMax') >= 15
     1          ::DOIF_time_once($hash,1,$wday) and ::ReadingValDoIf($hash,'Bewaesserung','state') eq "on" and ::ReadingValDoIf($hash,'Wetter','fc0_rain') <= 3 and ::ReadingValDoIf($hash,'Wetter','fc0_tempMax') > 10 and ::ReadingValDoIf($hash,'Wetter','fc0_tempMax') < 15
     2          ::DOIF_time_once($hash,2,$wday) and ::ReadingValDoIf($hash,'Bewaesserung','state') eq "off"
   days:
   do:
     0:
       0          set HM_Steckdose_Sw on-for-timer 3600, {Log 3, "Bedingung 1 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_tempMax]"}
     1:
       0          set HM_Steckdose_Sw on-for-timer 1800, {Log 3, "Bedingung 2 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_tempMax]"}
     2:
       0          {Log 3, "Bewässerung:off"}
     3:
       0          set HM_Steckdose_Sw on-for-timer 300, {Log 3, "Bedingung 3 rain: [Wetter:fc0_rain] Temp: [Wetter:fc0_tempMax]"}
   helper:
     DEVFILTER  ^global$|^myAstro$
     NOTIFYDEV  global|myAstro
     globalinit 1
     last_timer 3
     sleeptimer -1
   intervalfunc:
   localtime:
     0          1590427440
     1          1590427440
     2          1590427440
   perlblock:
   realtime:
     0          19:24:00
     1          19:24:00
     2          19:24:00
   time:
     0          ([myAstro:SunSet]-[7200])
     1          ([myAstro:SunSet]-[7200])
     2          ([myAstro:SunSet]-[7200])
   timeCond:
     0          0
     1          1
     2          2
   timer:
     0          0
     1          0
     2          0
   timers:
     0           0
     1           1
     2           2
   triggertime:
     1590427440:
       localtime  1590427440
       hash:
   uiTable:
Attributes:
   do         always
   repeatcmd  3660:1860:30:360
   repeatsame 4:4:4:4
   wait       60:60:60:60

funktioniert seit 2 Tagen ohne Probleme :)

duke-f

Hmmmm - wo liegt jetzt der Unterschied? Willst Du nicht mal einfach nur die beiden DOIFs ohne gen ganzen Schnick-Schnack drum herum posten?
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

Tobias

Schau mal in mein Wiki zu meiner Bewässerungssteuerung. Dort habe ich das DOIF genau beschrieben. Ich denke da kanst du dir einigen abschauen und eventuell übernehmen.
https://github.com/tobiasfaust/ESP8266_PumpControl/wiki/Integration-FHEM

Wenn du die von dir beschriebene Logik haben willst, ist dein Gardena 6 Wege VErteiler nicht gut geeignet. Da muss immer alles durchlaufen, ansonsten komm alles durcheinander. Ich hatte diesen am Anfang auch - aber bald wieder rausgeworfen, kenn ihn also ;)

Als Anregung, schau mal mein Wiki durch - meine PumpControl Lösung kann ich dir für dein Fall nur empfehlen
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

arthur_dent_2015

Zitat von: duke-f am 03 Juni 2020, 20:15:26
Hmmmm - wo liegt jetzt der Unterschied? Willst Du nicht mal einfach nur die beiden DOIFs ohne gen ganzen Schnick-Schnack drum herum posten?
steht doch in den jeweiligen DEF's

Zitat von: Tobias am 03 Juni 2020, 20:45:34
Schau mal in mein Wiki zu meiner Bewässerungssteuerung. Dort habe ich das DOIF genau beschrieben. Ich denke da kanst du dir einigen abschauen und eventuell übernehmen.
https://github.com/tobiasfaust/ESP8266_PumpControl/wiki/Integration-FHEM

Wenn du die von dir beschriebene Logik haben willst, ist dein Gardena 6 Wege VErteiler nicht gut geeignet. Da muss immer alles durchlaufen, ansonsten komm alles durcheinander. Ich hatte diesen am Anfang auch - aber bald wieder rausgeworfen, kenn ihn also ;)

Als Anregung, schau mal mein Wiki durch - meine PumpControl Lösung kann ich dir für dein Fall nur empfehlen

Ich weiß, die Lösung mit dem Verteiler ist eher suboptimal, aber die Verhältnisse geben nichts anderes her (siehe weiter oben). Ich hab jetzt noch mal die Pausen zwischen den Schaltvorgängen verlängert, seit dem kommt es auch nicht mehr zu Doppelbewässerungen. Ich bin mit der Lösung jetzt erst mal vollauf zufrieden :)

Danke für eure Tips!
Arthur

duke-f

Nett. Über solche Post ärgere ich ich schon mal bei meinen eigenen Fragen. Aber bei Interesse hinsichtlich der Umsetzung nach einiger Beteiligung an der Diskussion ist mir jetzt eine Antwort à la "such' selber" doch eher unerwartet.
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite