Hauptmenü

Watchdog???

Begonnen von SNX100, 15 Oktober 2021, 12:07:07

Vorheriges Thema - Nächstes Thema

kadettilac89

#15
ich bleibe dabei, dass es nicht optimal ist, und du ggf. fhem blockierst wenn du alle 2 Sekunden prüfst. Aber jeder ist seines Glückes Schmied.

Es funktioniert vermutlich einfach mit einem at und einem notify.

Annahmen, ich habe keinen Raspberry, musst du prüfen ... ggf. sind meine Annahmen falsch.

Dein Device heißt dem List nach Wasserstandssensor

Setzen des GPIO auf "on" somit per:

set Wasserstandssensor on


Setzen des GPIO auf "off" per:

set Wassersstandssensor off


Durchgang prüfen per:

get Wasserstandssensor

--> Als Folge wird das Reading "Pinlevel" auf
         Durchgang = "high"
         kein Durchgang = "low"

Die Logik:

Alle 2 Sekunden wird ein At ausgeführt, dass erst den GPIO auf on setzt und im selben Schritt auch den Durchgang abfragt (und damit das Reading setzt sowie ein Event auslöst)


define at_wasserstand at +*00:00:02 set Wasserstandssensor on ;; get Wasserstanddsensor;;


In einem notify reagierst du auf das Event welches beim setzen vom Reading "Pinlevel" ausgelöst wird. Prüfe im Eventmonitor ein Event zu dem REading Pinlevel auftaucht.

Wenn Durchgang
- Alles OK, nur GPIO auf low setzen

Wenn kein Durchgang
- Meldung, schalten ... was auch immer du auslösen willst
- GPIO wieder auf low setzen


#Durchgang
define ntf_wasserstand_high Wassersstandssensor:Pinlevel:high { set Wasserstandssensor off}



#kein Durchgang
define ntf_wasserstand_low Wassersstandssensor:Pinlevel:low {   <<<< deine Aktionenen >>>;; set Wasserstandssensor off}


Ich habe keinen Raspberry, und auch aktuell kein fhem vor mir. Die Definitionen können ggf. geringe Syntaxfehler haben.

Wenn Schalten und gleich setzen zu schnell läuft, ggf. ein sleep mit in das at aufnehmen und eine Sekunden warten.

Damit die Events des Readings auch ausgelöst werden darfst du KEIN event-on-change-reading setzen. Du brauchst auch ein Event wenn sich   das Reading nicht geändert hat.

Theoretisch könntest du auch im At den GPIO-Ausgang auf low schalten. Ich vermute aber, dass es im notify minimal verzögert wird und du dir ein weiteres Sleep sparen kannst. Musst du testen ...

SNX100

Aus irgend einem Grund wird das Notify nicht getriggert beim Wechsel von on/off.
Pin schaltet wie er soll...

Schleife:
+*00:00:10 get Wasserstandssensor ; set Wasserstandssensor on
funktioniert beides

Notify:
Wasserstandssensor:Pinlevel:high set Wasserstandssensor off
passiert gar nichts




MadMax-FHEM

Zitat von: SNX100 am 16 Oktober 2021, 11:21:30
Notify:
Wasserstandssensor:Pinlevel:high set Wasserstandssensor off
passiert gar nichts

Wie hast du denn das notify erstellt?
Selber manuell?
Oder per Eventmonitor erstellen lassen?

https://wiki.fhem.de/wiki/Event_monitor

Poste doch wenigestens immer ein vollständiges list und auch mal Ausgaben vom Eventmonitor...

list Devicename

in FHEMWEB-cmd und die Ausgabe dann hier posten...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

SNX100

#18
define Wassertestschleife at +*00:00:10 get Wasserstandssensor ; set Wasserstandssensor on

define wasserstand_Notify notify Wasserstandssensor:Pinlevel:low set Wasserstandssensor off


