[gelöst] Rolladensteuerung am WE

Begonnen von Nighthawk, 06 November 2017, 07:57:28

Vorheriges Thema - Nächstes Thema

Nighthawk

Hallo Forumgemeinde,

ich habe jetzt viel gesucht, aber leider keine Antwort, bzw. Lösung für mein Problem gefunden.
Ich habe mehrere DOIFs für meine Rolladen, diese funktionieren auch zu 90% so wie sie sollen.
Was nicht funktioniert ist das Runterfahren am Wochenende.
Die Zeiten für das Runterfahren sind aktuell noch die gleichen am WE und Wochentagen, ich weiss dass es so keinen Sinn macht zu trennen, aber mir geht es erstmal darum alles ans Laufen zu bekommen, bevor ich an das Zeittuning rangehe.


Hier ist der List von dem DOIF:

Internals:
   DEF        (
([EG_Jalousie_Terasse_gr] !~ "auf" and [EG_Jalousie_Terasse_gr] !~ "off")
and
([{sunrise("REAL",0,"09:00","10:30")}|7] or ([?06:30-09:00|8] and [Helligkeitssensor_Aussen:brightness] > 60))
)
(set EG_Jalousie_Terasse_gr auf)
DOELSEIF
(
([EG_Jalousie_Terasse_gr] !~ "zu" and [EG_Jalousie_Terasse_gr] !~ "on" and [Fenster_Terasse_gr] eq "closed")
and
(([?18:00-22:30|7] or [?18:00-22:30|8]) and [Helligkeitssensor_Aussen:brightness] < 5)
)
(set EG_Jalousie_Terasse_gr zu)
DOELSEIF
(
([EG_Jalousie_Terasse_gr] !~ "zu" and [EG_Jalousie_Terasse_gr] !~ "on" and [Fenster_Terasse_gr] eq "tilted")
and
(([?18:00-22:30|7] or [?18:00-22:30|8]) and [Helligkeitssensor_Aussen:brightness] < 5)
)
(set EG_Jalousie_Terasse_gr 50)
   NAME       di.EG_Jalousie_Terasse_gr_Automatik
   NR         602
   NTFY_ORDER 50-di.EG_Jalousie_Terasse_gr_Automatik
   STATE      cmd_1
   TYPE       DOIF
   Helper:
     DBLOG:
       cmd:
         logdb:
           TIME       1509948584.03511
           VALUE      1
       cmd_event:
         logdb:
           TIME       1509948584.03511
           VALUE      Helligkeitssensor_Aussen
       cmd_nr:
         logdb:
           TIME       1509948584.03511
           VALUE      1
       state:
         logdb:
           TIME       1509948584.03511
           VALUE      cmd_1
   READINGS:
     2017-11-06 07:50:52   Device          Helligkeitssensor_Aussen
     2017-11-06 07:09:44   cmd             1
     2017-11-06 07:09:44   cmd_event       Helligkeitssensor_Aussen
     2017-11-06 07:09:44   cmd_nr          1
     2017-11-06 07:10:18   e_EG_Jalousie_Terasse_gr_STATE auf
     2017-11-05 14:25:40   e_Fenster_Terasse_gr_STATE closed
     2017-11-06 07:50:52   e_Helligkeitssensor_Aussen_brightness 1609.68
     2017-11-06 07:09:44   state           cmd_1
     2017-11-05 16:56:29   timer_01_c01    06.11.2017 09:00:00|7
     2017-11-05 16:56:29   timer_02_c01    06.11.2017 06:30:00|8
     2017-11-05 16:56:29   timer_03_c01    06.11.2017 09:00:00|8
     2017-11-05 22:30:00   timer_04_c02    06.11.2017 18:00:00|7
     2017-11-05 22:30:00   timer_05_c02    06.11.2017 22:30:00|7
     2017-11-05 22:30:00   timer_06_c02    06.11.2017 18:00:00|8
     2017-11-05 22:30:00   timer_07_c02    06.11.2017 22:30:00|8
     2017-11-05 22:30:00   timer_08_c03    06.11.2017 18:00:00|7
     2017-11-05 22:30:00   timer_09_c03    06.11.2017 22:30:00|7
     2017-11-05 22:30:00   timer_10_c03    06.11.2017 18:00:00|8
     2017-11-05 22:30:00   timer_11_c03    06.11.2017 22:30:00|8
   condition:
     0            (InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "auf" and InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "off")   and   (DOIF_time_once($hash,0,$wday,"7") or (DOIF_time($hash,1,2,$wday,$hms,"8") and ReadingValDoIf($hash,'Helligkeitssensor_Aussen','brightness') > 60))
     1            (InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "zu" and InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "on" and InternalDoIf($hash,'Fenster_Terasse_gr','STATE') eq "closed")   and   ((DOIF_time($hash,3,4,$wday,$hms,"7") or DOIF_time($hash,5,6,$wday,$hms,"8")) and ReadingValDoIf($hash,'Helligkeitssensor_Aussen','brightness') < 5)
     2            (InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "zu" and InternalDoIf($hash,'EG_Jalousie_Terasse_gr','STATE') !~ "on" and InternalDoIf($hash,'Fenster_Terasse_gr','STATE') eq "tilted")   and   ((DOIF_time($hash,7,8,$wday,$hms,"7") or DOIF_time($hash,9,10,$wday,$hms,"8")) and ReadingValDoIf($hash,'Helligkeitssensor_Aussen','brightness') < 5)
   days:
     0          7
     1          8
     10         8
     2          8
     3          7
     4          7
     5          8
     6          8
     7          7
     8          7
     9          8
   devices:
     0           EG_Jalousie_Terasse_gr Helligkeitssensor_Aussen
     1           EG_Jalousie_Terasse_gr Fenster_Terasse_gr Helligkeitssensor_Aussen
     2           EG_Jalousie_Terasse_gr Fenster_Terasse_gr Helligkeitssensor_Aussen
     all         EG_Jalousie_Terasse_gr Helligkeitssensor_Aussen Fenster_Terasse_gr
   do:
     0:
       0          set EG_Jalousie_Terasse_gr auf
     1:
       0          set EG_Jalousie_Terasse_gr zu
     2:
       0          set EG_Jalousie_Terasse_gr 50
     3:
   helper:
     event      brightness: 1609.68
     globalinit 1
     last_timer 11
     sleeptimer -1
     timerdev   EG_Jalousie_Terasse_gr
     timerevent rssi_at_myHmUART_WLAN: -44
     triggerDev Helligkeitssensor_Aussen
     timerevents:
       rssi_at_myHmUART_WLAN: -44
     timereventsState:
       rssi_at_myHmUART_WLAN: -44
     triggerEvents:
       brightness: 1609.68
     triggerEventsState:
       brightness: 1609.68
   internals:
     0           EG_Jalousie_Terasse_gr:STATE
     1           EG_Jalousie_Terasse_gr:STATE Fenster_Terasse_gr:STATE
     2           EG_Jalousie_Terasse_gr:STATE Fenster_Terasse_gr:STATE
     all         EG_Jalousie_Terasse_gr:STATE Fenster_Terasse_gr:STATE
   interval:
     1          -1
     10         9
     2          1
     3          -1
     4          3
     5          -1
     6          5
     7          -1
     8          7
     9          -1
   itimer:
   localtime:
     0          1509955200
     1          1509946200
     10         1510003800
     2          1509955200
     3          1509987600
     4          1510003800
     5          1509987600
     6          1510003800
     7          1509987600
     8          1510003800
     9          1509987600
   readings:
     0           Helligkeitssensor_Aussen:brightness
     1           Helligkeitssensor_Aussen:brightness
     2           Helligkeitssensor_Aussen:brightness
     all         Helligkeitssensor_Aussen:brightness
   realtime:
     0          09:00:00
     1          06:30:00
     10         22:30:00
     2          09:00:00
     3          18:00:00
     4          22:30:00
     5          18:00:00
     6          22:30:00
     7          18:00:00
     8          22:30:00
     9          18:00:00
   regexp:
     0:
     1:
     2:
     all:
   state:
     STATE:
   time:
     0          {sunrise("REAL",0,"09:00","10:30")}
     1          06:30:00
     10         22:30:00
     2          09:00:00
     3          18:00:00
     4          22:30:00
     5          18:00:00
     6          22:30:00
     7          18:00:00
     8          22:30:00
     9          18:00:00
   timeCond:
     0          0
     1          0
     10         2
     2          0
     3          1
     4          1
     5          1
     6          1
     7          2
     8          2
     9          2
   timer:
     0          0
     1          0
     10         0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
     8          0
     9          0
   timers:
     0           0
   trigger:
   triggertime:
     1509955200:
       localtime  1509955200
       hash:
     1509987600:
       localtime  1509987600
       hash:
     1510003800:
       localtime  1510003800
       hash:
Attributes:
   eventMap   on:zu off:auf
   group      Jalousie_Automatik
   icon       helper_doif
   room       Wohnzimmer
   sortby     8



Ich wäre euch für eure Hilfe sehr dankbar.

Gruß Alex

Brockmann

Da die Bedingungen für Wochenende und Werktag bislang ja praktisch identisch sind, könnte das Problem beim Status des DOIFs bzw. beim manuellen Schalten liegen.
Wenn Du die Rollos manuell bewegst, beeinflusst Du ja auch das DOIF, da dort der Status jeweils abgefragt wird. Wenn Du also beispielsweise morgens das Rollo manuell hoch fährst, bevor das DOIF das erledigen kann, bleibt es im Status des Vorabends. Wenn dann am nächsten Abend die Bedingungen für das Runterfahren wieder erreicht werden, ist es noch in diesem Status. Es findet also kein Statuswechsel statt und das DOIF tut nichts.
Der Unterschied zwischen Werktag und Wocheende wäre also, dass werktags das DOIF zum Zuge kommt, während Du am Wocheende morgens manuell öffnest, bevor das DOIF auslöst? - Nur eine Vermutung.

Ändern könntest Du das mit dem Attribut do always, was aber andere Nebenwirkungen haben kann.
Oder Du verschiebst die Abfrage, ob die Rollos überhaupt bewegt werden dürfen/müssen in den Ausführungsteil:
IF ([EG_Jalousie_Terasse_gr] !~ "auf" and [EG_Jalousie_Terasse_gr] !~ "off") (set EG_Jalousie_Terasse_gr auf)

