Meine Situation:
Ich habe einen Dummy gebaut, auf dessen Statusänderung ich ein Notify gesetzt habe. Wenn dieser nun triggert, werden mehrere Befehle ausgeführt, mitunter auch 2 "at" Kommandos. Soweit so gut.
Aber wie unterscheidet fhem die Befehle die durch das Notify ausgelöst werden sollen und die, welche dem "at" Kommando hinzugefügt werden wenn ich hier auch mehrere vergeben möchte?
Anbei ein Beispielcode wie ich ihn momentan nutze:
define not_shut50 notify dummy_xbmc_shut50:start\
delete xbmc1_shut;;\
delete xbmc2_shut;;\
define xbmc1_shut at +00:50:00 set xbmc1 shutdown;;\
define xbmc2_shut at +00:55:00 set xbmc2 shutdown;;\
set xbmc1 msg Shutdowntimer "Shutdown in 50 Minuten" 20 info;;\
set xbmc2 msg Shutdowntimer "Shutdown in 55 Minuten" 20 info;;\
attr xbmc1_shut room Schlafzimmer;;\
attr xbmc2_shut room Wohnzimmer;;\
attr xbmc1_shut group XBMC_Timer;;\
attr xbmc2_shut group XBMC_Timer
Und hier mein Code wie ich ihn haben möchte (der fett gedruckte Teil ist dazu gekommen und soll erst ausgeführt werden, wenn das at Kommando greift)
define not_shut50 notify dummy_xbmc_shut50:start\
delete xbmc1_shut;;\
delete xbmc2_shut;;\
define xbmc1_shut at +00:50:00 set xbmc1 shutdown;;[b]set dummy_xbmc_shut50 halfdone;;[/b]\
define xbmc2_shut at +00:55:00 set xbmc2 shutdown;;[b]set dummy_xbmc_shut50 done;;[/b]\
set xbmc1 msg Shutdowntimer "Shutdown in 50 Minuten" 20 info;;\
set xbmc2 msg Shutdowntimer "Shutdown in 55 Minuten" 20 info;;\
attr xbmc1_shut room Schlafzimmer;;\
attr xbmc2_shut room Wohnzimmer;;\
attr xbmc1_shut group XBMC_Timer;;\
attr xbmc2_shut group XBMC_Timer
Ich hoffe ich habe meine Situation verstädnlich ausgedrückt.
???
Mal davon abgesehen, dass du nicht in der fhem.cfg rumwerkeln sollst (dein notify findest du unter Unsorted => notifies wieder, da kannst auf DEF klicken und direkt das Notify bearbeiten)
Was willst du wissen?
Funktioniert etwas nicht?
Oder klappt alles und du willst wissen warum?
Als ich in der DEF den Notify das erste mal geändert habe, hatte ich das Phänomen, dass er alles nach dem ersten "at" Befehl auch in diesen gepackt hat. Der DEF Part des at Befehls sah dann so aus (ich beziehe mich auf mein erstes Codebeispiel, ohne die Dummystatusänderung):
+00:50:00 set xbmc1 shutdown;;define xbmc2_shut at +00:55:00 set xbmc2 shutdown;;set xbmc1 msg Shutdowntimer "Shutdown in 50 Minuten" 20 info;;set xbmc2 msg Shutdowntimer "Shutdown in 55 Minuten" 20 info;;attr xbmc1_shut room Schlafzimmer;;attr xbmc2_shut room Wohnzimmer;;attr xbmc1_shut group XBMC_Timer;;attr xbmc2_shut group XBMC_Timer
Komischerweise hat er dies nicht getan, als ich den gesamtem Befehl das erste Mal eingekippt habe (sowohl über Web als auch direkt in der Datei). Daher kommt nämlich auch meiner Verwirrung und dieser Thread. ;)
Hier noch mal die DEF Zeilen der at Kommandos ohne, dass ich in der DEF editiert habe:
+00:50:00 set xbmc1 shutdown
+00:55:00 set xbmc2 shutdown
Meine Frage stelle ich ein mal, weil ich ein at Kommando mit mehreren Befehlen aufgrund eines Notifys definieren will und weil ich gerne verstehen will wie notify und at in solch einer Konstellation zusammenarbeiten. :)
Ich arbeite übrigens fast immer über die Weboberfläche. Die Datei editiere ich nur wegen Kommentarzeilen und in Troubleshootingfällen wie diesem.
Ok,
du willst also wissen, wenn du viele at und notify in ein einziges Konstrukt steckst, woher fhem dann weiß, was jetzt wozu gehört?
Sehe ich das richtig?
Da kann ich dir leider nicht weiterhelfen. Ich mache das immer einzeln. Ein kleines Blatt Papier, da drauf die at, notify und watchdogs, und ab geht die Post.
PS: schicke dir in Kürze ne PN
Zitat von: Rince am 16 Februar 2014, 15:42:45
Ok,
du willst also wissen, wenn du viele at und notify in ein einziges Konstrukt steckst, woher fhem dann weiß, was jetzt wozu gehört?
Sehe ich das richtig?
Genau das möchte ich wissen. Super zusammengefasst. :)
Jetzt haben wir uns verstanden ;)
Ich würde den fett gedruckten Teil in ein eigenes Notify stecken.
Es gibt keinen Grund, warum es unbedingt innerhalb des einen Notifies stehen muss.
Ist das keine akzeptable Lösung?
Wenn du viele solcher Konstrukte hast, bleibst du so prinzipiell flexibler. In dem Beispiel was ich dir geschickt habe, schau dir mal das mit der Temperatur Sprachausgabe an. Vor allem die Vorbemerkung dazu ;)
Hallo,
für sowas benutze ich immer "trigger".
Beispiel von mir zuhause:
Ich habe an der Haustüre einen Sender über dem ich meiner Steuerung mitteile wenn ich arbeiten gehen.
Nach dem drücken dieses Senders werden einige at angelegt die dann ihrerseits jeweils ein notify triggern.
define arbeiten notify Arbeiten:toggle.* {
fhem("define Licht_aus_1 at +00:02:00 trigger Licht_aus_arbeiten");
fhem("define Garage_zu_1 at +00:05:00 trigger Garage_zu_arbeiten");
fhem("define Heizung_runter_1 at +00:10:00 trigger Heizung_runter_arbeiten");
}
Dieses notify "lauscht" darauf das der Sender gedrückt wird - in FHEM heisst der Arbeiten und sendet ein toggle.
Sobald dieser gedrückt wird werden 3 at erzeugt die dann die jeweiligen notify triggern.
define Licht_aus_arbeiten notify Licht_aus_arbeiten {
fhem("set Esszimmer_Licht off");
fhem("define Eingang_Licht_innen_Aus_morgens at +00:00:05 set Eingang_Licht_innen off");
fhem("define Eingang_Licht_aussen_Aus_morgens at +00:00:20 set Eingang_Licht_aussen off");
}
define Garage_zu_arbeiten notify Garage_zu_arbeiten {
fhem("set Garage_Licht off");
fhem("define Garage_zu_1 at +00:00:05 set Garage off");
}
define Heizung_runter_arbeiten notify Heizung_runter_arbeiten {
fhem("set Wohnzimmer_Heizung desired-temp 20.0");
fhem("set EG_Gaeste_WC_Heizung desired-temp 19.5");
fhem("define Heizung_Kueche_spater1 at +00:05:00 set EG_Kueche_Heizung desired-temp 18.0");
}
Die notify existieren immer (logischerweise und zum Glück ;D ).
Die at werden nur erzeugt wenn benötigt.
Ja ich weiß das sieht kompliziert aus und der eine oder andere bekommt ob des Codes sicher "Augenkrebs" aber das sind noch "Altlasten" aus meiner Anfangszeit mit FHEM 8)
Bei Heizung_runter_arbeiten muss ich noch irgendwann mal die Abfrage der Uhrzeit einbauen.
Wenn ich Pikett habe und ich muss in der Nacht raus brauch ich meine CUNO nicht stressen und unnötigerweise die desired-temp runter fahren.
Grüße
Zitat von: siggi85 am 16 Februar 2014, 16:04:05
Genau das möchte ich wissen. Super zusammengefasst. :)
Die Verwirrung, die hier immer wieder kursiert, ist der fehlenden Klammernhierarchie in FHEM geschuldet. Stattdessen wird hier das Trennzeichen Semikolon für jede tiefere Ebene verdoppelt. Um die Verwirrung komplett zu machen verdoppelt der DEF-Editor intern auch jedes Semikolon, bevor er es in die cfg-Datei schreibt, welches aus der Kommandozeile zuvor entfernt wurde. ???
Bsp.: (Eingabe in der Kommandozeile)
define a_test at +00:30 set lampe1 on; set lampe2 on
hier gehört "set lampe1 on" zu a_test, lampe2 wird sofort ausgeführt.
bei:
define a_test at +00:30 set lampe1 on;; set lampe2 on
wird lampe1 und lampe 2 erst 30 Minuten später geschaltet, weil beide zu at gehören
im DEF-Editor siehst du dagegen nur ein Semikolon, weil der Editor das eine Semikolon "benutzerfreundlich" entfernt und bei modify save in der cfg-Datei wieder verdoppelt.
also
+00:30 set lampe1 on; set lampe2 on
willst du dagegen noch einen zweiten define in deinem ersten unterbringen, der mehrere Kommandos schaltet, musst du die Semikolons weiter verdoppeln. Am besten machst du das direkt im DEF-Editor, sonst kommst du aus dem Semikolon-Zählen nicht mehr raus.
+00:30 set lampe1 on;define a_test2 at +40:00 set lampe2 on;;set lampe3 on
in der cfg-Datei steht dagegen bereits:
define a_test at +00:30 set lampe1 on;;define a_test2 at +40:00 set lampe2 on;;;;set lampe3 on
Auch in der Kommandozeile müsstest du es bereit mit vier Semikolons eingeben.
Wenn du Perl in geschweiften Klammern im zweiten define unterbringen wolltest, z. B. in Verbindung mit if, müsstest du die Semikolons für lampe2 und lampe3 schon in der DEF-Zeile vervierfachen (in der cfg stehen dann bereits acht!).
Und so geht das Spiel immer weiter: nächste Ebene acht, sechzehn ... usw.
Ich persönlich hätte so etwas mit Klammern gelöst, wie in meinem IF-Befehl, dort kommt das Trennzeichen immer nur einmal vor und die Ebenen werden in Klammern gepackt.
In diesem Sinne...
Gruß
Damian
Also die Lösung von Puschel74 baut weitere Notifys die quasi wie eine Subroutine funktionieren. Interessanter Ansatz, gerade wenn ggf. mehrere Schalter die gleichen Folgen haben sollen und man die Schalter unter kein funktioniereden RegEx im Notifiy Pattern bekommt.
Die Lösung die am ehesten mit meinem Code umzusetzen ist, scheinen die Semikolons zu sein(Klammern hatten nicht funktioniert, daher habe ich dann hier gefragt ;) ). Nun ist mir auch endlich mal die Bedeutung der Doppelsimikolons etwas bewusster geworden.
Mal schauen ob ich heute noch dazu komme, aber mit den Infos sollte ich es demnächst hinbekommen. Falls nicht weiß ich ja wo ich mich wieder melden werde. :)
Vielen Dank auf jeden Fall an alle die mich wieder etwas klüger gemacht haben. :D
Zitat von: siggi85 am 16 Februar 2014, 17:38:23
Klammern hatten nicht funktioniert, daher habe ich dann hier gefragt ;)
Wie denn auch, wenn es die an dieser Stelle in FHEM nicht gibt - deswegen meinte ich auch fehlende Klammernhierarchie.
Dazu müsste man den FHEM-Befehlen at, notify und Co. Klammern erst mal beibringen.
So etwas würde sofort jeder verstehen:
define a_test at +00:30 (set lampe1 on;define a_test2 at +40:00 (set lampe2 on;set lampe3 on))
Aber bitte nicht ausprobieren, da es
nicht funktioniert.
Gruß
Damian