Automatische Bewässerung von Gewächshaus und Rasen

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

Moderatoren: Cyrelian, seppy

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

Re: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von udo1toni »

wighdeas hat geschrieben: 28. Jul 2021 20:23

Code: Alles auswählen

when 
	Time cron "0 0 6-7 ? 5-10 1/2 *"	                 			//von 6-7uhr, Mai bis Oktober jeden Zweiten Tag
	Item GardenaSensor1_Bodenfeuchtigkeit < 50 %			// Seonsorschwellwert Feuchtigkeit < 50%
	Item GardenaSensor1_Bodentemperatur > 1 °C		        // Seonsorschwellwert Temperatur > 1°
then 
	Item Pumpe.sendCommand(ON)						// Einschalten der Pumpe
	Item Gewaechshaus.sendCommand(ON)			 	// Einschalten des Ventils für Gewächshaus
	createTimer(now.plusSeconds(300))					// Timer für Bewässerungsdauer
	Item Pumpe.sendCommand(OFF)					// Ausschalten der Pumpe
	Item Gewaechshaus.sendCommand(OFF)				// Ausschalten des Ventils für Gewächshaus
end
Meine Fragen - ist das nun richtig - habe ich irgendwelche formalen Fehler drin oder grundsätzlich nicht begriffen wie ich das machen soll?
Ja, da sind diverse Fehler drin, die auf grundsätzliche Missverständnisse hindeuten :) Aber mach Dir nichts drauß, das ist auch etwas schwierig...

Punkt 1 (und das ist gleich das größte Punkt): Der when-Teil einer Rule beschreibt sämtliche Trigger einer Rule. Jeder einzelne Trigger führt zur Ausführung der Rule. Deshalb müssen auch sämtliche Trigger mit or miteinander verknüpft werden. Nein, ein and gibt es nicht.
Punkt 2: Time cron beschreibt Zeitpunkte. Die Notation ist "s m h D M W Y" also Sekunde, Minute, Stunde, Tag, Monat, Wochentag, Jahr. Dabei ist Jahr optional. Außerdem muss exakt ein Fragezeichen im Term gesetzt sein, und zwar entweder beim Wochentag oder beim Tag - was ausschließt, dass man z.B. einen Trigger definiert, der nur am Freitag, dem 13. auslöst. Deine Notation würde um 6:00:00 Uhr und um 7:00:00 Uhr triggern, an jedem Tag von Mai bis Oktober, wenn da nicht 1/2 als Wochentag eingetragen wäre. Wie gesagt, zwei Zeitpunkte, kein Zeitraum (es handelt sich um Trigger)
Punkt 3: Der Trigger (!) Item GardenaSensor1_Bodenfeuchtigkeit < 50 % wird ebenfalls nicht funktionieren, genauso wie der nachfolgende Trigger, denn ein kleiner als oder größer als ist innerhalb eines Triggers nicht erlaubt.

Das, was Du möchtest, sind stattdessen Bedingungen (also Eingrenzungen), die in den then-Teil der Rule gehören. Dann jedoch brauchst Du immer noch einen Trigger.
Die Frage ist auch, wie Du Dir das nun tatsächlich vorstellst. Der Rule-Code deutet an, dass die Bewässerung nur 5 Minuten laufen soll. Andererseits soll sie aber im Zeitraum 6-7 Uhr stattfinden.
Eine mögliche Variante:

Code: Alles auswählen

rule "Gewächshaus bewässern"
when
    Time cron "0 0/10 6 1/2 5-10 ?"                                             // von 6:00:00 - 7:00:00 Uhr, alle 10 Minuten, 1. Mai bis 31. Oktober, jeden 2. Tag
