Hallo,
ich habe mehrere AT Definitionen im Einsatz die nacheinander Dinge schalten wenn ich nicht daheim bin:
z.B. Licht an, 5 minuten später Rollos runter, dann Licht aus... usw.
Jetzt habe ich die AT Befehle alle manuell definiert, wenn ich jetzt die Rollos später herunter fahren will, muss ich händisch das "Licht an" AT anpassen.
Gibt es die Möglichkeit den RolloRunter AT als Variable in weiteren ATs nutzen, also in der Art
define RollosRunter at *{sunset(-100,"16:00","22:00")} set Rollos on
und dann
define Licht an at *Value("RollosRunter" -700){fhem("set Licht_EZ on")}
List RollosRunter liefert mir:
Internals:
COMMAND set Rollos on
DEF *{sunset(-100,"16:00","22:00")} set Rollos on
NAME RollosRunter
NR 105
NTM 17:55:24
PERIODIC yes
RELATIVE no
REP -1
STATE Next: 17:55:24
TIMESPEC {sunset(-100,"16:00","22:00")}
TRIGGERTIME 1486572924
TRIGGERTIME_FMT 2017-02-08 17:55:24
TYPE at
Readings:
2017-02-08 13:44:18 state Next: 17:55:24
Im Endeffekt will ich nur das RollosRunter AT anpassen und damit sind die anderen auch automatisch verschoben. Geht das?
Vielen Dank
Hmmm. Das ist auf jeden Fall mal was Interessantes. Möglicherweise kann da mal wieder das DOIF was ganz Tolles, aber da kann ich nicht helfen.
Das einfachste, was mir spontan einfällt, geht ungefähr so:
define RollosRunter at *{sunset(-100,"16:00","22:00")} set Rollos on;;define Licht_an at +00:05:00 set Licht_EZ on
D.h. das erste at legt ein zweites an, dass nach 5 Minuten das Licht anmacht. Du brauchst dann nur die Zeit im ersten zu ändern. Alles andere geht dann automatisch.
Gruß,
Thorsten
Beim DOIF gehört das zum Standardumfang dazu, siehe:
https://fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben
und
https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung
Danke für Eure Hinweise, leider kann ich beide nicht verwenden, da ich auch ständig das Attribut "Skip_next" vom AT für die Rollos nutze (habe dafür ein Notify das ich klicke, dann werden Heute die Rollos nicht herunter gefahren).
Daher muss es zwingend das AT sein und darf nicht mit einem +00:00:xx mit einem 2. AT sein, sonst Skippe ich ja beide...
Es muss doch eine Möglichkeit geben, den Rückgabewert eines ATs für ein 2. AT zu verwenden? Ich bekommen bei jedem Versuch aber immer nur die Fehlermeldung das der Syntax falsch ist und er einen Timestamp erwartet...
Danke
Hi,
ich nehme an, mit "Rückgabewert eines ATs" meinst Du den nächsten Zeitpunkt der Ausführung. Also im Prinzip, das was in "state" steht.
dann vielleicht so:
Du schreibst Dir eine Routine in der myUtils, die das Reading state Deines führenden at liest, die Zeit extrahiert und daraus die Zeit für das andere at (oder die anderen) ermittelt. Diese Routine verwendest Du dann in den anderen ats.
Dann müsste man sich nur noch überlegen, wie man die anderen ats ändert, wenn das erste geändert wird, da die Neuberechnung der Zeit normalerweise nur bei der Definition und nach einer Ausführung erfolgt. "set modifyTimeSpec" könnte da helfen.
Gruß,
Thorsten
Zitat von: pillepalle12 am 13 Februar 2017, 09:39:53
Danke für Eure Hinweise, leider kann ich beide nicht verwenden, da ich auch ständig das Attribut "Skip_next" vom AT für die Rollos nutze (habe dafür ein Notify das ich klicke, dann werden Heute die Rollos nicht herunter gefahren).
Daher muss es zwingend das AT sein und darf nicht mit einem +00:00:xx mit einem 2. AT sein, sonst Skippe ich ja beide...
Es muss doch eine Möglichkeit geben, den Rückgabewert eines ATs für ein 2. AT zu verwenden? Ich bekommen bei jedem Versuch aber immer nur die Fehlermeldung das der Syntax falsch ist und er einen Timestamp erwartet...
Danke
klar, du musst den Rückgabewert nur splitten, im state des at steht ja
Next: xx.xx.xx.xx
du kannst also z.b. mit split nur den timestamp als Rückgabewert verwenden
{ (split ':',Value("dein_AT"))[1]}
oder so ähnlich...
Das geht alles mit einem DOIF, ohne Zusätzliche Dummys oder änlichem...
define TEST DOIF ([{sunset(-100,"16:00","22:00")}] and [?$SELF:automatik] eq "on") (set Rollos on) (set Licht_EZ on)
DOELSEIF ([{sunset(-100,"16:00","22:00")}] and [?$SELF:automatik] eq "skip") (set $SELF automatik on) (set Licht_EZ on)
attr TEST wait 0,300:0,300
attr TEST readingList automatik
attr TEST setList automatik:on,skip
attr TEST do always
attr TEST webCmd automatik
Das skip kannst du direkt im DOIF anklicken, dann wird cmd_1 nicht ausgeführt und stattdessen cmd_2, damit wird die automatik wieder auf on gesetzt und nur das Licht 5 Minuten verzögert eingeschaltet.
Die Verzögerung wird mit dam attribut wait eingestellt 0 Sekunden für den ersten Ausführungsteil von cmd_1 und 300 Sekunden für den zweiten Ausführungsteil von cmd_1, beide durch ein Komma getrennt, hinter dem Doppelpunkt stehen die Zeiten für cmd_2. Ich hab deine Aufgabenstellung nicht ganz verstanden, daher bin ich mir nicht sicher, ob all deine Wünsche eingarbeitet sind...Die wait Zeiten, oder auch die Zeiten in sunset kannst du über $SELF:Readings variabel einstellen, ohne jedes mal die definition zu ändern.
EDIT:
Ich möchte damit niemanden zwingen DOIF zu verwenden! Ich möchte damit auch nicht zu Ausdruck bringen, dass at und notify schlechter als DOIF seien.
EDIT-2:
da fällt mir grad so ein... Bei meinem DOIF Beispiel könnte es zu Problemen kommen, wenn die Uhrzeit zu Sunset zunimmt. Da beim triggern durch die Uhrzeit direkt der nächste Timer berechnet wird, der sollte zwar erst am nächstem Tag triggern, die Uhrzeit ist aber nun mal nicht absolut sonder relativ. Wenn also Heute um 18.15 getriggert wird und der nächste Sunset für Morgen 18.18 Uhr berechnet wird, dann wird das DOIF heute um 18.18 nochmal getriggert. Dazu könnte man am einfachsten die Ausführungsteile von cmd_2 tauschen und das rücksetzten von 'skip' auf 'on' nochmal 5 Minuten nach dem Licht erledigen lassen, somit sollte dann alles safe sein.
dann sähe das DOIF so aus (der folgende Code ist per Raw definition einfügbar):
defmod TESTdoif DOIF ([{sunset(-100,"16:00","22:00")}] and [?$SELF:automatik] eq "on") (set Rollos on) (set Licht_EZ on)\
DOELSEIF ([{sunset(-100,"16:00","22:00")}] and [?$SELF:automatik] eq "skip") (set Licht_EZ on) (set $SELF automatik on)
attr TESTdoif do always
attr TESTdoif readingList automatik
attr TESTdoif room test
attr TESTdoif setList automatik:on,skip
attr TESTdoif wait 0,300:300,300
attr TESTdoif webCmd automatik
setstate TESTdoif initialized
setstate TESTdoif 2017-02-13 12:09:26 automatik on
EDIT-3: (danach hätt ich dann aber auch)
Der Damian hat da wohl mal wieder was verbessert und ich hab das mal wieder nicht mitbekommen.
Bei DOIF sind die Timer dann wohl doch absolut. Also ist das umbauen meines ersten Beispiels nicht notwendig...
Danke für Eure Hilfe, habe es jetzt mit DOIF gelöst.
Hi,
es wäre noch nett, wenn Du Deine Lösung hier schreiben könntest und dann noch [Gelöst] vor den Titel des Threads schreibst. ...den Thread aber bitte offen lassen.
Gruß,
Thorsten