zurück zur Startseite

zurück zur Übersicht der Heimautomatisierung

50. Die Bewässerung der Pflanzkübel (Stand 09.09.2019)

Wir haben nette Nachbarn, die gerne die Pflanzen gießen, wenn wir nicht zu Hause sind. Aber es stehen mittlerweile mehr als 30 Pflanzkübel um das Haus herum, so dass eine Automatisierung, die nicht nur die Nachbarn sondern auch uns etwas entlastet, doch eine kleine Annehmlichkeit wäre. Bevor es allerdings an das Programmieren geht, muss erst einmal geklärt sein, wie denn das Wasser zu den Kübeln kommt. Hier müssen Leitungen verlegt werden, diese müssen an entsprechende Verteiler angeschlossen werden und schließlich muss am Anfang der Kette bei Bedarf der Wasserhahn auf-, bzw. zugedreht werden.

Den Wasserhahn wollte ich nun auf keinen Fall mit einem Motor betätigen, dann schon eher ein Magnetventil einsetzen. Was aber passiert, wenn das Ventil defekt ist? Dann fließt solange Wasser, bis es jemand bemerkt und irgendwie abdreht. Bis dahin können schon einige Kubikmeter geflossen sein. Außerdem möchte ich möglichst Regenwasser verwenden und das kommt nun mal nicht aus dem Wasserhahn. Also muss ein Regensammelgefäß und eine Pumpe installiert werden. Ist das Sammelgefäß leer, wird es aus dem Wasserhahn gefüllt. Da die Pumpe gegen Trockenlauf geschützt ist, geht sie bei leerem Gefäß auch nicht kaputt. Einzig die Pflanzen sehen dann welk aus und erinnern an das Nachfüllen des Gefäßes.

Sind diese Vorarbeiten erledigt, geht es "nur" noch um das Ein- und Ausschalten der Pumpe. Wir gießen die Pflanzen eigentlich immer abends vor dem Schlafengehen. Aber es ist ratsam, die Pflanzen morgens zu gießen, weil wenn es draußen noch etwas kühler ist, verdunstet weniger Gießwasser und die Pflanzen sind tagsüber gut mit Wasser versorgt. Wer hingegen abends gießt, riskiert, dass die Pflanzen während der Nacht in der nassen Erde stehen, so dass die Wurzeln faulen könnten. Damit wäre das erste Kommando schon mal geklärt (aus fhem.cfg kopiert):

define tr_giessenstart dummy
   attr tr_giessenstart event-on-change-reading .*
   attr tr_giessenstart room Terrasse

define tr_triggergiessen DOIF ([({sunrise()}-1800)]) ## 30 Minuten vor Sonnenaufgang\
  (set tr_giessenstart ja)\
DOELSE ()
   attr tr_triggergiessen do always
   attr tr_triggergiessen room Terrasse

Ich möchte aber bei Bedarf auch zusätzlich händisch gießen lassen, dies mit einem Berührfeld bedienen und gleichzeitig auch anzeigen, ob die Automatik den Gießvorgang gestartet hat. Weiterhin wird nicht einfach gegossen, sondern das Gießen erfolgt mit Pausen, damit sich die Feuchtigkeit besser in den Pflanzkübeln verteilt. Damit ist die Programmierung etwas umfangreicher.

define tr_giessenmanuell dummy
   attr tr_giessenmanuell devStateIcon nein:20_k_giessen0:ja ja:20_k_giessen1:nein pumpen:20_k_giessen2:nein warten:20_k_giessen3:nein
   attr tr_giessenmanuell fp_zw_terrasse 700,200,0
   attr tr_giessenmanuell room Terrasse

Es wird also nicht direkt die Pumpe bedient, so dass noch der Start des Gießens ausgelöst werden muss.

define tr_triggermanuell notify tr_giessenmanuell:.* {\
if ($EVENT eq "ja") {fhem("set tr_giessenstart ja")}\
elsif ($EVENT eq "nein") {fhem("set tr_giessenstart nein")}\
}
   attr tr_triggermanuell room Terrasse

Es kann somit nicht nur der manuelle Gießvorgang gestoppt werden, sondern auch der automatisch ausgelöste.

Zukünftig soll die Menge des Wassers auch noch automtisch ermittelt werden. Bis die entsprechende Sensorik verfügbar ist, begnüge ich mich mit einer händischen Einstellung.

define tr_giessmenge dummy
   attr tr_giessmenge devStateIcon 0:20_k_giessmenge0:3 3:20_k_giessmenge1:6 6:20_k_giessmenge2:9 9:20_k_giessmenge3:12 12:20_k_giessmenge4:0
   attr tr_giessmenge fp_zw_terrasse 700,400,0
   attr tr_giessmenge room Terrasse

        