then 
    if(GardenaSensor1_Bodenfeuchtigkeit.state instanceof Number)                // enthält das Item einen gültigen Zahlenwert?
        if((GardenaSensor1_Bodenfeuchtigkeit.state as Number).floatValue >= 50) // größer oder gleich 50?
            return;                                                             // dann Rule abbrechen
    if(GardenaSensor1_Bodentemperatur.state instanceof Number)                  // enthält das Item einen gültigen Zahlenwert?
        if((GardenaSensor1_Bodentemperatur.state as Number).floatValue <= 1)    // kleiner oder gleich 1?
            return;                                                             // dann Rule abbrechen

    Pumpe.sendCommand(ON)                                                       // Pumpe einschalten
    Gewaechshaus.sendCommand(ON)                                                // Ventil für Gewächshaus einschalten
    createTimer(now.plusSeconds(300), [|                                        // Timer für Bewässerungsdauer
        Pumpe.sendCommand(OFF)                                                  // Pumpe ausschalten
        Gewaechshaus.sendCommand(OFF)                                           // Ventil für Gewächshaus ausschalten
    ])
end
Die Rule triggert von 6 bis 7 Uhr alle 10 Minuten, jeden 2. Tag vom 1. Mai bis 31. Oktober.
Zunächst wird das Item, welches die Bodenfeuchte hält geprüft, genauer wird geprüft, ob der Status eine gültige Zahl enthält. Ist das der Fall, so wird dieser Wert mit 50 verglichen. Falls der Wert nicht darunter liegt, wird die Rule abgebrochen.
Danach wird das gleiche für das zweite Item - die Bodentemperatur - vorgenommen, hier mit dem Grenzwert 1, der nicht unterschritten werden darf.
Danach sind alle Bedingungen erfüllt und die Pumpe sowie das Ventil können aktiviert werden. Abschließend wird ein Timer angelegt, der beide Geräte nach 300 Sekunden wieder abschaltet. daraus ergäbe sich ein Zyklus von maximal 6-malig 5 Minuten Bewässerung mit jeweils 5 Minuten Pause.
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: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von martin_aus_Ddorf »

udo1toni hat geschrieben: 28. Jul 2021 18:42 Tipp am Rande: Die Rule für den Timer brauchst Du nicht :)
cool, dann geht es ja (doch) komplett auf der UI. :-)

udo1toni hat geschrieben: 28. Jul 2021 18:42 Die Funktion ist etwas versteckt in den Metadaten der Items zu finden und heißt dort Expiration Timer. Du wählst also das Item Timer3_SR aus und ergänzt in den Metadaten den Timer. Du stellst dort den Timeout von drei Minuten ein und definierst, dass der Status auf OFF wechseln soll (alternativ kannst Du auch ein Kommando OFF erzeugen).
Danke dir! Das ist ein klasse Hinweis gewesen!

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

Re: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von martin_aus_Ddorf »

wighdeas hat geschrieben: 28. Jul 2021 20:23

Code: Alles auswählen


when 
	Time cron "0 0 6-7 ? 5-10 1/2 *"	                 			//von 6-7uhr, Mai bis Oktober jeden Zweiten Tag
jeden zweiten Tag 5 Minuten bewässern?

Baust du Kakteen an oder nimmst du ein C-Rohr zum gießen?
:-)

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28

Re: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von zinnik »

udo1toni hat geschrieben: 28. Jul 2021 22:05
wighdeas hat geschrieben: 28. Jul 2021 20:23

Code: Alles auswählen

when 
	Time cron "0 0 6-7 ? 5-10 1/2 *"	                 			//von 6-7uhr, Mai bis Oktober jeden Zweiten Tag
	Item GardenaSensor1_Bodenfeuchtigkeit < 50 %			// Seonsorschwellwert Feuchtigkeit < 50%
	Item GardenaSensor1_Bodentemperatur > 1 °C		        // Seonsorschwellwert Temperatur > 1°
then 
	Item Pumpe.sendCommand(ON)						// Einschalten der Pumpe
	Item Gewaechshaus.sendCommand(ON)			 	// Einschalten des Ventils für Gewächshaus
	createTimer(now.plusSeconds(300))					// Timer für Bewässerungsdauer
	Item Pumpe.sendCommand(OFF)					// Ausschalten der Pumpe
	Item Gewaechshaus.sendCommand(OFF)				// Ausschalten des Ventils für Gewächshaus