2021-10-16 11:32:41 dummy Uhrzeit 11:32
2021-10-16 11:32:41 at at_fp_time Next: 11:32:51
2021-10-16 11:32:41 RPI_GPIO Wasserstandssensor on
2021-10-16 11:32:41 at Wassertestschleife Next: 11:32:51
2021-10-16 11:32:51 dummy Uhrzeit 11:32
2021-10-16 11:32:51 at at_fp_time Next: 11:33:01
2021-10-16 11:32:51 RPI_GPIO Wasserstandssensor on
2021-10-16 11:32:51 at Wassertestschleife Next: 11:33:01
2021-10-16 11:33:01 dummy Uhrzeit 11:33
2021-10-16 11:33:01 at at_fp_time Next: 11:33:11
2021-10-16 11:33:01 RPI_GPIO Wasserstandssensor on
2021-10-16 11:33:01 at Wassertestschleife Next: 11:33:11




Heizung                  26
Jet1                     13
Jet2                     16
Licht                    19
Logfile                  ./log/fhem-%Y-%m.log Logfile
Luftpumpe                6
Relais6                  20
Relais7                  21
Taster1                  17
Taster1_Notify           Taster1 {if ( Value("Luftpumpe") eq "on") {fhem("set Luftpumpe off")} else {fhem("set Luftpumpe on")}}
Taster2                  27
Taster2_Notify           Taster2 {if ( Value("Jet1") eq "on") {fhem("set Jet1 off")} else {fhem("set Jet1 on")}}
Taster3                  22
Taster3_Notify           Taster3 {if ( Value("Jet2") eq "on") {fhem("set Jet2 off")} else {fhem("set Jet2 on")}}
Taster4                  23
Taster4_Notify           Taster4 {if ( Value("Licht") eq "on") {fhem("set Licht off")} else {fhem("set Licht on")}}
Taster5                  24
Taster5_Notify           Taster5 {if ( Value("Heizung") eq "on") {fhem("set Heizung off")} else {fhem("set Heizung on")}}
WEB                      8083 global
Wasserstandssensor       25
Wassertestschleife       +*00:00:10 get Wasserstandssensor ; set Wasserstandssensor on
Zirkulation              5
at_fp_date               +*00:30:00 { fhem 'set Datum '.strftime('%d. %B', localtime) }
at_fp_time               +*00:00:10 { fhem 'set Uhrzeit '.strftime('%H:%M', localtime) }
eventTypes               ./log/eventTypes.txt
global                   no definition
initialUsbCheck          global:INITIALIZED usb create
sun_riseSet_timer        *00:05:00 { my $s = sunrise_abs(); fhem("set Sonnenaufgang $s"); $s = sunset_abs(); fhem("set Sonnenuntergang $s"); }
wasserstand_Notify       Wasserstandssensor:Pinlevel:high set Wasserstandssensor off


MadMax-FHEM

#19
Wo ist das list von deinem GPIO-Device, von deinem notify und dem dummy?

Das sind defines/Auszüge aus der fhem cfg...

EDIT: es wäre schon hilfreich, wenn du tust/lieferst was man hier braucht um helfen zu können...

Egal, wenn der Auszug aus dem Eventmonitor ist, dann ist doch wohl klar warum das notify nix tut:

Zitat
Wasserstandssensor:Pinlevel:low

vs.

Zitat
2021-10-16 11:32:51 RPI_GPIO Wasserstandssensor on

Hast du das verlinkte Wiki mal gelesen?

Also einfach Eventmonitor auf, Event "erzeugen" (oder warten), Zeile wählen und notify/DOIF/FileLog etc. anlegen lassen...
...und dann anpassen.

EDIT: mal soll auf "high" (also verm. "on"?) was passieren, dann wieder auf "low" (also "off"?). Was nun? Oder verschiedene Dinge (hab zugegebenermassen nicht alles im Detail gelesen 8) )? Dann doch bitte (wie angefragt) lists von deinen aktuellen "Versuchen"... :)
Und das mit dem Ausführen auf System-/OS-Ebene halt ich auch für die bessere Variante. Rückmeldung an fhem nach Ausführung geht doch ganz einfach: telnet, http, ... (gibt im Forum einige Beispiele)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

kadettilac89

Zitat von: SNX100 am 16 Oktober 2021, 11:33:25
define Wassertestschleife at +*00:00:10 get Wasserstandssensor ; set Wasserstandssensor on

define wasserstand_Notify notify Wasserstandssensor:Pinlevel:low set Wasserstandssensor off


