Mit unserer Zisterne, die wir im letzten Jahr als Puffer und mit den neuen Rohren für die Regenwasserableitung bekommen haben, gibt es und reichlich kostenloses Wasser vom Dach. Zumindest, wenn es eines Tages mal wieder regnet.
Wir haben daher auf dem Grundstück Rohre für eine automatische Bewässerung verlegt, wozu das Gardena Bewässerungssystem zum Einsatz kam, da diese Komponenten im letzten Jahr günstiger als die Alternativen von Hunter oder Rainbird waren.
Durable Brass Inlet: Dieser water timer verfügt über einen robusten Messinganschluss für zuverlässige Leistung, sorgt für stabilen Betrieb in Ihrem bewässerungssystem garten oder bewässerungssystem, ideal für den langfristigen Einsatz.
Flexible Zeitpläne & Mengensteuerung: Erstellen Sie bis zu sechs Pläne für zeit- oder mengenbasierte Bewässerung. Wetter- und saisonale Anpassungen optimieren Ihr bewässerungssystem garten und sparen Wasser – ein intelligenter sprinkler-timer.
Multi-App Unterstützung & Home Assistant-Integration: 2GB RAM + 32GB Speicher für flüssige Nutzung mehrerer Drittanbieter-Apps – kein Root erforderlich, einfach über F-Droid als Home Assistant Steuerzentrale nutzbar. All-in-One Smart Panel ersetzt zusätzliche Tablets.
Matter Bridge für universelle Kompatibilität: Integriertes Matter Gateway verbindet Zigbee‑ & Wi‑Fi‑Geräte mit Apple Home, Google Home, Alexa & Home Assistant. Vereinheitlicht alle Marken und Protokolle für ein nahtloses Smart Home Erlebnis.
Die typischen Bewässerungsventile werden mit 24 Volt Wechselstrom angesteuert. Der Einschaltstrom beträgt etwa laut Datenblatt 370 mA, der Haltestrom 210 mA. Die tatsächlichen Werte waren nach meinen Messungen etwas geringer.
Da nie alle Ventile gleichzeitig in Betrieb sind, weil sonst der Wasserdruck zu stark abfallen würde (selbst bei der 4 bar Tauchdruckpumpe), genügt ein 24 Volt Wechselspannungsnetzteil mit 1 Ampere. Das hatte ich noch von einer alten Außenlichterkette. Passende Netzteile bekommt man auch
bei Ebay
.
Würde man die Ventile mit Gleichspannung betreiben, könnten sich die Kerne der Elektromagnete permanent magnetisieren und die Ventile würden “kleben”. Im schlimmsten Fall wird der Kern gesättigt, was einen höheren Stromfluss und damit die Zerstörung der Spulen bedeuten kann.
Daher kann man keine MOSFETs zur einfachen Ansteuerung nutzen. Am einfachsten wären Relais, doch darauf wollte ich nicht vertrauen. Erstens können die Kontakte korrodieren und die einfachen China-Relais, die es als
4er oder 8er Platinen
fix und fertig gibt, sind nicht unbedingt zum Schalten von Niederspannung geeignet. Das klingt paradox, aber die meisten Legierungen, die für Relais-Kontakte eingesetzt werden (bei diesen Relais AgCdO), benötigen einen kurzen Lichtbogen, der nur bei höheren Spannungen und Strömen entsteht (der sog. Frittstrom). Dadurch werden Oxide weggebrannt, was für einen dauerhaft guten Kontakt sorgt. Da im Gerätehaus auch hohe Luftfeuchtigkeit vorkommt, schieden Relais für mich aus.
Ich habe mich bei meinem DIY-Controller, den ich Waterking getauft habe, für
Triacs vom Typ BTA08-600B
entschieden, die über einen
MOC3041 Optokoppler
angesteuert werden, der auch gleich einen Nulldurchgang-Triac-Treiber enthält. Rechnet man noch 5 Widerstände, einen NPN-Transistor und eine LED dazu, kostet ein Kanal nicht einmal einen Euro und man wird nie Kontaktprobleme haben. Die LEDs zeigen Hardware-seitig an, ob ein Ventil offen ist und der Optokoppler angesteuert wird.
Da man ohnehin schon die 24 Volt hat, kann man die auch für die Versorgung des ESP8266 und des Displays nutzen. Gleichgerichtet kommt man auf 35 V Gleichspannung, die ich mit einem
LM2596S Step-Down-Konverter
sehr effizient auf 5 Volt wandle.
Wie oft bei meinen Projekten kommt ein
Wemos D1 Mini Pro
zum Einsatz, weil ich vor längerer Zeit einmal preiswert einen größeren Posten eingekauft hatte. Der Wemos wird auch bis auf den (fast) letzten GPIO ausgereizt. Zur Ansteuerung von 5 Ventilen und unserer Tauchdruckpumpe benötige ich 6 Ausgänge. Jetzt könnte man 6 GPIOs verbraten oder man nimmt ein Schieberegister vom Typ
SN74HC595
. Damit kann man mit 3 Steuer-Pins 8 Ausgänge schalten. Benötigt man mehr, kann man unter
?ESPHomeESPHomeFramework zur Konfiguration von ESP32/ESP8266-Mikrocontrollern, die sich dann automatisch in Home Assistant integrieren. Ideal für DIY-Sensoren und AktorenMehr dazu → bis zu 4 SN74HC595 kaskadieren, wozu man dann noch einen Pin mehr benötigt, damit aber 32 Ausgänge erhält.
Ursprünglich sollte mein Controller “dumm” bleiben, also nur die Triac-Ausgänge per Home Assistant schaltbar machen. Wenn man aber schon einen Mikrocontroller hat, kann man ja auch gleich noch ein paar Funktionen extra einbauen. So schalten die Ventile nach einer konfigurierbaren Zeit (10 Minuten) ab. Ist kein Ventil mehr aktiv, wird auch die Pumpe deaktiviert. Sollte die WLAN-Verbindung während der Bewässerung verloren gehen oder Home Assistant einen Bug haben, schalten Ventile und die Pumpe automatisch und autonom ab. Aufgebaut habe ich alles auf einer
Streifenrasterplatine
. Ich bin “Team Streifenraster” - mir gefällt das Herumgekleckse mit Lötzinn auf den Perfboards einfach nicht.
Bitte habt Verständnis dafür, dass ich keinen Plan für den Aufbau der Platine habe. Ich mache so etwas frei und ohne große Vorplanung direkt vom Schaltplan weg. Kurz die Position der Teile testen und los geht es. Bei Gelegenheit gibt es vielleicht mal ein Platinenlayout mit KiCAD dazu - vielleicht hat ja auch von euch jemand Lust dazu? Den Schaltplan in KiCAD dazu gibt es.
Über einen Dreh-Encoder und das LED-Display kann ich nicht nur den Zustand der Ventile (zusätzlich zu den LEDs am Optokoppler) anzeigen lassen, sondern diese auch direkt am Controller ein- und ausschalten. Weitere Menü-Ebenen zeigen den Wasserstand der Zisterne in Zentimetern und Litern, die Stärke des WLAN-Signals, den heutigen Wasserverbrauch und die Uhrzeit an. Wie man den Wasserstandsmesser mit einem TL-136 Sensor baut, habe ich hier beschrieben:
/wasserstand-in-zisternen-mit-homeassistant-esphome-und-tl-136-drucksensor-messen/
Durch einfaches Drehen am Encoder kann man die Ebenen wechseln. Drückt man die Taste, gelangt man ins Setup-Menü für die Ventile. Ein Strich zeigt ein inaktives Ventil an, ein Kästchen ein aktives. Der Dezimalpunkt signalisiert, welches Ventil man gerade ausgewählt hat und ein langer Druck auf die Taste schaltet es ein oder aus. Mit einer kurzen Betätigung kommt man wieder ins Hauptmenü.
Mich hat es einmal gereizt, mit einer einfachen
8-stelligen LED-Anzeige
ein komfortables Menü zu basteln. Es muss nicht immer ein OLED- oder LC-Display sein und die LED-Anzeige ist sehr robust, was bei -20 bis +50 °C im Gerätehaus nicht unwichtig ist.
Über die Abfrage des Wasserstands der Zisterne, kann ich die Pumpe deaktivieren, wenn der Wasserstand unter 12 cm sinkt. Eine lange Betätigung der Encoder-Taste schaltet alle Ventile und die Pumpe sofort aus.
Das Interlocking der Ausgänge verhindert, dass bestimmte Ventile gleichzeitig aktiv sein können. Damit verhindert man nicht nur einen Druckabfall, sondern auch die Überlastung des Netzteils. Es können maximal 3 Ventile (
Gardena Micro Trip Tropfer
Hochbeet, Vorgarten und Wasserentnahme) aktiv sein und nur einer der beiden Kreise für die Rasenfläche. Auch diese Sicherheitsfunktion stellt der Controller direkt bereit - egal, was ich in Home Assistant sonst konfigurieren würde.
Damit alles auch ordentlich verpackt ist und auch gut aussieht, habe ich noch ein Gehäuse aus PETG und PLA gedruckt. Das transparente PETG lässt die LEDs und das Display durchscheinen.
Beim Displayausschnitt habe ich die Schichtdicke bei der Konstruktion so gewählt, dass kein Infill gedruckt wird. Damit sieht das wie eine transparente Folie aus.
Das ganze Gehäuse ist schraubenlos verschließbar und auch die Platine wird nur von Schnappverschlüssen gehalten. Bei einer handgefertigten Platine ist die Konstruktion eines Gehäuses mit Deckel nicht ganz trivial, klappte aber beim ersten Versuch und Druck.
Als Gag ist noch ein Halter für eine Ersatzsicherung dabei. Der Zugang zu den Anschlussklemmen erfolgt von unten. Zur Konstruktion habe ich - wie immer - Autodesk Fusion 360 eingesetzt. Den Druck erledigte mein
Creality Ender 3
in etwa 10 Stunden.
Wer den Aufwand mit der Ventilansteuerung nicht betreiben möchte, kann statt der Triacs auch eine solche
SSR-Platine einsetzen
, die man für unter 20 € bekommt. Hier muss man nur noch die Kanäle mit dem ESP ansteuern. Der Code unten kann auch hierfür genutzt werden.
Die
?YAMLYAMLDatenformat (YAML Ain’t Markup Language). Wird in Home Assistant für Konfigurationen, Automationen und Szenen verwendet. Leicht lesbar aber fehleranfällig bei falschen Einrückungen-Konfiguration in ESPHome habe ich mit entsprechenden Anmerkungen versehen:
esphome:name:waterkingplatform:ESP8266board:d1_mini# Zur Sicherheit alle Ausgänge beim Start ausschaltenon_boot:then:- switch.turn_off:v1- switch.turn_off:v2- switch.turn_off:v3- switch.turn_off:v4- switch.turn_off:v5- switch.turn_off:pump- sensor.rotary_encoder.set_value:id:encvalue:0# Seriellen Logger an RX/TX ausschalten, um Pins für andere Aufgaben nutzen zu könnenlogger:baud_rate:0# Home Assistant API aktivierenapi:ota:password:!secret otapass"wifi:ssid:!secret wifi_ssidpassword:!secret wifi_passworduse_address:waterking.local# Fallback Hotspotap:ssid:"Bewaesserung Fallback Hotspot"password:!secret hotspotcaptive_portal:# Uhrzeit von HA holentime:- platform:homeassistantid:homeassistant_time# Globale Variablen setzenglobals:- id:setpage#Einstellmodustype:boolrestore_value:noinitial_value:'false'- id:maxtime#maximale Laufzeit Ventile als Schutztype:intrestore_value:yesinitial_value:'600000'# in ms = 10 min# Schieberegister einrichtensn74hc595:- id:'sn74hc595_hub'data_pin:D5clock_pin:D6latch_pin:D7oe_pin:D2sr_count:1# SPI für Displayspi:clk_pin:D0mosi_pin:D1# Ventile definierenswitch:- platform:gpioname:"Ventil Ost"id:v1pin:sn74hc595:sn74hc595_hubnumber:1inverted:falseinterlock:[v2,v4,v5]# Bestimmte Ventile nicht gleichzeitig einschalten -> Druckverluston_turn_on:- switch.turn_on:pump- delay:!lambda "return id(maxtime);"- switch.turn_off:v1- platform:gpioname:"Ventil West"id:v2pin:sn74hc595:sn74hc595_hubnumber:2inverted:falseinterlock:[v1,v4,v5]on_turn_on:- switch.turn_on:pump- delay:!lambda "return id(maxtime);"- switch.turn_off:v2- platform:gpioname:"Ventil Beet"id:v3pin:sn74hc595:sn74hc595_hubnumber:3inverted:falseinterlock:[v2]on_turn_on:- switch.turn_on:pump- delay:!lambda "return id(maxtime);"- switch.turn_off:v3- platform:gpioname:"Ventil Vorgarten"id:v4pin:sn74hc595:sn74hc595_hubnumber:4inverted:falseinterlock:[v1,v2]on_turn_on:- switch.turn_on:pump- delay:!lambda "return id(maxtime);"- switch.turn_off:v4- platform:gpioname:"Ventil Einfahrt"id:v5pin:sn74hc595:sn74hc595_hubnumber:5inverted:falseinterlock:[v2,v5]on_turn_on:- switch.turn_on:pump- delay:1h#Ventil 5 darf max. 1 Stunde an sein -> Wasserentnahme- switch.turn_off:v5# Solid State Relais Ausgang für Pumpensteuerung- platform:gpioname:"SSR Pumpe"internal:true# Pumpe nicht in HA anzeigenid:pumppin:sn74hc595:sn74hc595_hubnumber:0inverted:false# Display einrichtendisplay:- platform:max7219cs_pin:D3num_chips:1update_interval:500mslambda:|- // Page 5 Uhrzeit anzeigen
if ((id(enc).state == 5) && (id(setpage) == false)) {
it.print(" ");
it.strftime("%H.%M.%S", id(homeassistant_time).now());
}
// Page 4 Wifi Level
if ((id(enc).state == 4) && (id(setpage) == false)) {
it.print(" ");
it.printf("Wi %.0fdB", id(wlan_signal).state);
}
// Page 1 Wasserstand Höhe
if ((id(enc).state == 1) && (id(setpage) == false)) {
it.print(" ");
it.printf("FH %.1fcn", id(zisterne_cm).state);
}
// Page 2 Wasserstand Liter
if ((id(enc).state == 2) && (id(setpage) == false)) {
it.print(" ");
it.printf("FS %.0fL", id(zisterne_liter).state);
}
// Page 3 Wasserverbrauch heute
if ((id(enc).state == 3) && (id(setpage) == false)) {
it.print(" ");
it.printf(1,"= %.0f L", id(zisterne_delta_heute).state);
}
// Page 0 Status Ventile anzeigen
if ((id(enc).state == 0) && (id(setpage) == false)) {
it.print(" ");
if ((id(v1).state)) {
it.print("o");
} else {
it.print("_");
}
if ((id(v2).state)) {
it.print(1,"o");
} else {
it.print(1,"_");
}
if ((id(v3).state)) {
it.print(2,"o");
} else {
it.print(2,"_");
}
if ((id(v4).state)) {
it.print(3,"o");
} else {
it.print(3,"_");
}
if ((id(v5).state)) {
it.print(4,"o");
} else {
it.print(4,"_");
}
if ((id(pump).state)) {
it.print(6,"P");
} else {
it.print(6,"_");
}
}
// Erste Seite Setup-Page
if (id(setpage) == true && id(enc).state == 0) {
it.print(" S");
if ((id(v1).state)) {
it.print("o");
} else {
it.print("_");
}
if ((id(v2).state)) {
it.print(1,"o");
} else {
it.print(1,"_");
}
if ((id(v3).state)) {
it.print(2,"o");
} else {
it.print(2,"_");
}
if ((id(v4).state)) {
it.print(3,"o");
} else {
it.print(3,"_");
}
if ((id(v5).state)) {
it.print(4,"o");
} else {
it.print(4,"_");
}
if ((id(pump).state)) {
it.print(6,"P");
} else {
it.print(6,"_");
}
}
// Ventil 1 einstellen
if (id(setpage) == true && id(enc).state == 1) {
if ((id(v1).state)) {
it.print("o.");
} else {
it.print("_.");
}
if ((id(v2).state)) {
it.print(1,"o");
} else {
it.print(1,"_");
}
if ((id(v3).state)) {
it.print(2,"o");
} else {
it.print(2,"_");
}
if ((id(v4).state)) {
it.print(3,"o");
} else {
it.print(3,"_");
}
if ((id(v5).state)) {
it.print(4,"o");
} else {
it.print(4,"_");
}
} // Ende V1
// Ventil 2 einstellen
if (id(setpage) == true && id(enc).state == 2) {
if ((id(v1).state)) {
it.print("o");
} else {
it.print("_");
}
if ((id(v2).state)) {
it.print(1,"o.");
} else {
it.print(1,"_.");
}
if ((id(v3).state)) {
it.print(2,"o");
} else {
it.print(2,"_");
}
if ((id(v4).state)) {
it.print(3,"o");
} else {
it.print(3,"_");
}
if ((id(v5).state)) {
it.print(4,"o");
} else {
it.print(4,"_");
}
}
if (id(setpage) == true && id(enc).state == 3) {
if ((id(v1).state)) {
it.print("o");
} else {
it.print("_");
}
if ((id(v2).state)) {
it.print(1,"o");
} else {
it.print(1,"_");
}
if ((id(v3).state)) {
it.print(2,"o.");
} else {
it.print(2,"_.");
}
if ((id(v4).state)) {
it.print(3,"o");
} else {
it.print(3,"_");
}
if ((id(v5).state)) {
it.print(4,"o");
} else {
it.print(4,"_");
}
}
if (id(setpage) == true && id(enc).state == 4) {
if ((id(v1).state)) {
it.print("o");
} else {
it.print("_");
}
if ((id(v2).state)) {
it.print(1,"o");
} else {
it.print(1,"_");
}
if ((id(v3).state)) {
it.print(2,"o");
} else {
it.print(2,"_");
}
if ((id(v4).state)) {
it.print(3,"o.");
} else {
it.print(3,"_.");
}
if ((id(v5).state)) {
it.print(4,"o");
} else {
it.print(4,"_");
}
}
if (id(setpage) == true && id(enc).state == 5) {
if ((id(v1).state)) {
it.print("o");
} else {
it.print("_");
}
if ((id(v2).state)) {
it.print(1,"o");
} else {
it.print(1,"_");
}
if ((id(v3).state)) {
it.print(2,"o");
} else {
it.print(2,"_");
}
if ((id(v4).state)) {
it.print(3,"o");
} else {
it.print(3,"_");
}
if ((id(v5).state)) {
it.print(4,"o.");
} else {
it.print(4,"_.");
}
}sensor:- platform:rotary_encoder# Drehencoder einrichtenname:"Rotary Encoder"id:encpublish_initial_value:truepin_a:number:TXinverted:truemode:input:truepullup:truepin_b:number:RXinverted:truemode:input:truepullup:truemax_value:5min_value:0# Füllstand in Liter von HA holen- platform:homeassistantid:zisterne_literentity_id:sensor.zisterne_liter# Verbrauch heute von HA holen- platform:homeassistantid:zisterne_delta_heuteentity_id:sensor.zisterne_delta_heute# Füllstand in cm von HA holen- platform:homeassistantid:zisterne_cmentity_id:sensor.wasserstandraw# Notabschaltung Wasserstand < 12 cm -> Pumpenschutzon_value_range:- below:12then:- switch.turn_off:v1- switch.turn_off:v2- switch.turn_off:v3- switch.turn_off:v4- switch.turn_off:v5- switch.turn_off:pump# WLAN Signalstärke holen ... weil man es kann- platform:wifi_signalname:"Bewaesserung ESP Wifi Signal"update_interval:30sid:wlan_signalbinary_sensor:- platform:templatename:"Any Valve On"# Wenn alle Ventile aus, Pumpe ausschalteninternal:truelambda:'return id(v1).state or id(v2).state or id(v3).state or id(v4).state or id(v5).state ;'on_release:then:- switch.turn_off:pump- platform:gpio# Taster am Encoder einrichtenid:encswitchpin:number:GPIO2mode:INPUT_PULLUPinverted:Trueon_click:- min_length:50ms # Kurzer Betätigung, um ins Ventil-Setup zu kommenmax_length:250msthen:- lambda:|- if(id(setpage)) {
id(setpage) = false;
} else {
id(setpage) = true;
}- min_length:600ms# lange Betätigung, um ausgewähltes Ventil ein/aus zu schaltenmax_length:1500msthen:- if:condition:lambda:'return (id(setpage) == true && id(enc).state == 1);'then:switch.toggle:v1- if:condition:lambda:'return (id(setpage) == true && id(enc).state == 2);'then:switch.toggle:v2- if:condition:lambda:'return (id(setpage) == true && id(enc).state == 3);'then:switch.toggle:v3- if:condition:lambda:'return (id(setpage) == true && id(enc).state == 4);'then:switch.toggle:v4- if:condition:lambda:'return (id(setpage) == true && id(enc).state == 5);'then:switch.toggle:v5- min_length:3000ms# gaaanz lange Betätigung, um alle Ventile und die Pumpe auszuschaltenmax_length:60000msthen:- switch.turn_off:v1- switch.turn_off:v2- switch.turn_off:v3- switch.turn_off:v4- switch.turn_off:v5- switch.turn_off:pump
Bewässerungssteuerung mit Home Assistant
Die eigentliche Bewässerungssteuerung wird Home Assistant übernehmen. Da hier bereits diverse Sensoren wie der Regensensor der
LCN-WIH
Wetterstation, Regenmengensensor sowie die Wettervorhersage als Entitäten in HA vorhanden sind, kann man diese für eine optimale und sparsame Bewässerung nutzen.
Die Füllstandsmessung der Zisterne ist übrigens auch ein hervorragender Sensor, was Niederschlagsmengen angeht, bekommt er doch den Niederschlag von 75 qm Dachfläche. Bei niedrigem Wasserstand in der Zisterne kann man auch die Bewässerungszeiten verkürzen usw.
Die wichtigsten Werte für die Bewässerung kommen über einen Bodenfeuchtesensor. Kapazitive Sensoren sind zwar relativ robust, messen die Bodenfeuchte jedoch nur in einem engen Bereich von wenigen Quadratzentimetern. Ich habe mir daher einen resistiven Sensor aus zwei 1 Meter langen Edelstahlgewindestangen gebaut, die mit 20 mm Abstand in 10 cm Tiefe vergraben werden.
Edelstahl ist korrosionsbeständig und robust. Die zwei M5 Stangen kosteten im
Sonderpreis Baumarkt 3 Euro
. Mit diesem Sensor erfasst man einen repräsentativen Bereich und nicht nur punktuell. Da sich durch den Messstrom und die dadurch verursachte Elektrolyse mit der Zeit Salze und Mineralien an den Elektroden ablagern könnten, aktiviert man die Messung nur sehr kurz und in größeren Intervallen. Hierzu wird es einen separaten Beitrag geben.
War dieser Beitrag interessant oder sogar hilfreich?
Hallo! Ich bin Markus – der Fricklr. ⚡ Elektrotechniker, 🎵 Musiker (Bass, Gitarre, Keyboard) und seit über 30 Jahren beruflich „irgendwas mit Internet“ 🌐 – inzwischen auch mit KI 🤖 – ein 55-jähriger Generalist aus Bayern.
Dein Feedback hilft mir, noch interessantere Beiträge zu schreiben. Bei „Ja“ findest du danach eine kleine Option, meine Arbeit zu unterstützen.
Dir gefällt dieser Artikel? Unabhängiger Tech-Content braucht keine Paywall – aber deine Unterstützung. Mit einer Spende unterstützt du mich und meine Arbeit.
Teile deine Gedanken, Fragen oder Erfahrungen mit der Community.
Mit diesem Symbol gekennzeichnete Links sind Affiliate-Links (Werbung). Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Für dich entstehen keine Mehrkosten.
Was sagst du dazu? Kommentiere jetzt!
Teile deine Gedanken, Fragen oder Erfahrungen mit der Community.