Erstes Projekt - Wassersensor

Begonnen von bismosa, 07 August 2017, 08:29:17

Vorheriges Thema - Nächstes Thema

bismosa

#15
Um nochmal auf meine Probleme zu kommen:
Ich habe es jetzt nicht mit einem DOIF sondern mit dem Notify so gelöst (hier war ich gerade dabei...und wollte das erst einmal zu Ende testen:
[s]Wassermelder_Heizung:Alarm
{
my $temp=ReadingsVal("Wassermelder_Heizung", "battery","");
my $tempV=ReadingsVal("Wassermelder_Heizung", "batt","");
my $temp2=ReadingsVal("Wassermelder_Heizung", "RSSI","");
my $tempMail=ReadingsVal("Wassermelder_Heizung", "Mail", "");
if ($tempMail ne "gesendet"){
     fhem("setreading Wassermelder_Heizung Mail gesendet");
     fhem("define at.Wassermelder_Heizung.off at +01:30:00 setreading Wassermelder_Heizung Mail -");
     DebianMail("ich\@jemand.de","Wassereimer in der Heizung leeren!","Bitte den Wassereinmer in der Heizung leeren!\n"."Batterie: ".$tempV." V (min.2,4V!)\n"."Batteriestatus: ".$temp."\n"."RSSI: ".$temp2);
      }
}[/s]

Ich lege also ein Reading  an "Mail gesendet". Nach 1,5h wird dieses Reading auf "-" gesetzt. Somit wird nur alle 1,5h eine Mail gesendet.
Ich denke, das ist nicht die "feine" Art. Auf jeden Fall eine sehr komplizierte Lösung.
Daher habe ich mir DOIF jetzt mal genauer angesehen. Es will aber nicht:
defmod di_Wassermelder_Heizung DOIF ([Wassermelder_Heizung:Alarm]) \
({\
my $temp=ReadingsVal("Wassermelder_Heizung", "battery","");;\
my $tempV=ReadingsVal("Wassermelder_Heizung", "batt","");;\
my $temp2=ReadingsVal("Wassermelder_Heizung", "RSSI","");;\
DebianMail("ich\@jemand.de","DOIF Wassereimer in der Heizung leeren!","Bitte den Wassereinmer in der Heizung leeren!\n"."Batterie: ".$tempV." V (min.2,4V!)\n"."Batteriestatus: ".$temp."\n"."RSSI: ".$temp2);;\
})
attr di_Wassermelder_Heizung cmdpause 20
attr di_Wassermelder_Heizung do always


Es taucht zwar ein Reading auf, aber eine Mail wird nie gesendet. Die 20sek. habe ich erstmal nur zum Testen drin.
Habe ich hier etwas übersehen?

Gruß
Bismosa


[/s]
Bitte wieder vergessen. Ich habe endlich meinen Fehler gefunden! Es muss so geschrieben werden:
defmod di_Wassermelder_Heizung DOIF ([Wassermelder_Heizung:"Alarm"]) \

Also "Alarm" in "

Ja...es macht vielleicht den Eindruck "Fragen ist leichter als Denken". Aber ich habe jetzt mehrere Stunden mit frustrierender Suche verbracht....

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Amenophis86

Du hättest auch mit ([Device] eq "Status") arbeiten können. Wobei Status immer der Status des Readings state ist. Willst du auf ein anderes Reading lauschen musst du [Device:Reading] eq "Status" nehmen. Eq wird bei Zahlen durch == ersetzt.

Bezüglich meines Problems, werde ich das Morgen mal testen. Danke für die Info.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

bismosa

Hallo,

ich denke ich habe nun alles. Falls es jemanden interessiert, hier nochmal alles was ich nun gemacht habe:

Zusammenfassung:
Sehr günstige Wassermelder auf Basis eines ESP8266. Die Idee stammt von http://esp8266-server.de/Wassermelder.html .
Es geht hier um die Version mit dem ESP-07/ESP-12 (klappt aber auch wunderbar auf dem ESP-03. Nicht vergessen die Brücke GPIO16/Reset zu löten)
Der ESP ist so lange aus, wie noch kein Wasser am Sensor ankommt. Sobald Wasser detektiert wird, wird alle 15Min. eine URL aufgerufen, bis der "Schaden" beseitigt ist. Also der Sensor wieder trocken ist.

Ich nutze zwei Versionen:
1.) Unsere Heizung lässt beim erzeugen von Warmwasser gerne Wasser ab. Der Eimer muss ca. 1x pro Woche geleert werden. Hier soll
- sobald die erste Meldung kommt, eine Erinnerungs- Mail verschickt werden
- erst wieder nach 2h an den Eimer erinnert werden (nicht im 15Min. takt vom ESP)
- die Batteriespannung überwacht werden
- wenn die Batterie den Status "low" hat, eine Erinnerung zum Prüfen des Melders alle 2 Wochen versendet werden. Sonst alle 4 Wochen. Die Erinnerung täglich, bis der Melder überprüft worden ist.

