FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Gisbert am 12 Februar 2017, 15:18:16

Titel: [GELÖST] Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Gisbert am 12 Februar 2017, 15:18:16
Hallo,

ich möchte der Übersichtlichkeit halber jeweils 3 at-Befhele zur Steuerung der Außenbeleuchtung in einem DOIF zusammenfassen.
Was sich zunächst als lösbare Aufgabe darstellte, gelingt mir leider auch nach etlichen Versuchen nicht.

Die 3 at-Befehle für das Haustürlicht:
define Haustuer.Licht.1WT at *06:45 {if(sunrise_abs(1130) gt "06:45" && !($we) && !(Value("Feiertag_NRW")) && (ReadingsVal("Schalter.1","state","off") eq "off")) \
{fhem 'set Haustuer.Licht on-till {sunrise_abs(1190,"5:00","9:30")}'}}
define Haustuer.Licht.1WE at *07:30 {if(sunrise_abs(1130) gt "07:30" && ($we || (Value("Feiertag_NRW"))) && (ReadingsVal("Schalter.1","state","off") eq "off")) \
{fhem 'set Haustuer.Licht on-till {sunrise_abs(1190,"5:00","9:30")}'}}
define Haustuer.Licht.2 at *{sunset_abs(-660,"15:00","23:00")} IF ([Schalter.1] eq "off") ((set Haustuer.Licht on-till {sunset_abs(2700,"22:13:26","23:11:43")}))


Das Haustürlicht wird in der Weihnachtszeit nicht eingeschaltet, wenn die Lichterkette (Schalter.1) an ist.
Die 3 at-Befehle für den Schalter.1, der für die Weihnachstbeleuchtung sorgt:
define Schalter.1.1WT at *06:30 {if(time ge time_str2num("2017-11-27 00:00:10") && time le time_str2num("2018-01-07 23:59:50") && sunrise_abs(1130) gt "06:30" && !($we) && !(Value("Feiertag_NRW"))) \
{fhem 'set Schalter.1 on-till {sunrise_abs(2090,"5:00","9:30")}'}}
define Schalter.1.1WE at *07:15 {if(time ge time_str2num("2017-11-27 00:00:10") && time le time_str2num("2018-01-07 23:59:50") && sunrise_abs(1130) gt "07:15" && ($we || (Value("Feiertag_NRW")))) \
{fhem 'set Schalter.1 on-till {sunrise_abs(2090,"5:00","9:30")}'}}
define Schalter.1.2 at *{sunset_abs(-1200,"15:00","23:00")} {if(time ge time_str2num("2017-11-27 00:00:10") && time le time_str2num("2018-01-07 23:59:50")) \
{fhem 'set Schalter.1 on-till {sunset_abs(2700,"23:17:26","23:33:43")}'}}


Egal welche Kombinationen aus runden, geschweiften oder eckigen Klammern ich auch benutze, ich komme nicht zu einem funktionierenden DOIF.
Kann mir jemand dabei helfen?

Viele Grüße
Gisbert
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: KernSani am 12 Februar 2017, 15:34:25
Hi Gisbert,

mal abgesehen von der Frage, warum du ein funktionierendes "at" in ein DOIF umbauen möchtest: Ich würde vorschlagen, du tastest dich langsam an dein Vorhaben heran - die Beispiele in der CommandRef (https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung) sollten dabei helfen.
Wenn das nicht weiter hilft, poste dein (erfolgloses) DOIF hier, dann kommen wir da sicher weiter....

Grüße,

Oli
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: igami am 12 Februar 2017, 15:34:56
Was hast du denn bisher versucht? In der Commandref sind doch einige beispiele DOIF  Zeitsteuerung (https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung).
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Gisbert am 12 Februar 2017, 16:13:03
Hallo KernSani und igami,

da hätte ich mir meine ganzen erfolglosen Versuche besser aufschreiben sollen.
Die Commandref hab ich rauf und runter gelesen, aber nichts passendes gefunden.

Eine Variante die nicht funktioniert hat, ist diese:
define Haustuer.Licht.Schaltzeit DOIF ([06:45] and ({sunrise_abs(1130) gt "06:45" && !($we) && !(Value("Feiertag_NRW"))}) and [Schalter.1] eq "off") \
(set Haustuer.Licht on-till {sunrise_abs(1190,"5:00","9:30")}) \
DOELSEIF ([07:30] and ({sunrise_abs(1130) gt "07:30" && ($we || (Value("Feiertag_NRW")))}) and [Schalter.1] eq "off") \
(set Haustuer.Licht on-till {sunrise_abs(1190,"5:00","9:30")}) \
DOELSEIF ([{sunset_abs(-660,"15:00","23:00")}] and [Schalter.1] eq "off") \
(set Haustuer.Licht on-till {sunset_abs(2700,"22:13:26","23:11:43")})


