Hallo zusammen,
ich würde gerne beim Wechsel eines dummys von on auf off bzw. von off auf on einmalig mehrere Befehle ausführen. Wichtig ist dabei das ausschließlich beim Flankenwechsel diese Befehle ausgeführt werden.
Folgende Befehle sollen z.B. ausgeführt werden:
set Rollo1 pos 70
set Heizung RTS 17
Würde ein notify ausschließich auf den Wechsel reagieren und wie würde der Code dann aussehen. Hatte es wie folgt getestet:
define NF_Modus_On notify Switch:state:on {fhem(set Rollo1 pos 70) ;; fhem(set Heizung RTS 17)}
Dabei werden mir jedoch syntax-Fehler angezeigt.
Da du reine FHEM-Befehle ausführst, ist kein perl notwendig. Auch ,,state" im Event ist fehl am Platz.
Was für einen Fehler bekommst du denn?
...und
Zitatdas ausschließlich beim Flankenwechsel diese Befehle ausgeführt werden.
müsste mit dem Attribut event-on-change-reading beim Dummy funktionieren.
meiner Meinung fehlen die die Hochkomma.
versuch einmal:
define NF_Modus_On notify Switch:state:on {fhem("set Rollo1 pos 70") ;; fhem("set Heizung RTS 17")}
Zitat von: didi-fritz am 30 Dezember 2017, 17:26:59
meiner Meinung fehlen die die Hochkomma.
versuch einmal:
define NF_Modus_On notify Switch:state:on {fhem("set Rollo1 pos 70") ;; fhem("set Heizung RTS 17")}
Brauch man nicht versuchen. Das kann auch nicht funktionieren.
define NF_Modus_On notify Switch.on set Rollo1 pos 70; set Heizung RTS 17
Und bitte noch mal lesen wie das mit Notify funktioniert.
Ich glaube es müsste
define NF_Modus_On notify Switch:on set Rollo1 pos 70 ;; set Heizung RTS 17
heissen.
Siehe auch hier:
https://wiki.fhem.de/wiki/Trick_der_Woche#Mehrere_Ger.C3.A4te_zugleich_schalten
Ansonsten kleiner Exkurs:
{ ... } = FHEM mitteilen, dass alles was in den geschweiften Klammern steht, an perl übergeben werden soll
fhem(" ... ") = perl sagen, das alles was zwischen den Anführungszeichen an FHEM übergeben werden soll.
Dieses oft gesehen Konstrukt:
{fhem(" xy ")}
bewirkt also nichts anderes als:
"FHEM soll bitte perl sagen, perl möge doch FHEM sagen, xy zu machen. "
Klingt bescheuert?
Yep.
Obwohl es funktioniert.
Daher würde:
define NF_Modus_On notify Switch.on {fhem("set Rollo1 pos 70") ;; fhem("set Heizung RTS 17")}
tatsächlich funktionieren, ist eben nur eine besonders komplizierte Variante von
define NF_Modus_On notify Switch.on set Rollo1 pos 70 ;; set Heizung RTS 17
Auch gerne genommen wird:
define NF_Modus_On notify Switch.on {fhem("set Rollo1 pos 70 ;; set Heizung RTS 17")}
Etwas weniger blöd, aber immer noch überflüssig. Die Konstruktion
{fhem(" xy ")}
braucht man nur, wenn perl auch was macht.
Das sah dann so aus:
define irgendwas {Eine Operation mit perl, die FHEM nicht alleine kann {fhem(" xy ")} }
Beispiel:
define nacht_WE_aus at *02:59:00 {if ($we) {fhem ("set brenner off")} }
Hier wird um 2:59 mit dem perl Befehl "if" getestet, ob es Wochenende ist und nur falls ja wird FHEM mitgeteilt, dass der Aktor "Brenner" ausgeschaltet werden soll.
Allerdings könnte man dafür aktuell auch den FHEM Befehl "DOIF" verwenden, den gab's aber in der Anfangsphase von FHEM noch nicht.
Nochwas: Beschränkung auf Zustandswechsel lässt sich auf diversen Wegen erreichen.
- anstatt notify DOIF benutzen, das hat - soweit ich mich erinnere - als Default, dass nur die erste Auslösung triggert.
- weiteres dummy anlegen, das bei der ersten Schaltung mit einem Wert belegt wird, diesen bei nachfolgenden Schaltungen abfragen (z.b. mit perl if)(GrundsätzlicherAufbau so einer Prüfung z.b. so ähnlich wie hier: https://wiki.fhem.de/wiki/Trick_der_Woche#Funklast_reduzieren)
- vor Schaltung prüfen ob der Zielzustand nicht schon erreicht ist, also die nicht Rollo1 schon auf pos 70 ist (was ggf ja bedeutet, das schonmal geschaltet wurde.)
- das geschilderte Attribut müsste auch gehen.
- es gib auch einen Befehl, den VORHERIGEN Wert abzufragen, ich hab aber gerade vergessen wie der hiess ... OldValue(...) glaube ich.
kleine Korrektur
Zitatfhem(" ... ") = perl sagen, das alles was zwischen den Anführungszeichen an FHEM übergeben werden soll.
stimmt nicht. Es müsste heißen:
fhem( ... ) = perl sagen, das alles was in den Klammern steht an FHEM übergeben werden soll. Es kann nämlich auch der Inhalt v. Variablen sein.
(Und selbst das ist noch falsch, denn in Perl lässt sich eine Funktion, und der Befehl ist nichts anderes als der Aufruf der Funktion
fhem , auch ohne geklammerte Parameter aufrufen)
(Natürlich. Du hast aber schon gesehen, dass ich versucht habe das möglichst simple für Leute zu erklären, die offenbar die Benutzung von perl im Zusammenhang mit FHEM komplett nicht durchdrungen haben und dass ich es deswegen stark vereinfacht habe? Es ging ja um die konkrete Benutzung, also wie darkon und didi-fritz die perl aufrufe eingesetzt haben. Und die übergaben keine Variablen.)
Bei mir geht es nur so : define Lita_an notify Hue_Bewegungsmelder:motion {fhem ("set Pflanzkuebel_Lampen on-for-timer 122") ; fhem ("set HUEDevice9 on-for-timer 122")}
Alles andere habe ich durch brobiert, funktionieren tut es aber nur so wie oben.
kann man glauben, muss man aber nicht...
define Lita_an notify Hue_Bewegungsmelder:motion set Pflanzkuebel_Lampen,HUEDevice9 on-for-timer 122
Wenn das nicht funktioniert, würde mich die Fehlermeldung im Logfile interessieren.
Danke, werde es nachher mal testen mit Komma. Ich denke aber das habe ich bei meinen vielen Versuchen auch dabei gehabt.
Schaun mer mal.
Wenn wir schon dabei sind, kann man das:
define Pflanzkuebel_an at *([{sunset(-300,"16:00","22:00")}]) { fhem ("set Pflanzkuebel on"); sleep 5; fhem ("set Pflanzkuebel_Lampen off"); }
;)
auch einfacher gestalten?
Berichte dann nachher wenn es Dunkel ist ob es geklappt hat.
Danke
notify ([{sunset(-300,"16:00","22:00")}])
irgendwas hab ich wohl verpasst... *grübel*
Zitat von: Badflex am 13 September 2022, 17:22:59
Wenn wir schon dabei sind, kann man das:
define Pflanzkuebel_an notify ([{sunset(-300,"16:00","22:00")}]) { fhem ("set Pflanzkuebel on"); sleep 5; fhem ("set Pflanzkuebel_Lampen off"); }
;)
auch einfacher gestalten?
Berichte dann nachher wenn es Dunkel ist ob es geklappt hat.
Danke
Auf was soll denn mit dieser Regex "([{sunset(-300,"16:00","22:00")}])" das notify triggern?
(oder eher ein at? Bzw. sieht es etwas nach DOIF aus [ohne das jetzt genau zu kennen, weil ich es nicht nutze])
Und das hier wird (so ich das sehe) für 5 Sekunden blockieren: { fhem ("set Pflanzkuebel on"); sleep 5; fhem ("set Pflanzkuebel_Lampen off"); } da es so (vermutlich) ein Perl-Sleep und kein fhem-Sleep ist.
So wäre wohl besser: { fhem ("set Pflanzkuebel on; sleep 5; set Pflanzkuebel_Lampen off"); }
Bzw. gleich ohne nach Perl zu wechseln, ist doch unnötig...
(und je nachdem wo wie eingegeben: Strichpunkte doppeln)
Gruß, Joachim
Ja, mein Fehler. Sollte ein at sein.
dann sind da aber einige Klammern zuviel...
Zitat von: MadMax-FHEM am 13 September 2022, 17:28:33
Auf was soll denn mit dieser Regex "([{sunset(-300,"16:00","22:00")}])" das notify triggern?
(oder eher ein at? Bzw. sieht es etwas nach DOIF aus [ohne das jetzt genau zu kennen, weil ich es nicht nutze])
Und das hier wird (so ich das sehe) für 5 Sekunden blockieren: { fhem ("set Pflanzkuebel on"); sleep 5; fhem ("set Pflanzkuebel_Lampen off"); } da es so (vermutlich) ein Perl-Sleep und kein fhem-Sleep ist.
So wäre wohl besser: { fhem ("set Pflanzkuebel on; sleep 5; set Pflanzkuebel_Lampen off"); }
Bzw. gleich ohne nach Perl zu wechseln, ist doch unnötig...
(und je nachdem wo wie eingegeben: Strichpunkte doppeln)
Gruß, Joachim
Dann so?
define Eingangsbereich_an at *{sunset(-300,"16:00","22:00")} set Pflanzkuebel on;;sleep 5;;set Pflanzkuebel_Lampen off
eher so
define Eingangsbereich_an at *{sunset(-300,"16:00","22:00")} {
fhem "set Pflanzkuebel on";
fhem "defmod Tmp.Pfanzkuebel_Lampen at +00:00:05 set Pflanzkuebel_Lampen off";
}
dein sleep 5 ist eine ganz schlechte idee, da dadurch FHEM für 5 Sek still steht. FHEM ist single threaded und arbeitet alles in einer Dauerschleife ab?
Zitat von: Guybrush am 13 September 2022, 21:17:42
dein sleep 5 ist eine ganz schlechte idee, da dadurch FHEM für 5 Sek still steht.
Das ist kompletter Bullshit!
Man muss unterscheiden, ob das perl "sleep" verwendet wird oder das FHEM "sleep".
Im vorletzten Beitrag mit der Frage war das sleep die FHEM Variante, da ist nichts blockierend.
kompletter bullshit ist das nicht, zumal du deine Ausdrucksweise vielleicht überdenken solltest...
Ich hab nicht dran gedacht, dass ein Befehl dahinter gesetzt war. Grundsätzlich sollte man das aber auch besser vermeiden. wenn man noch am rumprobieren ist und dann unbedacht keinen befehl hinter dem sleep setzt, dann blockiert es nunmal...
Vielen Dank!