DOIF zum Warnen bei Nicht-Änderung von Reading

Begonnen von davidwohnthier, 24 November 2017, 22:11:32

Vorheriges Thema - Nächstes Thema

davidwohnthier

Hallo!

Ich komme irgendwie nicht weiter :(
Ich habe eine Datei, die alle 3 Minuten per cron und touch "verändert" wird. Diese letzte Änderung wird mit einem SYSMON2 Device angezeigt (siehe Code). Jetzt würde ich gerne ein DOIF erstellen, welches eine Aktion/Push Nachricht absetzt, wenn innerhalb von 5 Minuten keine Änderung des Readings festzustellen ist. Ich komm aber einfach nicht hinter den Code und ahne, dass es wahrscheinlich eine richtig simple Sache ist... Kann mir eventuell wer helfen?

Das SYSMON2 Device schaut so aus:
define SYSMON2 CustomReadings
attr SYSMON2 group SYSMON2
attr SYSMON2 interval 30
attr SYSMON2 readingDefinitions COMBINED:qx(/opt/fhem/FHEM/stillalive.sh),Change
attr SYSMON2 room Alive
attr SYSMON2 userReadings state { ReadingsVal("SYSMON2","Change",0);;;; }


In der stillalive.sh steht folgendes:
#/bin/bash
date -r /home/pi/stillalive
exit 0


Per Cron ausgelöst führt dies auch immer wieder dazu, dass die Datei ein neues "Last Change" hat..

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

amenomade

Ja stimmt. Meine Lösung war falsch. Hab mich vertauscht. Ich habe sie gelöscht
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

davidwohnthier

Vielen Dank! Also ich habe das Problem mit eurer Hilfe gelöst. Gestern Nacht bin ich noch auf eine Idee mit dem watchdog gekommen, was auch funktioniert hat aber ich habe es jetzt so gelöst. Damit ich vielleicht auch mal jemand helfen kann schreibe ich kurz, wie und was ich gemacht habe.
Das Gerät B (ein Router mit OpenWRT) sendet jede Minute per SSH und public Key einen Befehl (touch /home/pi/stillalive) an Gerät A (Raspberry Pi).
Das Skript welches minütlich per Cron ausgeführt wird sieht so aus:

#!/bin/bash
USERNAME=pi
HOSTS="XXXXXX"
SCRIPT="touch /home/pi/stillalive"
PORT="XXXX"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} -p ${PORT} "${SCRIPT}"
done


Auf dem Gerät B muss natürlich die Datei /home/pi/stillalive existieren.
Auf diesem Gerät läuft FHEM, welche alle 30 Sekunden per SYSMON2 diese Datei überwacht. Dafür habe ich folgendes Device erstellt:

## Check Still Alive ##
define SYSMON2 CustomReadings
attr SYSMON2 event-on-change-reading .*
attr SYSMON2 group SYSMON2
attr SYSMON2 interval 15
attr SYSMON2 readingDefinitions COMBINED:qx(/opt/fhem/FHEM/stillalive.sh),Change
attr SYSMON2 room Alive
attr SYSMON2 userReadings state { ReadingsVal("SYSMON2","state",0);;;; }


Damit nun ein Alarm versendet wird, sobald kein Event mehr mit dem Inhalt "Change" auftaucht habe ich, nach eurer Hilfe, folgendes DOIF erstellt:

define di_alarm1 DOIF ([":^Change"]){\
DebianMail("XXX\@XXX","ALARM 1: STROM/VERBINDUNG AUSFALL","Das Gerät XXXXX meldet seit 75 Sekunden kein Signal mehr.");;\
}
attr di_alarm1 do resetwait
attr di_alarm1 room Alive
attr di_alarm1 verbose 5
attr di_alarm1 wait 75


Ich habe dann zwei weitere Alarme erstellt, damit klar ist: Es ist immer noch kein neues Event erschienen - das Gerät ist immer noch offline:

define di_alarm2 DOIF ([":^Change"]){\
DebianMail("XXXX\@XXX","ALARM 2: STROM/VERBINDUNG AUSFALL","Das Gerät XXX meldet seit 135 Sekunden kein Signal mehr.");;\
}
attr di_alarm2 do resetwait
attr di_alarm2 room Alive
attr di_alarm2 verbose 5
attr di_alarm2 wait 135

define di_alarm3 DOIF ([":^Change"]){\
DebianMail("XXXX\@XXXX","ALARM 3: STROM/VERBINDUNG AUSFALL","Das Gerät XXXX meldet seit 195 Sekunden kein Signal mehr.");;\
}
attr di_alarm3 do resetwait
attr di_alarm3 room Alive
attr di_alarm3 verbose 5
attr di_alarm3 wait 195


Jetzt mache ich mich gerade daran ein DOIF zu erstellen, damit sobald die Verbindung wieder hergestellt wird, auch wieder eine eMail kommt, dass das Gerät eben wieder online ist.

Per

#4
Geht das nicht in ein DOIF?


define di_alarm1 DOIF ([":^Change"])\
({DebianMail("XXXX\@XXX","ALARM 1: STROM/VERBINDUNG AUSFALL","Das Gerät XXX meldet seit 75 Sekunden kein Signal mehr.");;})\
({DebianMail("XXXX\@XXX","ALARM 2: STROM/VERBINDUNG AUSFALL","Das Gerät XXX meldet seit 135 Sekunden kein Signal mehr.");;})\
({DebianMail("XXXX\@XXX","ALARM 3: STROM/VERBINDUNG AUSFALL","Das Gerät XXX meldet seit 195 Sekunden kein Signal mehr.");;})\
}
attr di_alarm1 do resetwait
attr di_alarm1 room Alive
attr di_alarm1 verbose 5
attr di_alarm1 wait 75,60,60



Zitat von: Sirel am 28 November 2017, 23:22:57nur dürfen beim wait dann keine Doppelpunkte gesetzt werden
*andenkopfklatsch* natürlich! Habs geändert.

Sirel

... das geht, nur dürfen beim wait dann keine Doppelpunkte gesetzt werden, sonder für Befehlssequenzen ein Komma.

Max

davidwohnthier

#6
Zitat von: Per am 27 November 2017, 13:13:37
Geht das nicht in ein DOIF?


define di_alarm1 DOIF ([":^Change"])\
({DebianMail("XXXX\@XXX","ALARM 1: STROM/VERBINDUNG AUSFALL","Das Gerät XXX meldet seit 75 Sekunden kein Signal mehr.");;})\
({DebianMail("XXXX\@XXX","ALARM 2: STROM/VERBINDUNG AUSFALL","Das Gerät XXX meldet seit 135 Sekunden kein Signal mehr.");;})\
({DebianMail("XXXX\@XXX","ALARM 3: STROM/VERBINDUNG AUSFALL","Das Gerät XXX meldet seit 195 Sekunden kein Signal mehr.");;})\
}
attr di_alarm1 do resetwait
attr di_alarm1 room Alive
attr di_alarm1 verbose 5
attr di_alarm1 wait 75,60,60


*andenkopfklatsch* natürlich! Habs geändert.

Vielen Dank! Hab das jetzt so wie du vorgeschlagen hast umgesetzt. Kann es sein, dass noch ein { nach dem DOIF ... und vor dem \ fehlt?

edit:

Leider funktioniert es auch mit der öffnenden Klammer nicht :(


edit2:

Fehler gefunden:
} vor den Attributen weg und beim letzten email versand die \ weg, danach kommt ja nichts mehr :)

Per

Zitat von: davidwohnthier am 14 Dezember 2017, 11:54:23Fehler gefunden:
Ein Bisschen Arbeit wollte ich dir auch noch lassen :-*

Sowas bei cut&paste  :-[