FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: superverbleit am 30 Mai 2024, 11:47:50

Titel: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: superverbleit am 30 Mai 2024, 11:47:50
Hallo Zusammen,

ich bin gerade bei der Umsetzung einer Rollladensteuerung via KNX (ist aber nicht das eigentliche Problem). Morgens möchte ich meine Rollladen/Jalousien natürlich gerne automatisiert hochlassen.
Dabei möchte ich gerne zwischen Werktags (Mo-Fr), Samstags und Sonntags unterscheiden.
Sonnenaufgang, sowie eine Helligkeitsabfrage der Wetterstation ist integriert.
Als Bonus hätte ich gerne noch eine Feiertagsabfrage, die dann gleich wie Sonntags behandelt werden soll.

Umgesetzt habe ich es wie folgt:

([{sunrise("REAL",0,"06:20","08:00")}|Mo Di Mi Do Fr] and [Aussenbereich.DachOst.Lux:state:d] > 150)
  (set UG.Abstell.Rollladen Pos2)
  (define SunriseAction1 at +00:00:30 set UG.Hobby.RollladenLinks Pos2)
  (define SunriseAction2 at +00:01:00 set UG.Hobby.RollladenRechts Pos2)
  (define SunriseAction3 at +00:01:30 set EG.Buero.Rollladen Pos2)
  (define SunriseAction4 at +00:02:00 set EG.Kueche.Rollladen Auf)
  (define SunriseAction5 at +00:02:30 set EG.Wohnz.Rollladen Pos2)
  (define SunriseAction6 at +00:03:00 set EG.Essz.Jalousie.TerrasseLinks Auf)
  (define SunriseAction7 at +00:03:30 set EG.Essz.Jalousie.TerrasseRechts Auf)
  (define SunriseAction8 at +00:04:00 set EG.Essz.Jalousie.Sitzfenster Auf)
  (define SunriseAction9 at +00:04:30 set EG.Wohnz.Jalousie.Eck.Lamelle Pos_60%)
  (define SunriseAction10 at +00:05:00 set EG.Wohnz.Jalousie.FrontLinks.Lamelle Pos_60%)
  (define SunriseAction11 at +00:05:30 set EG.Wohnz.Jalousie.FrontRechts.Lamelle Pos_60%)
  (define SunriseAction12 at +00:06:00 set DG.Treppenhaus.Jalousie.Lamelle Pos_65%)
  (define SunriseAction13 at +00:06:30 set DG.Bad.Rollladen Auf)
  (define SunriseAction14 at +00:07:00 set DG.Kind1.RollladenLinks Auf)
  (define SunriseAction15 at +00:07:30 set DG.Kind1.RollladenRechts Auf)
  (define SunriseAction16 at +00:08:00 set DG.Kind2.RollladenLinks Auf)
  (define SunriseAction17 at +00:08:30 set DG.Kind2.RollladenRechts Auf)
DOELSEIF ([{sunrise("REAL",0,"07:30","08:30")}|Sa] and [Aussenbereich.DachOst.Lux:state:d] > 150)
  (set UG.Abstell.Rollladen Auf)
  (define SunriseAction1 at +00:00:30 set UG.Hobby.RollladenLinks Auf)
  (define SunriseAction2 at +00:01:00 set UG.Hobby.RollladenRechts Auf)
  (define SunriseAction3 at +00:01:30 set EG.Buero.Rollladen Auf)
  (define SunriseAction4 at +00:02:00 set EG.Kueche.Rollladen Auf)
  (define SunriseAction5 at +00:02:30 set EG.Wohnz.Rollladen Auf)
  (define SunriseAction6 at +00:03:00 set EG.Essz.Jalousie.TerrasseLinks Auf)
  (define SunriseAction7 at +00:03:30 set EG.Essz.Jalousie.TerrasseRechts Auf)
  (define SunriseAction8 at +00:04:00 set EG.Essz.Jalousie.Sitzfenster Auf)
  (define SunriseAction9 at +00:04:30 set EG.Wohnz.Jalousie.Eck.Lamelle Pos_60%)
  (define SunriseAction10 at +00:05:00 set EG.Wohnz.Jalousie.FrontLinks.Lamelle Pos_60%)
  (define SunriseAction11 at +00:05:30 set EG.Wohnz.Jalousie.FrontRechts.Lamelle Pos_60%)
  (define SunriseAction12 at +00:06:00 set DG.Treppenhaus.Jalousie Auf)
  (define SunriseAction13 at +00:06:30 set DG.Bad.Rollladen Auf)
  (define SunriseAction14 at +00:07:00 set DG.Kind1.RollladenLinks Auf)
  (define SunriseAction15 at +00:07:30 set DG.Kind1.RollladenRechts Auf)
  (define SunriseAction16 at +00:08:00 set DG.Kind2.RollladenLinks Auf)
  (define SunriseAction17 at +00:08:30 set DG.Kind2.RollladenRechts Auf)
