Das Raspberry Pi als Wassersensor benutzen – E-Mail als Benachrichtung

9 Juni 2015 21 Kommentare Autor: Jürgen (jdo)

Ich brauche einen Wassersensor und zwar einen, der mich bei vorhandenem Wasser informiert. Nun habe ich nach solchen Geräten gesucht und die gibt es auch, allerdings derzeit nicht für mich greifbar. Allerdings kann man das auch mit einem Raspberry Pi realisieren, was meinen Ansprüchen noch besser taugt, da ich mich dann per E-Mail benachrichtigen lassen kann. Seitdem ich das Raspberry Pi 2 habe, liegt Version B eigentlich nur traurig im Schrank – bisher – nun bekommt der ältere Winzling eine sehr wichtige Aufgabe. Wir funktionieren das Gerät zu einem Wassersensor um.

Gleich vorweg möchte ich nehmen, dass die Lösung Wassersensor mit Raspberry Pi nicht viel oder gar nicht teurer ist als kommerzielle Produkte.

Was brauchen wir für das Raspberry Pi als Wassersensor?

Hinweis: Wenn Du etwas am Breadboard oder der GPIO-Schnittstelle änderst, dann ist es ratsam, das Raspberry Pi herunterzufahren und abzustecken. Also ich mache das zumindest, um Schäden an dem Winzling zu vermeiden.

Wie gesagt komme ich nicht an die Teile aus einem Elektroshop und musste einfach suchen. Dann bin ich auf diese kurze Anleitung gestoßen und habe im Prinzip die Schaltung übernommen – den Buzzer und den Kondensator (das fette schwarze Ding auf der rechten Seite und das Ding nach dem violetten Draht) habe ich auch nicht zur Hand, dafür eine LED.

Einwurf: Manchmal ist es wunderbar, wenn man nicht alles bestellen kann oder Dinge nicht greifbar sind – man fängt an, kreativ zu werden … Die oben erwähnte Anleitung hat mir den Schalter im Gehirn umgelegt, dass ich für den Wassersensor an sich eigentlich nur ein leitendes Material brauche, um einen Stromkreis zu schließen.

