Hallo zusammen,
ich bin blutiger Anfänger in FHEM. Ich habe gestern FHEM auf meinem Raspberry Installiert und fange jetzt meine ersten Projekte an. Daher bitte ich um Nachsicht, wenn ich einges noch durcheinander bekomme.
Ich habe mehrer Wassersensoren auf Basis eines ESP8266 laufen. Eigentlich sehr simpel: Sobald Wasser an den Kontakten anliegt, wird der CH_PD Eingang auf High gesetzt, der ESP startet und ruft eine URL (derzeit noch über Pushingbox) auf. Danach legt er sich für 15Min. schlafen und meldet den Wassereinbruch erneut, wenn das Problem nicht mittlerweile behoben wurde. (Das Projekt ist hier zu finden: http://esp8266-server.de/Wassermelder.html (http://esp8266-server.de/Wassermelder.html) )
Gleichzeitig wird über die URL die aktuelle Batteriespannung und der RSSI-Wert mitgegeben. Also ungefähr so:
http://URL/UBatt=3.1V&Empfang=-70&Nachricht=Wasseralarm Keller
Nun wäre es doch toll, wenn ich das ganze zum Üben in FHEM umsetzen würde. Ich stelle es mir so vor, das ich statt der Pushingbox-Adresse eine Adresse vom FHEM aufrufe. Für mich wäre dabei wichtig:
1.) Bei Meldung eine Benachrichtigung per Mail
2.) Alarmmeldung auf meinen Squeezeboxen
3.) Loggen der Alarme (wie oft muss ich den Wassereimer an der Heizung ausleeren)
4.) Loggen der Batteriespannung mit Plot (Dann sieht man schön, wann man die Batterien wechseln muss)
5.) Loggen der RSSI-Werte
Nun ist natürlich das Problem, das ich keine Ahnung habe, an welcher Stelle ich nun anfangen soll. Je mehr ich in der Dokumentation wühle und andere Beiträge lese, desto verwirrter werde ich.
Könnt ihr mir hier ein bisschen Starthilfe geben? Wo fange ich am beten an? Wie kann ich auf eine URL in FHEM einrichten, bei der Werte übergeben werden?
Vielen Dank!
Gruß
Bismosa
Schau dir doch mal das KeyValueProtocol in FHEM an. Damit kann man einfach Nachrichten als Broadcast senden ohne die genaue IP vom FHEM und co zu kennen.
Ich schicke darüber erkannte IR Signale von einem Gateway an FHEM.
Den Rest kannst du dann mit FHEM Mitteln umsetzen.
Hallo,
danke für die Antwort. Aber ich glaube das führt ebenfalls nicht in die gewünschte Richtung.
Wäre es nicht irgendwie machbar per UDP oder einfach per POST an eine URL (Sorry...neuland für mich) Daten an FHEM zu übermitteln?
Bin gerade ein wenig am verzweifeln...hatte nicht damit gerechnet, das es so schwierig ist den Anfang zu bekommen...
Gruß
Bismosa
das geht. Zweites FHEMWeb device, csrf token ausschalten, allowed nur für den zu beschreibenden dummy freigeben und diese mittels der url bestücken. Wie genau findest du, wenn du entsprechenden Begriffe in der commandref nachliest.
du kannst auch einfach statt der jetzigen url die fhem url nehem und darüber einem dummy werte setzen
http://ipOderNameDesDerversrv00:8083/fhem?cmd.dummyWassermelder1=set%20dummyWassermelder1%20alarm
http://ipOderNameDesDerversrv00:8083/ffhem?cmd=setreading%20dummyWassermelder1%20battery%202.4
auf den dummy setzt du dann ein notify welches zb eine pushnachricht oder eine mail sendet. loggen kannst du damit auch und entsprechend dann auch plotteb. einfacher gehts kaum.
per telnet würde auch gehen wenn du das auf dem esp hinbekommst
Hallo!
Danke! Genau danach habe ich gesucht. Ich bin noch dran, wie ich es jetzt am besten umsetzen kann...ist halt alles erstmal neu :)
Ich habe bereits ein Dummy-Device angelegt und habe auch erst einmal den csrfToken deaktiviert. Darum muss ich mich dann später nochmal kümmern.
Gibt es zum URL-Layout keine Wiki-Seite? Habe ich die vielleicht nur nicht gefunden?
Ich suche jetzt nach einer Möglichkeit, sowohl die readings als auch den set-Befehl in nur einem Aufruf unterzubringen. Geht das irgendwie?
Ich versuche es gerade so:
http://server:8083/fhem?cmd=setreading%20Wassermelder%20battery%2019.2&cmd.Wassermelder=set%20Wassermelder%20on&XHR=1
Hier wird aber immer nur der letzte Befehl (also hier set on) ausgeführt. Der erste Befehl wird nicht verarbeitet?
Danke!
Gruß
Bismosa
Wie in der Kommandozeile arbeiten und nicht mit &cmd. Siehe zB diesen Post: https://forum.fhem.de/index.php/topic,75164.msg669480.html welche die Suche sicher schnell gefunden hätte ;)
Hallo,
Zitat von: Amenophis86 am 08 August 2017, 17:49:19
...welche die Suche sicher schnell gefunden hätte ;)
Nö. Leider hatte die Suche das nicht ergeben! Der Beitrag wurde erst nach meinem Veröffentlicht :'(
Außerdem ist für mich das Problem, das ich nicht genau weiß mit welchen Begriffen ich hier suchen muss. Auch der Beitrag ist wenig aufschlussreich, da es hier um zwei "cmd" Befehle geht.
Der entscheidene Hinweis war hier wohl zu arbeiten wie in der Kommandozeile. Nach vielen Versuchen hat es nun endlich geklappt:
http://server:8083/fhem?cmd=set%20Wassermelder%20on%3bsetreading%20Wassermelder%20battery%2000.2&XHR=1
Danke!
Ich habe es nun auch soweit erfolgreich einrichten können. Es sind zwar noch viele Fragen offen...aber hier erstmal das, was ich hinbekommen habe (Wenn es falsch ist, bitte ich um einen Hinweis!)
Es geht hier um den Wassermelder, der in einem Auffangeimer hinter unserer Heizung steht. Beim erzeugen von Warmwasser steigt bei uns der Druck zu stark an...und das Überdruckventil löst aus. 1x die Woche muss der Einmer im schnitt geleert werden. Ich vergesse es nur zu gern...
Dummy Device anlegen:
define Wassermelder_Heizung dummy
attr Wassermelder devStateIcon Alarm::Alarm
attr Wassermelder room Heizung
attr Wassermelder webCmd :
Der ESP ruft nun diese Url auf:
http://server:8083/fhem?cmd=set%20Wassermelder_Heizung%20Alarm%3bsetreading%20Wassermelder_Heizung%20battery%2003.0%3bsetreading%20Wassermelder_Heizung%20RSSI%2080&XHR=1
Es wird also der Alarm ausgelöst und die Readings battery + RSSI übergeben
Dann habe ich ein Notify Mail eingerichtet:
define n_Mail_Wassermelder_Keller notify Wassermelder:Alarm {DebianMail("Mail\@jemand.de","Wassereimer in der Heizung leeren!","Bitte den Wassereinmer in der Heizung leeren!");;}
Noch schöner (mit den aktuellen Daten):
Wassermelder_Heizung:Alarm
{
my $temp=ReadingsVal("Wassermelder_Heizung", "battery","");
my $temp2=ReadingsVal("Wassermelder_Heizung", "RSSI","");
DebianMail("saschasmolny\@gmx.de","Wassereimer in der Heizung leeren!","Bitte den Wassereinmer in der Heizung leeren!\n"."Batterie: ".$temp." V (min.2,4V!)\n"."RSSI: ".$temp2);}
Readings loggen (Hier können alle in eine Datei...):
define log_Wassermelder FileLog ./log/wassermelder.log Wassermelder_.*
SVG-Plot erstellen (Siehe Anhang...der wird ja erst nach längerer Zeit interessant)
Somit wären ja jetzt die meisten Sachen endlich geschafft. Den Anfang habe ich mir irgendwie selbst viel zu schwierig gemacht...
Es bleiben aber noch ein paar Fragen:
1.) Ist das so ok, wie ich es jetzt umgesetzt habe?
2.) Ich habe für den FileLog Wassermelder_.* angegeben. Nun taucht beim Dummy bei "Probably associated with" der Filelog nicht mehr auf. Nur wenn ich den vollständigen Namen eingebe. Ist das Verhalten normal? Kann ich dies irgendwie ändern? Praktisch ist es ja schon direkt zu sehen, das diese miteinander verknüpft sind...
3.)
Ich habe den Wasssermelder in dem Raum Heizung. Nun steht in der Übersicht Heizung über den Wassermelder "dummy". Lässt sich der Name ändern? Ist nicht wichtig, aber optisch wäre es schönerSchon erledigt. Sobald ich eine Gruppe definiere, steht diese dort :)
Meine weiteren ToDo´s:
Leider sendet der ESP alle 35Min. (max. deep-sleep time) einen weiteren Alarm, wenn der Eimer noch nicht geleert wurde. Ich brauche nun nicht jedes Mal eine neue Mail zu bekommen. Wie kann ich den Mailversand für eine bestimmte Zeit (ich würde hier z.B. 12Stunden nehmen) pausieren?
Die Alarmmeldung auf den Squeezeboxen muss ich erst noch überdenken. Ich habe (noch) keine Anwesenheitserkennung. Auch soll der Alarm nicht nachts erfolgen ::)
Vielen Dank für eure Hilfen!
Gruß
Bismosa
Das ist korrekt, der Lösende Beitrag wurde erst danach geschrieben. Mea Culpa ;)
1) Solange es funktioniert und du keine Fehler bemerkst, ist es immer ok. Viele Wege führen nach Rom.
2) Ja, ist normal. Wenn du willst, dass es wieder auftaucht musst du den kompletten Namen nehmen
3) ---
4) Bei einem Notify kann ich es dir nicht sagen. Wenn du jedoch das notify durch ein DOIF tauschst, dann kannst du mit den Attr repeatcmd, repeatsame, wait etc. arbeiten und hier einstellen, wie oft die Meldung max in einem bestimmten Zeitraum gesendet werden soll. Auch kannst du hier einen Zeitraum definieren in dem der Alarm nur ausgelöst werden soll.
Ich habe mir die Seite mal angeschaut und gefällt mir ganz gut. Hast du Probleme mit der flimmernden blauen LED festgestellt, oder funktioniert alles soweit gut bei dem Sensor?
Ich versuche gerade auch das Ding nachzubauen, allerdings komme ich nicht ins Webinterface. Ich habe die bin geflasht, TX mit RX auf dem ESP direkt verbunden, 3,3v und gnd angelegt, aber sehe kein Netzwerk "Wassermelder". Hab ich da was falsch verstanden? Es scheint, dass er nicht in den accessmode kommt. Die blaue LED leuchtet auch nicht auf. Habe auch mal einen Arduino als Stromquelle genommen, geht trotzdem nicht.
Das Auslösen über verbinden der "Sensoren" führt allerdings dazu, dass die blaue LED kurz flackert, dann an bleibt und wieder ausgeht.
Hallo,
sorry...ich bin hier so beschäftigt und schicke mir so viele Mails das ich die Forenantwort-Mail übersehen habe.
Ich nutze einen ESP-03 (dann werde ich die mal endlich los...sind schwer zu löten...) Da gibt es keine LED. Daher kann ich das leider nicht beantworten.
Hast Du denn beim Versuch ins Webinterface zu kommen die Sensoren ebenfalls kurzgeschlossen? Sonst startet der ESP ja nicht...es muss auch zuerst TX-RX verbunden werden. Erst dann starten...
Ich bin noch dabei das Ganze zu erweitern. Ich habe jetzt auch gerade das Webinterface und den Code des ESP angepasst. Ich muss aber den Author fragen, bevor ich es weiter geben kann. Sonst beschreibe ich nur meine Änderungen.
Bitte um etwas Geduld :) Ich bin leider nicht so schnell mit dem ganzen Kram...
Gruß
Bismosa
Wie? ih muss sowohl tx-rx brücken und die sensoren verbinde, wie wenn wasser da wäre?
Jup. Denn die Verbindung "Wasser da" ist auf dem CH_PD Eingang. Nur wenn der auf High steht, geht der ESP an.
Das ist der "Trick" warum absolut kein Strom verbraucht wird. In den Deep-Sleep geht der ESP nur, wenn immer noch Wasser anliegt.
Gruß
Bismosa
Ok, das heißt ich verbinde ihn wie folgt:
3,3V (extern) an VCC (ESP)
GND (extern) an GND (ESP)
3,3V (ESP) an Reset (ESP)
Reset (ESP) mit CH_PD (ESP)
TX (ESP) an RX (ESP)
Und dann geht er in den Access Mode?
Ja...das sollte so richtig sein....klappt bei mir sehr gut :)
Gruß
Bismosa
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
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.
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 (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 (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 (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 (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
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.
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
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.
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
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
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.
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
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 ?
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
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.
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
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.
CH_PD bzw EN bleibt immer high!
Zum manuellen Wakeup RST kurz low!
Vielen Dank für Eure Antworten. Die "Alternative" mit ESPeasy schaue ich mir auf jeden Fall mal an.
Wenn CH_PD/EN immer High ist, dann kann das ganze doch gar nicht funktionieren ?
Ich habe das so verstanden, dass CH_PD gegen VCC den Eingang high setzt und dann das Wakeup erfolgt.
Kurz low löst ja noch nichts aus, sondern erst wenn wenn sich der Zustand nach low wieder ändert. Das würde
bedeuten, wenn Wasser da ist passiert noch nichts sondern erst wenn es wieder trocken ist. Verstehe ich doch
richtig oder ?
Mit dieser Schaltung, mit ESPEasy und Sleep Delay z. B. 300 sendet der ESP12 alle 5 Minuten die Daten des BME280, Akkuspannung, Sendestärke und was man sonst noch so einstellt und schläft dann wieder.
Mit RST kurz LOW wird er manuell aufgeweckt. Mit GPIO16 LOW wird Deep Sleep abgeschaltet.
Einen Wassersensor kann man als Device (Switch Input) anlegen oder damit RST LOW ziehen, aber nur kurz!
siehe auch hier: https://www.letscontrolit.com/wiki/index.php/SleepMode
Hi, aus der Doku lese ich, das der esp per espEasy nur nach festen timern automatisch aufwacht. Leider stand nix davon, Das der esp aufwacht bei einem event, zb. Der wassersensor meldet ein leck. Dann muss er ja aufwachen und sofort die Meldung absetzen. Danach wider schlafen legen.
Geht es wirklich nicht oder habe ich etwas überlesen?
Hallo,
eigentlich sollte alles hier beschrieben sein:
https://forum.fhem.de/index.php/topic,75139.msg671132.html#msg671132
Gerade was den ESP angeht hier:
http://esp8266-server.de/Wassermelder.html
Den ESP Easy im speziellen kenne ich nicht. Da gibt es mittlerweile auch viel zu viele unterschiedliche Module...
Zitat von: Prof. Dr. Peter Henning am 14 Mai 2018, 16:10:51
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.
Jein. Wenn wirklich sicherheitskritisch stimme ich zu. Ansonsten könnte man die Prüfzeit (die ich in FHEM eingebaut habe) noch verkürzen. 4 Wochen ist vielleicht auch ein wenig lang. Aber funktioniert haben meine immer bei der Prüfung. Wenn die Batterien leerer wurden habe ich die dann immer gleich ausgetauscht.
Ich finde das System nach wie vor ausreichend und gut und günstig. Meine Meinung :)
Gruß
Bismsoa
Von einem Event zum Aufwecken steht da auch nix. Kann er ja auch nicht, er schläft ja.
Aufwecken nur über RST (negative Flanke) verbunden entweder über internen Timer (der als einziges nicht schläft) an GPIO16 und /oder manuell mit Taster an GND.
Mit der og Schaltung funktioniert das.
Den Wassersensor würde ich mir einfach als Input Switch alle paar Minuten schicken lassen.
"Da gibt es mittlerweile auch viel zu viele unterschiedliche Module..." Aber gerade das man den ESP8266 mit ESPEasy sehr einfach und universell einsetzbar.