[Gelöst] FS20 Dimmer Skript funktioniert mal und mal nicht

Begonnen von valknut, 29 Januar 2020, 08:01:33

Vorheriges Thema - Nächstes Thema

valknut

Hallo liebes Forrum und vielen Dank an all die, die hier die tollen Beiträge und Tutorials verfassen.

Ich bin noch relativ neu, konnte aber shon jede Menge umsetzen. Bei einer Sache verzweifle ich aber schon ein paar Wochen:

Ich habe einen FS20 Dimmer, den ich mit einer "at-Funktion" ansteuere.



*05:50
{
my $sa=ReadingsVal("Wecker","state",0);;
my $Mo=ReadingsVal("Wecker","Mo",0);;
my $Di=ReadingsVal("Wecker","Di",0);;
my $Mi=ReadingsVal("Wecker","Mi",0);;
my $Do=ReadingsVal("Wecker","Do",0);;
my $Fr=ReadingsVal("Wecker","Fr",0);;
my $Sa=ReadingsVal("Wecker","Sa",0);;
my $So=ReadingsVal("Wecker","So",0);;
my $st=ReadingsVal("Status_Tag","state",0);;
my $Ur=ReadingsVal("Urlaub","state","");;

    if( ($sa eq "Ein") && ($st eq "Nacht" && ($Ur eq "Aus") ) &&
          (  ($wday == 1) && ($Mo eq "ja") ||
             ($wday == 2) && ($Di eq "ja") ||
             ($wday == 3) && ($Mi eq "ja") ||
             ($wday == 4) && ($Do eq "ja") ||
             ($wday == 5) && ($Fr eq "ja") ||
             ($wday == 6) && ($Sa eq "ja") ||
             ($wday == 7) && ($So eq "ja")
          )
        )
         {fhem("set Dimmer off;;sleep 10;;set Dimmer dim100% 1280;;define tmp_dim at +00:40:00 set Dimmer off")}
}


Wenn nun der Zeitpunkt eintritt, erhalte ich im Log:

2020.01.29 05:50:00 3: set Dimmer off;;sleep 10;;set Dimmer dim100% 1280;;define tmp_dim at +00:40:00 set Dimmer off : Unknown argument off;sleep, choose one of dim06% dim100% dim12% dim18% dim25% dim31% dim37% dim43% dim50% dim56% dim62% dim68% dim75% dim81% dim87% dim93% dimdown dimup dimupdown off off-for-timer on on-100-for-timer-prev on-for-timer on-old-for-timer on-old-for-timer-prev ramp-off-time ramp-on-time reset sendstate timer toggle dim:slider,0,6.25,100 on-till off-till intervals on-till-overnight blink off-till-overnight
2020.01.29 05:50:00 3: a_Wecker: Unknown argument off;sleep, choose one of dim06% dim100% dim12% dim18% dim25% dim31% dim37% dim43% dim50% dim56% dim62% dim68% dim75% dim81% dim87% dim93% dimdown dimup dimupdown off off-for-timer on on-100-for-timer-prev on-for-timer on-old-for-timer on-old-for-timer-prev ramp-off-time ramp-on-time reset sendstate timer toggle dim:slider,0,6.25,100 on-till off-till intervals on-till-overnight blink off-till-overnight


Ändere ich aber die Zeit auf z.B. 06:10 kurz nach der Fehlermeldung, wird das at fehlerfrei ausgeführt. Ich komme absolut nicht weiter. Das gleche Skript geht und geht mal nicht?

Ich hoffe, ihr habt eine Idee

Vielen Dank !!!

rudolfkoenig

Ich gebe zu, dass die ;; Behandlung in FHEM weder intuitiv, noch konsistent ist.

Generell braucht man ;; um dem _FHEM_ Parser zu sagen, dass die Zeile hier nicht in einzelne FHEM/Perl/Shell Befehle zu trennen ist. Der Parser ersetzt ;; durch ; vor der Ausfuehrung. Diese Schreibweise ist Pflicht in der FHEMWEB Eingabezeile, in Raw-Definition und beim Editieren der fhem.cfg.

In der FHEMWEB Detail-Ansicht, beim DEF Knopf weiss FHEMWEB aber, dass es sich hier um _eine_ Definition geht, deswegen wird fuers modify jedes ; im Argument zu ;; gewandelt. Das wandelt der Parser wieder zu ; zurueck, und der Benutzer freut sich, dass alles gleich und einfach ausschaut. In der Raw-Definition sieht man die eigentliche Version.

Wenn man ;; in DEF schreibt, dann ist das perl zwar egal, dem fhem() Befehl aber nicht: set dimmer on wird nicht vom sleep getrennt, sondern set dimmer mit dem Argument "on;sleep ..." aufgerufen.

=> Die Loesung ist beim Aufruf ueber DEF "halbsoviel" ; zu schreiben.

Generell empfehle ich Code, was ueber eine Zeile geht, in eine eigene Funktion in 99_myUtils auszulagern, und diese Funktion aus at/notify/etc aufzurufen.

valknut

#2
hallo und vielen Dank für di schnelle Antwort.

ok, ich habe jetzt alle Semikola in dem "fhem("set..."" entfernt. Das hatte ich auch schon probiert, allerdings wird dann der Befehl vor dem sleep nicht ausgeführt.

{fhem("set Dimmer off;sleep 10;set Dimmer dim100% 1280;define tmp_dim at +00:40:00 set Dimmer off")}

2020-01-29 14:47:10 FS20 Dimmer dim100% 1280
2020-01-29 14:47:10 at tmp_dim Next: 15:27:10


habe es in die 99_myUtils ausgelagert. Werde es mal testen. Vielen Dank!

rudolfkoenig

ZitatDas hatte ich auch schon probiert, allerdings wird dann der Befehl vor dem sleep nicht ausgeführt.
Ich auch gerade, und bei mir tut es.
Auslagern ist trotzdem die bessere Loesung.

valknut

Guten Morgen,

es funktioniert. Habe alles in die 99_myUtils.pm eingetragen. Super. Vielen Dank!!