2.) Normaler Wassermelder:
Wie 1.) jedoch:
- Alle 15Min. eine Erinnerung abfeuern. Es steht ja schließlich etwas unter Wasser


A.) Vorbereiten der ESP-Module
Da wir nicht mit PushingBox sondern in FHEM arbeiten muss im Programm für den ESP die URL-Verarbeitung angepasst werden:
aus
  url = url + "UBatt=" + Ubatt;      //Parameter Bat Spannung
  url = url + "&Empfang=" + String(rssi); //Parameter Signalstärke
  url = url + "&Nachricht=" + urlencode(nachricht);

wird
url = url + "fhem?cmd=setreading%20" + urlencode(nachricht) + "%20batt%20" + Ubatt + "%3bsetreading%20" + urlencode(nachricht) + "%20RSSI%20" + String(rssi) + "%3bset%20" + urlencode(nachricht) + "%20Alarm&XHR=1"; 
Nun muss in der Konfiguration (siehe angegebene Seite RX-TX + Wassersensor kurzschließen) die URL nur "http://meinserver:8083/" angeggeben werden.
Bei der Nachricht kommt der DeviceName rein.

Der ESP ruft nun diese Url auf:
http://server:8083/fhem?cmd=set%20Wassermelder_Heizung%20Alarm%3bsetreading%20Wassermelder_Heizung%20batt%2003.0%3bsetreading%20Wassermelder_Heizung%20RSSI%20-80&XHR=1
Es wird also der Alarm ausgelöst und die Readings batt + RSSI übergeben


B.) Einrichtung in FHEM (Verbesserungsvorschläge sind immer willkommen. Ist mein erstes Projekt!)
Dummy Device anlegen. Muss für jeden Melder erfolgen. (RAW Definition):
defmod Wassermelder_Heizung dummy

attr Wassermelder_Heizung devStateIcon Alarm::Alarm
attr Wassermelder_Heizung group Wassermelder
attr Wassermelder_Heizung room Heizung
attr Wassermelder_Heizung userReadings battery { return "ok" if ( ReadingsVal("Wassermelder_Heizung", "batt","") > 2.8 );;;; return "low" \
#siehe https://wiki.fhem.de/wiki/Batterie%C3%BCberwachung\
}
attr Wassermelder_Heizung webCmd :