Ungeteste und ohne Gewähr...

Nighthawk

#2
Als erstes vielen Dank für die schnelle Rückmeldung.

Auf den ersten Blick klingt das plausibel, nach nochmaligen durchlesen bin ich mir aber nicht mehr sicher.

Es ist tatsächlich so, dass am Wochenende meistens das DOIF nicht zum Zuge kommt. Aber warum sollte es dann nicht am nächsten Abend greifen?
Die Abfrage
([EG_Jalousie_Terasse_gr] !~ "auf" and [EG_Jalousie_Terasse_gr] !~ "off")
bzw. ([EG_Jalousie_Terasse_gr] !~ "zu" and [EG_Jalousie_Terasse_gr] !~ "on")

soll ja nur sicherstellen dass nicht unnötig angesteuert wird wenn die Rollos sowieso schon oben bzw. in dem Problemfall unten sind. Ich hätte erwartet dass dieser Zweig in dem Fall einfach ignoriert wird, oder verstehe ich die Statemashine dahinter falsch?

Ich bin mir auch ziemlich sicher dass in der Woche ich die Rollos auch händisch geöffnet habe und das DOIF am Abend hat da meines Wissens sauber funktioniert.


Ich werde es morgen noch mal testen.


Gruß
Alex

maci

Ich hatte gerade eine ähnliches Thema.

Bei der Rolladengeschichte, die mir noch bevorsteht, könnte ich mir vorstellen, dass du dein DOIF während des Tages über ein at auf das richtige cmd1/2 setzt. Das gleiche kannst du auch in der Nacht machen.

Somit startet das DOIF immer im richtigen Status.
Fhem auf Dell Thinclient, Fhem auf Raspebrry Pi4,
UniPi Vers. 1.1 mit Raspberry Pi3, 1wire USB Adapter mit OWX
Netatmo Wetterstation + Regenmesser + Netatmo Thermostat
Homematic mit HMLan

Nighthawk

#4
Scheinbar habe ich das DOIF noch nicht vollständig verstanden (muss ich mir in Ruhe nochmal durchlesen).
Werden die cmd States immer nur in der richtige Reihenfolge abgearbeitet und nicht nach dem Motto "führe das aus was gerade zutrifft"?


EDIT:
Habe den Ausschlaggebenden Satz in der Doku gefunden:
Das DOIF-Modul arbeitet mit Zuständen. Jeder Ausführungszweig DOIF/DOELSEIF..DOELSEIF/DOELSE stellt einen eigenen Zustand dar (cmd_1, cmd_2, usw.). Das Modul merkt sich den zuletzt ausgeführten Ausführungszweig und wiederholt diesen standardmäßig nicht.

Jetzt muss ich tatsächlich at's basteln um DOIF in die richtigen Bahnen zu lenken, oder hat jemand eine bessere Idee?

nils_

do always wurde ja schon genannt
oder ein
DOELSEIF [0:01] kein ausführungsteil nötig
viele Wege in FHEM es gibt!

pc1246