end
Meine Fragen - ist das nun richtig - habe ich irgendwelche formalen Fehler drin oder grundsätzlich nicht begriffen wie ich das machen soll?
Ja, da sind diverse Fehler drin, die auf grundsätzliche Missverständnisse hindeuten :) Aber mach Dir nichts drauß, das ist auch etwas schwierig...

Punkt 1 (und das ist gleich das größte Punkt): Der when-Teil einer Rule beschreibt sämtliche Trigger einer Rule. Jeder einzelne Trigger führt zur Ausführung der Rule. Deshalb müssen auch sämtliche Trigger mit or miteinander verknüpft werden. Nein, ein and gibt es nicht.
Punkt 2: Time cron beschreibt Zeitpunkte. Die Notation ist "s m h D M W Y" also Sekunde, Minute, Stunde, Tag, Monat, Wochentag, Jahr. Dabei ist Jahr optional. Außerdem muss exakt ein Fragezeichen im Term gesetzt sein, und zwar entweder beim Wochentag oder beim Tag - was ausschließt, dass man z.B. einen Trigger definiert, der nur am Freitag, dem 13. auslöst. Deine Notation würde um 6:00:00 Uhr und um 7:00:00 Uhr triggern, an jedem Tag von Mai bis Oktober, wenn da nicht 1/2 als Wochentag eingetragen wäre. Wie gesagt, zwei Zeitpunkte, kein Zeitraum (es handelt sich um Trigger)
Punkt 3: Der Trigger (!) Item GardenaSensor1_Bodenfeuchtigkeit < 50 % wird ebenfalls nicht funktionieren, genauso wie der nachfolgende Trigger, denn ein kleiner als oder größer als ist innerhalb eines Triggers nicht erlaubt.

Das, was Du möchtest, sind stattdessen Bedingungen (also Eingrenzungen), die in den then-Teil der Rule gehören. Dann jedoch brauchst Du immer noch einen Trigger.
Die Frage ist auch, wie Du Dir das nun tatsächlich vorstellst. Der Rule-Code deutet an, dass die Bewässerung nur 5 Minuten laufen soll. Andererseits soll sie aber im Zeitraum 6-7 Uhr stattfinden.
Eine mögliche Variante:

Code: Alles auswählen

rule "Gewächshaus bewässern"
when
    Time cron "0 0/10 6 1/2 5-10 ?"                                             // von 6:00:00 - 7:00:00 Uhr, alle 10 Minuten, 1. Mai bis 31. Oktober, jeden 2. Tag
then 
    if(GardenaSensor1_Bodenfeuchtigkeit.state instanceof Number)                // enthält das Item einen gültigen Zahlenwert?
        if((GardenaSensor1_Bodenfeuchtigkeit.state as Number).floatValue >= 50) // größer oder gleich 50?
            return;                                                             // dann Rule abbrechen
    if(GardenaSensor1_Bodentemperatur.state instanceof Number)                  // enthält das Item einen gültigen Zahlenwert?
        if((GardenaSensor1_Bodentemperatur.state as Number).floatValue <= 1)    // kleiner oder gleich 1?
            return;                                                             // dann Rule abbrechen

    Pumpe.sendCommand(ON)                                                       // Pumpe einschalten
    Gewaechshaus.sendCommand(ON)                                                // Ventil für Gewächshaus einschalten
    createTimer(now.plusSeconds(300), [|                                        // Timer für Bewässerungsdauer
        Pumpe.sendCommand(OFF)                                                  // Pumpe ausschalten
        Gewaechshaus.sendCommand(OFF)                                           // Ventil für Gewächshaus ausschalten
    ])
end
Die Rule triggert von 6 bis 7 Uhr alle 10 Minuten, jeden 2. Tag vom 1. Mai bis 31. Oktober.
Zunächst wird das Item, welches die Bodenfeuchte hält geprüft, genauer wird geprüft, ob der Status eine gültige Zahl enthält. Ist das der Fall, so wird dieser Wert mit 50 verglichen. Falls der Wert nicht darunter liegt, wird die Rule abgebrochen.
Danach wird das gleiche für das zweite Item - die Bodentemperatur - vorgenommen, hier mit dem Grenzwert 1, der nicht unterschritten werden darf.
Danach sind alle Bedingungen erfüllt und die Pumpe sowie das Ventil können aktiviert werden. Abschließend wird ein Timer angelegt, der beide Geräte nach 300 Sekunden wieder abschaltet. daraus ergäbe sich ein Zyklus von maximal 6-malig 5 Minuten Bewässerung mit jeweils 5 Minuten Pause.
Hallo,