und diese:
define Schalter.1.Schaltzeit DOIF ([06:30] and {time ge time_str2num("2017-11-27 00:00:10") && time le time_str2num("2018-01-07 23:59:50") && sunrise_abs(1130) gt "06:30" && !($we) && !(Value("Feiertag_NRW"))}) \
(set Schalter.1 on-till {sunrise_abs(2090,"5:00","9:30")}) \
DOELSEIF ([07:15] and {time ge time_str2num("2017-11-27 00:00:10") && time le time_str2num("2018-01-07 23:59:50") && sunrise_abs(1130) gt "07:15" && ($we || (Value("Feiertag_NRW")))}) \
(set Schalter.1 on-till {sunrise_abs(2090,"5:00","9:30")}) \
DOELSEIF ([{sunset_abs(-1200,"15:00","23:00")}] and {time ge time_str2num("2017-11-27 00:00:10") && time le time_str2num("2018-01-07 23:59:50")}) \
(set Schalter.1 on-till {sunset_abs(2700,"23:17:26","23:33:43")})


Viele Grüße Gisbert
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Ellert am 12 Februar 2017, 16:18:24
Mich würde mal interessieren für welchen Breitengrad diese Angabe {sunset_abs(2700,"23:17:26","23:33:43")} sinnvoll ist und etwas anderes als 23:17:26 zurückliefert?
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Gisbert am 12 Februar 2017, 16:25:50
Hallo Ellert,

ich mags gerne hell, das war Absicht; Breitengrad NRW.
Zugegebenermaßen hätte ich auch gleich eine feste Zeitangabe nehmen können.
Vermutlich war's mal anderes angedacht und hat sich dann zu dem unsinnigen Code entwickelt.

Viele Grüße Gisbert
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: KernSani am 12 Februar 2017, 16:32:13
In der ersten Zeile sitzt schonmal eine schließende Klammer zu viel...  (vor "and [Schalter1]")






Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Ellert am 12 Februar 2017, 16:33:35
Also, die Set-Befehle sehen funktionsfähig aus.

Ich sehe, dass Du Wochentagsteuerung einsetzt, dazu gibt es in der Befehlsreferenz ein Kapitel das solltest Du erstmal umsetzen, zunächst beim ersten DOIF.
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: igami am 12 Februar 2017, 16:49:21
Was sicherlich hilft ist das formatieren des Codes. also anstatt alles in eine Zeile zu schreiben ruhig mal einen Umbruch machen
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Ellert am 12 Februar 2017, 16:59:49
Und wenn Du den DEF-Editor mit codemirror verwendest, dann ist eine Klammerprüfung enthalten, siehe: https://wiki.fhem.de/wiki/DOIF/Tipps_zur_leichteren_Bedienung
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: igami am 12 Februar 2017, 17:04:39
noch ein Frage: was soll 'time ge time_str2num("2017-11-27 00:00:10")' bewirken?
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Gisbert am 12 Februar 2017, 17:13:08
Hallo igami,

Zitat von: igami am 12 Februar 2017, 17:04:39
noch ein Frage: was soll 'time ge time_str2num("2017-11-27 00:00:10")' bewirken?
Das ist die Abfrage für die Weihnachtsbeleuchtung, d.h wenn die aktuelle Zeit größer als 27.11.2017 und kleiner als 8.1.2018 ist, dann soll Schalter.1 angeschaltet werden.

Hallo Ellert,
die Wochentagssteuerung und den DEF-Editor schaue ich mir an.
Im Moment bin ich allerdings erkältungs/grippe-geschwächt und nicht Herr meiner Sinne  :'(

Viele Grüße Gisbert
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: igami am 12 Februar 2017, 17:39:17
Zitat von: Gisbert am 12 Februar 2017, 17:13:08
Hallo igami,
Das ist die Abfrage für die Weihnachtsbeleuchtung, d.h wenn die aktuelle Zeit größer als 27.11.2017 und kleiner als 8.1.2018 ist, dann soll Schalter.1 angeschaltet werden.
und das willst du dann jedes Jahr anpassen?
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Ellert am 12 Februar 2017, 17:48:54
ZitatIm Moment bin ich allerdings erkältungs/grippe-geschwächt und nicht Herr meiner Sinne.
Und da dachtest Du Dir, wir würden die Umstellung für Dich erledigen.

Gute Besserung
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Gisbert am 12 Februar 2017, 19:14:51
Hallo Ellert und igami,

