Farm Flows Update

Jetzt, wo die Saison wieder los geht, habe ich noch ein paar Änderungen an den Node Red Flows (April 2025) der Farm gemacht. Da ich noch keine Zeit hatte, um den geplanten Sensor für den hydrostatischen Druck (Füllstandssensor) einzubauen, gibt es jetzt eine Zwischenlösung.

Die Zwischenlösung sieht vor, die verbrauchte Wassermenge durch die Laufzeit der Tauchpumpe zu bestimmen. Zusätzlich gibt es jetzt eine Bedienmöglichkeit direkt über das Dashboard von Node Red.

Diese ist allerdings etwas eingeschränkt. Die Pumpenlaufzeit kann derzeit nur über Home Assistant eingestellt werden.

Der kleinste einstellbare Wert ist eine Laufzeit von 25 Sekunden. Eine kleinere Laufzeit macht meiner Meinung nach keinen Sinn. Also habe ich diesen Wert eingestellt, die Bewässerung ausgelöst, und habe die Wassermenge mit einem Messbecher gemessen. Diesen Messversuch habe ich dann an verschiedenen Erbeerkästen wiederholt, da Leitungswege zwischen der ersten und vierten Reihe doch nicht unerheblich sind.

Als Ergebnis kann man sagen, dass ca. 0,5 Liter Wasser bei 25 Sekunden Pumpenlaufzeit in einen Erdbeerkasten gepumpt werden. Aus den Messversuch verwende ich den Kalibrierwert 0.5 mit dem die Wassermenge pro Sekunde errechnet wird.

Konfigurationsflow

Der Konfigurationsflow besitzt verschiedene Teilflows. Der folgende Teilflow erledigt Aufgaben für das Bedieninterface.

Über den Button Tankinhalt 200l kann der Tankinhaltzähler zurück auf 200 Liter gesetzt werden. Dazu wird der Wert 200 in die globale Variable tankinhalt geschrieben. Gleichzeitig wird für Home Assistant der Wert 200 per MQTT auf dem Topic farm/tank/liter publiziert.

In Home Assistant gibt es eine entsprechende Anzeige für den Tankinhalt.

Es gibt einen Reihenzähler, der zählt wieviele Reihen gegossen wurden. Der Button Reihencounter Null setzt diesen Wert zurück auf 0. Der Rückstellwert wird ebenfall für Home Assistant auf farm/reihencounter per MQTT publiziert. Dann gibt es noch den Not Aus Button, der über ein Link-Node sofort alle Ventile schließt und die Pumpe ausschaltet.

Der Teilflow Gießzeit hat folgende Aufgaben:

Über den Topic farm/giessen/zeit kommt von Home Assistant die gewünschte Gießzeit an. Diese wird unverändert auf dem Topic farm/giessen/state versendet. Das dient nur für mich als Kontrolle, ob die MQTT-Kette funktioniert. Außerdem wird die Gießzeit auf dem Dashboard von Node Red zur Anzeige gebracht. Zur weiteren Verarbeitung der Gießzeit innerhalb der einzelnen Bewässerungsflows, wird der Zeitwert mit 1000 multipliziert (ergibt Millisekunden) und in der globalen Variable giesszeit gespeichert.

Die weiteren Funktionen diese Teilflows sorgen für die Anzeigen auf dem Node Red- und dem Home Assistant-Dashboard. Dazu wird die Gießzeit über ‘die tolle Funktion’ etwas aufbereitet:

1let kalibrierwert = Number(global.get("kalibrierwert")); 
2let giesszeit = msg.payload;
3let wasser1sek = (kalibrierwert / 25);
4msg.payload = (wasser1sek * giesszeit * 4);
5return msg;

Aus dieser Funktion ergeben sich die gegossenen Liter pro Reihe. Mit dem Kalibrierwert wird die Wassermenge pro Sekunde errechnet. Dieser Wert wird mit der Gießzeit multipliziert, dann hat man die Wassermenge pro Kasten. Multipliziert man den Wert mit vier, hat man die Wassermenge für die Reihe für diesen Gießvorgang.

Dieser Teilflow sende über einen Inject-Node alle 10 Sekunden diverse Werte an Home Assistant. Dazu werden in den Funktionsnodes die zuvor gesetzten globalen Variablen ausgelesen, und via MQTT publiziert. Die ausgelesenen Werte werden außerdem auf dem lokalen Bedieninterface zur Anzeige gebracht.

Bewässerungsflow