Moin
Ich sehe eigentlich kein Problem! Ausser du faehrst die nach dem Runterfahren noch mal hoch, und erwartest, dass Sie wieder runterfahren. Du bist doch immer in einem definierten Zustand. Oder hast Du die Rollaeden noch irgendwo anders drin?
BTW: Was sind das fuer welche? Homematic oder etwas anderes?
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

Nighthawk

@nils_
Do always führt leider dazu dass die Rolladenaktoren ständig immer wieder angesteuert werden (solange die Bedingung wahr ist), was sicherlich nicht förderlich für die Lebensdauer der Aktoren ist.

Das mit dem DOELSEIF probiere ich mal aus, danke.

@Christoph
Das Problem ist eben, dass ich, wenn ich manuell morgens vor dem DoIf die Rolladen öffne, in dem Abend-Doif Zweig "hängen" bleibe und dieser wird im Normalfall nicht nochmal ausgeführt.

Die Aktoren sind Homematic.


Gruß
Alex

Neuhier

Mache es doch per at-Befehl.
Dann ist es völlig egal, ob Du die irgendwann schon hochgefahren hast, die werden zur eingestellten Zeit angesteuert, fertig.

pc1246

Zitat von: Nighthawk am 06 November 2017, 16:49:37
@nils_
Do always führt leider dazu dass die Rolladenaktoren ständig immer wieder angesteuert werden (solange die Bedingung wahr ist), was sicherlich nicht förderlich für die Lebensdauer der Aktoren ist.

Das mit dem DOELSEIF probiere ich mal aus, danke.

Alex
Hast Du Dir das angesehen, was Nils Dir da vorschlaegt? Das bewirkt, dass Du um 0:01 Uhr in den Pfad rein kommst. Hilft Dir aber fuer den Abend nichts! Aber wenn Du es sinnvoll erweiterst, dann kommst Du da immer hin! (z.B.: OR [12:01])
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

Nighthawk

Hi Christoph,

das habe ich vor zu testen:
Zitat von: Nighthawk am 06 November 2017, 16:49:37
Das mit dem DOELSEIF probiere ich mal aus, danke.

Und das mit 0:01 Uhr bringt doch was, denn das doif wird dann (in meinem Fall) auf cmd4 gesetzt und das ist ja ungleich 2 oder 3.

So langsam habe ich den Part wohl verstanden.

Brockmann

Zitat von: Nighthawk am 06 November 2017, 13:20:56
soll ja nur sicherstellen dass nicht unnötig angesteuert wird wenn die Rollos sowieso schon oben bzw. in dem Problemfall unten sind. Ich hätte erwartet dass dieser Zweig in dem Fall einfach ignoriert wird, oder verstehe ich die Statemashine dahinter falsch?
Deshalb ja auch mein Vorschlag, die Abfrage, ob die Rollos nicht ohnehin schon in der gewünschten Position sind, per IF in den Ausführungsteil zu verlagern. Dann sind die Bedingungen für die state machine unabhängig vom Zustand des Rollos zum gewünschten Zeitpunkt immer wahr. Trotzdem wird nur geschaltet, wenn wirklich nötig.
Scheint mir in diesem Fall die einfachsten Lösung zu sein.

Nighthawk

#12
Das würde aber aus meiner Sicht das ganze Konstrunkt nur unnötig unübersichtlich machen.
Ich denke die einfachste Lösung ist mit dem DOELSEIF ([0:01]).
Ohne die Runden Klammern nimmt FHEM die Bedingung nicht an, es kommt die Meldung dass eine Klammer rechts fehlt.

Ich probiere trotzdem mal beide Varianten aus.

Danke für die hilfreichen Tips!

nils_

Zitat von: Nighthawk am 07 November 2017, 14:27:58
Ich denke die einfachste Lösung ist mit dem DOELSEIF ([0:01]).
Ohne die Runden Klammern nimmt FHEM die Bedingung nicht an, es kommt die Meldung dass eine Klammer rechts fehlt.
die runden Klammern fehlten bei mir. sorry!
müssen natürlich dahin. syntax siehe https://fhem.de/commandref_DE.html#DOIF
viele Wege in FHEM es gibt!

Nighthawk

Kurze Rückmeldung, zumindest die Variante mit DOIF ([0:01]) hat schon mal funktioniert, daher habe ich das Thema als gelöst markiert.
Die zweite Variante mit der Abfrage im Ausführungsteil versuche ich zum Wochenende zu testen und Rückmeldung geben.

Danke nochmal an alle die unterstützt haben!