Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

martin_aus_Ddorf
Beiträge: 56
Registriert: 2. Apr 2018 15:45

Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von martin_aus_Ddorf »

Hallo zusammen,

diese Anfrage bezieht sich auf das tolle Projekt von Cyrelian aus dem Jahr 2018... und da dieser Thread schon 16 Seiten hat, schreibt udo1toni, dass mal lieber ein neuer Thread aufgemacht werden soll...

Das Thread von Cyrelian beschreibt eicht ein Wahnsinnsprojekt! Und ist vermutlich jedes Frühjahr aktuell. 😊

Bei mir läuft nun ein Wasserkreis mit Magnetventil und einem Sonoff über OH. Als Nichtprogrammierer tue ich mich offen gestanden sehr schwer den Rules-Code zu nachzuvollziehen. Anfangs hatte ich noch gehofft, dass alles „irgendwie“ per Copy&Paste in mein System zu überführen, doch die 16 Seiten Foreneinträge haben mir ganz schnell den Zahn gezogen.
Deshalb habe ich mir überlegt, ob es nicht möglich ist, das ganze System von den Anforderungen auf eine Kernaussage „Bewässere in Abhängigkeit von Regen IST und SOLL (Vorhersage) Werten“ zu reduzieren.

Wenn ich das OH System aus Bindgings, Things, Items und Rules richtig verstanden habe, müsste also eine Regel reichen die umgangssprachlich folgendes aussagt:
(DB = DauerBeregnung in Minuten, die berechnet wird)

Code: Alles auswählen

Starte jeden Montag, Mittwoch und Freitag um 03.00 Uhr
   Wenn DB > 0, dann
         Ventil auf
         Warte DB Minuten 
         Ventil zu
Ende.
Ich tippe mal, das müsste irgendwie als Rule hinterlegt werden, oder?
Die Beregnungsdauer könnte eine Funktion aus vorgegebenen Variablen und Werten von dem Wetterdienst sein:

Code: Alles auswählen

DB = DauerBeregnung (die gesuchte Zahl)
MB = Maximale Beregnungsdauer (ein Vorgabe durch den User)
MR = Maximaler Regen (eine Vorgabe in mm durch den User: Fällt mehr, dann keine zusätzliche Beregnung)
IR = IST-Regen (Niederschlag in mm gestern, durch Wetterdienst)
SR = SOLL-Regen (Niederschlag in mm Vorhersage durch Wetterdienst)
DB wäre dann z.B.:

Code: Alles auswählen

DB = MB – ((IR+SR)/MR * MB)
Wenn es also schon mehr als notwendig geregnet hat, plus noch wird, dann ist der Wert negativ und das Ventil bleibt zu.
Wo könnte denn dann eine solche Berechnung in OH stattfinden? Wie komme ich denn an die IST und Soll Werte? Das Wunderground-Binding habe ich eingebunden und steh jetzt ratlos da.
Wäre dieser Ansatz weniger komplex als das von Cyrelian, oder liegt der Teufel derart im Detail, dass es genau so umfangreich wird? Ich hoffe, dass ich hiermit jemanden anspreche die/der das Projekt auch klasse findet, die große Lösung auch respekteinflößend findet aber programmieren kann…

Mir ist auch klar, dass ich hier gerade nach viel frage – ich hab versucht den Programmbereich so klein wie möglich zu halten und verstehe aber die Zusammenhänge nur so lala… aber wäre das nicht einfacher als bei Cyrelian?

Kann mir jemand bitte helfen?
Danke euch!
Martin

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von udo1toni »

Im Großen und Ganzen ist das in etwa das, was Cyrelians Rule auch macht. Ob die Formel so stimmt, müsste man dann halt noch prüfen.

Grundsätzlich arbeitet die Rule Engine von openHAB (genau wie der Rest von openHAB auch) eventgesteuert. Soll heißen, es tritt ein Ereignis auf, deshalb wird eine Rule gestartet.
Ein typisches Ereignis wäre, dass eine bestimmte Uhrzeit errreicht ist, oder auch, dass sich ein bestimmter Wert geändert hat.
Alle werte, auf die Du zugreifen willst, musst Du als Item zur Verfügung stellen. Dann muss die Rule prüfen, dass alle Items sinnvolle werte enthalten, die Berechnung vornehmen und gegebenenfalls die Beregnung starten.
Eine nicht unwichtige frage wäre dabei, wann die Beregnung stattfinden soll. Bei nur einem Ventil stellt sich eine andere Frage hingegen nicht, nämlich, wie die Zonen gesteuert werden.