Im Bewässerungflow haben keine großen Änderungen stattgefunden. Ein Link-in-Node bekommt jetzt das Not Aus Signal um das Ventil zu schließen. Wie oben rechts in der Flow-Abbildung zu sehen, gibt es für die Anzeige zwei Nodes. Der Change-Node wandelt das True/False-Signal in On/Off um und bringt es als Text zur Anzeige.

Ein Link-out-Node gibt das vom Change-Node on2false off2true kommende Schaltsignal an den Pumpenflow weiter, und schaltet damit die Pumpe ein oder aus.

Auf dem Bewässerungsflow gibt es noch einen kleinen Teilflow. Dieser stellt auf der Bedienoberfläche ein Button für die Bewässerung der entsprechenden Reihe zu Verfügung. Wird der Button gedrückt wird daraus ein Schaltsignal erzeugt, das über MQTT auf dem Topic farm/reihe1/cmd versendet wird.

Der Umweg über MQTT für ein lokales Signal ist natürlich nicht schön, sondern erstmal eine quick and dirty Lösung, die funktioniert.

Pumpenflow

Auf dem Pumpenflow gibt es im Vergleich zur vorherigen Version einige Änderungen. Ein Link-in-Node empfängt Schaltsignal für die Pumpe aus dem Bewässerungsflow. Das ist schon die Hauptfunktion.

Der Change-Node false2on true2off wandelt das Pumpenschaltsignal in on oder off um. Dieses Signal wird mit einem Text-Node zur Anzeige gebracht, und via MQTT auf dem Topic farm/pumpe/state an Home Assistant geschickt. Außerdem geht das Pumpenschaltsignal auf den Change-Node bei on. Dieser Node löst zwei Funktionen aus.

Die Funktion counter plus 1 holt sich die globale Variable reihencounter und erhöht sie:

1let counter = Number(global.get("reihencounter"));
2msg.payload = counter + 1;
3return msg;

Danach wird der Zählerwert zurück in die Variable geschrieben. Die zweite Funktion Tankinhalt Rest holt sich aus den Variablen tankinhalt und wasserreihe die Werte. Dann wird die Literzahl der gegossenen Reihe vom Tankinhalt abgezogen.

1let tankvoll = Number(global.get("tankinhalt"));
2let wasserreihe = Number(global.get("wasserreihe"));
3let tankrest = (tankvoll - wasserreihe);
4msg.payload = Math.round(tankrest*100)/100;
5return msg;

Das Ergebnis wird gerundet um keine Kommstellen im Wert zu haben. Danach wird der neue Wert des Tankinhalts in die Variable tankinhalt geschrieben. So, das war der Pumpenflow.

Controllerflow

Es gibt noch zusätzliche Flows, der weiter nichts mit den eigentlichen Funktionen der Erdbeerfarm zu tun haben. In diesem Flows wird ein Exec-Node verwendet, der jeweils das Tool vcgencmd mit unterschiedlichen Parametern ausführt.

Ich benutze im Moment nur die beiden Aufrufe

  • vcgencmd measure_temp
  • vcgencmd measure_volts

um Daten auszulesen. Im anschließenden Funktionsnode werden Temperatur und Spannung für die Ausgabe und den Versand via MQTT etwas aufbereitet:

1const re = /^temp=(.*)'C$/gm;
2msg.payload = Number(msg.payload.replace(re, '$1'));
3return msg;
1const re = /^volt=(.*)V$/gm;
2msg.payload = Number(msg.payload.replace(re, '$1'));
3return msg;

Der Inject-Node fragt alle 30 Sekunden die Daten ab. Versendet werden an die beiden Topics farm/cputemp und farm/cpuvolts. Auf dem Node Red Dashboard werden die Daten auch angezeigt.

Home Assistant empfängt die MQTT-Topics ebenfalls und bindet sie, wie hier beispielsweise die CPU-Temperatur, in das Dashboard ein.

lokales Bedieninterface

Das lokale Bedieninterface von Node Red ist in erster Linie dazu da, eine Eingriffmöglichkeit direkt auf dem Raspberry Pi in der Garage zu haben (siehe erstes Bild, oben). Wichtigste Funktion ist hier der Not Aus Button, mit dem zuverlässig jedwede Bewässerung sofort unterbrochen werden kann.

Home Assistant

Home Assistant hat ergänzende Anzeigen bekommen. Der Tankinhalt wird einmal als vorhandene Liter und in Prozent angezeigt (siehe oben). Der Temperaturverlauf des Prozessors wird über eine Sensorkachel angegeben. Aus der Bewässerungzeit werden die ermittelten Liter pro Reihe angezeigt. Der Gießcounter gibt die gegossenen Erdbeerreihen an.