Seit schon über einem Jahr bin ich stolzer Besitzer von einem kleinen „Nano-Aquarium“. In einem etwa 20 Liter großen Becken halte ich eine glückliche Familie von Zwerggarnelen, die sich wohlfühlen und fleißig vermehren. Es macht mir sehr viel Spaß den Tieren bei ihren (zugegeben eher einfachen) Tätigkeiten zuzusehen und für sie zu sorgen. Allerdings ist das Aquarium natürlich auch mit viel Verantwortung verbunden, schließlich ist der Zustand der Garnelen von meinen äußeren Einflüssen auf das Becken abhängig. Wer nicht den Überblick über sein Aquarium behält, kann schnell einen Fehler machen und das Wasser kippt: Wäre es da nicht praktisch, das Aquarium digital zu überwachen? Zeit, in die IoT-Trickkiste zu greifen!
Ein Aquarium lässt sich für kleines Geld digital überwachen und sogar ganz einfach in ein SmartHome integrieren. Ich möchte euch ein paar Möglichkeiten zeigen, wie ihr euer Aquarium smart macht!
Das Konzept
Eigentlich unterscheidet sich die Überwachung für unser smartes Aquarium kaum von einem Standardprojekt mit Arduino & co.: Wir haben Sensoren die ausgelesen werden und mit den Daten können wir am Ende machen, was wir wollen. Allerdings bietet es sich an, die Daten so komfortabel wie möglich zu nutzen. Wer ein Smarthome-System mit zum Beispiel HomeAssistant oder openHab sein Eigen nennt, der kann die Daten direkt in sein Setup integrieren und verwerten. Grundsätzlich geht das Ganze natürlich auch ohne Smarthome und wir können uns die Werte auch einfach auf einem Display anzeigen lassen.
Ich werde für meine Implementationen ESPHome verwenden, da es uns das Schreiben einer Firmware stark vereinfacht und wir die Werte direkt nutzen können (zumindest bei Homeassistant). Allerdings lässt sich ESPHome auch so konfigurieren, dass es im Standalone-Betrieb unabhängig von einem Smarthome-, oder MQTT-Server arbeitet. Die Hauptsache: Wir müssen uns nicht mit nervigen Libraries herumschlagen! Das limitiert uns zwar auf ESP32 und ESP8266 basierte Boards, aber zu 99% wollen wir die Daten ja eh extern analysieren und brauchen WiFi.
ESPhome lässt sich hier herunterladen
ESPhome spuckt uns später eine Firmware aus, die wir einfach nurnoch auf unser Board laden müssen: Das geht nach dem ersten mal „von Hand“ flashen sogar per WiFi. Probiert es aus, die Inbetriebnahme geht kinderleicht. Ich verwende zum Testen einen M5 Atom Lite, also einen ESP32-Pico, aber ihr könnt auch jeden anderen ESP nutzen.
Der Temperatursensor: Wer braucht schon Thermometer?
Jedes Aquarium hat es an der Scheibe kleben: Ein Thermometer. Mit einem Blick hat man die Wassertemperatur schnell im Blick. Heizt der Heizstab noch? Ist mein Becken zu warm oder zu kalt? Mit einem Thermometer im Becken können wir problemlos die Temperatur abfragen.
Als Sensor kommt hierzu ein DS18B20 zum Einsatz, den man eigentlich aus jedem guten Arduino-Starter-Kit kennt. Diesen gibt es nämlich nicht nur in der „klassischen“ Bauweise die einem Transistor ähnelt, sondern auch in einer wasserdichten Hülle mit Metallkapsel am Ende. Je nachdem, wo man ihn kauft, ist er auch mit 2€ relativ erschwinglich und liefert brauchbare Messergebnisse. (Keine Sorge, die Materialliste ist wie immer am Ende des Beitrags!)
Der TDS-Sensor: Unnormales Verhalten feststellen
Bis jetzt gibt es keine günstige Möglichkeit, wichtige Parameter im Wasser, wie zum Beispiel den Nitratanteil zu messen. Allerdings kann uns ein TDS-Sensor über ein unvorhergesehenes Verhalten informieren. TDS steht für „total dissolved solids“ und misst die gelösten Feststoffe bei uns im Becken. Welche das genau sind können wir zwar nicht erfahren, aber so können wir Abweichungen vom Normalbetrieb detektieren. Für sinnvolle Messwerte braucht der TDS-Sensor einen Temperatursensor, da die Messergebnisse von der Wassertemperatur abhängig sind.
So ein Sensor kostet in etwa 13€ und lässt sich ebenfalls in unsere Firmware integrieren.
Anschluss der Sensoren an ein ESP-Board
Dieser Schritt ist für jeden wahrscheinlich ein bisschen unterschiedlich und hängt auch von dem verwendeten Board ab. Bei meinem M5 Atom Lite nutze ich den „Grove Connector“ Anschluss an dem ich 2 Pins für die Daten und 2 Pins für 5 Volt und Ground zur Verfügung habe. Dazu habe ich mir ein kleines Adapter gelötet, indem ich die Stromversorgung der beiden Sensoren verbunden habe.
Der DS18B20 benötigt für sichere Messergebnisse noch einen Pullup-Widerstand mit 4,7 kOhm, der parallel zwischen 5 Volt und dem Datenpin geschaltet wird. Ansonsten kann es zu Fehlmessungen kommen.
Der TDS-Sensor benötigt keine weiteren Komponenten und fungiert als analoger Sensor. Hier muss die ESP8266-Fraktion aufpassen: Es gibt nur einen Pin der analoge Werte lesen kann.
Ich jedenfalls verwende Pins 26 und 32, da diese den vorderen Anschluss belegen.
Firmware konfigurieren und hochladen
Ist ESPHome eingerichtet, so muss lediglich diese Konfiguration kompiliert und auf das Board hochgeladen werden. Meine Konfiguration sendet alle 15 Minuten einen neuen Wert an HomeAssistant und befindet sich zwischendurch zum Energie sparen im Deepsleep. Möchte man das deaktivieren, so kommentiert einfach die Zeilen mit dem DeepSleep aus. Außerdem prüft das Programm, ob in HomeAssistant ein virtueller Schalter aktiviert wurde, der den DeepSleep unterbindet.
Leider findet man keine genauen Details, wieso die Formel für das Berechnen der TDS so aussieht, wie sie aussieht. Allerdings habe ich die Messwerte überprüft und sie scheinen zu stimmen.
esphome:
name: Aquarium
on_boot:
priority: -100
then:
- script.execute: deep_sleep_evaluation # Prüft am Anfang, ob der ESP in Deep Sleep gehen soll
esp32:
board: m5stack-atom
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
password: "OTA-PASSWORT-HIER"
wifi:
ssid: "SSID-HIER"
password: "PASSWORT-HIER"
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Fallback Hotspot"
password: "PASSWORT-HIER"
captive_portal:
deep_sleep: # Deepsleep zum Stromsparen (1 Wert alle 15min)
id: deep_sleep_enabled
run_duration: 80s
sleep_duration: 820s
dallas:
- pin: GPIO26 # Temperatursensor an Pin 26
sensor:
- platform: dallas
address: 0x8b0121523a614028
name: "Temperatur"
id: "temp"
filters:
- offset: -1 # Die gemessene Temperatur war bei mir 1 Grad zu hoch, die wird abgezogen
- filter_out: nan # Messfehler werden gefiltert
- platform: adc # Hier wird die rohe Spannung des TDS Sensors gemessen
pin: GPIO32
name: "TDS raw"
id: tds_raw_v
update_interval: 10s
unit_of_measurement: "V"
icon: "mdi:water-percent"
internal: true
filters:
- filter_out: nan # Messfehler werden gefiltert
# Temperatur kompensierte Spannung
- platform: template # Hier wird die Spannung mit der Temperatur verrechnet
name: "TDS TCV"
id: tds_tcv
unit_of_measurement: 'V'
accuracy_decimals: 3
lambda: 'return ((id(tds_raw_v).state) / (1 + (0.02 * ((id(temp).state) - 25.0))));'
update_interval: 10s
filters:
- filter_out: nan # Messfehler werden gefiltert
internal: true
# Temperatur kompensierte TDS
- platform: template
name: "Aquarium TDS"
id: aquarium_tds
icon: "hass:water-opacity"
unit_of_measurement: 'PPM'
accuracy_decimals: 0
update_interval: 10s
filters:
- filter_out: nan # Messfehler werden gefiltert
- median: # von 5 gemessenen Werten wird der Durchschnitt gebildet
window_size: 5
send_every: 5
send_first_at: 5
lambda: 'return (133.42*(id(tds_tcv).state)*(id(tds_tcv).state)*(id(tds_tcv).state) - 255.86*(id(tds_tcv).state)*(id(tds_tcv).state) + 857.39*(id(tds_tcv).state))*0.5;' # Verrechnung der Werte
binary_sensor: # Für Homeassistant wird geprüft ob der Deepsleep in der Benutzeroberfläche deaktiviert wurde
- platform: homeassistant
id: disable_deep_sleep
entity_id: input_boolean.disable_deep_sleep
script: # Ist Deepsleep deaktiviert, so verzögert das Skript diesen immer weiter
- id: deep_sleep_evaluation
mode: queued
then:
- delay: 80s
- if:
condition:
binary_sensor.is_on: disable_deep_sleep
then:
- logger.log: 'Deep Sleep Disabled'
- deep_sleep.prevent: deep_sleep_enabled
else:
- deep_sleep.enter: deep_sleep_enabled
- script.execute: deep_sleep_evaluation
Code-Sprache: YAML (yaml)
Ist die Firmware hochgeladen, so sollte sich der ESP in HomeAssistant melden und erfolgreich die ersten Werte übermitteln. (Wer kein HomeAssistant verwendet, der kann ESPhome auch als Standalone verwenden und die Werte per MQTT weiterreichen!)
Weitere Ideen: Steuerung von Filter, Licht und Heizung mit Relais
Natürlich ist bei Temperatur und TDS noch nicht schluss: Wer möchte kann seinen Filter, Licht und Heizung über Relais steuern lassen. Somit ist zum Beispiel eine Notabschaltung denkbar, wenn der Heizstab kaputt geht und die gemessene Temperatur zu hoch ist. Außerdem lässt sich natürlich das Licht bequem per App einstellen und der Filter bei Reinigungsarbeiten im Aquarium ausstellen, ohne hinter den Schrank krabbeln zu müssen.
Und wem das nicht genügt, der findet Servo-basierte Futterautomaten zum 3D-Drucken, pH-Sonden und Durchflussmesser im Internet.
Ergebnis und Nachwort
Wer sich gerne um die Tiere in seinem Aquarium kümmert und gerne mit ESP, Smarthome und Co. bastelt, kommt an diesem Projekt einfach nicht vorbei. Nicht nur sind die Statistiken interessant zu beobachten, sondern geben auch aus der Ferne eine Aussage über den Zustand des Aquariums – egal ob im Urlaub oder auf der Arbeit. Ein schneller Blick genügt und man weiß mehr.
Hier noch die Materialliste:
Was? | Wo? |
---|---|
ESP32-Board | https://amzn.to/3TGvry1 * |
DS18b20 Temperatursensor | https://amzn.to/3tqkJRT * |
4,7 kOhm Widerstand | https://amzn.to/3UZQ7SZ * |
TDS-Sensor | https://amzn.to/3Ewyuoj * |
Mit * gekennzeichnete Links sind Affiliate-Links. Solltest du ein Produkt kaufen, erhalte ich eine Provision; der Verkaufspreis bleibt für dich gleich. Mehr dazu findest du beim Datenschutz.