DOELSEIF ([{sunrise("REAL",0,"07:45","08:45")}|So] and [Aussenbereich.DachOst.Lux:state:d] > 150)
  (set UG.Abstell.Rollladen Pos2)
  (define SunriseAction1 at +00:00:30 set UG.Hobby.RollladenLinks Pos2)
  (define SunriseAction2 at +00:01:00 set UG.Hobby.RollladenRechts Pos2)
  (define SunriseAction3 at +00:01:30 set EG.Buero.Rollladen Pos2)
  (define SunriseAction4 at +00:02:00 set EG.Kueche.Rollladen Auf)
  (define SunriseAction5 at +00:02:30 set EG.Wohnz.Rollladen Pos2)
  (define SunriseAction6 at +00:03:00 set EG.Essz.Jalousie.TerrasseLinks Auf)
  (define SunriseAction7 at +00:03:30 set EG.Essz.Jalousie.TerrasseRechts Auf)
  (define SunriseAction8 at +00:04:00 set EG.Essz.Jalousie.Sitzfenster Auf)
  (define SunriseAction9 at +00:04:30 set EG.Wohnz.Jalousie.Eck.Lamelle Pos_60%)
  (define SunriseAction10 at +00:05:00 set EG.Wohnz.Jalousie.FrontLinks.Lamelle Pos_60%)
  (define SunriseAction11 at +00:05:30 set EG.Wohnz.Jalousie.FrontRechts.Lamelle Pos_60%)
  (define SunriseAction12 at +00:06:00 set DG.Treppenhaus.Jalousie.Lamelle Pos_65%)
  (define SunriseAction13 at +00:06:30 set DG.Bad.Rollladen Auf)
  (define SunriseAction14 at +00:07:00 set DG.Kind1.RollladenLinks Auf)
  (define SunriseAction15 at +00:07:30 set DG.Kind1.RollladenRechts Auf)
  (define SunriseAction16 at +00:08:00 set DG.Kind2.RollladenLinks Auf)
  (define SunriseAction17 at +00:08:30 set DG.Kind2.RollladenRechts Auf)

Leider funktioniert so die Werktags-Abfrage nicht.
Nehme ich jetzt für jeden Werktag ein eigenes DOELSEIF, funktioniert das Ganze, aber das ist ja nicht so toll gelöst, da Mo-Fr die exakt gleiche Aktion ausgelöst wird.
Auch bei der Feiertagsabfrage bin ich noch ein wenig überfordert.

Hat mir vielleicht jemand einen guten Tipp.
Danke schon mal für euer Feedback.

Gruß Stefan
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: Beta-User am 30 Mai 2024, 12:01:27
Fragen zu DOIF solltest du im entsprechenden Unterforum stellen.

Vermutlich solltest du die Abfragelogik umstellen und den "engsten" Fall als erstes prüfen, also "Sonn- oder Feiertag", dann entweder Samstag oder der Rest (da gibt es ja keine logische Reihung mehr).
(Und was passiert eigentlich, wenn es im angegebenen Zeitraum nicht hell genug ist? Helligkeitsgestützte sunrise-Berechnungen bietet Twilight)

Einen Feiertagskalender könnte man mit einem holiday-Device realisieren, alles, was "heute" nicht "none" ist, ist ein Feiertag.

PS: Hier bei uns macht die Verwaltung der Jalousien und Rollläden "AutoShuttersControl", damit kann man auch gleich "Mach den Rollladen hoch, wenn jemand das Fenster öffnet" mit realisieren, das (Öffnen und) Schließen vom Bewohnerstatus abhängig machen usw..
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: erwin am 30 Mai 2024, 13:37:04
... schon an die isWe funktion (in fhem.pl) gedacht ?
l.g. erwin
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: Beta-User am 30 Mai 2024, 13:46:17
Zitat von: erwin am 30 Mai 2024, 13:37:04... schon an die isWe funktion (in fhem.pl) gedacht ?
l.g. erwin
Meinereiner schon, aber vorläufig wollte ich nicht das Risiko eingehen zu erklären, wie man den Samstag zum nicht-WE-Tag erklärt... Den will der TE nämlich extra behandeln ;) .

