FBDECT löst Ereignis nicht aus

Begonnen von Det20, 19 Januar 2017, 11:08:54

Vorheriges Thema - Nächstes Thema

Det20

Hallo,

irgendwie stehe ich gerade auf dem Schlauch. Ich möchte mich an ein Ereignis vom FritzBox DECT dranhängen, um eine Variable zu definieren und etwas in ein Log zu schreiben:

define WWLastSwitch notify FBDECT_18:state:.on ($main::LastWW = time;Log 1, "WW An")

Geht nicht, Eintrag im Log taucht nie auf. Folgender Befehl geht leider auch nicht:

define WWLastSwitch notify FBDECT_18:state:.* (set FBDECT_Fritzbox_20 on)

und das auch nicht:

define WWLastSwitch notify FBDECT_18 (set FBDECT_Fritzbox_20 on)

Übersehe ich da was? Oder wird beim Fritzbox / DECT kein Ereignis ausgelöscht

rudolfkoenig

Zitatdefine WWLastSwitch notify FBDECT_18:state:.on ($main::LastWW = time;Log 1, "WW An")
Je-nachdem, ob in fhem.cfg ; oder ;; steht, sollte beim FHEM-Start oder bei der Ausfuehrung des notifys im FHEM-Log eine Fehlermeldung stehen, bei mir das definitiv der Fall.

Woher stammt die Inspiration fuer den Syntax mit den runden Klammern bzw fuer $main::LastWW?

ZitatÜbersehe ich da was? Oder wird beim Fritzbox / DECT kein Ereignis ausgelöscht
Meines Wissens wird ein Event ausgeloest, ich schlage vor das im "Event-Monitor" in FHEMWEB zu pruefen.

Det20

#2
Habe ich mir aus verschiedenen Beiträgen zusammengesucht, danach Try-and-Error. Die runden Klammern sind ein Fable, ich gruppiere in anderen Sprachen immer gerne mit ( ) zusammen.
Wie müßte der Befehl bzw die Zeile denn richtig lauten?

LastWW ist Global und brauche ich anschließend noch, damit die Steckdose frühestens alle x Sekunden geschaltet wird. Das Warmwasser ist ja nicht nach 5 Minuten wieder kalt, es reicht also alle x Sekunden / Minuten, neues Wasser durch die Leitung zu schicken:

define WWDashButton notify DashButton:present IF ( ([FBDECT_18:state] eq "off") && (time>($main::LastWW+300)) ) (set FBDECT_18 on-for-timer 240)

rudolfkoenig

Das Hauptproblem mit IF/DOIF ist, dass es seinen eigenen Syntax mitbringt, was _NUR DA_ funktioniert, und damit leider Anfaenger verwirrt.

Syntaktisch richtig waere:
Zitatdefine WWLastSwitch notify FBDECT_18:state:.on { $main::LastWW = time;;Log 1, "WW An" }

Semantisch gibt es immer noch Probleme:
- man sollte nicht irgendwelche globale Variablen setzen, fuer sowas ist das %data Hash vorgesehen, also statt $main::LastWW = time lieber $data{LastWW} = time(). Oder klassisch mit setreading / readingsVal()
- ob der Regexp den beabsichtigten Event erwischt, habe ich nicht geprueft
- Falls FBDECT von FBAHAHTTP bedient wird (und nicht FBAHA), dann wird das Event erst beim naechsten Poll gemeldet, bitte deswegen sich bei AVM bedanken bzw. ein Ticket oeffnen.

Det20

#4
In "$data{Name}" habe ich also ein glob. Variablen Stack? Sehr guter Hinweis, danke.

Ich hab es so wie beschrieben umgesetzt und die DECT über FHEM/FritzApp geschaltet (bin gerade nicht vor Ort). Im Log erscheint:

2017-01-19 11:59:18 FBDECT FBDECT_18 set_on
2017-01-19 11:59:18 FBDECT FBDECT_18 on

Trotzdem wird nichts geschaltet bzw. das Event nicht ausgelöst. Hast Du noch eine Idee?

Und wann wird mit () bzw. mit {} im Notify gearbeitet? Habe ich noch nicht verstanden, da der folgende Befehl funktioniert:

define WWDashButton notify DashButton:present IF ([FBDECT_18:state] eq "off") (set FBDECT_18 on-for-timer 240)