Ich möchte an der Stelle nicht unerwähnt lassen, dass es mit OpenSprinkler eine Software gibt, die darauf spezialisiert ist, die Bewässerung zu steuern, und wir reden hierbei um ein System, welches notfalls auch für die Gärten vom Schloss Versailles verwendet werden könnte und den Vergleich mit mehrere 10.000 € teuren Systemen nicht zu scheuen braucht - mit dem Unterschied, dass es kostenlos ist und von openHAB gesteuert werden kann... ;)

Aber in Deinem Fall (ein Ventil...) wäre das zugegebenermaßen etwas überkandidelt.

Zurück zum Thema... Es ist sicherlich sinnvoll, zu prüfen, ob es gerade regnet (dann wäre Bewässerung eher Quatsch, weil potenziell zu viel Wasser in einer Zeiteinheit fließen könnte. Ebenso ist es vermutlich sinnvoll, zu prüfen, ob es demnächst regnen wird.
Da die Regenmenge in mm vorliegen wird, wäre es natürlich auch sinnvoll, die gewünschte Wassermenge ebenfalls in mm anzugeben, denn dann reduziert sich die Berechnung auf Soll_mm = (Soll_mm_Tag - Ist_mm - Vorhersage_mm). Mit der Durchflussmenge kann dann leicht die Dauer kalkuliert werden, eben Dauer = Soll_mm/(mm/Stunde), bzw. Soll_mm * Stunde/mm.
Soll das Wasser auf einmal ausgebracht werden, oder im mehreren Phasen? Oft wird ja (gerade im Sommer) mehr Wasser gebraucht (ich meine mich zu erinnern, dass Cyrelians Rule diese ganzen Dinge mit berücksichtigt, was dann die Komplexität erklärt (Temperatur, Bewölkung, Regenmenge usw...)
Du musst die ausgebrachte Wassermenge auf jeden Fall speichern und täglich zurücksetzen. Es wäre naheliegned, die Rules etwas anders zu gestalten, in der Art, dass die ausgebrachte Wassermenge in 1-mm-Schritten berücksichtigt wird, das ginge so, dass, solange das Wasserventil geöffnet ist, alle x Minuten ein Zählimpuls generiert wird. Die Zählimpulse werden nun vom Tagessoll abgezogen, bis das Tagessoll 0 ist. Der gefallene Regen wird ebenfalls abgezogen, genau wie die vorhergesagte Menge.

Wenn also das Ventil auf ON wechselt, wird ein Timer mit fixer Länge gestartet, der sich selbst erneut startet, wenn er abläuft und außerdem den Zählimpuls sendet. Wird das Ventil geschlossen, wird der Timer gestoppt. eine weitere Rule triggert bei jedem Zählimpuls, sowie bei Update der Regenmengen. In dieser Rule wird die Berechnung der Abweichung vom Soll vorgenommen.
Eine dritte Rule setzt den Sollwert einmal täglich auf den gewählten Sollwert.
Eine vierte Rule startet zu einer bestimmten Zeit die Bewässerung, falls die Voraussetzungen erfüllt sind.

Es sind also mehrere Rules für die eine Aufgabe zuständig, die aber jeweils nur ein kleines Detail erledigen, dafür aber total einfach aufgebaut sind.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

martin_aus_Ddorf
Beiträge: 56
Registriert: 2. Apr 2018 15:45

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von martin_aus_Ddorf »

Erst mal ganz herzlichen Dank für deine Antwort. Ich habe schon ein paar sehr hilfreiche Hinweise gefunden und auch schon ein paar Stelle, die ich nicht verstanden habe. Warum ich z.B. die ausgebrachte Wassermenge speichern soll(te) und zurücksetzen muss ist mir nicht klar. Wenn ich dich richtig interpretiere, dann wäre das wichtig, falls die Vorhersage nicht richtig war und beispielsweise wenig Regen angekündigt war, aber viel fiel. Dann hätte ich einen Tag mehr beregnet, als notwendig war - was aber nicht schlimm ist, denn die falsche Vorhersage wird am nächsten Tag ja zu einem IST Wert. Dann hat der Garten halt mal mehr Wasser bekommen. Aber mir scheint, ich muss erst mal ein paar Brocken aus dem Weg räumen - z.B. "wie programmiert man?" und dann kommen diese Details.

Die Beregnung über die Zeit zu steuern ist schon ok, da hier mehr als genug Erfahrungswerte vorliegen. Es muss im Übrigen schon sehr heiß sein, dass man mal 2x oder mehr am Tag sprengen muss. Als halber Rasen- und Gartenfachmann kann ich sagen, dass 1x lange sprengen für die Wurzelbildung der Pflanzen besser ist, als 4x kurz beregnen. Und wenn man kein Schneckenbiotop möchte, dann sprengt man auch nicht zu spät :-) Ich habe bisher immer gegen 6 Uhr in der Früh beregnen lassen und bin damit gut gefahren.

Als erstes versuche ich nun mal die Werte von Wunderground als Items zu holen. Das wird mich schon genug fordern und dann komme ich wieder und frage mal nach, wie ich einen Timer (cron job?) steuere und wie ich eine Berechnung (DauerBeregnung in Minuten) machen kann. :-)