Hier wird auch gleich ein userReading battery erzeugt. (Siehe https://wiki.fhem.de/wiki/Batterie%C3%BCberwachung)
Die Batteriespannung wird in das Reading "batt" übertragen. Somit kann mit "battery" der Status angezeigt werden.

E-Mail bei Alarm
Neu habe ich jetzt ein Notify (danke für den Tipp!) eingerichtet:
Für Variante 1:
defmod di_Wassermelder_Heizung DOIF ([Wassermelder_Heizung:"Alarm"]) \
({\
my $temp=ReadingsVal("Wassermelder_Heizung", "battery","");;\
my $tempV=ReadingsVal("Wassermelder_Heizung", "batt","");;\
my $temp2=ReadingsVal("Wassermelder_Heizung", "RSSI","");;\
DebianMail("ich\@jemand.de","DOIF Wassereimer in der Heizung leeren!","Bitte den Wassereinmer in der Heizung leeren!\n"."Batterie: ".$tempV." V (min.2,4V!)\n"."Batteriestatus: ".$temp."\n"."RSSI: ".$temp2);;\
})
attr di_Wassermelder_Heizung cmdpause 5400
attr di_Wassermelder_Heizung do always
attr di_Wassermelder_Heizung group Wassermelder
attr di_Wassermelder_Heizung room Heizung


Für Variante 2:
defmod di_Wassermelder_Keller DOIF ([Wassermelder_Keller:"Alarm"]) \
({\
my $temp=ReadingsVal("Wassermelder_Keller", "battery","");;\
my $tempV=ReadingsVal("Wassermelder_Keller", "batt","");;\
my $temp2=ReadingsVal("Wassermelder_Keller", "RSSI","");;\
DebianMail("ich\@jemand.de","Im Keller ist Wasser ausgelaufen!","ACHTUNG! Im Keller ist Wasser ausgelaufen! Sofort beheben!\n"."Batterie: ".$tempV." V (min.2,4V!)\n"."Batteriestatus: ".$temp."\n"."RSSI: ".$temp2);;\
})
attr di_Wassermelder_Keller do always
attr di_Wassermelder_Keller group Wassermelder
attr di_Wassermelder_Keller room Heizung


Unterschied ist neben dem Text für die Mail die cmdpause von 5400sek. = 1,5h. Somit bekomme ich nicht zu häufig Mails. Bestimmt werde ich mir die Zeit später nochmal anpassen.

Readings loggen (Hier können alle in eine Datei...):
define log_Wassermelder FileLog ./log/wassermelder.log Wassermelder_.*

Plot erstellen
Das lasse ich jetzt hier mal weg...die muss ich eh noch etwas aufhübschen :)