rudolfkoenig

ZitatTrotzdem wird nichts geschaltet bzw. das Event nicht ausgelöst. Hast Du noch eine Idee?
Der Regexp sollte FBDECT_18:on heissen.

ZitatUnd wann wird mit () bzw. mit {} im Notify gearbeitet?
Dazu empfehle ich das Einsteiger-PDF oder den Commandref Eintrag fuer notify.
Kurz: () nie, {} fuer Perl.

Zitatda der folgende Befehl funktioniert:
Da fuehrst du ja auch das FHEM-Befehl IF aus. Das ist kein Perl-Befehl, sondern sowas wie update, backup, etc, ein FHEM-Modul, dokumentiert in Commandref. Wie geschrieben: verwirrt Anfaenger, die mehr als Copy&Paste machen. Das Problem war mir von Anfang an klar, habe das Experiment aber zugelassen, inzwischen ist die Fan-Gemeinde aber auch zu gross, um es zu verbieten. Und "Problemfaelle" wie Du relativ wenig (jedenaflls was ich mitkriege).

Det20

#6
Ok, dann habe ich auch das verstanden. Komme aus anderen Entwicklungsumgebungen, daher war ich etwas verwirrt.
Wie mische ich denn PERL ($data{LastWW} = time()) und FHEM (set ... on-for-timer) Befehle? Mit { }? Oder ( )?

Allerdings, auch auf die Gefahr hin dass ich nerve ...

Es geht nicht: define WWLastSwitch notify FBDECT_18:on { set FBDECT_Fritzbox_20 on;;Log 1, "WW An" }
Mit () Klammern auch nicht: define WWLastSwitch notify FBDECT_18:on ( set FBDECT_Fritzbox_20 on-for-timer 240 )

Kann ich $data{LastWW} eigentlich irgendwo einsehen? Gibt es einen Variablen-View?

rudolfkoenig

ZitatEs geht nicht: define WWLastSwitch notify FBDECT_18:on { set FBDECT_Fritzbox_20 on;;Log 1, "WW An" }
Es heisst ja auch:
define WWLastSwitch notify FBDECT_18:on { fhem("set FBDECT_Fritzbox_20 on");;Log 1, "WW An" }
habs bei mir mit dummys getestet, geht. Habe ich schon geschrieben, dass es sinnvoller ist, das Einsteiger-PDF zu lesen statt zu raten? Noch besser: erst die ersten Kapitel eines Perl-fuer-Anfaenger Buches, und erst dann das Einsteiger-PDF.

ZitatKann ich $data{LastWW} eigentlich irgendwo einsehen?
Ja, mit { $data{LastWW} } . Falls ein FHEM-Befehl in {} geschlossen, ist, dann interpretiert FHEM das als Perl-Ausdruck. Und "" als Shell-Befehl. Steht hier beschrieben. Die ersten drei kurzen Absaetze aus commandref empfehle ich immer noch jedem. Sonst haette ich es ja umsonst geschrieben, und muesste es immer wieder jedem nochmal einzeln erklaeren. Hmmm.

Det20

Vielen Dank. Ich denke das Problem ist, dass man, wenn man hier im Forum oder bei Google sucht, einfach viele Möglichkeiten findet. Mal so, mal so. Mal mit einem .*, mal ohne. Als nicht-Profi kommt man da schnell durcheinander und obwohl ich selbst seit einigen Jahren Entwickler bin, verstehe ich manches nicht so recht.

Ich denke aber, dafür sollte dieses Forum sein. Anyway ... Vielen Dank, ich teste es später.

rudolfkoenig

Das Forum sollte aber nicht die erste Wahl sein, wenn man eine Programiersprache wie perl oder Konzepte wie regexp lernen will. Dafuer gibt es Doku (online wie offline), und man sollte sich ein bisschen Zeit nehmen, um die Grundkonzepte kennenzulernen. Ist halt meine altmodische Ansicht, vielleicht schon laengst ueberholt.

Det20

