Hallo Fhem-Experten,
ich suche nach einer Möglichkeit, einen undefinierten Dummy bzw. Dummy mit dem STATE ? ? ? zu finden und mich dann zu benachrichtigen.
Der Hintergrund: Es ist mal vorgekommen, dass Fhem unsauber beendet wurde und dann einige Dummy-Werte verloren gegangen sind und im STATE dann die drei Fragezeichen standen.
Eine Benachrichtigung für Devices, die nicht mehr reagieren, habe ich mir bereits mittels notify zusammengebastelt:
.*:(MISSING.ACK.*|.*NACK.*) {
if ("$NAME" ne "global") {
fhem("set Push_Wartung msg 'Fhem' '$NAME reagiert nicht!'")
}
}
Ich bekomme es nun nicht hin, die drei Fragezeichen abzufragen. Bei meinen Versuchen habe ich stets nur Fehlermeldungen im Log erhalten.
Vielleicht kann mir jemand weiterhelfen oder einen Tipp geben, wie ich das oben stehende notify abwandeln kann, um eine Mitteilung für ? ? ? zu erhalten (Die Fragezeichen sind zusammengeschrieben, das Forum macht nur dann einen Emoji daraus).
Dafür schon einmal vielen Dank!
Fragezeichen haben eine besondere Bedeutung in einem Regulären Ausdruck, wenn Du sie buchtäblich nutzen willst, dann müssen sie maskiert werden.
Beispiel: list STATE=\?\?\? in der Kommandozeile ausgeführt, listet alle Geräte die 3 Fragezeichen in STATE haben.
Hallo, danke für die Antwort.
Ich habe es nun so versucht:
.*:\?\?\? {
fhem("set Push_Wartung msg 'Fhem' 'Dummy $NAME ist leer'")
}
Leider reagiert das notify nicht, wenn ich zum Beispiel einen neuen Dummy erstelle, der dann ja automatisch den STATE ? ? ? hat.
Mach mal den Event-Monitor auf und erstelle in einem 2. Tab einen Dummy, am Event siehst Du warum es nicht funktioniert.
Bei "set DeinDummy ? ? ?" spricht das notify an.
Wenn ich einen neuen Dummy erstelle, erhalte ich folgende Zeile im Event-Monitor:
2016-03-10 16:55:06 Global global DEFINED Dummy_test
Dadurch, dass die Fragezeichen nicht im Event-Monitor auftauchen, kann ich daraus schließen, dass ein Abfragen des Zustands mit ? ? ? nicht möglich ist? (Es sei denn, ich setze es manuell auf ? ? ?, dann taucht es im Event-Monitor auf und das notiy löst aus)
ZitatDadurch, dass die Fragezeichen nicht im Event-Monitor auftauchen, kann ich daraus schließen, dass ein Abfragen des Zustands mit ? ? ? nicht möglich ist?
Ja, so ist es. Es gibt jedoch ein Event global:INITIALIZED nach einem Neustart von FHEM, das könntest Du nutzen, um den Status der Dummys abzufragen.
Mit einem DOIF etwa so:
define deinDOIF DOIF (["global:INITIALIZED"])
(IF ([dummy1] eq "? ? ?") (set Push ...),
IF ([dummy2] eq "? ? ?") (set Push ...),
...)
Kannst ja mal probieren ob ein
list .*.:FILTER=state=\?\?\?
funktioniert
Zitat von: CoolTux am 10 März 2016, 18:04:06
Kannst ja mal probieren ob ein
list .*.:FILTER=state=\?\?\?
funktioniert
@CoolTux: Könntest Du uns auch verraten, wie die Ausgabe von list gespeichert werden kann?
Mir ist es bisher nicht gelungen, z.B. mit:
set dummy list STATE=\?\?\?
set dummy {(fhem "list STATE=\?\?\?")}
set dummy {(fhem("list STATE=\?\?\?"))}
my @monitored=devspec2array(".*.:FILTER=state=\?\?\?");
my $cnt_devs=@monitored;
my $i = 0;
my $device = "";
foreach(@monitored) {
$device .= $_;
if ($i <= $cnt_devs - 2) {
$device .= ", ";
}
$i++;
}
return $device;
Als Inhalt des returns bekommst ne Liste der Geräte mit Komma getrennt.
@CoolTux: Danke für den Hinweis auf devspec2array.
Dann könnte man die Abfrage stark vereinfachen, etwa so:
define deinDOIF DOIF (["global:INITIALIZED"]) ((set Push ... {(join(", ",devspec2array(".*.:FILTER=state=\?\?\?")))}))
Wenn Du so zum Ziel kommst dann könnte man es so machen. Du kannst auch Deine list Ausgabe irgendwo in eine Variable schreiben. Wie Du das alles machst ist Dir überlassen, ich wollte Dir nur mal den Pfeil für die Richtung malen ;D
Vielen Dank für die Antworten!
Ich habe nun das DOIF
(["global:INITIALIZED"]) ((set Push_Wartung msg 'Fhem' 'Dummy {(join(", ",devspec2array(".*.:FILTER=STATE=\?\?\?")))} leer!!!'))
Erstelle ich nun einen Dummy und starte Fhem neu, erhalte ich eine Nachricht, in der steht:
Dummy .*.:FILTER=STATE=\?\?\? leer!!!
Am besten Du legst Dir eine 99_myUtils_Helper.pm an. So mache ich das. Darin schreibst Du dann eine kleine Sub mit dem Code
$emptyDummy = join(", ",devspec2array(".*.:FILTER=STATE=\?\?\?"))
fhem "set Push_Wartung msg 'Fhem' 'Dummy $emptyDummy leer!!";
ACHTUNG das sind nur Codeteile, nicht die gesamte sub. Ist ein Beispiel
Diese funktion rufst Du dann halt auf
(["global:INITIALIZED"]) ( { funktion(); } )
[code]
Glaube das war bei DOIF irgendwie so
Das werde ich gleich versuchen.
Was mir jetzt noch aufgefallen ist; ich erhalte folgende Fehlermeldung im Log:
devspec2array .*.:FILTER=STATE=???: Sequence (???...) not recognized in regex; marked by <-- HERE in m/^(??? <-- HERE )$/ at fhem.pl line 1144
Soweit ich weiß kann man wohl innerhalb eines fhem Befehles keine perl sub aufrufen.
Habe ich mal so glaube von Rudi vernommen. Bin mir aber nicht wirklich sicher
Zitat von: CoolTux am 11 März 2016, 16:17:30
Soweit ich weiß kann man wohl innerhalb eines fhem Befehles keine perl sub aufrufen.
Habe ich mal so glaube von Rudi vernommen. Bin mir aber nicht wirklich sicher
Beim DOIF immer schon, bei set bzw. setreading neuerdings auch. Die Syntax wurde aus DOIF übernommen {(..)}.
Gruß
Damian
Zitat von: MMeier67 am 11 März 2016, 16:02:58
Das werde ich gleich versuchen.
Was mir jetzt noch aufgefallen ist; ich erhalte folgende Fehlermeldung im Log:
devspec2array .*.:FILTER=STATE=???: Sequence (???...) not recognized in regex; marked by <-- HERE in m/^(??? <-- HERE )$/ at fhem.pl line 1144
Probiere mal (beachte die Hochkommas):
(["global:INITIALIZED"]) ((set Push_Wartung msg 'Fhem' 'Dummy {(join(", ",devspec2array('.*.:FILTER=STATE=\?\?\?')))} leer!!!'))
Gruß
Damian
Vielen Dank, es funktioniert nun perfekt. Dank des Tipps von Damian mit den Hochkommas arbeitet das DOIF nun einwandfrei :)