/assets/img/2017-07-31-fhem-eimer-640.jpg

Automatische Balkonbewässerung - Tankinhalt berechnen

Contents

Nachdem der Füllstandsensor nun zuverlässig Distanzen an FHEM sendet, kann daraus der Tankinhalt berechnet werden.

Mathematik eines Eimers

/assets/img/2017-07-31-fhem-eimer-640.jpg

Die dafür nötigen Formel unterscheiden sich je nachdem, welche Form der Tank hat, als ersten Protoypen habe ich einen Putzeimer genutzt.

Über dem Eimer habe ich den Ultraschallsensor angebracht und die Entfernung der Unterkante bis zum Boden mit 24cm gemessen. Der Radius in dieser Höhe beträgt 14cm, am Boden sind es 12cm.

Mithilfe dieser Angaben und der Formel zu Berechnung des Volumens eines Kegelstumpf kann der Inhalt des Eimers berechnet werden."

Die nötige Formel findet sich zum Beispiel auf Wikipedia1:

V=hπ3(R2+Rr+r2) V = \frac{h \cdot \pi}{3} \cdot (R^2 + R \cdot r + r^2)

/assets/img/2017-07-31-fhem-tankinhalt-640.jpg

Für unseren Eimer ergeben sich dann folgende Variablen:

VariableBedeutungWert
R_maxMaximaler Radius14cm
rRadius an tiefster Stelle12cm
hnutzbare Höhe des Eimers24cm
RRadius an Wasseroberfläches.u.
dGemessene DistanzReadingsVal('Balkon_Distance', 'distance13', 0)
wWasserstandh - d
Vaktuelles Volumen

Um den Radius an einer gegebenen Höhe zu berechnen, kann folgende Formel genutzt werden:

R=r+((Rmaxr)wh) R = r + ((R_{max}-r) \cdot \frac{w}{h})

Einbindung in FHEM

Damit die gesamte Berechnung und Konfiguration des Tanks an einer einzelnen Stelle in FHEM erfolgt, wird dazu ein ReadingsProxy2 definiert.

Dieser besitzt folgende Readings, wobei die ersten vier manuell gesetzt werden müssen (abhängig vom Eimer):

ReadingBedeutung
tankhoehenutzbare Höhe des Eimers: h
eimerradius_maxMaximaler Radius: R_max
eimerradius_minMinimaler Radius: r
min_waterlevelMindestfüllung bevor Trockenlaufschutz greift (in ml)
waterlevelaktueller Wasserstand (wird berechnet): w
tankfillingaktueller Füllstand (wird berechnet)
defmod Balkon_Tank readingsProxy Balkon_Distance:distance13

# Berechnung der einzelnen Variablen
attr Balkon_Tank valueFn {\
  my $eimerhoehe = ReadingsVal('Balkon_Tank', 'tankhoehe', 0);;\
  my $eimerradius_max = ReadingsVal('Balkon_Tank', 'eimerradius_max', 0);;\
  my $eimerradius_min = ReadingsVal('Balkon_Tank', 'eimerradius_min', 0);;\
  # Wasserstand = Tankhöhe - gemessene Distanz\
  my $waterlevel = $eimerhoehe-ReadingsVal('Balkon_Distance','distance13',0);;\
  # Radius an Oberfläche berechnen\
  my $radius = $eimerradius_min + (($eimerradius_max-$eimerradius_min)*$waterlevel/$eimerhoehe);;\
  # Volumen des Kegelstump berechnen\
  my $tankfilling = int((($waterlevel * pi)/3)*(( $radius ** 2) + ($radius * $eimerradius_min) + ($eimerradius_min ** 2)));;\
  # Readings setzen\
  fhem("setreading Balkon_Tank waterlevel  $waterlevel");;\
  fhem("setreading Balkon_Tank tankfilling $tankfilling");; \
  return $tankfilling;;\
}

# Konfiguration Eimerabmessungen
setstate Balkon_Tank 2017-07-28 17:59:51 tankhoehe 24
setstate Balkon_Tank 2017-07-28 17:59:11 eimerradius_max 14
setstate Balkon_Tank 2017-07-28 17:59:22 eimerradius_min 12
# Mindestinhalt bevor Trockenlaufschutz greift
setstate Balkon_Tank 2017-07-28 13:13:53 min_waterlevel 3000

Trockenlaufschutz

Der Trockenlaufschutz wird über ein notify3 umgesetzt welches bei Aktualisierung des Tankinhalts überprüft, ob noch genug Wasser vorhanden ist. Falls nicht wird die Pumpe deaktiviert und eine Benachrichtigung gesendet.