#10
Ich gebe Dir im Prinzip recht. Allerdings verzweifelt man gerne, gerade wenn es um ( und { geht. Oder mal fhem(, mal ohne. Das leuchtet mir irgendwie immer noch nicht ein. Von $data habe ich bei Google leider kaum was gefunden, deshalb wusste ich das nicht. Ich habe es anhand eines Beispiels aus der FHEM Doku so umgesetzt. Aktuell läuft z.B. dieser Befehl nicht:

define WWDashButton notify DashButton:present { IF ( (time()>($data{LastWW}+10*60)) && ([FBDECT_18:state] eq "off") ) { fhem("set FBDECT_18 on-for-timer 300");;$data{LastWW} = time();;Log 1, "Push WW An" } }

Und jetzt komme ich an meine Grenzen. Wo soll mit { gearbeitet werden? Kommt vor dem ersten IF ein { oder nicht? Ist LOG nun ein FHEM Befehl? Und wieso taucht LOG nicht im EventLog auf?
Ich denke, mehr Beispiele helfen es zu verstehen. Deshalb frage ich lieber einmal mehr als weniger. Und jedesmal bin ich ein wenig schlauer :)

rudolfkoenig

Gibs zu: du hast die von mir empfohlene Lektuere nicht durch, ignorierst also meine Ratschlaege, und willst eine direkte  persoenliche Einfuehrung. Ich versuche es ausnahmsweise kurz (in commandref/Einsteiger-PDF steht es detaillierter):

Es gibt 3 Arten von Befehlen, die man in FHEM (telnet, FHEMWEB oder fhem.cfg) eingeben kann:
- die in {}, das sind Perl-Ausdruecke, und werden mit Perl-Eval ausgefuehrt
- die in "", das sind Shell-Befehle, und werden mit system() ausgefuehrt.
- alles andere (nennen wir sie FHEM-Befehle): da sucht FHEM nach einem bekannten Befehl (wie define, set, get, list, etc), oder laedt es aus dem FHEM-Verzeichnis (wie update, xmllist, jsonlist2, IF).

- Befehle kann man entweder direkt eingeben, oder als Argument fuer at/notify/etc.
- Notify nimmt ein ein regexp und ein Befehl als Argument (FHEM-Befehl oder Perl Ausdruck oder Shell-Befehl).
- IF ist ein Modul aus dem FHEM Verzeichnis, und definiert seine eigene Syntax mit () usw. Kann nichts dazu sagen, ist nicht von mir, kenne ich nicht. Wenn du damit Probleme hast, bitte im passenden Unterforum (siehe MAINTAINER.txt) die Frage stellen
- Wenn du { IF.. } oder { set XXXX on } schreibst, dann erzeugt das ein Perl-Fehler, weil perl weder mit IF noch mit set was anfangen kann.
- Falls du aus einem Perl-Ausdruck heraus FHEM-Befehle ausfuehren willst, dann muss man die Perl-Funktion fhem() aufrufen, also { fhem("set XX on") }. Das ist equivalent mit set XX on.
- Log ist eine in fhem.pl definiert Perl Funktion, die man aus einem Perl-Ausdruck {} aufrufen kann.

Det20

#12
Für den Moment habe ich tatsächlich nicht reingeschaut. Das liegt jedoch daran, dass ich versuche, von TAHOMA (Somfy) wegzukommen. Aktuell funtkioniert die Box mal wieder nicht, entsprechend versuche ich, auf die Schnelle Workarounds zu schaffen; das ist der Nachteil, wenn man sich zu sehr auf die Systeme verlässt. Und dabei bringe ich natürlich die Programmier-Erfahrung aus anderen Sprachen mit. Das Vermischen von FHEM und PERL ist mein Problem. Ich gebe zu, ich dachte, IF ist nativ, also eingebaut. Ok, dafür fehlen mir die Erfahrungen, ich versuche mich erst seit 2 Wochen in Deinem Projekt. Vielen Dank also für den Crash-Kurs, hat tatsächlich einige Fragen aufgelöst. Allerdings wird z.B. hier das IF in { } verpackt: https://www.fischer-net.de/hausautomation/fhem/24-fhem-benachrichtigt-bei-event.html

So funktioniert es (auch für die Nachwelt).

define WWDashButton notify DashButton:present {\
if ((time()>($data{LastWW}+3*60))&&(ReadingsVal("FBDECT_18","state","off") eq "off")){\
fhem("set FBDECT_18 on-for-timer 300");;$data{LastWW}=time();;\
}\
}

Ich danke Dir nochmal für Deine Geduld und Hilfe!