das ist genau das was ich gesucht habe. Leider kennei chm it Rules und Scripten nicht so aus.

Wo muss ich die Rule in Openhab anlegen?
Also normale Rule unter Rules oder als DSL Rule oder EcmaRule?

Kann mir das einer kurz erklären?


Lg zinnik
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von udo1toni »

Grundsätzlich: Wenn der Code so aussieht:

Code: Alles auswählen

rule ...
when
    ...
then
    ...
end
dann handelt es sich immer um eine DSL Rule, welche über eine *.rules Datei angelegt wurde. Dies ist im Übrigen der Standard.

Wenn Du eine solche Rule über die UI anlegen willst, geht das grundsätzlich auch. Dabei wird als Codetyp DSL ausgewählt und ausschließlich der Text zwischen then und end als Code übernommen (exklusive then und end)
Der Text zwischen when und then wird im when-Bereich der UI Rule eingetragen (natürlich nicht als Text...)

ECMA-Scripte sind JavaScript, wobei der Befehlssatz von der Java Version abhängig ist. ECMA ist nicht empfohlen, aber wenn Du Dich gut mit JavaScript auskennst, kannst Du es natürlich verwenden. Blockly Rules erzeugen ECMA Code (das ist auch der Grund, warum überhaupt ECMA zur Verfügung steht).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28

Re: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von zinnik »

Hallo udo1toni,

vielen dank für deine Antwort.

Müsste denn die Rule starten wenn ich auf "Run now" klicke?

Die Feuchtigkeit der Hecke beträgt derzeit 45% und Temperatur ist derzeit bei 12°C

Also müsste doch das Ventil schalten oder ?

hier meine rule
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von udo1toni »

Ja, die Rule sollte laufen.
Allerdings ist die Ansicht über Screenshots wenig hilfreich. Besser wäre es, auf die Code-Ansicht umzuschalten und den Inhalt der Codeansicht hier als Text einzufügen.
Der Foreneditor nutzt BBCode zur Auszeichnung von Textmerkmalen. Wenn Du auf den vollständigen Editor umschaltest (Vorschau...) hast Du am oberen Rand auch Schaltflächen, um markierte Textblöcke mit den entsprechenden Tags zu versehen.

Hast Du den Code als DSL Rule markiert? Das lässt sich leider in den Screenshots nicht erkennen (in der Codeansicht schon...)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28

Re: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von zinnik »

Hallo

hier der Code:

Code: Alles auswählen

triggers:
  - id: "1"
    configuration:
      cronExpression: 0 0/10 6 1/2 3-10 ?
    type: timer.GenericCronTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-2
        
            if(bodenfeuchtesensorhecke_Bodenfeuchtigkeit.state instanceof Number)                    // enthält das Item einen gültigen Zahlenwert?
                if((bodenfeuchtesensorhecke_Bodenfeuchtigkeit.state as Number).floatValue >= 50)     // größer oder gleich 50?
                    return;                                                                          // dann Rule abbrechen
            if(bodenfeuchtesensorhecke_Bodentemperatur.state instanceof Number)                      // enthält das Item einen gültigen Zahlenwert?
                if((bodenfeuchtesensorhecke_Bodentemperatur.state as Number).floatValue <= 1)        // kleiner oder gleich 1?
                    return;                                                                          // dann Rule abbrechen

            Bewaesserung_2_STATE.sendCommand(ON)                                                     // Pumpe einschalten
            //Gewaechshaus.sendCommand(ON)                                                           // Ventil für Gewächshaus einschalten
            //createTimer(now.plusSeconds(300), [|                                                   // Timer für Bewässerungsdauer
                //Pumpe.sendCommand(OFF)                                                             // Pumpe ausschalten
                //Gewaechshaus.sendCommand(OFF)                                                      // Ventil für Gewächshaus ausschalten
            //])
    type: script.ScriptAction
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von udo1toni »

