2023-12-06

Features

Wassermelder mit WhatsApp
Der Wassermelder mit WhatsApp-Benachrichtigung
  • Bis zu fünf anschließbare Wassersensoren
  • Schaltausgang für Alarm (z.B. Autohupe)
  • WhatsApp-Benachrichtigung bei Wasseralarm
  • Fancy OLED-Display für Statusanzeige
  • Blink-LED (um zu sehen ob das Ding noch läuft)
  • Formschönes transparentes Gehäuse (Schraubenschachtel aus'm Obi)

Beschreibung

Motivation

Das letzte Refugium des Mannes im Hause ist bei uns im Keller. Das ist der Ort, wo sich ausgediente Computer neben Baumaterialien stapeln und wo Netzteile, Kabel, Transistoren, Widerstände und die ein oder andere Spinne zu Hause sind. Wo programmiert, getüftelt und geschraubt und gesägt wird. Wo Leitungen und Rohre an der nackten Betondecke hängen und ästhetische Aspekte offensichtlich eine untergeordnete Rolle spielen.
Leseempfehlung am Rande: Es gibt übrigens ein unterhaltsames Buch über Orte wie diesen.

Nun, jedenfalls habe ich mein ganzes gesammeltes "Spielzeug" hier unten in der man cave.
Wie fatal da ein Rohrbruch sein könnte oder Wassereinbruch durch ein Fenster bei Starkregen mag man sich da gar nicht ausdenken. Unabhängig davon, ob eine Versicherung die Schäden kompensiert, wären auch viele Schätze unwiederbringlich verloren wenn hier signifikant Brühe in den Keller läuft. - Wo schon bekäme man heute wieder einen Röhrenmonitor her? Oder 5,25-Zoll-Disketten? Meinen alten Walkman? Und so weiter ...
😦 Ugh! Besser, man lässt es gar nicht so weit kommen. Ein Wassermelder muss her. Und zwar einer, der dann nicht nur hier vor Ort herumpiepst, sondern mich auch benachrichtigt, wenn mal niemand zu Hause ist.

Konzept

Ein Wassermelder ist eigentlich ein ziemlich primitiver Apparat: wenn Wasser zwei Kontakte kurzschließt, dann löse einen Alarmton aus.
Im einfachsten Fall könnte man sogar schlicht eine Zuleitung zu einer Autohupe unisoliert und mit ein paar Millimetern Abstand unterbrochen auf den Boden legen und etwaiges Wasser besorgt den Rest. Fertig ist der Wassermelder.
Und wer es etwas elaborierter möchte, der verwendet günstige Arduino-Regensensoren.
Dieser Aspekt eines Wassermelders ist also denkbar einfach.

Interessanter wird es bei der Benachrichtigungsfunktion. Wie erreicht man jemanden jederzeit und überall? Klar, über's Handy!
Meine erste Idee war, ein altes Nokia 3210 dazu zu bringen, mir auf Befehl eine SMS bei Wassereinbruch zu senden. Denn von diesem Handy habe ich noch ein paar Exemplare in irgendeiner Kiste und sogar noch ein passendes M-Bus-Datenkabel mit serieller Schnittstelle, über das man das Nokia fernsteuern konnte.
So ein altes 3210 ist einfach ein legendäres Teil. Allerdings hätte die Sache auch Nachteile: erstens bräuchte man für den Wassermelder eine eigene SIM-Karte und zweitens ist hier unten im Keller der GSM-Empfang sehr lausig. Meistens hat man gar keinen.
Was es hier aber gibt, ist WLAN. Und noch ein übrig gebliebenes WeMos D1 Mini Modul mit ESP8266 als Relikt aus einem nie verwirklichten Projekt.
Das kann WLAN und hat gerade genug I/O-Anschlüsse für ein paar der Arduino-Regenmeldersensoren. Soll mich das doch über irgendeinen Messaging-Dienst auf's Handy benachrichtigen.

Der Wassermelder

Wassersensoren

Regensensor für Arduino
Regensensor für Arduino o.ä.
Als Sensoren für den Wassermelder verwendete ich also Regensensoren für Arduino-Projekte, die man bei eBay günstig bekommt.
Die funktionieren mit 3.3V und haben neben einem Analogausgang auch ein Digitalausgang, dessen Schaltschwelle sich an einem Poti einstellen lässt. Normal hat der Digitalausgang 3.3V, bei Wasserkontakt wird er auf 0V gezogen. Optimal also für Inputs am ESP8266.
Zur Sicherheit habe ich die Inputs des ESP noch mit externen 1.2kΩ-PullUp-Widerständen auf 3.3V gezogen. - Man will ja auch keinen Fehlalarm durch floating inputs bekommen.
Zu beachten ist bei den Sensoren ansonsten nur, dass die Kontaktfläche aus unbehandelten Kupferbahnen besteht - ob diese im Laufe der Zeit oxidieren und dann nicht mehr ausreichend bei Wasserkontakt leiten muss sich zeigen. Im Zweifelsfall besorge ich mir eben Neue und verzinne sie mit etwas Lötzinn.

Alarmierung

Installation im Keller
Installation im Keller
Wenn Wasser, dann mach Krach.
So könnte man, etwas vereinfacht, das Programm beschreiben. Damit man den Krach vom Keller bis unter's Dach auch hören kann, habe ich mir eine Hupe mit integrierter Signalleuchte als Alarmgeber auserkoren. Diese macht viel Krach, braucht aber auch viel Power. Viel mehr, als das ESP-Modul liefern könnte.
Also schaltet der Wassermelder lediglich über einen BC547-Transistor ein kleines Relais, welches wiederum die Hupe über ein separates Netzteil versorgt.
Das funktioniert gut und ist so auch aktuell bei mir installiert, aber so ganz glücklich bin ich mit der Konfiguration noch nicht. - Ein Alarmgeber aus einem Rauchmelder könnte vielleicht eine bessere Lösung sein, sofern sich dieser aus den 5V des USB-Netzteils vom ESP-Modul versorgen lässt.
Mal sehen, ob ich das noch ändere.

Weil das D1 Mini nur wenige I/Os hat, musste ich den Alarmausgang an RX legen. Dieser Pin wird allerdings auch zum Programmieren des Moduls über die Arduino-IDE genutzt. Damit man während des Hochladens des Programms nicht tausende kurze Alarmierungen hat, ist zwischen RX und dem Transistor noch ein Unterbrecherschalter - so kann man den Alarm ggf. auch im Betrieb stummschalten.

Display

Display
OLED-Display
So ein Cypax-Projekt wäre nicht komplett ohne Display. Zudem braucht man ja auch irgendeine Anzeige wie den nun der Status ist; also ob es geklappt hat ins WLAN zu kommen, ob das Benachrichtigen via WhatsApp funktioniert, und so weiter.
Gerade groß genug für den Zweck sind kleine 64x128-Pixel-OLED-Displays mit I2C-Schnittstelle, die man ebenfalls bei eBay günstig bekommen kann und für die es natürlich auch bereits Arduino-Bibliotheken gibt. Und nett leuchten tun sie auch noch.
Da sich der Wassermelder aber den größten Teil seines Lebens wohl ziemlich langweilen wird und es nicht ständig Neuigkeiten anzuzeigen gibt, lasse ich das Programm stündlich den Display-Inhalt komplett invertieren: was vorher geleuchtet hat wird nun schwarz und was vorher schwarz war, leuchtet nun. Das ist nicht gegen Langeweile gedacht, sondern damit ein Einbrennen des Displays vermieden wird (so erhoffe ich mir das wenigstens).

WhatsApp-Benachrichtigung

Jetzt zum spannenden Teil.
Um eine Nachricht an ein Smartphone loszuschicken braucht es zunächst mal eine WLAN-Verbindung. Dank den Arduino-Bibliotheken und zahlreichen Beispielprogrammen war es eine leichte Übung den ESP8266 ins heimische WLAN einzubringen. Ich habe den Code lediglich noch so angepasst, dass regelmäßig geprüft wird, ob die WLAN-Verbindung noch besteht und sie andernfalls wiederhergestellt wird.

Welcher Messaging-Dienst?

Wie kriegt man nun die Info, dass der Keller unter Wasser steht auf's Handy?
Eine Möglichkeit, die keine externen Dienste benötigen würde, wäre einen kleinen Webserver auf dem ESP laufen zu lassen und das Handy frägt dann kontinuierlich diesen ab und gibt einen Alarm ab, wenn Wasseralarm ist. In etwa ähnlich wie ein RSS-Feed. Das wäre allerdings konzeptuell nicht sehr geschmeidig. Besser ist die Verwendung eines Push-Dienstes, d.h. das Handy wird vom ESP im Fall des Falles aktiv informiert.

Messaging-Dienste gibt es viele und ein paar habe ich auch auf meinem Handy. Das von mir am unbeliebtesten WhatsApp ist dabei tatsächlich trotzdem der Service, der bislang immer zuverlässig funktionierte und nicht etwa von meinem Android bei Nichtnutzung schlafen gelegt wird.
Zudem gibt es eine Reihe von kostenlosen Anbietern, die schon mit fertiger API und Arduino-Codebeispielen für den ESP8266 aufwarten, um WhatsApp-Nachrichten zu verschicken (siehe Links unten).
Meine Wahl fiel auf Whatabot - der Code sollte jedoch auch für CallMeBot genauso gut funktionieren.

Das Prinzip ist: man sendet von seinem Handy eine WhatsApp-Nachricht an Whatabot in welcher man das Senden von WhatsApp-Nachrichten an seine Handynummer erlaubt und bekommt als Antwort einen API-Key zu gestellt. Dann ruft man vom ESP8266 aus eine URL mit dem API-Key und der gewünschen Nachricht als Parameter auf und Whatabot wird die Nachricht via WhatsApp auf jenes Handy schicken, mit dem der API-Key generiert wurde.

Somit also wird einem auch die Umsetzung dieses Feature des Wassermelders sehr leicht gemacht.
Zu beachten ist allerdings, dass vom ESP eine gesicherte SSL-Verbindung zum Whatabot-Server hergestellt wird. Im Code wird dazu die WiFiClientSecureAxTLS-Bibliothek eingebunden, welche - Stand Dezember 2023 - zuletzt nur mit Version 2.7.4 des ESP8266-Boardmanagers in der Arduino-IDE funktioniert. Nicht mit höheren Versionen. Ggf. muss man also für dieses Projekt ein Downgrade seines ESP8266-Boardmanagers durchführen.

So ein API-Service im Internet kann natürlich auch mal nicht erreichbar sein, daher habe den Code für meinen Wassermelder so angepasst, dass er bei Nichtversenden der WhatsApp-Nachricht es regelmäßig erneut versucht solange der Alarmzustand anhält.
Zudem wird auch bei Power-On eine WhatsApp-Nachricht verschickt. - So weiß man ob es prinzipiell überhaupt funktioniert ohne dazu erst einen Wasseralarm provozieren zu müssen.

Dokumentation

Der Code ist Doku genug.

Nein, ernsthaft. Das ganze Programm besteht aus weniger als 700 Zeilen wovon ein Großteil erläuternde Kommentare sind. Alle Funktionen sind beschrieben, es gibt eingangs einen Abschnitt von Definitionen / Konstanten, die man für sich spezifisch anpassen muss (WLAN-SSID, WLAN-Passwort, API-Key, ...), einen Abschnitt von Werten die man anpassen kann (Wiederholintervalle im Fehlerfall, Dauer der Alarmaktivierung, ...) und eine ausführliche Beschreibung des generellen Programmablaufs nebst Schaltplan als ASCII-Art.
Man kommt also gut damit klar 😉

Links

APIs: Hilfreiche Quellen:

Lizenz und Hinweise

WhatsApp ist eine Marke der Meta Platform. Ich beziehe keine Gegenleistung von Meta / WhatsApp oder den Anbietern der APIs für dieses Projekt.
Schaltplan und Code des Wassermelders sind trivial; ich stelle es unter Public Domain (CC0).

Download

Download des Arduino-Codes: waterdetector.ino (ca. 18 kB) - Schaltplan ist dort als ASCII-Zeichnung enthalten