DOIF Rollladensteuerung mit KNX - Unterscheidung Werktags - Samstags - Sonntags

Begonnen von superverbleit, 30 Mai 2024, 11:47:50

Vorheriges Thema - Nächstes Thema

superverbleit

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

Beta-User

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..
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

erwin

FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Beta-User

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).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

teufelchen

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.
Raspberry Pi 3
CUL433: V 1.26.05 a-culfw Build: 311 (2018-12-09_19-12-53) CUL433 (F-Band: 433MHz)
freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB
Debmatic mit RPI-RF-MOD

erwin

@ Beta-User:
... erwischt... ;D na dann: $wday = (localtime(gettimeofday()))[6];
if ($wday =~ /[1-5]/) { # Mo-Fr..
... allerdings in perl...
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Beta-User

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).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

superverbleit

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

 



Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

superverbleit

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.

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

superverbleit

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Du kannst einen Trigger für Mitternacht machen, der das DOIF definiert setzt.