defmod Trockenlaufschutz notify Balkon_Tank:tankfilling:.* { \
\
  my $tankfilling = Value("Balkon_Tank");;\
  my $lastTankfilling = ReadingsVal('Trockenlaufschutz', 'last_tankfilling', 0);;\
  my $minWaterlevel = ReadingsVal('Balkon_Tank', 'min_waterlevel', 0);;\
  # Nur auslösen, wenn der letzte Waterstand über dem minimum war\
  if ($lastTankfilling > $minWaterlevel && $tankfilling <= $minWaterlevel) {\
    Log 2, ("Pumpe wird gestoppt, zu wenig Wasser: $tankfilling");;\
    fhem("set Pumpe_Schalter off");;\
    fhem("set pushmsg msg 'fhem' 'Pumpe wurde gestoppt, zu wenig Wasser: $tankfilling ml übrig' '' 0 ''");;\
  }\
  else {\
    Log 3, ("Pumpe kann weiterlaufen: $tankfilling");;\
  }\
  # Wasserstand speichern\
  fhem("setreading Trockenlaufschutz last_tankfilling $tankfilling");;\
}

Footnotes

Tags

Comments

Related

Automatische Balkonbewässerung - Finaler Aufbau

Da nun sowohl die Software als auch Hardware einige problemlos lief, habe ich als finalen Schritt noch einen besseren Wasserbehälter als den 12 Liter Eimer gesucht. Fündig geworden bin ich bei der Firma Goebel, welche Wassertanks für den Campingbedarf anbietet. Hinter unserem Sofa sind knapp 30cm Platz zur Wand, daher passt hier der 76 Liter Tank (100cm x 40cm x 20cm) ideal. Die Einfüll und Reinigungsöffnung des Tanks ist auf der Seite, daher musste ich oben einen neuen Stutzen anbringen.

FHEM - MySensors Ultrasonic Sensor

Mithilfe des im Blogpost zum Füllstandsensor Ultraschallsensor HC-SR04 können Entfernungen zwischen 2 Zentimetern und über 3 Meter gemessen werden. Aus der Laufzeit von kurzen Ultraschallimpulsen kann eine Entfernung gemessen werden, welche zwar je nach Temperatur etwas abweichen kann aber für unserer Zwecke völlig ausreichend ist. Der Ultraschallsensor verfügt über 4 Pins welche an den Arduino angeschlossen werden müssen1: Sensor Arduino VCC VCC (5V) TRIG D6 ECHO D5 GND GND Das nRF24L01 Funkmodul hat weitere 8 Pins von denen 7 benötigt werden2:

Automatische Balkonbewässerung - Sensoren und Schalter

Im nächsten Schritt sollen nun die angelegten Dummy Devices durch echte Sensoren und Schalter ersetzt werden. Benötigt werden ein Temperatursensor und eine schaltbare Steckdose. Prinzipiell gibt es hier eine recht große Auswahl, sowohl FHEM Forum und Wiki bieten hier einen guten Anlaufpunkt. Aufgrund meiner bisherigen Erfahrungen habe ich mich für eine Steckdose1 aus dem FS20 System von ELV2 und einen LaCrosse-kompatiblen Temperatursensor3 entschieden, alternativ könnte man aber beispielsweise auch eine Steckdose aus dem HomeMatic System4 nutzen.

FHEM - MySensors Ethernet Gateway

Damit nicht nur ein einzelnes Gerät Zugriff auf die Daten einer MySensors Node hat, wird ein Gateway benötigt. Dieses empfängt über 2.4Ghz die Daten und bietet diese über diverse Schnittstellen zur Weiterverarbeitung an. MySensors bietet mehrere Möglichkeiten ein Gateway für die Sensoren zur Verfügung zu stellen. Das Ganze reicht von einem Seriellen Gateway1 über den direkten Anschluss an einen Raspberry2 oder auch ein WLAN Gateway3. Um etwas flexibler zu bleiben habe ich mich für ein Ethernet Gateway4 entschieden.

Automatische Balkonbewässerung - Füllstandsensor

Nachdem nun sowohl der Temperatursensor als auch die Schaltsteckdose für die Pumpe in FHEM eingebunden sind, fehlt noch eine Möglichkeit, den Füllstand des Wasserbehälters in FHEM zu erfassen und entsprechend zu verhindern, dass die Pumpe trocken läuft. Von den möglichen Lösungen wird hier die Einbindung eines Ultraschall-Distanzsensors vorgestellt. Im Vergleich zu Lösungen wie dem ELV Homematic HM-Sen-Wa-Od1 welcher eine Mindesthöhe des Behälters von 1,1m voraussetzt oder anderen ‘fertigen’ Sensoren ist hier etwas Bastelaufwand erforderlich.

Automatische Balkonbewässerung - FHEM

Nachdem ich im letzten Blog post die Gardena Balkonbewässerung1 inklusiver der möglichen Verbesserungen vorgestellt habe, soll hier nun die Schaltzentrale für die spätere Pumpensteuerung diskutiert werden. Natürlich kann man sich so eine Software auch komplett selbst schreiben, hier wird aber der in Perl geschriebene Heimautomatisierungsserver FHEM2 genutzt. Der wohl größte Vorteil von FHEM ist, dass man quasi beliebige Sensoren und Hardwarekomponenten anbinden kann und mit diesen dann in eigenen Skripen agieren kann.