2021-10-16 11:32:41 dummy Uhrzeit 11:32
2021-10-16 11:32:41 at at_fp_time Next: 11:32:51
2021-10-16 11:32:41 RPI_GPIO Wasserstandssensor on
2021-10-16 11:32:41 at Wassertestschleife Next: 11:32:51
2021-10-16 11:32:51 dummy Uhrzeit 11:32
2021-10-16 11:32:51 at at_fp_time Next: 11:33:01
2021-10-16 11:32:51 RPI_GPIO Wasserstandssensor on
2021-10-16 11:32:51 at Wassertestschleife Next: 11:33:01
2021-10-16 11:33:01 dummy Uhrzeit 11:33
2021-10-16 11:33:01 at at_fp_time Next: 11:33:11
2021-10-16 11:33:01 RPI_GPIO Wasserstandssensor on
2021-10-16 11:33:01 at Wassertestschleife Next: 11:33:11




So schlecht sieht es nicht aus.

1) Die Reihenfolge musst du vertauschen. Erst Set on und dann erst den STatus mit "get" abfragen. Zumindest verstehe ich deine Anforderung so.

2) gib mal die Befehle aus dem AT manuell ein. Und poste dann mal welche Events du siehst. Ich vermisse das Event "Wasserstandssensor Pinlevel high". Das müsste durch den set Befehl erzeugt werden. Wichtig, erst den SET ON Befehlt, dann den GET Befehl.

Dann schaun wir weiter.

SNX100


Manuell gestartet
set Wasserstandssensor on ; get Wasserstandssensor

Bei physisch kein Durchgang
Event: Current Value for Wasserstandssensor: high
Log: 2021.10.16 12:55:39 3: Wassertestschleife: Current Value for Wasserstandssensor: high


Bei physisch Durchgang
Event: Current Value for Wasserstandssensor: low
Log: 2021.10.16 12:57:19 3: Wassertestschleife: Current Value for Wasserstandssensor: low



kadettilac89


Event: Current Value for Wasserstandssensor: high
Event: Current Value for Wasserstandssensor: low

Ok, das sind die Situationen die du auswerten bzw. auf die du reagieren willst? Meine Annahme zumindest. Wobei ich bei Durchgang high erwarten würde, das musst nochmal testen.

Zum sauberen Anlegen des Notify:
Markiere die Zeile im Eventlog und klicke auf den Button "Create/Modify Device". Damit legst du dir für low und für high ein notify an.

Wenn die Befehle manuell gehen muss es auch im AT funktionieren. Ich habe mal ein AT angelegt mit 2 Befehlen, das funktioert. Vielleicht hast du irgend wo ein Sonderzeichen, nicht druckbares Zeichen o. ä.

defmod testat at +*00:00:02 set dy_mn1 on ;; set dy_mn2 on



2021-10-16 13:42:01.650 dummy dy_mn1 on
2021-10-16 13:42:01.658 dummy dy_mn2 on
2021-10-16 13:42:01.666 at testat Next: 13:42:03
2021-10-16 13:42:03.642 dummy dy_mn1 on
2021-10-16 13:42:03.650 dummy dy_mn2 on
2021-10-16 13:42:03.659 at testat Next: 13:42:05

SNX100

Wow, super....
Danke Leute, es tut sich schon mal ein bisschen was.
Scheint als wären hautsächlich Syntaxfehler schuld gewesen.
Muss morgen mal versuchen die komplette Logik um zusetzten und werde dann auf jeden Fall Rückmeldung (oder Fragen) geben.

Für heute erst noch mal ein ganz dickes Dankeschön und einen schönen Abend.

SNX100

So... die Abfrage funktioniert soweit und er schaltet wie er soll.

Allerdings fehlt jetzt noch die Möglichkeit eine Mehrfachabfrage zu machen welche bei offenem Kontakt checkt ob der Kontakt länger als 1 Sekunde offen ist. Und erst dann die Relais abschaltet.

Notify:
define  Wassertestschleife_notify_1 Wassertestschleife:Next:.*:.*:.* {if (ReadingsVal("Wasserstandssensor","Pinlevel","") eq "low") {fhem("set Heizung on")} else {fhem("set Heizung off")}}

