Hallo,
ich fürchte, ich habe das mit dem Presence-Modul noch nicht ganz verstanden.
In meiner Fhem.cfg steht folgendes drin:
define Handy_Stephan PRESENCE fritzbox SGS2-Stephan
### Anwesend?
define watchdog_Anwesenheit_Handy_Stephan watchdog Handy_Stephan:present 00:01 Handy_Stephan:absent { fhem("set Funkschalter2 on");;}
Meine Fragen:
Was genau macht der watchdog?
Wenn der eintrag Handy_Stephan:present kommt, dann wartet er 1 Minuten und dann ? schaltet er den Funkschalter ein ?
im Log bekomme ich folgende Einträge:
2013.04.18 11:33:12 5: Cmd: >{PRESENCE_ProcessLocalScan('Handy_Stephan|0|present|10')}<
2013.04.18 11:33:12 5: PRESENCE_ProcessLocalScan: Handy_Stephan|0|present|10
2013.04.18 11:33:12 5: Triggering Handy_Stephan (1 changes)
2013.04.18 11:33:12 5: Notify loop for Handy_Stephan present
Der Funkschalter bleibt aber zuverlässig aus ;-(
Hat jemand ne Idee, wo der Fehler liegt?
Ich verzweifel gerade ;-)
Danke!
Hallo,
der watchdog:
define watchdog_Anwesenheit_Handy_Stephan watchdog Handy_Stephan:present 00:01 Handy_Stephan:absent { fhem("set Funkschalter2 on");;fhem("set watchdog_Anwesenheit_Handy_Stephan defined")}
attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1
Wenn der eintrag Handy_Stephan:present kommt, dann wartet er 1 Minute lang, ob er noch immer "present" ist (und nicht "absent) und schaltet dann den Funkschalter ein.
Viele Grüße
Markus
Hi,
okay,
a) was bewirkt das zweite Attribut "attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1"
b) wie schreibt man sowas, wenn man sagen will:
"Wenn der Status x ist, und nicht *irgendwas*, dann tue ..." ?
In diesem Beispiel gibt es ja nur zwei Stati, present, oder absent.
Danke!
Stephan
Zitat von: abc2006 schrieb am Do, 18 April 2013 19:39Hi,
okay,
a) was bewirkt das zweite Attribut "attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1"
Das der Watchdog innerhalb dieser 1 Minuten-Frist nicht nochmal von vorne die 1 Minute zählt, falls innerhalb dieser Frist ein weiteres Event "Handy_Stephan:present" eintrifft.
Zitatb) wie schreibt man sowas, wenn man sagen will:
"Wenn der Status x ist, und nicht *irgendwas*, dann tue ..." ?
In diesem Beispiel gibt es ja nur zwei Stati, present, oder absent.
Danke!
Stephan
Das ist dann ein klassisches notify:
define Anwesenheit_Handy_Stephan notify Handy_Stephan:present set Funkschalter2 on
Viele Grüße
Markus
ich habe jetzt in meiner fhem.cfg stehen
define watchdog_Anwesenheit_Handy_Stephan watchdog Handy_Stephan:present 00:01 Handy_Stephan:absent { fhem("set FHT80B3_BUERO desired-temp 22.5");;}
attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1
define watchdog_Abwesenheit_Handy_Stephan watchdog Handy_Stephan:absent 00:01 Handy_Stephan:present { fhem("set FHT80B3_BUERO desired-temp 17.5");;}
attr watchdog_Abwesenheit_Handy_Stephan regexp1WontReactivate 1
Wenn ich am Handy WLAN deaktiviere, schaltet FHEM wie gewünscht auf "absence" und setzt die Temperatur auf 17.5. Wenn ich WLAN wieder aktiviere, schaltet FHEM auch auf present, aber ändert die Temperatur nicht (auf 22,5). Ich habs Zeichen für Zeichen verglichen, aber es ist doch gleich? Hab ich was übersehen? Oder gibt es einen anderen Grund?
Danke
Stephan
define watchdog_Anwesenheit_Handy_Stephan watchdog Handy_Stephan:present 00:01 Handy_Stephan:absent { fhem("set FHT80B3_BUERO desired-temp 22.5");;}
attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1
Verstehe ich nicht, was soll das im einzelnen machen soll.
ICH würde das so machen:
define watchdog_Anwesenheit_Handy_Stephan at *00:05:00 {if (Value("Handy_Stephan") eq "present" { fhem("set FHT80B3_BUERO desired-temp 22.5")} else { fhem("set FHT80B3_BUERO desired-temp 16")} }
Nicht vergessen das FHT mit
attr FHT80B3_BUERO lazy
zu versehen, sonst gibt's Ruck Zuck LOVF Probleme.
Hallo Stephan,
Bitte vergiss nicht die watchdogs wie in meinem Beispiel oben angegeben mit "setstate <name> defined" wieder scharf zu schalten. Sonst schalten diese nur einmal.
Viele Grüße
Markus
Hallo Zrrronggg! ,
Zitatdefine watchdog_Anwesenheit_Handy_Stephan at *00:05:00 {if (Value("Handy_Stephan") eq "present" { fhem("set FHT80B3_BUERO desired-temp 22.5")} else { fhem("set FHT80B3_BUERO desired-temp 16")} }
Ich nehme an, dass du mit dem Code alle 5 Minuten auf "present" prüfen möchtest? Müsste es da in der at Anweisung nicht +*00:05:00 heißen?
Gruß
Wolle
ZitatIch nehme an, dass du mit dem Code alle 5 Minuten auf "present" prüfen möchtest? Müsste es da in der at Anweisung nicht +*00:05:00 heißen?
Ja, korrekt, thx.
Hi,
ich habe jetzt meinen Code durch deinen ersetzt. Zuverlässig schalten tut die Fritzbox bzw. FHEM aber nicht. Woran könnte das jetzt noch liegen?
Wenn ihr Infos von mir braucht, sagt, welche.
Danke und lg
stephan
Muss da nicht noch ein "setstate watchdog_Anwesenheit_Handy_Stephan defined" angefügt werden?
Probiere es mal mit:
define watchdog_Anwesenheit_Handy_Stephan at +*00:05:00 {if (Value("Handy_Stephan") eq "present" { fhem("set FHT80B3_BUERO desired-temp 22.5")} else { fhem("set FHT80B3_BUERO desired-temp 16")} };; setstate watchdog_Anwesenheit_Handy_Stephan defined
Ohne Gewähr ;-)
Hi,
Frage a): Was macht das setstate defined? Momentan hab ich das Problem, dass ich den Code nicht verstehe und daher keine Fehler finde.
Frage b) Du schreibst hinter das statement ";;". Zronggg schreibt nirgendwo ";;". Ich würde ";;" hinter den Perl-Code, aber vor die letzte "}" schreiben. Wo bzw. wie ist es richtig?
Frage c) ich habe den Abschnitt in die fhem.cfg kopiert, konkret geht es um den teil mit [...]fhem("set irgendwas")[...] Das habe ich dann übers Webfrontend geändert ( auf "DEF" klicken). nun steht da [...] fhem set irgendwas on[...]. Sind die runden Klammern überflüssig/notwendig/falsch?
Danke
Stephan
ZitatIch würde ";;" hinter den Perl-Code, aber vor die letzte "}" schreiben.
Das ist definitiv nicht notwendig. Ich hole mal ein bisschen aus.
Das Semikolon trennt mehrere FHEM Kommandos ab, das DOPPELTE Semikolon "escaped" das Semicolon im PERLteil eines FHEM Kommandos, da EIN Semikolon von PERL als Code interpretiert wird. Das zweite Semikolon bleibt dann quasi übrig in der Funktion als Trenner.
Zur Verdeutlichung:
FHEM Commandozeilen gehen so:
commando 1 ; commando 2
Wenn Sachen machen will die FHEM nicht kann, PERL aber wohl (z.b. IF-Abfragen) dann sagt man FHEM, dass bestimmter Code PERL sei. Nämlich in dem man diesen Code in geschweiften Klammern schreibt:
fhemirgnedwas { Hier steht alles PERL Code drin }
Wenn man nun INNERHALB von PERL Code doch wieder FHEM Kommandos abgeben will (und das will man ja in der Regel) dann muss man PERL mitteilen, das bestimmter Code an FHEM zurückgegeben werden soll. Das macht man durch
{ fhem("... ") }
Wenn man nun innerhalb dieses FHEM Codes (der innerhalb PERL Codes liegt) mehrere Kommandos reihen will, muss man die - wie bei FHEM üblich- per Semikolon abtrennen... und da PERL das Semikolon verschlucken würde, muss man ZWEI Semikolons schreiben... aber immer nur zur Abtrennung von FHEM Kommandos.
Die Struktur gemischter Dinge ist dabei oft
fhemirgendwas {PERLirgendwas { fhem("kommando1 ;; kommando 2 ") }}
z.b.
define test at *04:00:00 {(Value("Handy_Stephan") eq "present" { fhem("set Licht1 on ;; set Licht2 on ") }}
Daraus ergibt sich:
1. nach dem letzten FHEM Kommando muss kein Abtrennzeichen, weil kein weiteres Element der Aufzählung folgt.
Es ist weder erforderlich in FHEM zu schreiben:
set Licht1 on; set Licht 2 on;
noch
define test at *04:00:00 {if (Value("Handy_Stephan") eq "present" { fhem("set Licht1 on ;; set Licht2 on ;; ") }}
und erst recht nicht
define test at *04:00:00 {(Value("Handy_Stephan") eq "present" { fhem("set Licht1 on ;; set Licht2 on ");; }}
Zum Glück machen die Zeichen aber auch meistens nix, sodass Code noch funktioniert wenn man sie überflüssigerweise einfügt.
2. Ebenfalls sehr häufig sieht man hier in letzter Zeit Code, der so aufgebaut ist:
define test at *04:00:00 { fhem("set Licht1 on ;; set Licht2 on ") }
oder so:
define test at *04:00:00 { fhem("set Licht1 on") } ;; { fhem("set Licht2 on") }
Beides ist komplett überflüssig, da hier durch die
"{"
Klammer gesagt wird: Es kommt jetzt PERL (obwohl mit PERL weiter nichts gemacht wird) nur um PERL dann sofort mit
fhem("
zu sagen: und jetzt kommen nur FHEM Kommandos. Noch weniger notwendig ist das Vorgehen des 2.Beispiels, nämlich mehre FHEM Komandos einzeln in PERL einzukapseln.
Es bleibt die Frage: Wir kommt das alles. wieso machen das viele hier?
Ich sehe da mehrere Gründe.
Zum ersten ist hier viel Cargo-Cult Programming zu sehen. (kann man in Wikipedia nachlesen)
D.H. Leute haben irgendwo gesehen, dass was bestimmtes funktioniert und schreiben das ab bzw. verändern dass, ohne eigentlich zu verstehen was welche Elemente bedeuten.
Zum Glück ist FHEM recht robust, sodass viel Kram tatsächlich funktioniert, auch wenn man überflüssiges reinschreibt oder seltsam formatiert oder Abtrennungen nach dem letzten Element einer Kette einfügt etc.
Der Nächste glaubt dann, der Code funktioniere nicht TROTZ dieser überflüssigen Konstrukte sondern WEGEN dieser Konstrukte und baut das bei sich auch ein, im Glauben das müsse so.
En anderer Grund ist, das Leute vorhandenen Beispielcode vereinfachen .
Wer z.b.
define test at *04:00:00 {if irgendwas { fhem("set Licht1 on ;; set Licht2 on") }}
als Beispiel findet und sich sagt: "Ach, die IF Abfrage brauche ich eigentlich nicht" wird den Ausdruck dann zu
define test at *04:00:00 { fhem("set Licht1 on ;; set Licht2 on") }
vereinfachen... und siehe da: geht auch. Habe ich z.b. am anfang viel so gemacht.
Das hier eigentlich
define test at *04:00:00 set Licht1 on ;; set Licht2 on
richtig sein würde, wird einem erst später klar.
So ist das Semikolon am Ende einer Befehlskette z.b. ein Artefakt aus der strukturierten Schreibweise, in der tatsächlich Zeilen berechtigterweise mit einem Semikolon (oder 2) ENDEN, aber eben nur, wenn in der nächsten Zeile weitere Befehle kommen.
Lange rede kein Sinn: die ";;" am Ende sind überflüssig!
Das hast Du sehr gut erklärt, ich werde versuchen es zu verinnerlichen (daumenhoch)
Hi Zrrronggg,
Danke für die ausführliche Erklärung. Das Beispiel
Zitatfhemirgendwas {PERLirgendwas { fhem("kommando1 ;; kommando 2 ") }}
finde ich super! hierbei erkennt man ( bzw. ich) mal genau, was wohin gehört.
Zitatund schreiben das ab bzw. verändern dass, ohne eigentlich zu verstehen was welche Elemente bedeuten.
Genau das ist gerade mein Problem! Aber wenn ich jetzt weiss, wie es richtig sein muss, kann ich ja mithelfen, die Beispiele zu korrigieren:-)
Danke für die ausführliche erklärung, vielleicht willst du ja deinen Post einfach mal so als Programmiererklärung im Wiki veröffentlichen?
konkret zum Problem:
Das hier
define watchdog_Anwesenheit watchdog Handy_Stephan:absent 00:00:10 Handy_Stephan:present { fhem "set K5_BAD_LICHT_SPIEGEL toggle";; fhem "setstate watchdog_Anwesenheit defined";;}
attr watchdog_Anwesenheit regexp1WontReactivate 1
müsste eigentlich heissen
define watchdog_Anwesenheit watchdog Handy_Stephan:absent 00:00:10 Handy_Stephan:present set K5_BAD_LICHT_SPIEGEL toggle; setstate watchdog_Anwesenheit defined
attr watchdog_Anwesenheit regexp1WontReactivate 1
ja ?
zu deinem Beitrag: Muss es nicht eigentlich nur ein semikolon zwischen den set-Befehlen sein:? ( und ein plus bei dem at)
ZitatDas hier eigentlich
define test at +*04:00:00 set Licht1 on ; set Licht2 on
richtig sein würde, wird einem erst später klar.
und das ganze kann man dann noch weiter vereinfachen xD:
define test at +*04:00:00 set Licht1,Licht2 on
lg
stephan
Zitatmüsste eigentlich heissen
Code: [alles markieren] [anzeigen/verstecken]
define watchdog_Anwesenheit watchdog Handy_Stephan:absent 00:00:10 Handy_Stephan:present set K5_BAD_LICHT_SPIEGEL toggle; setstate watchdog_Anwesenheit defined
attr watchdog_Anwesenheit regexp1WontReactivate 1
ja ?
Ich denke ja, bin mir aber nicht ganz sicher ich kenne mich mit der Watchdogformulierung nicht gut genug aus, das ist einer
meiner Blind-Spots :-)
Zitatzu deinem Beitrag: Muss es nicht eigentlich nur ein semikolon zwischen den set-Befehlen sein:? ( und ein plus bei dem at)
Zitat:
Das hier eigentlich
define test at +*04:00:00 set Licht1 on ; set Licht2 on
Gute Frage...
1. ein Plus bei dem at kann muss aber nicht, man muss eben wissen was man will.
*04:00:00 = jeden Morgen um 4 Uhr
+*04:00:00 = in 4Stunden und dann alle 4 stunden
+04:00:00 = 1x in 4 Stunden
04:00:00 = das nächste mal um 4 Uhr morgens
2. Nur ein Semikolon: hier habe ich auch eine kleine Lücke. An sich hast du recht, ich habe aber bemerkt, dass es FHEM Kommandos zu geben scheint, ein denen aus irgendeinem Grunde doch zwei Semikolon notwendig sind.
Dies hier funktioniert z.B. nur mit 2 Semikolons:
define act_on_ANLAGE_SCHARF_dimup notify ANLAGE_SCHARF:dimup set ANLAGE_SCHARF on ;; set Scharfanzeige1 on
Ich habe noch nicht genau durchdrungen warum, und gehe davon aus, dass "ANLAGE_SCHARF:dimup" eine verdeckte IF-Bedingung ist und die das irgendwie zur Folge hat. Da bin ich aber selber in genau der selben Lage wie du: Ich weiss es nicht und mache was geht: Du siehst, meine Kenntnisse haben auch Grenzen. (und deswegen scheue ich mich auch Wikiartikel dazu zu schreiben. Wenn ich verstanden habe, warum man auch bei FHEM manchmal escapen muss, dann schreibe ich den Wikiartikel, okay?)
Übrigens kann es genau deswegen sein, dass dein watchdog doch
define watchdog_Anwesenheit watchdog Handy_Stephan:absent 00:00:10 Handy_Stephan:present set K5_BAD_LICHT_SPIEGEL toggle;; setstate watchdog_Anwesenheit defined
heissen muss.
Zitatund das ganze kann man dann noch weiter vereinfachen xD:
define test at +*04:00:00 set Licht1,Licht2 on
Ja, aber nur weil ich mein Beispiel unglücklicherweise so wenig verallgemeinernd gewählt habe, das die beiden FHEM Kommandos hier gleich sind nämlich "set irgendwas on".
Wenn also ein Mitleser meine Verständnislücke schliessen kann, wäre ich dankbar, und ich schreibe einen Wikiartikel. Hier müsste Rudolf vielleicht mal einen Satz sagen.
Hi, nochmal back to topic:
Zitat von: Zrrronggg! schrieb am Di, 23 April 2013 10:59
ICH würde das so machen:
[code]define watchdog_Anwesenheit_Handy_Stephan at *00:05:00 {if (Value("Handy_Stephan") eq "present" { fhem("set FHT80B3_BUERO desired-temp 22.5")} else { fhem("set FHT80B3_BUERO desired-temp 16")} }
wenn ich nach Hause komme, schaltet das FHT auf 22,5°. Jetzt möchte ich aber aus irgendwelchen Gründen die Temperatur nur auf 21° haben. Der obige Befehl schaltet aber alle 5 minuten wieder auf 22.5.
Gibt es bereits eine Lösung, wie ich erkenne, ob die Temperatur manuell geändert wurde und die dann so zu lassen? Oder wir habt Ihr dieses Problem gelöst?
danke und lg ( aus der kalten Wohnung ;-)
Stephan
Wegen des 5 Minutenintervalls solltest du das obige unbedingt mit dem Attr Lazymode versehen, sonst hast du sowieso Ruckzuck ein Problem mit LOVF... aber das hilft dir nicht.
Dein Problem ist prinzipiell das Kernproblem einer vollautomatischen Heizungsteuerung. So richtig Richtig kann man das nicht umgehen. Entweder FHEM regelt die Heizung nach diversen Parametern oder die Wetware macht's. Meine Frau mosert auch öfters, wegen der selben Effekte.
Man könnte sich aber einiges an Hilfskonstrukten überlegen, um die Sache zu entschärfen.
Grobe Ideen:
Du merkst dir irgendwie, dass die Temperatur schonmal hochgeregelt wurde und änderst sie dann nur, wenn der Status sich von anwesend auf abwesend ändert. (bzw umgekehrt)
Ich hab das jetzt nicht wirklich super durchdacht und skitziere das jetzt so, wie es mir gerade einfällt, die Lösung ist daher sicher weder besonders elegant noch getestet.
Erstmal einen Dummy anlegen
define dummy "Heizungskontrolle"
Den befüllst du dann mit dem Watchdog:
define watchdog_Anwesenheit_Handy_Stephan at *00:05:00 {if (Value("Handy_Stephan") eq "present" { fhem("set FHT80B3_BUERO desired-temp 22.5 ;; set Heizungskontrolle warm")} else { fhem("set FHT80B3_BUERO desired-temp 16 ;; set Heizungskontrolle kalt")} }
Dann baust du in deinen Code noch eine Abfrage nach dem Zustand dieses Dummys ein. Grob so:
define watchdog_Anwesenheit_Handy_Stephan at *00:05:00 {if (Value("Handy_Stephan") eq "present" && Value("Heizungskontrolle") ne "warm" ...
Dann würde die Temperatur nur geändert, wenn sie vorher auf "kalt" stand.
Problem dabei ist die ELSE Bedingung, die dann auch bei Anwesenheit zuschlagen würde.. Man wird also deinen Watchdog aufspalten müssen:
define watchdog_Anwesenheit_Handy_Stephan at *00:05:00 {if (Value("Handy_Stephan") eq "present" && Value("Heizungskontrolle") ne "warm" { fhem("set FHT80B3_BUERO desired-temp 22.5 ;; set Heizungskontrolle warm")}}
define watchdog_Abwesenheit_Handy_Stephan at *00:05:00 {if (Value("Handy_Stephan") ne "present" && Value("Heizungskontrolle") ne "kalt" { fhem("set FHT80B3_BUERO desired-temp 16 ;; set Heizungskontrolle kalt")} }
Ohne getestet zu haben sollte das jetzt dazu führen, das wenn die Anwesenheit z.b. von abwesend auf anwesenheit wechselt ,die Heizung genau 1x auf 22,5 geregelt wird. Wenn du die dann lokal danach auf andere Werte stellst, wird die nicht mehr auf 22,5 gestellt, weil ja das Dummy Heizungskontrolle immer noch "warm" ist.
Genau so umgekehrt.
Die beiden Watchdogs ließen sich in einen zusammenfassen, dann hätte man aber verschaltelte elsif-Geschichten, die ein bisschen schwieriger zu debuggen sind. Wenn das deinen Ansprächen genügt und auch funktioniert, können wir das im nächsten Schritt machen.
Mit dem Konstrukt lisse sich auch noch mehr machen. Du könntest mit mehreren Watchdogs auch unterschiedliche Heizlevel realisieren. Dazu würdest du dir einen (Web)Schalter bauen, der das dummy Heizungskontrolle mit diversen Werten befüllt. Z.B "warm" "heiss" "kalt" "Urlaub"
Und je nach dem welchen Wert das hat stellst du dann auf 22, oder 25 oder 16 oder 8 Grad ein.
Ein andere Idee wäre eventuell, mit "old value" zu arbeiten und zu sehen, ob der 16 Grad war. Da bin ich Zusammenhang mir FHT und desired-temp nicht firm.