es gibt ja nur einmal im Jahr Weihnachten. Ich kann mir zwar vorstellen, dass man das auch automatisieren kann, x Tage vor 25.12. und y Tage nach 25.12., allerdings geht das bei weitem über meine Möglichkeiten.

Zitat von: Ellert am 12 Februar 2017, 17:48:54
Und da dachtest Du Dir, wir würden die Umstellung für Dich erledigen.
Gute Besserung
Danke für die Besserungswünsche. Es geht ja ums Selbermachen und Anleitungen bzw. Erklärungen zu übernehmen.
Mein Hinweis wollte ich nur so verstanden wissen, dass falls ich nicht kurzfristig antworte, darin die Erklärung zu suchen ist.

Viele Grüße Gisbert
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: igami am 12 Februar 2017, 19:16:21
Formulier doch mal bitte wann das Licht eingeschaltet werden soll. Also einfach in Worten.
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Per am 13 Februar 2017, 15:29:13
Zitat von: Gisbert am 12 Februar 2017, 17:13:08wenn die aktuelle Zeit größer als 27.11.2017 und kleiner als 8.1.2018 ist, dann soll Schalter.1 angeschaltet werden.
Wenn du nur auf Tag.Monat prüfst und mit or verknüpfst, musst du nix anpassen.
Und wenn du aber eh jedes Jahr die Daten ändern willst ("es ist nur einmal..."), könntest du auch mit einem Dummy arbeiten und erzeugst dir weniger Arbeit UND dem System weniger Last.
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Gisbert am 14 Februar 2017, 17:34:55
Hallo igami,

Zitat von: igami am 12 Februar 2017, 19:16:21
Formulier doch mal bitte wann das Licht eingeschaltet werden soll. Also einfach in Worten.

Ich versuch mal mit der Weihnachstbeleuchtung (Schalter.1), das erscheint mir der schwierigere Fall von beiden zu sein:
1. define: Schalte Schalter.1 um 6:30 an, wenn die aktuelle Zeit größer als 27.11.2017 ... und kleiner als 7.1.2018 ... ist und wenn es nicht Wochende und nicht Feiertag ist
2. define: Schalte Schalter.1 um 7:15 an, wenn die aktuelle Zeit größer als 27.11.2017 ... und kleiner als 7.1.2018 ... ist und wenn es Wochende oder Feiertag ist
3. define: Schalte Schalter.1 bei Sonnenuntergang (oder kurz vorher) an, wenn die aktuelle Zeit größer als 27.11.2017 ... und kleiner als 7.1.2018 ... ist
Die set Befehle set ... on-till ... sind auf jeden Fall korrekt, d.h. es wird bis zur vorgesehen Zeit angeschaltet bis zur Zeitmarke, die im set-Befhel steht.

Wie eingangs geschildert funktionieren die drei at-Befehle, mein Ziel wäre es aus Übersichtlichkeitsgründen dafür nur ein DOIF zu haben.

Hallo Per,
mir ist nicht klar, wie ich eine zeitliche Abfrage in einen Dummy reinbekomme. Bisher hab ich Dummys so verstanden, dass sie mehr owder weniger nur an oder aus sein können, wobei die Bedingungen von anderen Devices oder Befeheln kommen.
Wie sieht dein Vorschlag konkret aus?

Viele Grüße Gisbert
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Per am 14 Februar 2017, 20:16:03
Zitat von: Gisbert am 14 Februar 2017, 17:34:55Hallo Per,
mir ist nicht klar, wie ich eine zeitliche Abfrage in einen Dummy reinbekomme.
Gar nicht.

Zitat von: Gisbert am 14 Februar 2017, 17:34:55Wie sieht dein Vorschlag konkret aus?
Statt einmal im Jahr die Zeiten manuell in die Config zu schreiben, kannst du auch schnell manuell einen Dummy "Weihnachten" (oder nach Wunsch benannt) auf 0 oder 1 setzen. Diesen fragst du dann ab.
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Gisbert am 14 Februar 2017, 20:54:45
Hallo Per,