Ach ja, ich versuche mich an OH3. Das scheint mir im Augenblick noch nicht wichtig zu sein, aber ich wollte es zur Sicherheit mal gesagt haben..

Erst mal ganz herzlichen Dank!

Beste Grüße
Martin

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von udo1toni »

Es ist nicht so, dass es Wichtig wäre, es so wie von mir beschrieben zu lösen, es scheint mir aber einfacher zu realisieren und letztlich genauer.

Sechs Uhr morgens als Startzeit ist aus programmlicher Sicht genauso gut oder schlecht wie jede andere Zeit, wenn das für den Garten gut ist, soll es mir recht sein :)

Eine Rule zum Einschalten des Wassers:

Code: Alles auswählen

rule "Wasser Marsch" 
when
    Time cron "0 0 6 * 5-9 ?" // Mai bis September um 6 Uhr
then
    Soll_Tag.postUpdate(Soll.state)
    Beregnung.sendCommand(ON)
end
Notfalls könnte man noch beliebige Bedingungen einbauen, natürlich um den Preis, dass potenziell an diesem Tag keine Beregnung stattfindet, weil die Beregnung nun mal um 6 Uhr startet.

Nehmen wir an, die Beregnung braucht 5 Minuten, um auf einen Quadratmeter 0,1 Liter Wasser zu beregnen, also 0,1 mm, und wir wollen 3 Liter pro Quadratmeter beregnen, dann wäre Soll 30 und um 6 Uhr wird auch Soll_Tag 30.

Eine weitere Rule:

Code: Alles auswählen

var Timer tRain = null

rule "Zyklus"
when
    Item Beregnung changed
then
    tRain?.cancel
    if(Beregnung.state == ON)
        tRain = createTimer(now.plusMinutes(5),[|
            val nSoll = Soll_Tag.state as Number
            val nIst = Ist_Tag.state as Number
            val nWird = Wird_Tag.state as Number
            if(nSoll  - 10 * (nIst + nWird) > 0) {
                Soll_Tag.postUpdate(nSoll - 1))
                tRain.reschedule(now.plusMinutes(5))
            } else {
                Beregnung.sendCommand(OFF)
            }
        ])
end
Schwupp, erledigt.
Natürlich kann man die Rules auch so bauen, dass man Zeiteinheiten benutzt, aber es scheint mir so naheliegend... :)

Der Umweg über die Konstanten ist nicht zwingend, ist aber praktisch, falls man die Werte noch anderweitig verwenden will (z.B. die doppelte Verwendung von nSoll). Durch den zyklischen Timer kann man auch noch eine Anzeige realisieren, wieviel mm noch zum Soll fehlen (natürlkich ohne Berücksichtigung des Regens)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

martin_aus_Ddorf
Beiträge: 56
Registriert: 2. Apr 2018 15:45

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von martin_aus_Ddorf »