Ich hab die Rule mal bei mir angelegt, der Code sieht im Detail minimal anders aus.
Insbesondere stimmt die Indentation nicht. Da YAML im Gegensatz zur Rules DSL die Indentation auswertet, bin ich mir nicht sicher, wie sich das auswirkt. Zumindest die erste Zeile sollte also nur um zwei Leerzeichen eingerückt sein.

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      cronExpression: 0 0/10 6 1/2 3-10 ? *
    type: timer.GenericCronTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-
        if(bodenfeuchtesensorhecke_Bodenfeuchtigkeit.state instanceof Number)                    // enthält das Item einen gültigen Zahlenwert?
            if((bodenfeuchtesensorhecke_Bodenfeuchtigkeit.state as Number).floatValue >= 50)     // größer oder gleich 50?
                return;                                                                          // dann Rule abbrechen
        if(bodenfeuchtesensorhecke_Bodentemperatur.state instanceof Number)                      // enthält das Item einen gültigen Zahlenwert?
            if((bodenfeuchtesensorhecke_Bodentemperatur.state as Number).floatValue <= 1)        // kleiner oder gleich 1?
                return;                                                                          // dann Rule abbrechen

        Bewaesserung_2_STATE.sendCommand(ON)                                                     // Pumpe einschalten 
        //Gewaechshaus.sendCommand(ON)                                                             // Ventil für Gewächshaus einschalten

        //createTimer(now.plusSeconds(300), [|                                                     // Timer für Bewässerungsdauer
            //Pumpe.sendCommand(OFF)                                                               // Pumpe ausschalten
            //Gewaechshaus.sendCommand(OFF)                                                        // Ventil für Gewächshaus ausschalten
        //])
    type: script.ScriptAction
Auch fehlt bei mir die "2" hinter script: >-, keine Ahnung, wie die 2 zustande kommt. Da der hintere Teil auskommentiert ist, wird das Item nur den ON-Befehl senden. Der Name des Items endet auf STATE. Ich nehme an, das ist nur ein Überbleibsel?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28

Re: Automatische Bewässerung von Gewächshaus und Rasen

Beitrag von zinnik »

Hi

die Rule läuft jetzt ich werde es grammatikalisch noch ausbessern. mit dem Versatz im Code.
Warum da hinter Skript eine 2 steht weiß ich auch nicht. Vielleicht weil ich schon mal in der Main UI den Code als Skript angelegt hatte?

Ja das Item endet mit State. Das ist ein Homematic Hutschienen 4 Fach Aktor der meine Magnetventile steuert.

Die ich die bis jetzt nur manuell über die Sitemap gesteuert habe.

Habe ich in der Homematic ein kleines Programm was bei einschalten des Aktors den Aktor nach 10min wieder ausschaltet.

Aber vermutlich werde ich das noch umändern so das es wie du erwähnt hattest über den Expiration Timer geht.

Wahnsinn von dir kann man echt sehr viel lernen. und dein Geduld bestaune ich.

Echt großes Lob an Dich.

Ich hätte mal noch eine frage zu den Sitemaps. Das hast du zwar schon mal erklärt aber mit Frames.

Also ich ich habe viel kleine Sitemaps die ich in der App aufrufen Kann.

zb: Garten, Haus, BMW, Netzwerk usw...

Die Habe ich jetzt mit dem Group Element alles in eine Sitemap gepackt so zu sagen das die Hauptelemente auf der Startseite sind.

Jetzt zum Problem wenn nun was dazu kommt gestaltet sie die Pflege sehr unübersichtlich.
Gibt es eine Möglichkeit die kleinen Sitemaps zu pflegen und die dann zb verlinken in eine große(haupt) Sitemap?

Ich hoffe du kannst verstehen was ich meine.

Lg Sven


PS: ich habe den Code verbessert grammatikalisch und jetzt gibt es auch nicht mehr die 2 hinter Skript
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

Antworten