den "Weihnacht"-Dummy manuell auf ein oder aus zu schalten, ist wahrscheinlich die bessere Idee.
Die Config wird dann durch diesen Vorgang nicht mehr geändert und ich werde diese unhandliche Abfrage der Zeiten los.
Ich versuche auf der Basis ein DOIF zurechtzuschnitzen; wenn ich Erfolg hab melde ich mich nochmals :), wenn nicht auch :(

Viele Grüße Gisbert

Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Damian am 14 Februar 2017, 21:28:45
Zitat von: Gisbert am 14 Februar 2017, 20:54:45
Hallo Per,

den "Weihnacht"-Dummy manuell auf ein oder aus zu schalten, ist wahrscheinlich die bessere Idee.
Die Config wird dann durch diesen Vorgang nicht mehr geändert und ich werde diese unhandliche Abfrage der Zeiten los.
Ich versuche auf der Basis ein DOIF zurechtzuschnitzen; wenn ich Erfolg hab melde ich mich nochmals :), wenn nicht auch :(

Viele Grüße Gisbert

Ab morgen kannst du die Variablen $md und $ymd im DOIF benutzen ;)

Beispiel

([6:30] and  $md gt "11-27" and $md lt "01-07")

oder

([6:30] and  $ymd gt "2017-11-27" and $ymd lt "2018-01-07")
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: igami am 15 Februar 2017, 06:13:44
Zitat von: Per am 14 Februar 2017, 20:16:03
Statt einmal im Jahr die Zeiten manuell in die Config zu schreiben, kannst du auch schnell manuell einen Dummy "Weihnachten" (oder nach Wunsch benannt) auf 0 oder 1 setzen. Diesen fragst du dann ab.
Alternativ kann man noch das holday Modul nutzen. Weihnachten ist ja meist auf dem gleichen Datum ;)
Titel: Antw:Wie mehrere at-Befehle in ein DOIF zusammenfassen?
Beitrag von: Gisbert am 20 Februar 2017, 10:05:39
Hallo,

vielen Dank an Damian für den Hinweis und die Implemntierung der Variablen $md und $ymd im DOIF. Mit $md ist eine jährliche Änderung nicht mehr notwendig, die Bedingung gilt ohne Angabe der Jahreszahl.

Eine Schwierigkeit gab es dann doch noch. Wie bekomme ich die folgende Bedingung in DOIF hin: Sonnenaufgang größer einer definierten Zeit (an der das Haustürlicht angehen soll; Einschalten nach Sonnenaufgang macht ja keinen Sinn).
Die Schwierigkeiten waren die geschweiften Klammern, die bei {sunrise()} üblicherweise genutzt werden (wegen Perlcode).

Im Forum habe ich den folgenden Beitrag gefunden:
Zitathttps://forum.fhem.de/index.php/topic,58884.0.html # Thema: Zeitintervall Ende vor Anfang wegen sunrise... wie ist Syntax korrekt?
Hier wird erklärt, dass sunrise / sunset im DOIF ohne geschweifte Klammern benutzt werden muss. Ich hab vorher die commandref und das Wiki rauf und runter gelesen, da aber keinen Hinweis gefunden.
Statt der Abfrage sunrise_abs(1130) gt "06:30" geht auch sunrise_abs(1130) gt $hms, was natürlich eleganter ist, da ja die Abfrage nach der Einschaltzeit 06:30 schon vorne drin ist.

Der Vollständigkeit halber meine beiden DOIF's (Schalter.1 schaltet die Weihnachtsbeleuchtung an der Haustür):
define Schalter.1.Schaltzeit DOIF ([06:30|8] and $md ge "11-25" and $md le "01-10" and [Feiertag.NRW] == 0 and sunrise_abs(1130) gt $hms) \
(set Schalter.1 on-till {sunrise_abs(2090,"5:00","9:30")}) \
DOELSEIF (([07:15|7] or ([07:15] and [Feiertag.NRW] == 1)) and $md ge "11-25" and $md le "01-10" and sunrise_abs(1130) gt $hms) \
(set Schalter.1 on-till {sunrise_abs(2090,"5:00","9:30")}) \
DOELSEIF ([{sunset_abs(-1200,"15:00","23:00")}] and $md ge "11-25" and $md le "01-10") \
(set Schalter.1 on-till {sunset_abs(2700,"23:17:26","23:33:43")})

und
define Haustuer.Licht.Schaltzeit DOIF ([06:45|8] and [Schalter.1] eq "off" and [Feiertag.NRW] == 0 and sunrise_abs(1130) gt $hms) \
(set Haustuer.Licht on-till {sunrise_abs(1190,"5:00","9:30")}) \
DOELSEIF (([07:45|7] or ([07:45] and [Feiertag.NRW] == 1)) and [Schalter.1] eq "off" and sunrise_abs(1130) gt $hms) \
(set Haustuer.Licht on-till {sunrise_abs(1190,"5:00","9:30")}) \
DOELSEIF ([{sunset_abs(-660,"15:00","23:00")}] and [Schalter.1] eq "off") \
(set Haustuer.Licht on-till {sunset_abs(2700,"22:13:26","23:11:43")})


Viele Grüße Gisbert