Zunächst war ich mal stolz wie Karl-Otto, dass ich ein Wetter-Thing nach drei Anläufen (openweather) erstellen konnte und frage mich gerade, wie bzw. wo ich das anpasse, dass sie das tun, was ich gerne hätte. Zudem bin ich irgendwie davon ausgegangen, wenn ich in OH3 ein item anlege, dass ich dann auf dem Server eine entsprechende Datei finde, wo ich mehr sehen kann...

Also gut, du siehst schon ich hadere noch mit den Basics und daher versuche ich derzeit deine Antwort syntaktisch und semantisch zu entschlüsseln, was mir halt noch nicht so recht gelingt. Dennoch erst mal ganz herzlichen Dank, auch wenn ich es noch nicht begreife.

Ich bin also noch bei deinem Punkt "Alle werte, auf die Du zugreifen willst, musst Du als Item zur Verfügung stellen."... Vielleicht muss ich als erstes die OH3 Oberfläche verlassen und mit Putty und vi weiter sehen - das wird ein paar Tage dauern und dann komme ich vermutlich mir irgendeiner trivialen Frage zurück..

danke dir!!
Grüße
Martin

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von Cyrelian »

martin_aus_Ddorf hat geschrieben: 12. Mai 2021 08:11 Zudem bin ich irgendwie davon ausgegangen, wenn ich in OH3 ein item anlege, dass ich dann auf dem Server eine entsprechende Datei finde, wo ich mehr sehen kann...
Hi Martin, das ist leider nicht der Fall. Alles was via GUI z.B. an ITEMS oder THINGS angelegt wird, findet man nicht im Filesystem/Files.
martin_aus_Ddorf hat geschrieben: 12. Mai 2021 08:11 Ich bin also noch bei deinem Punkt "Alle werte, auf die Du zugreifen willst, musst Du als Item zur Verfügung stellen."...
Das ist meiner Meinung nach der wichtigste Punkt. Am besten machst Du vor dem Anlegen der ITEMS Gedanken darüber, welche Werte du für die Bewässerung verwenden willst.
Bei mir ist das damals über die Zeit einfach "gewachsen", da mir während der Umsetzung immer Dinge auf- und eingefallen sind die man mit einbauen könnte.
Da wären zum einen die Bodenbedingungen(sandiger Boden oder eher lehmiger Boden), Wetterbedingungen(review und forecast), optimale Uhrzeit der Beregnung (sehr früh morgens, da der Boden sich in der Nacht abgekühlt hat) usw.
Du siehst.....es ist komplex aber nicht kompliziert :D

CU
Cyrelian

marcelj
Beiträge: 4
Registriert: 23. Jun 2022 11:56

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von marcelj »

Hallo ihr Lieben,

nachdem in diesem Thread zwar schon ein Jahr Ruhe eingekehrt ist, melde ich mich jetzt in meiner Verzweiflung an Euch Profis.

