HowTo:RaspberryPI mit PiFace: Aufbau eines simplen Wassermelders (Kabelgebunden)

Begonnen von Patrik.S, 08 März 2016, 22:12:28

Vorheriges Thema - Nächstes Thema

Patrik.S

Ich möchte meine Lösung eines Wassermelders auf einem RaspberryPI mit PiFace und wringPI vorstellen.
Es ist nur ein simpler an/aus Schalter und soll auch nur alarmieren, wenn der Keller unter Wasser steht.

Ich hatte zuerst einen Berührungssensor mit Darlington-Schaltung gebaut und wollte ihn schon an einen GPIO Input anklemmen.
Hmm... Wasser ist ja soweit leitend, das sollte auch anders gehen.  ;)

Jetzt ist ein alte Stromkabel mit einem normalen 230V Eurostecker am Ende direkt an der PiFace Erweiterung an einem Input und dessen GND angeschlossen.
Der Eurostecker ist mit einer Schraube sehr knapp über dem Fußboden in der Wand fixiert

Die gefüllte Wasserschüssel hat schonmal gezeigt, dass es klappt. :)

Einige Hürden waren dabei aber zu nehmen, denn ein erster Test der Inputs hat gezeigt, das sie frei schwingen und ein togglen der Zustände zu sehen war.

while (true); do clear; gpio -p readall; sleep 1; done


Zumindest die Pins 200 - 206 wechseln immer kurzzeitig ihren Zustand, obwohl gar nichts angeschlossen ist.
Der Pin 207 blib zumindest immer konstant auf 0

Vom wringPI Entwickler habe ich dann den Tipp bekommen, die internen Pullup Widerstände zu nutzen, um einen stabilen Eingangspegel zu erhalten.
Für den ersten Input Pin 200:
sudo gpio -x mcp23s17:200:0:0 mode 200 tri

Das habe ich der Einfachheit halber direkt vor den Start von FHEM geschrieben.
In diesem Beispiel setzte ich den Mode für alle 8 Inputs, man kann es natürlich auch nur für den oder die benötigten machen.

/etc/init.d/fhem

....
        # PiFace Inputs, den Pullup Widerstand aktivieren um einen stabilen Eingang zu bekommen
        for i in `seq 200 207`; do sudo gpio -x mcp23s17:200:0:0 mode $i tri; done

        # normaler Start
        perl fhem.pl fhem.cfg
....


Danach noch in der FHEM.cfg das PIFACE Modul konfiguriert und einen Dummy erzeugt, um den Zustandswechsel in ein Logfile zu schreiben und natürlich noch eine Email zu versenden, oder eine Sirene einzuschalten über eine der PiFace Outputs.

# RPi GPIO input / output settings
define PiFaceControl PIFACE
attr PiFaceControl defaultState off
attr PiFaceControl pollInterval 10
attr PiFaceControl portMode0 up
attr PiFaceControl room Keller

# readingsProxy um PiFace Input Pin0 als eigenen Parameter zu erhalten
define Wassermelder readingsProxy PiFaceControl:in0
attr Wassermelder getFn 0
attr Wassermelder getList 0:noArg
attr Wassermelder room Keller
attr Wassermelder valueFn ""
attr Wassermelder event-on-change-reading state

define WassermelderDummy at +*00:00:05 { my $sensor= ReadingsVal("Wassermelder","0",0));; fhem("set Wassermelder $sensor")}
define FileLog_Wassermelder FileLog ./log/Wassermelder-%Y.log Wassermelder
attr FileLog_Wassermelder logtype text
....


Edit:
Weil die Inbetriebnahme der DOIF basierten Benachrichtigung echt nicht intuitiv war hier der Codeteil, der den Zustandswechsel sauber erkennt, denn es muss mit meiner vorherigen Definition ein "DOIF ([Wassermelder:"0"])" sein

define di_wassermailer DOIF ([Wassermelder:"0"]) ({(Log 2,"DOIF EventLog Wassermelder=Kontakt"), (exmail('<Ziel-Email-Adresse>','Wasser im Keller!?','Der Wassersensor meldet einen Kontakt! Diese Email kommt jetzt alle 15 Minuten. In Summe 2 Stunden lang'))}) DOELSE ({(Log 2,"DOIF EventLog Wassermelder=kein Kontak mehr"), (exmail('<Ziel-Email-Adresse>','Keller Wassersensor meldet keinen Kontakt mehr!','Entweder der Keller ist jetzt komplett abgesoffen oder es was nur ein Fehlalarm.'))})

attr di_wassermailer state "Wassersensor meldet [Wassermelder:state] (1-keinKontakt/0-Kontakt!)"
# alle 15 Min, wenn Wassermelder == 0 ist, dass ganze begrenzt auf 8 Wiederholungen
attr di_wassermailer repeatcmd 900
attr di_wassermailer repeatsame 8

Wernieman

Eine kleine Anmerkung meinerseits:
Ich hoffe Dein "Wasserfühler" Schukostecker ist nicht mehr als Stromstecker erkennbar. Nicht das ausversehen ..

Ansonsten .. hört sich gut an ;o)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Patrik.S

Natürlich ist mein Eurostecker (kein Schukostecker  ;)) als Eurostecker erkennbar.
Er ist aber mit einem Loch zwischen den zwei Kontakten und einem 5 mm Abstandshalter in einem Dübel an die Wand mit wenigen mm Fußbodenabstand angeschraubt. Keince Change da auch nur irgendwie mit einem Verlängerungskabel 230 Volt ranzukriegen  :P