Batteriestatus
Zunächst habe ich diesen nach der Anleitung ( https://wiki.fhem.de/wiki/ReadingsGroup#Auswahl_.C3.BCber_Reading-Namen.2C_Status_als_Symbol_dargestellt) erstellt. Also
define rg_battery readingsGroup .*:battery
attr rg_battery alias Batteriestatus
attr rg_battery valueIcon {'battery.ok' => 'batterie', 'battery.low' => 'batterie@red'}


Notify dafür (https://wiki.fhem.de/wiki/Batterie%C3%BCberwachung):
define n_batt_chk notify .*:[Bb]attery.* {}
(Ich habe keine Ahnung, wie ich das sonst aus den Beispielen bei mehreren Zeilen übernehmen soll)
DEF
.*:[Bb]attery.*
{
  if ($EVENT !~ m/ok/)
  {
   {
     my $spannung=ReadingsVal($NAME, "batt",""); #Anzeige der letzten Batteriespannung
     if ($EVENT =~ m/unknown/)
     {
       DebianMail("ich\@jemand.de","FHEM Geräteprüfung $NAME","Bitte den Wassermelder auslösen und prüfen!\n"."Batterie: ".$NAME.": ".$EVENT." \n\nLetzte Batteriespannung: ".$spannung." V");
     } else {
       DebianMail("ich\@jemand.de","FHEM Batteriewarnung $EVENT","ACHTUNG! Batterie ist leer!\n"."Batterie: ".$NAME.": ".$EVENT."\nBatteriespannung: ".$spannung." V");
     }
     
   };;
   Log 3, "$NAME : Batteriewarnung $EVENT";;
   }
}

Hier habe ich das Beispiel gleich erweitert. Sobald Batteriestatus "unknown", wird eine andere Mail generiert als bei einerleerer Batterie.
Daher müssen wir den Status "unknown" noch setzen. Dafür eignet sich wohl sehr gut ein "at"

define chk_WassermelderBatt at *18:00:00 {}
DEF
*18:00:00 {
my @names = ("Wassermelder_Keller","Wassermelder_Heizung","Wassermelder_Kueche","Wassermelder_Waschmaschine");
my $name;
foreach my $name (@names) {
     my $status=ReadingsVal($name, "battery",""); #low oder ok
     if ($status eq "ok"){                     #Bei ok nur alle 4 Wochen = 24h*28Tage = 672h
        if (check_if_alive($name, 1) != 1) { #2=Error, 0 = Zu lange, 1 = ok
           fhem ("setreading ".$name." battery unknown");
        }
     } else {                                  #sonst alle 2 Wochen = 24h*56Tage = 1344h
        if (check_if_alive($name, 1) != 1) { #2=Error, 0 = Zu lange, 1 = ok
           fhem ("setreading ".$name." battery unknown");
        }     
     }
}
}

Somit wird jeden Tag um 18Uhr geprüft, wie lange die Wassermelder nichts mehr gemeldet haben. Ist die Batterie eh schon auf dem Status "low", muss alle 2Wochen geprüft werden. Sonst alle 4 Wochen.
Ist die Zeit um, wird der Status auf "Unknown" gesetzt. Dadurch wird in der Batterieüberwachung (n_batt_chk notify) eine Mail geschickt.

Ich hoffe, das nun alles so klappt und nicht mehr zu viele Fehler eingebaut sind.

Gruß
Bismosa




1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Amenophis86

Zitat von: bismosa am 12 August 2017, 17:48:42
A.) Vorbereiten der ESP-Module
Da wir nicht mit PushingBox sondern in FHEM arbeiten muss im Programm für den ESP die URL-Verarbeitung angepasst werden:
aus
  url = url + "UBatt=" + Ubatt;      //Parameter Bat Spannung
  url = url + "&Empfang=" + String(rssi); //Parameter Signalstärke
  url = url + "&Nachricht=" + urlencode(nachricht);

wird
url = url + "fhem?cmd=setreading%20" + urlencode(nachricht) + "%20batt%20" + Ubatt + "%3bsetreading%20" + urlencode(nachricht) + "%20RSSI%20" + String(rssi) + "%3bset%20" + urlencode(nachricht) + "%20Alarm&XHR=1"; 

Öffnest du hierzu die wassermelder.ino.generic.bin Datei und änderst es dort? Wenn ja, mit was öffnest du die Datei? Mit Arduino IDE klappt es nicht, wirft mir einen Fehler aus.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

bismosa

Hallo,

nein. Der Quellcode ist frei verfügbar unter Download Project. (Unbedingt das im Abschnitt ESP-07 nehmen). Dort ist dann auch die ino Datei vorhanden, die einfach mit der Arduino IDE geöffnet werden kann.

Viel Glück!
Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Amenophis86

Habe aber nur einen ESP-01, daher ist die Frage, ob ich den -07 Sketch nehmen kann. Werde es mir mal ansehen. Danke für die Info.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

bismosa

Ne. Mit dem ESP-01 geht der Deep-Sleep nicht.
Ich glaube da gab es aber auch Mal irgendeine Möglichkeit eine Brücke zu löten. Bin mir da aber nicht ganz sicher...
Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Amenophis86

Der Deepsleep wird aber nur genutzt, solange der Kontakt besteht. Dh wenn er zeitnah aus dem Wasser genommen wird, dann schaltet er sich ja eh aus. Mal sehen was ich mache. Danke
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Amenophis86

Habe es heute mal auf den ESP-01 aufgespielt mit deiner Änderung und es funktioniert soweit. Was die Batterie macht muss ich erst mal testen. Noch eine Vorschlag für eine Änderung:

Zitatattr Wassermelder_Heizung userReadings battery { return "ok" if ( ReadingsVal("Wassermelder_Heizung", "batt","") > 2.8 );;;; return "low" \
Mach aus ReadingsVal ein  ReadingsNum, dann wird nur der Wert genommen und das V ignoriert. Dadurch gibt es auch keine Fehler im Log, dass ein nummerischer Wert erwartet wird.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

bismosa

Hallo,

danke für den Verbesserungsvorschlag. Das hatte ich schon umgesetzt, indem ich die Zeile im ESP Programm geändert habe:
String Ubatt = String(ADCfloat, 2); // + "V";

Sorry. Das hatte ich vergessen mit reinzuschreiben.

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Nitaro

Guten Morgen zusammen,

ich versuche das gerade nachzubauen, habe aber erhebliche Probleme mit dem ESP. Vielleicht kann mir jemand helfen, ich kenne mich mit den ESPs nicht so gut aus.

Mein erster Versuch war mit einem ESP-12e. Dieser ging in Deep-Sleep (RST -> GPIO16 verbunden), wachte aber nicht bei CH_PD -> VCC auf. Auch nicht mit Widerständen. Er reagierte nur auf CH_PD -> Ground mit einem Neustart, meldete sich bei Fhem und ging wieder in den Deep Sleep (Anzeige im Seriellen Monitor).

Dann habe ich einen ESP-07 versucht. Dieser geht trotz RST -> GPIO16 aber nicht in den Deep-Sleep. Nach dem Starten meldet er an FHEM und sagt dann im seriellen Monitor nur "Closing Connection", die rote LED bleibt an. Auch dieser reagiert nicht auf CH_PD -> VCC sondern macht auch nur einen Restart bei CH_PD -> Ground.

Ich verstehe die Welt hier irgendwie nicht. Ich habe es auch mit dem ESP-07, ESPtool und der Original Bin-Datei des Erschaffers versucht. Der 07 sagt nur "Clothing Connection".

Gibt es da noch irgendeinen Trick oder habe ich etwas übersehen ?




Prof. Dr. Peter Henning

Erstens frage ich mich, warum man als Neuling mit einem Gerät beginnt, mit dem man sich nicht auskennt. Da sollte man doch erst einmal die Arduino-IDE verstehen lernen und mit einfacheren Dingen herumspielen.

ZitatDer 07 sagt nur "Clothing Connection"
Kann ich nicht glauben...

LG

pah

Nitaro

Zitat von: Prof. Dr. Peter Henning am 12 Mai 2018, 12:30:06
Erstens frage ich mich, warum man als Neuling mit einem Gerät beginnt, mit dem man sich nicht auskennt.
Das machen Menschen in der Regel dann, wenn sie etwas lernen wollen. Auskennen kann man sich ja erst, wenn man sich damit beschäftigt hat.
Sollte jemanden mit akademischen Hintergrund geläufig sein.

Zitat von: Prof. Dr. Peter Henning am 12 Mai 2018, 12:30:06
Da sollte man doch erst einmal die Arduino-IDE verstehen lernen und mit einfacheren Dingen herumspielen.
Ich hatte nicht gesagt das ich unwissend bin, ich sagte lediglich dass ich mich mit den ESP´s nicht so gut auskenne.

Zitat von: Prof. Dr. Peter Henning am 12 Mai 2018, 12:30:06
Kann ich nicht glauben...

Kein Problem, ich helfe gerne. Das ist die Rückmeldung des HTTP aufrufes welcher im Sketch definiert ist.
Zu finden in der Debug Ausgabe im seriellen Monitor nach Start des ESPs. Hier sollte der ESP dann in den Deep
Sleep gehen, was er aber nicht macht.



Prof. Dr. Peter Henning

#28
Verzeihung, ich bekenne mich eines gewissen Sarkasmus schuldig - aber  "Clothing" -
ZitatDas ist die Rückmeldung
?

Im Übrigen halte ich die Idee dieses Wassermelders für etwas daneben. Weil keine Abfrage des Batteriezustandes erfolgt (auch keine zyklische Mitteilung), kann man den Zustand "trocken" nicht vom Zustand "nass, aber Batterie leer" unterscheiden. Das ist bei einem sicherheitskritischen System nicht sehr schlau. Aber gut, muss jeder selbst wissen.

Zum eigentlichen Thema der Frage: Kann es sein, dass vorher schon CH_PD auf High war, z.B. weil der Eingang offen geblieben ist ?

LG

pah



HubertM

Was ist daran ,,daneben"??
Ein ESP12F mit ESPEasy, versorgt mit Batterie oder Solarpanel und Akku, Devices für Switch Inputs (Wassersensor), ADC für Batteriespannung und Beliebiges einrichten, Deep Sleep Mode verdrahten und aktivieren. Das Teil sendet zuverlässig und regelmäßig die Daten an Fhem und kann nach Auswertung sehr gut zwischen ,,nass", ,,trocken" und ,,Batterie leer" unterscheiden.