(Und DOIF kennt dafür afair auch irgendwelche Kürzel).
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: teufelchen am 30 Mai 2024, 13:52:05
Schau mal das Modul AutoShuttersControl an.
Dort kannst Du sehr einfach und übersichtlich je Rollo die Fahrzeiteneinstellung vornehmen.

Ich hatte auch mal mit DoIf versucht und bin relativ schnell umgestiegen und zufrieden.
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: erwin am 30 Mai 2024, 14:11:17
@ Beta-User:
... erwischt... ;D na dann: $wday = (localtime(gettimeofday()))[6];
if ($wday =~ /[1-5]/) { # Mo-Fr..
... allerdings in perl...
l.g. erwin
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: Beta-User am 30 Mai 2024, 14:30:58
Das macht dann aber keine $we-Prüfung mehr, und das war doch auch eines der Anliegen des TE ;) .

Man kann auch isWe() verwenden, um NUR Feiertage gesondert zu behandeln, indem man in global auch den Eintrag "weekEnd" vornimmt (siehe die dortige commandref). Allerdings muss man dann separat auf Sonntag prüfen.
Oder man setzt explizit BESTIMMTE Samstage in "noWeekEnd", um sie als "normalen" Samstag zu kennzeichnen (ist aber deutlich aufwändiger)...

(Und ob DOIF damit umgehen kann, entzieht sich mangels Nutzung meiner Kenntnis).
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: superverbleit am 30 Mai 2024, 19:12:23
Danke schon mal für den schnellen Input von euch. Ich habe das Thema jetzt hoffentlich an die richtige Stelle verschoben.

Um im ersten Schritt schnell mal ans Ziel zu kommen, würde ich die DOIF Lösung vorerst mal bevorzugen.
Das Modul "AutoShuttersControl" hört sich gut an und ist sicherlich im 2. Schritt die richtige Wahl, auch das "Twilight" scheint die richtige Wahl zu sein, wobei ich da nichts mit Helligkeitswerten gelesen habe.

Alles was ich jetzt mal will, ist
([{sunrise("REAL",0,"06:20","08:00")}|Mo Di Mi Do Fr] and [Aussenbereich.DachOst.Lux:state:d] > 150)
den Block/Ausdruck "|Mo Di Mi Do Fr" zu ersetzen. Wenn ich ja einzelne DOELSEIF's mache tut es ja. 

Z.B. so
([{sunrise("REAL",0,"06:20","08:00")}|Mo] and [Aussenbereich.DachOst.Lux:state:d] > 150)
DOELSEIF ([{sunrise("REAL",0,"06:20","08:00")}|Di] and [Aussenbereich.DachOst.Lux:state:d] > 150)
...

Ich bräuchte ja wahrscheinlich einen anderen Ausdruck dafür, wie istWerkTags().

Im 2. Schritt, dann noch die Feiertagsgeschichte.
Also |istSonntag() || |istFeiertag(), dann die Reihenfolge der DOIF's umstellen.

Habt ihr da noch Ideen? 

Das mit der Helligkeit, soll einfach so funktionieren, egal was der Sonnenaufgang macht, der Sensor an der Wetterstation muss zuerst eine Helligkeit > 150 Lux melden.
Dann in Kombination mit Sonnenaufgang und erst dann die Rolllos hoch.


Gruß Stefan

 


Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: Beta-User am 30 Mai 2024, 19:23:34
Zitat von: superverbleit am 30 Mai 2024, 19:12:23"Twilight" scheint die richtige Wahl zu sein, wobei ich da nichts mit Helligkeitswerten gelesen habe.
Da kannst du einfach zusätzlich einen "Bewölkungssensor" definieren, der die aktuelle Wolkendecke simuliert. Wenn also "150" ausreichend hell ist, könnte ggf. sowas wie die Hälfte als userReadings-Eintrag an deinem Licht-Sensor tauglich sein. Damit werden die Sonnenauf- und -untergänge verschoben - aber eben immer nur innerhalb der gesetzten Zeitgrenzen ;) .
Wie man das statt "sunrise" nutzt, steht in der commandref unter "Funkctions".

Und DOIF kennt afaik auch eine Angabe für "unter der Woche" (aber nicht am WE) und umgekehrt.
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: Damian am 30 Mai 2024, 21:06:39
Die Wochentag-Funktionalität ist recht ausführlich hier beschrieben: https://fhem.de/commandref_DE.html#DOIF_Wochentagsteuerung

Hast du dort schon reingeschaut?

WE sind Wochenenden und Feiertage, wie in FHEM üblich (entspricht der $we Variablen).