Mir ist es gelungen, die Beregungsregel auf mein OH3 (inkl. openweathermap-API-workaround gemäß https://community.openhab.org/t/openwea ... ules/68513) zu adaptieren.

Berechnung des Scale-Faktors und alle nachgelagerten Schritte laufen problemlos.

Durch die Umstellung auf die Java Time API bekomme ich in meiner openweathermap-rule allerdings stets folgenden Fehler:

Code: Alles auswählen

Script execution of rule with UID 'openweathermap-5' failed: 'getDayOfMonth' is not a member of 'DateTime'
Ich habe jetzt sooo viel versucht, diesen Error auszubügeln, aber bekomme einfach nicht raus, was der Ersatz für getDayOfMonth gemäß Java Time sein soll. Sobald ich die Zeile auskommentiere, kommt übrigens der gleiche Error für getMonthValue.

Kann mir jemand von Euch sagen, wie ich mit diesen DateTime values umzugehen habe bzw. wie sie in OH3 richtigerweise heißen sollten?

Vielen Dank und die besten Grüße aus der Hauptstadt
Marcel

Die OWM-Rule ist recht umfangreich, deshalb verzichte ich hier mal darauf, sie zu posten. Ich denke, der entsprechende Teil der rule sollte aussagekräftig genug sein. Er sieht folgendermaßen aus:

Code: Alles auswählen

/* Compute daiy forecast values from the hourly forecast values provided by the OpenWeatherMap binding.*/

rule "Group-based weather forecast processing"
when
    Item DBG_Test_Weather_Forecast changed or // Debugging
    Time cron "0 0 0 * * ?" or
    Item Wx_OWM_Forecast_Time_03h changed
then
	val String ruleTitle = "UpdateOWMForecastInfo_Groups"

---> BEGINN PROBLEMZONE <---

    // Compute the rule execution time, making sure we use the same 'now' value for computing month, day and hour
    val DateTime dtNow = now
    val Number now_d = dtNow.getDayOfMonth
    val Number now_m = dtNow.getMonthValue
    val Number now_h = dtNow.getHour

    // Compute the month, day and hour of the first forecast time (3 hour offset)
    val DateTime dtForecast_03h = (new DateTime(Wx_OWM_Forecast_Time_03h.state.toString)).toDateTime
    val Number forecast_03h_d = dtForecast_03h.getDayOfMonth
    val Number forecast_03h_m = dtForecast_03h.getMonthValue
    val Number forecast_03h_h = dtForecast_03h.getHour
    
 ---> ENDE PROBLEMZONE <---

    // If the first forecast value doesn't apply for the current day (e.g., at 22:00h the 1st forecast is for the next day at 22:00 +3h = 01:00),
    // then set 'forecastDayOffset' to 'true' for further processing. In this edge case, we won't display today's forecast as it is nonexistent.
    val Boolean forecastDayOffset = ( if (forecast_03h_d > now_d) true else false )

    // Store the forecastDayOffset value in the proxy item Wx_OWM_Forecast_Day_Offset so it is available in sitemaps and UIs:
    if (forecastDayOffset) { // No forecast for today
        logInfo(ruleTitle, "No forecast for today ({}/{} - at or after {}h", now_d, now_m, now_h)
        if (Wx_OWM_Forecast_Day_Offset.state !== ON) {
            postUpdate(Wx_OWM_Forecast_Day_Offset, ON)
        }
    } else {
        if (Wx_OWM_Forecast_Day_Offset.state !== OFF) {
            postUpdate(Wx_OWM_Forecast_Day_Offset, OFF)
        }
    }

    logInfo(ruleTitle,
        "Update Wx forecast info - today is {}/{} @ {}h - 03h forecast is for {}/{} at {}h",
        now_d, now_m, now_h,
        forecast_03h_d, forecast_03h_m, forecast_03h_h)

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von int5749 »

Da fehlen aus meiner Sicht die Klammern

Nur kurz, da ich auf dem Sprung bin

Code: Alles auswählen

val Number now_d = dtNow.getDayOfMonth()
val Number now_m = dtNow.getMonthValue()
val Number now_h = dtNow.getHour()
VG
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von int5749 »

marcelj hat geschrieben: 23. Jun 2022 12:21 Kann mir jemand von Euch sagen, wie ich mit diesen DateTime values umzugehen habe bzw. wie sie in OH3 richtigerweise heißen sollten?

Vielen Dank und die besten Grüße aus der Hauptstadt
Marcel
Also, nun mit etwas mehr Zeit und VSC noch einmal richtig geschaut.
Der Fehler liegt schon in der Eingangsvariable, da der Typ nicht passt

Code: Alles auswählen

val DateTime dtNow = now
muss

Code: Alles auswählen

val ZonedDateTime dtNow = ZonedDateTime.now()
Ergebnis
2022-06-23T19:47:16.946428+02:00[Europe/Berlin]

Code: Alles auswählen

val ZonedDateTime dtNow = ZonedDateTime.now()
val Number now_d = dtNow.getDayOfMonth
val Number now_m = dtNow.getMonthValue
val Number now_h = dtNow.getHour
Ergebnis der now_x
23
6
19
Viele Grüße aus einer Kreisstadt :lol:
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

marcelj
Beiträge: 4
Registriert: 23. Jun 2022 11:56

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff (neuer Thread)

Beitrag von marcelj »

Tausend Dank, dass Du Dir die Sache angesehen und sie offenbar sogar direkt gelöst hast!
Ich bin am Wochenende nicht zuhause und habe keine Möglichkeit, das auszuprobieren - das Kribbeln in den Fingern ist schon jetzt unerträglich :D

Melde mich, sobald ich es testen konnte.

Nochmal danke und ein schönes sonniges Wochenende!

Antworten