kadettilac89

Zitat von: SNX100 am 17 Oktober 2021, 16:48:20
Allerdings fehlt jetzt noch die Möglichkeit eine Mehrfachabfrage zu machen welche bei offenem Kontakt checkt ob der Kontakt länger als 1 Sekunde offen ist. Und erst dann die Relais abschaltet.


das verstehe ich nicht. Losgelöst von den AT und NOTIFY. Wie würdest du das manuell machen? Wann genau willst du 1 Sekunde?

Aktuell
Set Wasserstandssensor on
Get Wasserstandssensor
Set Wasserstandssensor off

Wo willst du was genau prüfen?

So was hier? Was willst du dann mit welchem Status machen?
Set Wasserstandssensor on
Get Wasserstandssensor
<<<   1 Sekunde warten >>>
Get Wasserstanddsensor
Set Wasserstandssensor off

SNX100

ZitatSo was hier? Was willst du dann mit welchem Status machen?
Set Wasserstandssensor on
Get Wasserstandssensor
<<<   1 Sekunde warten >>>
Get Wasserstanddsensor
Set Wasserstandssensor off

Set Wasserstandssensor on
Get Wasserstandssensor
wenn high
<<<   wenn pin high teste 1 sekunde lang mehrfach ob pin high bleibt >>>

SNX100

ZitatSo was hier? Was willst du dann mit welchem Status machen?
Set Wasserstandssensor on
Get Wasserstandssensor
<<<   1 Sekunde warten >>>
Get Wasserstanddsensor
Set Wasserstandssensor off

Set Wasserstandssensor on
Get Wasserstandssensor
  wenn high
         teste 1 sekunde lang mehrfach ob pin high bleibt
         wenn er high bleibt schalte alles ab
         wenn nicht Set Wasserstandssensor off
  wenn nicht Set Wasserstandssensor off



kadettilac89

mehrfach prüfen wird komplizierter. Da musst du aufpassen, dass fhem / raspberry nicht blockiert. Dann hast du schnell das Monitoring deaktiviert.

Änderung der Logik. Im AT alle Befehle, im Notify nur noch die Fehlersituation Wasserstandssensor ausführen.

"mehrfach" = 3 Prüfungen. Sobald EINE davon fehl schlägt wird die Fehlersituation "high" abgearbeitet.

Alle xxx Sekunden: Pin einschalten, Status abfragen, 0,5 Sekunden warten, Status abfragen, 0,5 Sekunden warten, STatus abfragen, Pin ausschalten.

Sollte einer der 3 Prüfungen fehlschlagen --> notify schaltet ab, oder macht was immer du dann machen willst (die Aktion bei Fehler). Ggf. auch die Prüfung alle 2 Sekunden deaktivieren.

Im Notify brauchst du kein if/else. Du musst nur auf das volle Event reagieren. Du solltest ein Event haben das Pinlevel enthält. Zeig dazu mal die Events die im Eventlog angezeigt werden.

Notify müsste dann in etwa so aussehen ...

define ntf_wasserstand_high Wassersstandssensor:Pinlevel:high  <<< fhem Aktion bei Fehler >>>


Im AT alle Befehle verketten

define Wassertestschleife at +*00:00:10  set Wasserstandssensor on ; get Wasserstandssensor ; sleep 0.5 ; get Wasserstandssensor ; sleep 0.5 ; get Wasserstandssensor ; set Wasserstandssensor off



Christoph Morrison

Ich würde sowas überhaupt nicht über FHEM realisieren, sondern über ein abgesetztes Device, z.B. einen Arduino, der über USB an den FHEM-Raspberry angeschlossen ist und KeyValueProtocol-kompatible Werte über Seriell schickt. Erstens blockierst du dir so dein FHEM nicht, zweitens machst du dir deinen Raspberry nicht kaputt, wenn irgendwas mal schief geht (Arduino für 2-5€ vs. Raspberry für das mind. zehnfache). Oder nimmst halt ein ESP und machst das ganze über MQTT, z.B.

Ein Sketch für die erste Version ist ja trivial und für einen ESP könntest du Tasmota etc. benutzen.