Raspberry Pi als Wassersensor: Die Schaltung (Quelle: http://fritzing.org)

Raspberry Pi als Wassersensor: Die Schaltung (Quelle: http://fritzing.org)

Logischerweise benötigen wir ein Raspberry Pi und eine SD-Karte mit Raspbian oder einem anderen funktionierendem Linux-System darauf. Dann sind einige Steckbrücken nicht verkehrt und ein bisschen Draht. In dem oben erwähnten Projekt wird selbstklebendes Kupferband verwendet. An das komme ich aber auch nicht und jemand bringt es mir im August mit. Ich habe dafür ein Stück Ethernet-Kabel genommen und das hat ebenfalls funktioniert.

Erst auf dem Breadboard testen

Zunächst habe ich meine zugegeben recht simple Schaltung auf einem Breadboard mit einem Schalter und dann mit Drähten und Wasser getestet. Diese kleinen Komponenten kann man alle einzeln kaufen oder man bestellt sich so ein Starter Kit für das Raspberry Pi / Arduino. Da ist auch alles drin, was man zum Testen benötigt.

Mit drei Drähten, einem Schalter, einem Widerstand und einer LED sieht das Ganze so aus. Der Schalter ersetzt dabei den eigentlichen Sensor.

Das Rasperry Pi als trockener Wassersensor

Das Rasperry Pi als trockener Wassersensor

Was passiert nun, wenn man den Schalter drückt? Der Stromkreis wird geschlossen und die LED leuchtet. Weiterhin wird Strom auf GPIO #18 angelegt, der Zustand ändert sich also auf 1. Das ist wichtig, da wir für den Wassersensor genau diesen GPIO-PIN beobachten.

  • 0 ist Stromkreis unterbrochen -> keine Leitung -> kein Wasser
  • 1 ist Stromkreis geschlossen -> es findet Leitung statt -> Wasser
Schalter gedrückt simuliert, dass Wasser am Sensor ist.

Schalter gedrückt simuliert, dass Wasser am Sensor ist.

Wassersensor: Schalter durch Drähte ersetzt

Versuchen wir das Ganze nun mit Drähten anstelle des Schalters. Ein an den Enden abisoliertes Ethernet-Kabel (ich habe nur zwei von acht Kabeln genommen, das reicht) lässt sich gut in das Breaboard stecken. Das andere Ende ist zunächst nicht verbunden, was uns den Zustand 0 oder unterbrochener Stromkreis beschert. Hmmm – grün und braun waren für das Foto eher nicht ideal – ich hätte wohl rot und blau nehmen sollen – egal jetzt …

Die Drähte ersetzen den Schalter.

Die Drähte ersetzen den Schalter.

Stecke ich nun das andere Ende in ein Glas mit Wasser, fängt die LED zu leuchten an. Das bedeutet für GPIO #18 den Zustand 1 -> Stromkreis geschlossen -> Wasser.

Die Drähte befinden sich nun in einem Glas mit Wasser und schließen den Stromkreis.

Die Drähte befinden sich nun in einem Glas mit Wasser und schließen den Stromkreis.

Update: Das Testkabel war 1,3 Meter lang. Ich habe es nun mit einem Cat 5 Ethernet-Kabel mit zehn Metern probiert, plus die 1,3 Meter noch manuell hingezwirbelt. Also mit einer unsauberen Verbindung nach zehn Metern funktioniert das KOnstrukt mit über elf Metern – die LED leuchtet allerdings nur noch sehr schwach.

Raspberry Pi Wassersensor schickt E-Mail

Der Wassersensor an sich funktioniert und würde uns über die LED benachrichtigen, wann Wasser vorhanden ist oder nicht. Nun möchte ich mich allerdings gerne per E-Mail benachrichtigen lassen, wann die beiden Drähte im Wasser stecken.

Auf der oben erwähnten Seite gibt es ein Python-Skript, das sich water_sensor.py nennt. Das tut alles, was wir wollen und so muss man das Rad nicht neu erfinden. Die Logik dahinter ist klar:

  • Schicke E-Mail mit Sensor ist nass, wenn auf GPIO #18 Zustand 1 erreicht ist
  • Schicke E-Mail mit Sensor ist trocken, wenn auf GPIO #18 Zustand 0 erreicht ist

Gmail-Konto notwendig

Der Erschaffer des Skripts weist darauf hin, dass man ein GMail-Konto braucht, um das Skript verwenden zu können. Das stimmt, wenn man lediglich die Parameter am Anfang modifizieren möchte (Name / Passwort). Es wird aber die smtplib von Python verwendet und wer sich ein bisschen auskennt, kann die Parameter im Skript so modifizieren, dass sich auch ein anderer SMTP-Server verwenden lässt.

Vorsicht!: Das Passwort wird im Klartext in diesem Skript hinterlegt. Am besten wäre es wohl, ein separates E-Mail-Konto für den Wassersensor zu verwenden.

Starten wir also nun das Skript manuell: sudo python water_sensor.py

Ist das Skript richtig eingestellt, dann sieht das so aus (ein Rundgang – trocken -> nass -> trocken) …

Skript für den Wassersensor in Aktion

Skript für den Wassersensor in Aktion

… und bekomme ich nun entsprechend das E-Mail zugesandt.

E-Mail vom Raspberry Pi

E-Mail vom Raspberry Pi

Der Wassersensor ist nass!

Der Wassersensor ist nass!

Persönlich habe ich das Senden von E-Mails deaktiviert, wenn der Sensor wieder trocken wird (email(‚dry‘) wurde auskommentiert mit # – ebenso wurden die Buzzer-Aktionen auskommentiert, brauche ich auch nicht). Mich interessiert nur, wenn er nass ist.

Bei anderen könnte aber das Umgekehrte der Fall sein. Sie wollen möglicherweise eine Nachricht, wenn der Wasserpegel unter einen bestimmten Stand fällt, damit man nachfüllen kann. Gibt es eigentlich schon Bierkrüge, die dem Wirt eine Nachricht schicken, wenn der Bierfüllstand niedrig wird? 🙂

E-Mail nicht sofort schicken

Update: Aus irgendwelchen Gründen schickt mir das Raspberry Pi nach der Installation alle ein bis zwei Stunden eine Nachricht, dass der Sensor nass ist und dann sofort danach, dass er wieder trocken ist. Für wenige Augenblicke muss also GPIO #18 unter Strom stehen und ich weiß (noch) nicht genau, warum.

Nun habe ich den Code umgeschrieben, dass der Stromkreis mindestens einige Sekunden geschlossen sein muss, bevor eine E-Mail geschickt wird. Das kann man sehr einfach mit einem Counter realisieren. Ich definiere also weiter oben water_count = 0 und meine while-Schleife sieht dann so aus:

...
water_count = 0
...
while True:
time.sleep(1)
water_count = 0
if RCtime(18) == 1:
print "Sensor is wet"
# email('wet')
while True:
time.sleep(1)
if RCtime(18) == 1:
print "Sensor is still wet..."
if water_count == 5:
email('wet')
# buzz_on(17)
water_count = water_count + 1
continue
...

Das scheint nun bisher zu funktionieren.

Das Skript für den Wassersensor automatisch starten

Dieses Unterfangen ist sehr einfach und wird im Skript selbst auf Englisch auch beschrieben. Der Vollständigkeit halber erkläre ich es trotzdem.

Editiere dafür die Datei /etc/rc.local und füge vor der Zeile exit 0 das ein: /usr/bin/python /Pfad/zu/Deinem/Skript/water_sensor.py

In meinem Fall steht da drin: /usr/bin/python /home/pi/water_sensor.py

Noch ein paar Hinweise und Tipps für das Raspberry Pi und Raspbian

Ich habe ein ganz normales Raspbian am Laufen. Natürlich läuft für diese Aktion keine grafische Oberfläche, weil das verschwendete Ressourcen sind.

Allerdings habe ich zum Einrichten das Raspberry Pi in die grafische Oberfläche starten lassen, da ich eine WLAN-Karte verwende. Ich muss ja irgendwie ins Netzwerk kommen, sonst kann ich keine E-Mails schreiben lassen. In der grafischen Oberfläche kann man via GUI die WLAN-Karte konfigurieren und die verbindet sich dann auch, wenn das Raspberry Pi ohne GUI startet.

Im Endeffekt konfiguriert mir das grafische Konfigurations-Tool die Datei /etc/wpa_supplicant/wpa_supplicant.conf. Man kann diese natürlich auch via Konsole bearbeiten, aber bevor ich mir das ganze Zeug wieder zusammensuche, starte ich einfach grafisch, konfiguriere das System und deaktiviere X wieder (Stichwort sudo raspi-config).

Da ich das Raspberry Pi im Netzwerk via SSH erreichen möchte, hätte ich zudem gerne, dass es immer die gleiche IP-Adresse hat. Man könnte das nun im System einstellen. Ich habe allerdings meinem DHCP-Server gesagt, dass er der WLAN-Karte mit Mac-Adresse <was auch immer> immer die gleiche IP-Adresse zuweisen soll.

Eine dritte Möglichkeit über die Konsole wäre wicd-curses. Damit muss man die grafische Desktop-Oberfläche nicht bemühen und muss trotzdem nicht alle Parameter im Kopf haben.

wicd-curses: WLAN - Einstellungen

wicd-curses: WLAN – Einstellungen

Im Endeffekt ist es egal, wie man das realisiert. Bei einem Gerät, das headless betrieben wird, ist es nur angenehm, wenn man es immer gleich findet.

Ich habe auf jeden Fall nun meinen Wassersensor und musste keine zusätzlichen Teile bestellen. Außerdem ist das kleine Raspberry Pi B glücklich, wieder einen Sinn im Leben gefunden zu haben …

Nette Pi-Konstellation

Du kannst gerne Deinen Senf zu diesem Beitrag geben: Hier geht es zu den Kommentaren




Schreiben macht durstig! Eine kleine Erfrischung kann daher nie schaden. Wem dieser freie Artikel gefallen hat, der darf mir gerne einen frisch gezapften Hopfen-Tee ausgeben (Paypal - der Spenden-Knopf
oder bitcoin - Adresse: 1NacVNwcLLePUVv8uSafu5Ykdwh8QyDfgK). Ich freue mich über jede noch so kleine Spende. Vielen Dank und Prost!
 Alle Kommentare als Feed abonnieren

21 Kommentare zu “Das Raspberry Pi als Wassersensor benutzen – E-Mail als Benachrichtung”

  1. postlet sagt:

    Das Kurzschließen des Kabels ist eine erschreckend einfache Lösung für ein kompliziert wirkendes Problem. Also alleine dieser Umstand wäre schon den ganzen Artikel wert gewesen =D

    Hast du mal ausprobiert, wie lang das Kabel sein kann, das du als Sensor verwendest? Oder anders gefragt, mit welcher Kabelänge arbeitest du in diesem Fall?

    Ich hätte da tatsächlich auch einen Anwendungsfall, müsste aber den Pi aber wegen den "Umweltbedingungen" mit einigen Metern Entfernung montieren.

    • jdo sagt:

      Ja, das dachte ich mir auch ... "Kabel kurzschließen!" - das ist es! ...

      Das Ethernet-Kabel für den Test war 1,3 Meter lang - ich brauche aber auch 6-7 Meter Entfernung, weil der Sensor außen sein, das RasPi aber im Haus stehen soll. Ich muss das längere Kabel heute Nachmittag noch kaufen und sage dann Bescheid.

      Ich gehe aber davon aus, dass es funktioniert, weil ein Ethernet-Kabel (ich komme nur an Cat 5) sehr wenig Widerstand hat.

    • jdo sagt:

      Ich musste das nun wissen und habe mir zehn Meter Cat 5 Ethernet-Kabel gekauft. Daran habe ich die 1,3 Meter altes Kabel noch angeflanscht (zusammengedreht eben) - es funktioniert immer noch mit über elf Metern. Die rote LED leuchtet allerdings nur noch recht schwach - was mir egal ist, Hauptsache GPIO #18 wird auf 1 gesetzt. Habe das im Artikel selbst auch noch nachgetragen.

  2. postlet sagt:

    Danke für das Testen der Kabellänge! Das sollte dann auch in meiner Umgebung funktionieren.

    Ich bin in Elektrotechnik nicht besonders fit, aber vermutlich ließe sich das schwache Leuchten der LED wohl kompensieren, wenn man den Vorwiderstand etwas reduziert. Für eine halbwegs handfeste Berechnung brauche ich aber wahrscheinlich länger als für das Umsetzen deiner Anleitung =D

    • jdo sagt:

      Das RasPi steht momentan an einer Stelle, an der ich die LED sowieso nicht sehe. Vielleicht werfe ich sie raus und schließe passive Lautsprecher an - wie ein Klingelton würde ich dann bei Wasser ein mp3 abspielen lassen oder so - das ginge mit mpg123 ... Ich bastle, tüftle und optimiere noch 🙂

  3. […] Direkt gebastelt wird derzeit gar nicht – meinen Wassersensor Raspberry Pi werde ich demnächst etwas schicker machen. Ich mache mir aber im Moment Gedanken, wie man mit dem […]

  4. Danny sagt:

    Moin, Danke für die Anleitung, das wird mich bald ruhiger schlafen lassen bzgl. unseres 🙂 Eine Frage, wenn man die LED nicht benötigt, kann man diese weglassen - klaro.
    Benötigt man den Widerstand zwischen + und - zwingend oder kann man diesen auch weglassen, dann wäre der Kreislauf ja komplett kurzgeschlossen (mir war so aus Physik, dass kein Verbraucher nicht gut ist). Gruß Danny

    • jdo sagt:

      Ich bin da auch kein Experte, habe es aber auch so in Erinnerung, dass gar kein Verbraucher nicht gut ist. Schaden tut der Widerstand wohl auf keinen Fall.

  5. Danny sagt:

    Wort vergessen: ... ruhiger schlafen lassen bzgl. unseres Drainagenschachtes/Tauchpumpe

  6. Mike sagt:

    Hallo Jürgen,

    Kannst du mir bitte dein script zur verfügung stellen mit deiner Änderung, ich hatte das jetzt selber versucht zu ändern nach deinen angaben aber leider bekomme ich das nicht hin. Würde mich freuen.

    Gruß Mike

    • jdo sagt:

      Klar, kann ich machen - Benutzung auf eigene Gefahr ... 😉 klick für Download

      P.S: Anstatt zu löschen kommentiere ich lieber aus. Somit sieht das möglicherweise etwas chaotisch aus - aufräumen musst Du selbst ... außerdem habe ich die Wartezeit auf 30 Sekunden erhöht und die Schleife wiederholt sich dafür nur ein mal ... aber die beiden Zahlen kannst Du einfach anpassen.

  7. Mike sagt:

    Klasse, Danke für deine Bemühungen.
    Wünsche frohe Feiertage und einen guten Rutsch.

  8. Dane sagt:

    Hallo Leute,
    erstmal vielen Dank für diesen Post mega coole Sache.
    ich habe mal eine Frage, bin Anfänger was python angeht.
    Ich habe den Python script 1 zu 1 übernommen und es funktioniert nur ich habe das gleiche Problem wie du, ich bekomme jede sec. ein mail wet, dry wie genau hast du denn den Count gesetzt so sieht das Original aus. Vor was muss ich den water_count = 0 setzen?
    Kann mir da jemand weiter helfen?

    while True:
    time.sleep(1) # check for wetness every second
    if RCtime(18) == 1:
    buzz_on(17)
    print "Sensor is wet"
    email('wet')
    print "Waiting for dryness..."
    while True:
    time.sleep(1) # check for dryness every second
    if RCtime(18) == 0:
    buzz_off(17)
    print "Sensor is dry again"
    email('dry')
    print "Waiting for wetness..."
    break

    • jdo sagt:

      Es sollte eigentlich funktionieren. Nur mal ein Schuss ins Blaue - was für eine Stromversorgung verwendest Du für das Pi? Wenn die zu schwach ist, dann könnte das so eine Schwankung auslösen?

      Und schau Dir mal mein Skript in dem Beitrag noch mal an - das ist anders als das Original und da wird bis 5 gezählt, bevor der Alarm ausgelöst wird.

      Das water_count = 0 setzt Du irgendwo vor die while-Schleife. Wo ist egal - damit definierst Du lediglich einen Parameter.

  9. Dane sagt:

    Das mit dem Netzteil muss ich nochmal prüfen danke für den Hint.
    habe das script so angepasst also nur unten:
    #!/usr/bin/python

    #########
    # About #
    #########

    # This script uses a Raspberry Pi to sense for the presense or absense of water.
    # If there is water, an email is sent and a buzzer goes off.
    # When it's dry again, another email is sent, and the buzzer turns off.

    # To run this script at boot, edit /etc/rc.local to include (no quotes) 'sudo python .py'
    # Schematic here: http://fritzing.org/projects/raspberry-pi-water-sensor/

    ###########
    # License #
    ###########
    # Released under the WTFPL.
    #Full text and more information here: http://en.wikipedia.org/wiki/WTFPL

    ########################################
    # Gmail login credentials to send email#
    ########################################

    username = 'exampleusername' #you don't need the "@gmail.com" bit.
    password = 'examplepassword'

    ############################
    # General Email Parameters #
    ############################

    From = "senderaddress@domain.com"
    To = "recipientaddress#domain.com"

    #######################################
    # Email Parameters when sensor is Wet #
    #######################################

    Subject_wet = "RPi Water Sensor is WET"
    Body_wet = "Your water sensor is wet."

    #######################################
    # Email Parameters when semsor is Dry #
    #######################################

    Subject_dry = "RPi Water Sensor is DRY"
    Body_dry = " Your water sensor is dry again!"

    import smtplib
    from email.mime.text import MIMEText
    import RPi.GPIO as GPIO
    import string
    import time

    # Function Definitions

    #takes either "wet" or "dry" as the condition.
    def email(condition):
    print "Attempting to send email"
    if condition == 'wet':
    Body = string.join((
    "From: %s" % From,
    "To: %s" % To,
    "Subject: %s" % Subject_wet,
    "",
    Body_wet,
    ), "\r\n")
    if condition == 'dry':
    Body = string.join((
    "From: %s" % From,
    "To: %s" % To,
    "Subject: %s" % Subject_dry,
    "",
    Body_dry,
    ), "\r\n")

    # The actual mail send
    server = smtplib.SMTP('smtp.gmail.com:587')
    server.starttls()
    print "Logging in..."
    server.login(username,password)
    print "Logged in as "+username+"."
    server.sendmail(From, [To], Body)
    server.quit()
    print "Email sent."

    #Tests whether wter is present.
    # returns 0 for dry
    # returns 1 for wet
    # tested to work on pin 18
    def RCtime (RCpin):
    reading = 0
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(RCpin, GPIO.OUT)
    GPIO.output(RCpin, GPIO.LOW)
    time.sleep(0.1)
    GPIO.setup(RCpin, GPIO.IN)
    # This takes about 1 millisecond per loop cycle
    while True:
    if (GPIO.input(RCpin) == GPIO.LOW):
    reading += 1
    if reading >= 1000:
    return 0
    if (GPIO.input(RCpin) != GPIO.LOW):
    return 1

    # Turns on the piezo buzzer
    # tested to work on pin 17
    def buzz_on (pin):

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, GPIO.HIGH)

    # Turns off the piezo buzzer
    # tested to work on pin 17
    def buzz_off(pin):

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, GPIO.LOW)

    # Main Loop

    water_count = 0

    while True:
    time.sleep(1)
    water_count = 0
    if RCtime(18) == 1:
    print "Sensor is wet"
    # email('wet')
    while True:
    time.sleep(1)
    if RCtime(18) == 1:
    print "Sensor is still wet..."
    if water_count == 5:
    email('wet')
    # buzz_on(17)
    water_count = water_count + 1
    continue
    ...
    while True:
    time.sleep(1) # check for dryness every second
    if RCtime(18) == 0:
    buzz_off(17)
    print "Sensor is dry again"
    email('dry')
    print "Waiting for wetness..."
    break

    da bekomme ich bei meinen raspy immer diese Fehlermeldung.
    pi@raspberrypi:/usr/bin $ sudo python python.py
    File "python.py", line 139
    email('wet')
    ^
    wenn ich das script nicht veränder wir es auch gestartet vielleicht habe ich irgenwo ein Fehler eher wahrscheinlich. ;.)

  10. Dane sagt:

    ok super, heute Abend teste ich es, danke in voraus
    und schönes Wochenende.

  11. Tom sagt:

    Bei mir steht durchgehend Attempting to send email
    und dann passiert nichts mehr

  12. Tom sagt:

    Ich wollte mal fragen ob es vlt. möglich wäre den script so zu ändern das er sagt "NASS" wenn der Stromkreißlauf geöffnet wird anstatt geschlossen wird. Und wenn wie geht das ?
    MFG . TOM

    PS: Ich benutze den Script übrigens für eine Alarmanlage deswegen muss es funktionieren wenn der Stromkreis geöffnet ist. Danke im Voraus !

    • jdo sagt:

      Auch ein interessanter Anwendungsfall ...

      Die Zeile if RCtime(18) == 1: überprüft im Prinzip, ob Strom fließt oder nicht. if RCtime(18) == 0: wäre dann praktisch der andere Fall oder wenn kein Strom fließt, ... oder wenn Stromkreis unterbrochen

Antworten