Das Gegenteil ist AT für Arbeitstage.

Wenn die Helligkeitssteuerung unabhängig funktionieren soll, dann brauchst du eher eine "or"- und nicht eine "and"-Verknüpfung.
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: superverbleit am 31 Mai 2024, 20:44:28
Hallo,

ok, dann ersetze ich einfach mal
([{sunrise("REAL",0,"06:20","08:00")}|Mo Di Mi Do Fr] and [Aussenbereich.DachOst.Lux:state:d] > 150)
mit

([{sunrise("REAL",0,"06:20","08:00")}|AT] and [Aussenbereich.DachOst.Lux:state:d] > 150).


Dann müsste es ja schon funktionieren.

Ebenso könnte ich meine Wochenendbehandlung mit WE ersetzen, dann hätte ich den Feiertag ja auch schon erschlagen.

Richtig?
Ich probiere das mal aus und gebe bescheid, ob es funktioniert hat.

Helligkeitssteuerung ist schon richtig mit and, da beide Bedingungen true sein müssen.
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: Damian am 31 Mai 2024, 20:58:15
Zitat von: superverbleit am 31 Mai 2024, 20:44:28Helligkeitssteuerung ist schon richtig mit and, da beide Bedingungen true sein müssen.


And wird hier aber nicht funktionieren, da die Zeit-Angabe nur zum Triggerzeitpunkt wahr ist, sonst nicht.

And kannst du in Verbindung mit Zeitintervallen nutzen, dazu gibt es auch Beispiele in der Commandref zu DOIF.
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: superverbleit am 05 Juni 2024, 09:18:51
Hallo,

ich habe das Ganze jetzt so gelöst:

([{sunrise("REAL",0,"07:30","08:30")}|WE] and [Aussenbereich.DachOst.Lux:state:d] > 150)
  (set UG.Abstell.Rollladen Pos2)
  (define SunriseAction1 at +00:00:30 set UG.Hobby.RollladenLinks Pos2)
  (define SunriseAction2 at +00:01:00 set UG.Hobby.RollladenRechts Pos2)
  (define SunriseAction3 at +00:01:30 set EG.Buero.Rollladen Pos2)
  (define SunriseAction4 at +00:02:00 set EG.Kueche.Rollladen Auf)
  (define SunriseAction5 at +00:02:30 set EG.Wohnz.Rollladen Pos2)
  (define SunriseAction6 at +00:03:00 set EG.Essz.Jalousie.TerrasseLinks Auf)
  (define SunriseAction7 at +00:03:30 set EG.Essz.Jalousie.TerrasseRechts Auf)
  (define SunriseAction8 at +00:04:00 set EG.Essz.Jalousie.Sitzfenster Auf)
  (define SunriseAction9 at +00:04:30 set EG.Wohnz.Jalousie.Eck.Lamelle Pos_60%)
  (define SunriseAction10 at +00:05:00 set EG.Wohnz.Jalousie.FrontLinks.Lamelle Pos_60%)
  (define SunriseAction11 at +00:05:30 set EG.Wohnz.Jalousie.FrontRechts.Lamelle Pos_60%)
  (define SunriseAction12 at +00:06:00 set DG.Treppenhaus.Jalousie.Lamelle Pos_65%)
  (define SunriseAction13 at +00:06:30 set DG.Bad.Rollladen Auf)
  (define SunriseAction14 at +00:07:00 set DG.Kind1.RollladenLinks Auf)
  (define SunriseAction15 at +00:07:30 set DG.Kind1.RollladenRechts Auf)
  (define SunriseAction16 at +00:08:00 set DG.Kind2.RollladenLinks Auf)
  (define SunriseAction17 at +00:08:30 set DG.Kind2.RollladenRechts Auf)
