Rechtzeitig vor Masifis Präsentation seines GardenControl bin ich soweit, meine Arbeit der letzten Wochenenden vorzustellen.
Da es in KNX scheinbar nicht so einfach ist, eine Sequenz zu erstellen, hab ich diese Aufgabe in HA ausgelagert.
Es gibt zwar Lösungen auf Basis des OpenKNX Logik-Moduls mit gegenseitigen Verriegelungen zur Vermeidung von Überlappungen,
aber das sind im Vergleich zu der Sequenz die ich im Kopf hatte nur umständliche Workarounds, die ich vermeiden möchte.
Damit die Posts hier übersichtlich bleiben, werde ich die gesamte Beschreibung aufteilen.
Teil 1: Beschreibung der Smart-Irrigation Integration
Teil 2: Beschreibung der erstellten Variablen (bzw. Entitäten)
Teil 3: Beschreibung der Automation
Teil 4: Beschreibung der Cards
Die Kernfrage, die ich mir gestellt habe ist, was muss mein Code alles können.
Update: Da die Frage weiter unten aufgekommen ist, hier einige weitere Lösungen, die ich (obwohl sie im Prinzip nicht schlecht sind) wieder verworfen habe: Irrigation-V5, Irrigation Unlimited
Basis meines Entwurfs war das Video von Simon42, wo er eine Smart-Irrigation Integration verwendet, die in der Lage ist, die optimale Bewässerungsdauer basierend auf dem ETo zu ermitteln.
ETo - Referenz-Evapotranspiration / Referenzverdunstung
Es ist jedoch mMn nicht wirklich notwendig, diese Integration einzusetzen. Ich könnte mir vorstellen, stattdessen auch eine eigene Logik zu entwickeln, wenn ich Zeit dazu habe. Aktuell setzt meine Lösung zwar noch darauf auf, das könnte sich aber im Laufe der Zeit noch ändern.
Mittlerweile gibt es diese Integration in der V2, hier die Diskussion in der Community dazu.
Nach der Installation über den HACS und einem Neustart von HA kann man die Integration hinzufügen, ich verwende die Anbindung an OpenWeatherMap. Es wird eine neue Page hinzugefügt mit folgenden Tabs: Allgemein, Zonen, Module, Sensor-Gruppen, Hilfe
Automatische Aktualisierung der Wetterdaten:
Die Wetterdaten sollte man nicht viel häufiger als 1x pro Stunde laden, sonst wird es irgendwann mal kostenpflichtig, 1000 API-Calls pro Tag sind aber frei.
Automatische Berechnung der Bewässerungsdauer: hab ich auf 23 Uhr belassen
Automatisches Löschen der Wetterdaten: hab ich auf 23:59 belassen
Bei Zonen hab ich testhalber mal 2 Zonen angelegt, da das OpenKNX Garden-Control 12 Zonen ansteuern kann, hab ich da noch einiges an Reserve.
Mein Code ist an den meisten Stellen dynamisch und zeigt automatisch so viele Felder an, wie es Zonen gibt. Nur das Variablen-Set dazu muss man händisch kopieren.
Für jede Zone wird ein Sensor erstellt mit dem Namen: sensor.smart_irrigation_<Name der Zone>
HACS Bewässerung - Zone01.png
Um die Erstellung des Triggers zu vereinfachen, vergebe ich definierte Sequenz-Namen in der Form: Zone01, Zone02, ...
Leider kann man den sensor.name und den sensor.friendly_name nicht getrennt voneinander definieren, sonst wäre es deutlich einfacher, die Übersicht zu behalten, indem der Friendly_Name einen sprechenden Namen bekommt.
Achtung: Die Zonen müssen zwingend immer Zone01, Zone02, usw. benannt werden. Mein gesamter Code baut auf diesen Namen auf!
Die Drainage Rate ist mit 50,8 mm/h (2 Zoll pro h) vorbestückt, sollte aber eigentlich am Anfang besser auf 0 gesetzt und nur vorsichtig erhöht werden. Viele Böden haben z.B. nur 5 mm/h und daher viel weniger als die vorbestückten 50.
Der Vorrat wird eigentlich durch die Regenmenge berechnet (oder gemessen), aber der maximale Vorrat ist mit 50 mm wieder sehr hoch vorbestückt. Laut Doku soll je nach Boden (Sand/Lehm) ein Wert von 12 bis 30 mm passender sein.
Lead Time wird benötigt, wenn eine Pumpe zuerst noch den Wasserdruck aufbauen muss.
Maximale Dauer von 3.600 Sekunden entspricht 1 h, die Bewässerungsdauer wird immer in Sekunden ermittelt.
Der Multiplikator sollte den Bewuchs berücksichtigen, empfohlen ist ein Wert von 0,6 bis 0,8 (hier nimmt HA jetzt mal das deutsche Komma-Zeichen), den optimalen Wert muss man wohl erst ermitteln.
Ich verwende diesen Wert als Max-Wert, der dann noch je Monat mit einem zusätzlichen Faktor von 0 bis 100% weiter reduziert werden kann.
Die Dauer wird dann wieder berechnet, leider werden die berechneten Felder nicht speziell gekennzeichnet.
Es gibt 4 Aktionen für alle Zonen:
Alle Zonen aktualisieren: Aktualisierung der Wetterdaten
Alle Zonen berechnen: erfolgt per Default-Einstellung automatisch um 23 Uhr
Alle Vorräte zurücksetzen
Alle Wetterdaten löschen
und unterhalb von jeder Zone auch noch Buttons für Einzel-Aktionen:
Wetterdaten aktualisieren
Bewässerungsdauer berechnen: Achtung, in diesem Fall werden die Wetterdaten für die Sensorgruppe dieser Zone gelöscht!
Vorrat zurücksetzen: erfolgt per Trigger nach jeder Bewässerung
Löschen
Berechnungs-Module muss man nicht so viele erstellen, da man jedes Modul gleich für mehrere (oder alle) Zonen verwenden kann.
Es gibt 3 verschiedene Modul-Typen, wobei PyETO (das ist die Python Library für ETo) sicher die interessanteste ist.
Im Prinzip geht es darum, die Verdunstungsrate auf Basis von Temperatur, Sonneneinstrahlung oder anderen Faktoren zu ermitteln.
Ich hab den Artikel bisher noch nicht durchgelesen: FAO Irrigation and Drainage Paper No. 56
Coastal: für einen Standort in Küstennähe
Solrad behavior - steht wohl für Solar radiation (also Sonneneinstrahlung) und diese kann unterschiedlich ermittelt werden.
Basierend auf der Temperatur, den Sonnenstunden, Sonnenstunden & Temperatur,
nicht berechnet (das ist jetzt etwas missverständlich und meint eigentlich gemessen, denn in diesem Fall ist ein Sensor-Wert dafür notwendig)
Forecast days: Das kommt jetzt darauf an, wie sehr man seiner Wettervorschau trauen kann, ich halte 1 Tag bereits für gewagt.
Die Sensorgruppen sind für mich auf den ersten Blick mal etwas unübersichtlich, aber wer einzelne Feuchtesensoren einsetzt, der wird wohl nicht um sie herumkommen, auch wenn der Luftdruck und viele andere Werte bei jeder Gruppe gleich sind.
Trotz der Unübersichtlichkeit kann man erkennen, dass nur 2 Werte nicht vom Wetterservice abhängen, und das sind Verdunstung und Sonnenstrahlung.
Die Verdunstung benötigt man nur dann, wenn man ein Modul vom Typ Passthrough einsetzt.
Die Sonnenstrahlung könnte eigentlich eine KNX-Wetterstation liefern, wenn nicht, wird auch diese laut Modell ermittelt.
Ich hab jetzt einfach mal jede Zone mit dem PyETO-Modul und der Standard-Sensorgruppe verbunden.
Zusätzlich zu den Sensoren, die für jede Zone erstellt werden, gibt es noch 8 Services:
update_zone / all_zones: Aktualisiert die Wetterdaten, hab ich bisher noch nicht verwendet.
calculate_zone / all_zones: Zur Berechnung von Zonen - erfolgt per Default-Einstellung eigentlich automatisch um 23 Uhr
set_bucket / all_buckets: Damit könnte man den gespeicherten Vorrat auf einen bestimmten Wert setzen.
reset_bucket / all_buckets: Damit wird der gespeicherte Regen-Vorrat gelöscht, was nach jeder Bewässerung (per Trigger) erfolgen soll.
Beispielcode:
Zusätzlich zu diesen Services wird auch noch ein Event erstellt: smart_irrigation_start_irrigation_all_zones
Wenn man mit diesem Event startet, dann wird die Bewässerung aller Zonen genau zum Sonnenaufgang fertig.
Da man die Automation zum Start der Bewässerung ohnehin selbst erstellen muss, kann man natürlich auch beliebig früher starten.
Da es in KNX scheinbar nicht so einfach ist, eine Sequenz zu erstellen, hab ich diese Aufgabe in HA ausgelagert.
Es gibt zwar Lösungen auf Basis des OpenKNX Logik-Moduls mit gegenseitigen Verriegelungen zur Vermeidung von Überlappungen,
aber das sind im Vergleich zu der Sequenz die ich im Kopf hatte nur umständliche Workarounds, die ich vermeiden möchte.
Damit die Posts hier übersichtlich bleiben, werde ich die gesamte Beschreibung aufteilen.
Teil 1: Beschreibung der Smart-Irrigation Integration
Teil 2: Beschreibung der erstellten Variablen (bzw. Entitäten)
Teil 3: Beschreibung der Automation
Teil 4: Beschreibung der Cards
Die Kernfrage, die ich mir gestellt habe ist, was muss mein Code alles können.
- Ich möchte die Anzahl der Zonen möglichst dynamisch handhaben. Nicht weil sie sich so oft ändern können, sondern weil es den Code übersichtlicher und wartbarer macht, wenn man Wiederholungen vermeidet.
- Ich möchte je Monat und auch je Zone definieren, wie viel ich sprengen möchte und wie oft pro Woche gesprengt werden soll.
Update: Da die Frage weiter unten aufgekommen ist, hier einige weitere Lösungen, die ich (obwohl sie im Prinzip nicht schlecht sind) wieder verworfen habe: Irrigation-V5, Irrigation Unlimited
Basis meines Entwurfs war das Video von Simon42, wo er eine Smart-Irrigation Integration verwendet, die in der Lage ist, die optimale Bewässerungsdauer basierend auf dem ETo zu ermitteln.
ETo - Referenz-Evapotranspiration / Referenzverdunstung
Es ist jedoch mMn nicht wirklich notwendig, diese Integration einzusetzen. Ich könnte mir vorstellen, stattdessen auch eine eigene Logik zu entwickeln, wenn ich Zeit dazu habe. Aktuell setzt meine Lösung zwar noch darauf auf, das könnte sich aber im Laufe der Zeit noch ändern.
Mittlerweile gibt es diese Integration in der V2, hier die Diskussion in der Community dazu.
Nach der Installation über den HACS und einem Neustart von HA kann man die Integration hinzufügen, ich verwende die Anbindung an OpenWeatherMap. Es wird eine neue Page hinzugefügt mit folgenden Tabs: Allgemein, Zonen, Module, Sensor-Gruppen, Hilfe
Automatische Aktualisierung der Wetterdaten:
Die Wetterdaten sollte man nicht viel häufiger als 1x pro Stunde laden, sonst wird es irgendwann mal kostenpflichtig, 1000 API-Calls pro Tag sind aber frei.
Automatische Berechnung der Bewässerungsdauer: hab ich auf 23 Uhr belassen
Automatisches Löschen der Wetterdaten: hab ich auf 23:59 belassen
Bei Zonen hab ich testhalber mal 2 Zonen angelegt, da das OpenKNX Garden-Control 12 Zonen ansteuern kann, hab ich da noch einiges an Reserve.
Mein Code ist an den meisten Stellen dynamisch und zeigt automatisch so viele Felder an, wie es Zonen gibt. Nur das Variablen-Set dazu muss man händisch kopieren.
Für jede Zone wird ein Sensor erstellt mit dem Namen: sensor.smart_irrigation_<Name der Zone>
HACS Bewässerung - Zone01.png
Um die Erstellung des Triggers zu vereinfachen, vergebe ich definierte Sequenz-Namen in der Form: Zone01, Zone02, ...
Leider kann man den sensor.name und den sensor.friendly_name nicht getrennt voneinander definieren, sonst wäre es deutlich einfacher, die Übersicht zu behalten, indem der Friendly_Name einen sprechenden Namen bekommt.
Achtung: Die Zonen müssen zwingend immer Zone01, Zone02, usw. benannt werden. Mein gesamter Code baut auf diesen Namen auf!
Die Drainage Rate ist mit 50,8 mm/h (2 Zoll pro h) vorbestückt, sollte aber eigentlich am Anfang besser auf 0 gesetzt und nur vorsichtig erhöht werden. Viele Böden haben z.B. nur 5 mm/h und daher viel weniger als die vorbestückten 50.
Der Vorrat wird eigentlich durch die Regenmenge berechnet (oder gemessen), aber der maximale Vorrat ist mit 50 mm wieder sehr hoch vorbestückt. Laut Doku soll je nach Boden (Sand/Lehm) ein Wert von 12 bis 30 mm passender sein.
Lead Time wird benötigt, wenn eine Pumpe zuerst noch den Wasserdruck aufbauen muss.
Maximale Dauer von 3.600 Sekunden entspricht 1 h, die Bewässerungsdauer wird immer in Sekunden ermittelt.
Der Multiplikator sollte den Bewuchs berücksichtigen, empfohlen ist ein Wert von 0,6 bis 0,8 (hier nimmt HA jetzt mal das deutsche Komma-Zeichen), den optimalen Wert muss man wohl erst ermitteln.
Ich verwende diesen Wert als Max-Wert, der dann noch je Monat mit einem zusätzlichen Faktor von 0 bis 100% weiter reduziert werden kann.
Die Dauer wird dann wieder berechnet, leider werden die berechneten Felder nicht speziell gekennzeichnet.
Es gibt 4 Aktionen für alle Zonen:
Alle Zonen aktualisieren: Aktualisierung der Wetterdaten
Alle Zonen berechnen: erfolgt per Default-Einstellung automatisch um 23 Uhr
Alle Vorräte zurücksetzen
Alle Wetterdaten löschen
und unterhalb von jeder Zone auch noch Buttons für Einzel-Aktionen:
Wetterdaten aktualisieren
Bewässerungsdauer berechnen: Achtung, in diesem Fall werden die Wetterdaten für die Sensorgruppe dieser Zone gelöscht!
Vorrat zurücksetzen: erfolgt per Trigger nach jeder Bewässerung
Löschen
Berechnungs-Module muss man nicht so viele erstellen, da man jedes Modul gleich für mehrere (oder alle) Zonen verwenden kann.
Es gibt 3 verschiedene Modul-Typen, wobei PyETO (das ist die Python Library für ETo) sicher die interessanteste ist.
Im Prinzip geht es darum, die Verdunstungsrate auf Basis von Temperatur, Sonneneinstrahlung oder anderen Faktoren zu ermitteln.
Ich hab den Artikel bisher noch nicht durchgelesen: FAO Irrigation and Drainage Paper No. 56
Coastal: für einen Standort in Küstennähe
Solrad behavior - steht wohl für Solar radiation (also Sonneneinstrahlung) und diese kann unterschiedlich ermittelt werden.
Basierend auf der Temperatur, den Sonnenstunden, Sonnenstunden & Temperatur,
nicht berechnet (das ist jetzt etwas missverständlich und meint eigentlich gemessen, denn in diesem Fall ist ein Sensor-Wert dafür notwendig)
Forecast days: Das kommt jetzt darauf an, wie sehr man seiner Wettervorschau trauen kann, ich halte 1 Tag bereits für gewagt.
Die Sensorgruppen sind für mich auf den ersten Blick mal etwas unübersichtlich, aber wer einzelne Feuchtesensoren einsetzt, der wird wohl nicht um sie herumkommen, auch wenn der Luftdruck und viele andere Werte bei jeder Gruppe gleich sind.
Trotz der Unübersichtlichkeit kann man erkennen, dass nur 2 Werte nicht vom Wetterservice abhängen, und das sind Verdunstung und Sonnenstrahlung.
Die Verdunstung benötigt man nur dann, wenn man ein Modul vom Typ Passthrough einsetzt.
Die Sonnenstrahlung könnte eigentlich eine KNX-Wetterstation liefern, wenn nicht, wird auch diese laut Modell ermittelt.
Ich hab jetzt einfach mal jede Zone mit dem PyETO-Modul und der Standard-Sensorgruppe verbunden.
Zusätzlich zu den Sensoren, die für jede Zone erstellt werden, gibt es noch 8 Services:
update_zone / all_zones: Aktualisiert die Wetterdaten, hab ich bisher noch nicht verwendet.
calculate_zone / all_zones: Zur Berechnung von Zonen - erfolgt per Default-Einstellung eigentlich automatisch um 23 Uhr
set_bucket / all_buckets: Damit könnte man den gespeicherten Vorrat auf einen bestimmten Wert setzen.
reset_bucket / all_buckets: Damit wird der gespeicherte Regen-Vorrat gelöscht, was nach jeder Bewässerung (per Trigger) erfolgen soll.
Beispielcode:
HTML-Code:
service: smart_irrigation.reset_bucket data: {} target: entity_id: sensor.smart_irrigation_zone01
Wenn man mit diesem Event startet, dann wird die Bewässerung aller Zonen genau zum Sonnenaufgang fertig.
Da man die Automation zum Start der Bewässerung ohnehin selbst erstellen muss, kann man natürlich auch beliebig früher starten.
Kommentar