Mein Ziel war es eine unbeaufsichtigte Bewässerung des Gartens hinzubekommen, ohne Systeme von Gardena, Hunter usw. zu nutzen und den Programmieraufwand so gering wie möglich zu halten.
Wie die Hardware für zwei unabhängig steuerbare Wasserkreisläufe aussieht, könnt ihr hier nachlesen:
viewtopic.php?p=36328#p36328
Im Wesentlichen schalten zwei SONOFF SV (SV für „schwach Volt“
) je ein magnetisches Ventil. Damit kann ich den Kreislauf „Versekungsregner“ für den Rasen und die Beete und einen kleineren Bereich „Schattenrasen“ steuern.
Die Steuerung sollte regelbasiert sein und mit möglichst wenig Programmierung auskommen. Das liegt vor allem daran, weil mir die entsprechenden Kenntnisse fehlen und ich keine Möglichkeit habe mich dort einzuarbeiten.
Daher geht, bis auf eine Kleinigkeit komplett über die OH3 Oberfläche ohne Programmierung.
Im Ergebnis wird nun jeden Tag die Außentemperatur und Regenmenge für verschiedene Zeiträume ermittelt und nach bestimmten Regeln bewässert, bzw. eben nicht.
Los geht´s:
1.) Regen und Temperaturinformationen
Um das hier nicht zu groß werden zu lassen, setzte ich voraus, dass bekannt ist wozu Things (quasi Geräte oder Informationsquellen), Items (Eigenschaften oder Zustände der Things) und Rules (regelbasierte Ereignisse, die die Eigenschaften auswerten und je nach dem andere Eigenschaften von Items ansteuern oder auslösen) gut sind und wie sie funktionieren.
Für die Steuerung benötige ich die folgenden standortbezogenen Informationen:
• Regen aktuell
• Regen in drei Stunden
• Regen heute 24 Stunden
• Regen gestern
• Regensumme heute und gestern
• Heutige maximale Temperatur
Diese Werte (bis auf die Regensumme) kann man sich recht einfach über das Thing openweathermap besorgen. Dazu geht ihr zunächst auf deren Web Site und holt euch einen sog. gen. API Schlüssel, den ihr in das Bridge-Thing eintragen müsst. Danach könnt ihr die beiden Items One Call Api Forecast bzw. Historical einbinden und daraus Items erstellen.
Normalerweise sollte es so sein, dass ihr für die Vorhersage Items nur jeweils einmal das entsprechende Thing einbinden müsst. Das war bei mir nicht so und so habe ich für die vier Forecast Informationen, jeweils einmal das entsprechende Thing bemühen müssen. Nicht elegant, aber selten.
Meine Itemliste sieht als Auszug nun so aus:
ScreenShot 353 openHAB - Google Chrome.png
Die Regensumme (Regen heute plus gestern in mm) ist manuell, durch Klick auf das „Plus-Symbol / add Item“ unten rechts bei den Items erzeugt worden. Dann gebt ihr „type = group“, „Members Base Type = Number:Length“ und bei “aggregation Function = SUM” an. Ihr könnt ja noch einen Namen vergeben, ein Icon wählen usw.
Wenn ihr auf „create“ klickt, kommt ihr wieder in die Übersicht des Items, wählt die Regensumme gleich wieder an und fügt durch Klick auf „Direct Group Members / change / Members“ die Items aus, die hier aufsummiert werden sollen (also Regen gestern (24h) und Regen heute (24)).
Nur der Vollständigkeit halber: Ich habe mir noch ein Item „Rasenzeitsteuerung“ mit den Zuständen an und aus erstellt (neues Item, „type = switch“,), damit ich die komplette Anlage mit einem Klick abschalten kann.
2.) Die Ventile als Items
Wie gesagt, gibt es zwei Ventile für die Wasserkreise „Versekungsregner“ und „Schattenrasen“. Die wiederum werden mit den SONOFF SVs ein- und ausgeschaltet. Die SONOFFS (Tasmota geflashed – anderes Thema, schaut mal bei Youtube vorbei) werden per MQTT als Things eingebunden (ebenfalls anders Thema - > Youtube) und über die Things Channels konfiguriert. Beispielsweise ist der Schattenrasen SONOFF bei mir wie folgt unter Things / Code zu finden:
Code: Alles auswählen
UID: mqtt:topic:7270ff151e:652a197864
label: SONOFF-SV-Schattenrasen
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:systemBroker:7570ee151e
location: Garten
channels:
- id: SONOFFSVSchattenrasenONOFF
channelTypeUID: mqtt:switch
label: SONOFF-SV Schattenrasen ON-OFF
description: ""
configuration:
commandTopic: cmnd/Schattenrasen/POWER
off: OFF
on: ON
Au weh, wie man von dort aus dann zu einem Item kommt, welches später angesteuert wird, weiß ich gar nicht mehr genau… Ich meine mir ein Switch-Item angelegt zu haben und mit dem o.g. Channel des Things verlinkt zu haben, um später ein ON oder OFF an das SONOFF SV Bauteil senden zu können.
Dieses Item heißt bei mir „SchattenrasenAnAus“ und wird gleich für den Mini-Programmierausflug benötigt.
3.) Der Teil mit der Programmierung – die Timer
Wenn ihr nun eine ganze Latte Items erstellt habt, dann könnt ihr in den Regeln sehr einfach die einzelnen Werte abfragen und mit Aktionen hinterlegen. Es ist immer das gleiche Muster: Wenn (Zeit), dann mache irgendwas (Schalte das Ventil A ein), es sei denn irgendwas (Regensumme > 2 mm – oder so.)
Und jetzt kommt der ganz kleine Ausflug in die Programmierung, weil nur so ein Timer (lasse Ventil 5 Minuten auf und mach dann wieder zu) realisierbar ist. Alternativ hatte ich zum Start eine Regel, die ein Ventil unter bestimmten Voraussetzungen aufgemacht hat und eine weitere Regel, die das Ventil x Minuten später wieder zu gemacht hat. Nicht schön.
Hier hatte ich Hilfe von
peter-pan (danke noch mal) und mir den folgenden Code geben lassen:
Code: Alles auswählen
rule "Schattenrasen 3 Minuten"
when
Item Timer3_SR changed to ON
then
SchattenrasenAnAus.sendCommand(ON)
createTimer(ZonedDateTime.now.plusMinutes(3), [ |
SchattenrasenAnAus.sendCommand(OFF)
Timer3_SR.sendCommand(OFF)
])
end
Hier wird also das oben erwähnte Item „SchattenrasenAnAus“ angesprochen, welches eben ein „sendCommand(ON)“ geschickt bekommt, dann wartet die Rule 3 Minuten und schickt ein „sendCommand(OFF)“ hinterher.
In der Regel steht noch was von „Item Timer3_SR“. Das ist nur ein weiteres Switch-Items, welches ich nutze, wenn ich die Bewässerung per Hand mal 3 Minuten starten will, bzw. das ist der Schalter, der in der späteren eigentlichen Regel umgelegt wird.
Systematik ist also wie folgt:
Eine Regel zündet (z.B. weil es 15 Uhr und trocken ist). Dann wird das Switch-Item „Timer3_SR“ auf ON gestellt. Das bekommt die Rule "Schattenrasen 3 Minuten" mit und sendet ein ON Kommando an das Switch-Item SchattenrasenAnAus. Dieses Item ist mit dem Channel zum entsprechenden Thing (also dem tatsächlichen Gerät) verbunden und überträgt „sendCommand(ON)“ dorthin. Nach 3 Minuten wird dann ein OFF ans Gerät und ein OFF an das erste Switch-Item (Timer3_SR) gesendet. Damit ist dann im Übrigen wieder auf der Oberfläche von OH das Item auf aus gestellt.
DIESE Timer Rules müssen nun leider im Dateisystem von OH gespeichert werden. Das ist eine einfache Textdatei, die ihr die Endung .rules verpassen müsst und im Verzeichnis „rules“ liegen muss. Bei mir heißt die Datei z.B. timer.rules.
DIESE Rules könnt ihr auf er OH Oberfläche unter Rules auch ansehen, aber nicht bearbeiten.
4.) Die eigentlichen Regeln des Systems
Jetzt ist Erntezeit, weil nun muss nur noch zusammen geklickt werden. Beispielsweise startet mein Wasserkreis „Schattenrasen“ jeden Tag von 7:00 Uhr bis 19:00 Uhr alle zwei Stunden und ruft den Timer3_SR auf – beregnet also 3 Minuten. ABER NUR WENN: Die Rasensteuerung = On ist (ihr erinnert euch, das ist der Switch (Item), der die komplette Anlage an oder ausmacht), in den letzten 24 Stunden weniger als 1 mm Regen gefallen ist, derzeit weniger als 0,1 mm Regen fällt, in den nächsten 3 Stunden weniger als 0,2 mm fallen werden, es heute wärmer als 15°C wird und die Regensumme (Regen gestern plus heute) kleinergleich 2 ist.
Als Rule Code sieht das dann so aus:
Code: Alles auswählen
triggers:
- id: "1"
configuration:
cronExpression: 0 0 7,9,11,13,15,17,19 * * ? *
type: timer.GenericCronTrigger
conditions:
- inputs: {}
id: "9"
configuration:
itemName: Rasenzeitsteuerung
state: ON
operator: =
type: core.ItemStateCondition
- inputs: {}
id: "3"
label: weniger als 1 mm in den letzten 24 h
configuration:
itemName: OneCallAPIhistorydata_Regen
state: "1"
operator: <=
type: core.ItemStateCondition
- inputs: {}
id: "4"
label: derzeit weniger als 0,1 mm Regen
configuration:
itemName: Wetterinformationen_Regen
state: "0.1"
operator: <=
type: core.ItemStateCondition
- inputs: {}
id: "5"
label: in den nächsten 3 Stunden weniger als 0,2 mm Regen
configuration:
itemName: Localweatherandforecast_VorhergesagterRegen
state: "0.2"
operator: <=
type: core.ItemStateCondition
- inputs: {}
id: "6"
configuration:
itemName: Wetterinformationen_Aussentemperatur
state: "15"
operator: ">="
type: core.ItemStateCondition
- inputs: {}
id: "7"
configuration:
itemName: Regensumme
state: "2"
operator: <=
type: core.ItemStateCondition
actions:
- inputs: {}
id: "2"
configuration:
itemName: Timer3_SR
command: ON
type: core.ItemCommandAction
Is klar, nä?
Die restlichen Regeln für den Versenkungsregner ersparen wir uns nun. Es sind drei: Eine wird täglich geprüft und zündet, wenn es unter anderem über 30°C sind und die andern beiden im Tageswechsel mit unterschiedlichen Außentemperaturen und Regenkonstellationen. So wird alles zwei Tage bei Trockenheit und mäßiger Wärme beregnet, ist es etwas wärmer, dann jeden Tag und ist es richtig heiß, dann noch mal 15 Minuten zusätzlich.
Und was soll ich sagen? Es klappt!
Einzige Schwachstelle sind leider die historischen Wetterdaten. Da wird dann und wann für „Regen gestern (24h)“ null Millimeter angezeigt, obwohl es geschüttet hat. Heute ist das der Fall: API zeigt Null, Wetterdienst sagt 13,3 mm für gestern (27.07.2021 in Düsseldorf). Das habe ich allerdings über die Regensumme einigermaßen austarieren können.
Das war mein Sommerprojekt und es hat richtig Spaß gemacht, obwohl ich handwerklich ungeschickt bin und nicht programmieren kann (ich bin natürlich Projektmanager für Software Projekte von Beruf
). Die Anlage lief nun drei Wochen ohne Aufsicht, als wir im Urlaub waren. Alles perfekt, wenn nicht am letzten Tag der Schattenrasen mit der letzten Beregnung das ON Signal, wegen des schwachen WLANs aber nicht das OFF Signal bekommen hätte. Aua. Ein Mesh mehr und gut ist.
Wenn ihr Fragen habt, kommt gerne auf mich zu. Wenn beispielsweise der Abschnitt mit den Things und Channels zu ungenau oder diffus ist, hoffe ich hier auf die Scharmintelligenz, denn ich hab jetzt mindestens zwei Wochen keine Zeit mehr, mich da noch mal reinzufuchsen.
Fragen?
Fragen!
Liebe Grüße
Martin