DOELSEIF ([{sunrise("REAL",0,"06:20","07:30")}|AT] and [Aussenbereich.DachOst.Lux:state:d] > 150)
  (set UG.Abstell.Rollladen Pos2)
  (define SunriseAction1 at +00:00:30 set UG.Hobby.RollladenLinks Pos2)
  (define SunriseAction2 at +00:01:00 set UG.Hobby.RollladenRechts Pos2)
  (define SunriseAction3 at +00:01:30 set EG.Buero.Rollladen Pos2)
  (define SunriseAction4 at +00:02:00 set EG.Kueche.Rollladen Auf)
  (define SunriseAction5 at +00:02:30 set EG.Wohnz.Rollladen Pos2)
  (define SunriseAction6 at +00:03:00 set EG.Essz.Jalousie.TerrasseLinks Auf)
  (define SunriseAction7 at +00:03:30 set EG.Essz.Jalousie.TerrasseRechts Auf)
  (define SunriseAction8 at +00:04:00 set EG.Essz.Jalousie.Sitzfenster Auf)
  (define SunriseAction9 at +00:04:30 set EG.Wohnz.Jalousie.Eck.Lamelle Pos_60%)
  (define SunriseAction10 at +00:05:00 set EG.Wohnz.Jalousie.FrontLinks.Lamelle Pos_60%)
  (define SunriseAction11 at +00:05:30 set EG.Wohnz.Jalousie.FrontRechts.Lamelle Pos_60%)
  (define SunriseAction12 at +00:06:00 set DG.Treppenhaus.Jalousie.Lamelle Pos_65%)
  (define SunriseAction13 at +00:06:30 set DG.Bad.Rollladen Auf)
  (define SunriseAction14 at +00:07:00 set DG.Kind1.RollladenLinks Auf)
  (define SunriseAction15 at +00:07:30 set DG.Kind1.RollladenRechts Auf)
  (define SunriseAction16 at +00:08:00 set DG.Kind2.RollladenLinks Auf)
  (define SunriseAction17 at +00:08:30 set DG.Kind2.RollladenRechts Auf)

Es funktioniert eigentlich auch wie gewünscht.

Jetzt habe ich allerdings noch ein Problem:

Z.B. wird Montags das 2. DOELSEIF richtig ausgelöst. Intern wird es dann auf cmd2 gesetzt.
Am Dienstag wird cmd2 aber nicht mehr ausgelöst, da wir intern ja immer noch auf cmd2 stehen.

Kann man den state irgendwie wieder auf z.B. init zurücksetzen?
Dann würde es ja wieder auslösen.

Oder ist in dem Fall das DOIF Statement komplett das Falsche?

Gruß Stefan
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: Damian am 05 Juni 2024, 18:05:34
Wie schon geschrieben, wird "and" nicht funktionieren, wenn die Dunkelheit vor sunrise kommt, dann wird sich kein Rollladen bewegen.

at im DOIF macht wenig Sinn, weil man es wesentlich eleganter mit dem Attribut wait realisieren kann.
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: Per am 05 Juni 2024, 19:17:06
Du kannst einen Trigger für Mitternacht machen, der das DOIF definiert setzt.
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: superverbleit am 05 Juni 2024, 21:54:38
@Damian
Was ich hier erreichen will, ist das Die Rollladen auf jeden Fall spätestens um 8:30 hoch gehen.
Ist um 7:30 Uhr die Helligekit noch nicht größer 150 Lux, soll gewartet werden, aber spätestens um 8:30 trotzdem die Rollladen hoch gefahren werden, egal wie hell es ist.

([{sunrise("REAL",0,"07:30","08:30")}|WE] and [Aussenbereich.DachOst.Lux:state:d] > 150)
Wie lautet dann die Abfrage? :-[

Gibt es Beispiele zum Attribut wait? Dann schaue ich mir das gerne an.

@Auto Per
Wie meinst du das, definiert setzen?
Zustände sind checkall, cmd_1, cmd_2, disable, enable, initialize...oder?
Also, wenn Montags der State auf cmd_2 steht, wie muss ich ihn setzen, das er am Dienstag nochmals auslöst, also das cmd_2 wieder geht. "initialize"?
Steht dazu auch was in der Referenz? Hab die richtige Stelle nicht gefunden. Sorry.
Als Trigger würde ich einfach Rollladenab (abends) nehmen.
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: Damian am 05 Juni 2024, 22:42:28
siehe hier: https://fhem.de/commandref_DE.html#DOIF_Kombination_von_Ereignis_und_Zeitsteuerung_mit_logischen_Abfragen

und hier: https://fhem.de/commandref_DE.html#DOIF_wait

Auch viele andere typische Beispiele wirst du in der Commanderef zu DOIF finden - es lohnt sich etwas Zeit zum Lesen zu investieren
Titel: Aw: DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags
Beitrag von: superverbleit am 06 Juni 2024, 16:02:10
Hallo,

habe jetzt nochmals ein wenig recherchiert.
Damit das DOIF jeden Tag auslöst, müsste ich dann das DOIF attr do nach always setzen?

Also so:
attr Rollladenauf do always
Oder wäre ein leeres DOELSE besser?


Die Beispiele mit dem wait und der logischen Abfrage aus der Referenz von Damian zum DOIF passen super zu meinem Fall....das schauer ich mir heute abend gleich an.