Abfragen von Dummys mit dem Zustand ??? mit Benachrichtiung per notify oder DOIF

Begonnen von Svnm, 08 März 2016, 10:21:08

Vorheriges Thema - Nächstes Thema

Svnm

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!

Ellert

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.

Svnm

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.

Ellert

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.

Svnm

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)

Ellert

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 ...),
   ...)

CoolTux

Kannst ja mal probieren ob ein


list .*.:FILTER=state=\?\?\?



funktioniert
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ellert

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=\?\?\?"))}

CoolTux


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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ellert

@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=\?\?\?")))}))

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Svnm

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!!!


CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Svnm

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

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net