define tr_giesskanne dummy
   attr tr_giessmenge room Terrasse

define tr_giessmengeanzahl notify tr_giessmenge:.* {\
  my $anzahl = Value("tr_giessmenge");;\
  fhem("set tr_giesskanne $anzahl")\
}
   attr tr_giessmenge room Terrasse

Die Gießmenge wird über die möglichen Pumpintervalle eingestellt, es sind die Werte 0, 3, 6, 9, und 12 möglich, was 0 bis 2 Litern Wasser je Kübel maximal entspricht. Dies ist für die größten Kübel mit den durstigsten Pflanzen die richtige Menge, bei kleineren Kübeln und/oder weniger durstigen Pflanzen kann ich die Wassermenge mechanisch reduzieren. Die zusätzliche Variable "tr_giesskanne" wird später bei jedem Pumpintervall dekrementiert, so dass bei dem Wert Null der Vorgang beendet wird. So jetzt wollen wir aber mal die Pumpe einschalten:

define tr_giessen DOIF (([tr_giessenstart] eq "ja" and [tr_giesskanne] != 0) or [tr_giessenrestart] eq "ja")\
  (set tr_Wasserpumpe on-for-timer 30, set tr_giesskanne {([tr_giesskanne]-1)}, set tr_giessenrestart nein, trigger tr_giessenreset)\
DOELSE (set tr_giessenmanuell nein)
   attr tr_giessen cmdState giessen|fertig
   attr tr_giessen comment tr_giessenicon muss gleichen on-for-timer Wert haben!
   attr tr_giessen do always
   attr tr_giessen room Terrasse

Die Pumpe läuft also mal 30 Sekunden und muss dann nach einer Pause entprechend weitere 30 Sekunden laufen, solange, die die Anzahl Pumpvorgänge erreicht ist. Das geht eigentlich auch ganz elegant mit den Attributen "repeatcmd" und "repeatsame" von DOIF. ABer wenn die ANzahl variiert, muss man den Code verändern und das gefällt mir nicht. Deshalb habe ich den umständlicheren Weg gewählt. Damit auf der Bedienoberfläche immer das für mich Richtige angezeigt wird, braucht es noch ein weiteres "notify".

define tr_giessenicon notify tr_Wasserpumpe:.* {\
  if (Value ("tr_Wasserpumpe") eq "on" || Value ("tr_Wasserpumpe") eq "set_on-for-timer 30") {fhem("set tr_giessenmanuell pumpen")}\
  elsif ((Value ("tr_Wasserpumpe") eq "off") && (Value ("tr_giessenstart") eq "ja")) {fhem("set tr_giessenmanuell warten")}\
  else {fhem("set tr_giessenmanuell nein")}\
}
   attr tr_giessenicon comment tr_giessen muss gleichen on-for-timer Wert haben!
   attr tr_giessenicon room Terrasse

So, jetzt muss nur noch die Wiederholung des Pumpvorgangs erfolgen. Dazu beraucht es eigentlich nur ein "at" welches erzeugt wird und (in meinem Fall) nach 5 Minuten die Pumpe neu startet. Solange noch weitere Pumpvorgänge anstehen, muss ein weiteres "at" erzeugt werden. Logischerweise kann dieses neue "at" nicht den gleichen Namen haben. Einen variablen Namen zu erzeugen, z.B. ergänzt um einen Zeitstempel, ist mir nicht gelungen, so dass ich 2 hintereinander geschaltete "at" programmiert habe, die jeweils durch ein "notify" erzeugt werden.

define tr_giessenreset notify tr_giessenreset define reset_giessen2 at +00:03:00 trigger tr_giessenreset2
   attr tr_giessenreset room Terrasse

define tr_giessenreset2 notify tr_giessenreset2 defmod reset_giessen at +00:02:00 {\
  if (Value("tr_giesskanne") == 0) {\
    fhem("set tr_giessenstart nein");;\
    my $anzahl = Value("tr_giessmenge");;\
    fhem("set tr_giesskanne $anzahl")\
}\
  else {fhem("set tr_giessenrestart ja")}\
}
   attr tr_giessenreset2 room Terrasse

Der Vollständigkeit halber hier noch die Definition des Aktors für die Pumpe.

define tr_Wasserpumpe CUL_HM 34A06F02
   attr tr_Wasserpumpe devStateIcon on:20_k_giessen1:off off:20_k_giessen0:on-for-timer%20120
   attr tr_Wasserpumpe event-on-change-reading .*
   attr tr_Wasserpumpe model HM-LC-SW4-SM
   attr tr_Wasserpumpe peerIDs 00000000,
   attr tr_Wasserpumpe room Terrasse
   attr tr_Wasserpumpe webCmd on-for-timer 120:off

weiter zu: 99. Fortsetzung folgt