Dämmerungszustand/Helligkeit löst kein DOIF aus ohne "do always" zu setzen

Begonnen von Sirel, 08 Juli 2015, 22:06:02

Vorheriges Thema - Nächstes Thema

Sirel

Hallo zusammen,
ich besitze einen Helligkeitssensor, welcher ca. alle 20 Min. den aktuellen Helligkeitswert übermittelt. Das funktioniert auch alles tadellos.
Mit Hilfe eines DOIFs möchte ich, ab einer bestimmten Helligkeitsgrenze und in Verbindung mit einem Uhrzeitintervall, die Rollladen runterfahren.
([?18:00-23:00] and [EG_BM_1:brightness] == 0 and [?rgr_Bewohner] =~ /gone|absent/)
Nach meinem Verständnis müsste, sobald der Brightnesswert 1x >0 war (irgendwann im Laufe des Tages) und danach zwischen 18 und 23 Uhr auf Null fällt und ich nicht da bin, der Rollladen runterfahren.
Ein "do always" macht, analog zum Beispiel in der CommandRef, wenig Sinn, da das Rollladen-Relais nicht die ganze Nacht hindurch zyklisch getriggert werden soll (wenngleich man natürlich den Rollladenzustand auch mit abfragen könnte und somit den trigger umgehen könnte).
Mein DOIF verpasst aber immer seinen "Einsatz". Der Befehl wird nur dann ausgeführt, wenn ich das "do always" attribut setze :o
Der brightness=0 Wert wurde bis dato nie vor 18 Uhr erreicht. Immer erst nach 20 Uhr. Womit kann dieser Effekt zu tun haben? Kann es sein, dass der Wechsel von Null nach größer Null und zurück auf Null im gleichen oben definierten Zeitfenster stattfinden muss (also zwischen 18 und 23 Uhr?) Wenn ja, hilft dann nur den Zeitbezug zu löschen und mit dem "wait" Attribut zu arbeiten, damit nicht, sobald mal eine dunkle Wolke vorbeikommt, gleich alles geschlossen wird?

Vielen Dank für eine kurze Erklärung,

Max

PS:
Verbose 5 liefert keine Fehlermeldung. Wie gesagt, bei gesetztem "do always" funktioniert der code so wie es sein soll.

Damian

Zitat von: Sirel am 08 Juli 2015, 22:06:02
Hallo zusammen,
ich besitze einen Helligkeitssensor, welcher ca. alle 20 Min. den aktuellen Helligkeitswert übermittelt. Das funktioniert auch alles tadellos.
Mit Hilfe eines DOIFs möchte ich, ab einer bestimmten Helligkeitsgrenze und in Verbindung mit einem Uhrzeitintervall, die Rollladen runterfahren.
([?18:00-23:00] and [EG_BM_1:brightness] == 0 and [?rgr_Bewohner] =~ /gone|absent/)
Nach meinem Verständnis müsste, sobald der Brightnesswert 1x >0 war (irgendwann im Laufe des Tages) und danach zwischen 18 und 23 Uhr auf Null fällt und ich nicht da bin, der Rollladen runterfahren.
Ein "do always" macht, analog zum Beispiel in der CommandRef, wenig Sinn, da das Rollladen-Relais nicht die ganze Nacht hindurch zyklisch getriggert werden soll (wenngleich man natürlich den Rollladenzustand auch mit abfragen könnte und somit den trigger umgehen könnte).
Mein DOIF verpasst aber immer seinen "Einsatz". Der Befehl wird nur dann ausgeführt, wenn ich das "do always" attribut setze :o
Der brightness=0 Wert wurde bis dato nie vor 18 Uhr erreicht. Immer erst nach 20 Uhr. Womit kann dieser Effekt zu tun haben? Kann es sein, dass der Wechsel von Null nach größer Null und zurück auf Null im gleichen oben definierten Zeitfenster stattfinden muss (also zwischen 18 und 23 Uhr?) Wenn ja, hilft dann nur den Zeitbezug zu löschen und mit dem "wait" Attribut zu arbeiten, damit nicht, sobald mal eine dunkle Wolke vorbeikommt, gleich alles geschlossen wird?

Vielen Dank für eine kurze Erklärung,

Max

PS:
Verbose 5 liefert keine Fehlermeldung. Wie gesagt, bei gesetztem "do always" funktioniert der code so wie es sein soll.

Auch hier ein list von deinem Modul hier posten, dann kann man etwas dazu sagen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MaJu

Wenn du nur eine einzige DO-Bedingung angibst, wird sie genau einmal ausgeführt, sobald alle Parameter erstmals stimmen.

Da es aber beim nächsten Mal auch wieder auslösen soll wenn die Bedingungen erfüllt sind, MUSST du das do=always setzen.
Erlebnisreiche Grüße aus Leipzig!

Sirel

Hallo MaJu,

danke für den Hinweis. Da bin ich mir eben nicht sicher. Ich lasse mir nämlich, sobald die Helligkeit einen bestimmten Wert unterschreitet, eine Pushnachricht auf mein Handy schicken. Im Code ist ebenfalls nur eine DO-Bedingung hinterlegt und dennoch erhalte ich jeden Tag mind. eine Nachricht. Das attribut do always habe ich ebenfalls nicht nicht gesetzt. Es sind manchmal sogar mehrere, bspw. dann, wenn eine dunkle Wolke vorbeizieht und die Helligkeit kurzzeitig abfällt, dann wieder steigt und abends wieder sinkt.
Somit entspricht das Verhalten exakt dem, was in der Commandref beschrieben ist.
Meine Rollladensteuerung ist doch aber eigentlich auch genau das gleiche wie im Commandref Beispiel, nur dass ich die Heizung gegen einen Rollladenmoter getauscht habe. Allerdings angereichert um einen Zeitintervall. Daher bin ich überhaupt darauf gestoßen, dass möglicherweise der Zustandwechsel innerhalb des definierten Zeitintervall erfolgen muss.

Nebenbei: Vielleicht ist das auch ein Grund, weswegen bei dem anderen Fragesteller der Rollladen nur hin- und wieder das tut, was er soll. Wenn ich es richtig gesehen habe, hat er auch eine Kombination aus Zeitfenster (Sonnenauf/untergang) mit der einer Helligkeitsbedingung verknüpft.

Viele Grüße und Danke,

Max

Brockmann

Wie hier schon geschrieben, bei solchen Fragen immer ein list <Name des DOIFs> machen und das Ergebnis hier in einen Code-Block posten.
Sonst ist das überwiegend Kaffeesatzleserei.
In diesem Sinne möchte ich eines zu Bedenken geben: Im Moment wird es SEHR spät erst dunkel. Könnte es vielleicht sein, dass Dein Helligkeitssensor erst nach 23:00 Uhr auf 0 absinkt? Dann wäre die Zeitbedingung nicht mehr erfüllt und die Bedingung würde nie zutreffen. Vielleicht hast Du ja ein Log der Sensordaten und kannst mal reinschauen, wann in den letzten Tagen typischerweise 0 erreicht wurde.

Ansonst wie gesagt bitte ein list... machen, am Besten in der Situation, wo es nicht wie erwartet funktioniert.

Sirel

Hallo,
war eben noch nicht zu Hause und konnte daher nicht auf die Daten zugreifen. Anbei die Daten:


Internals:
   DEF        ([?18:00-23:00] and [EG_BM_1:brightness] == 0 and [?rgr_Bewohner] =~ /gone|absent/) (set LS scene abends_{(int(rand(4))+1)}, set Fenster_1 on) DOELSEIF ([?18:00-23:00] and [EG_BM_1:brightness] == 0 and [?rgr_Bewohner] =~ /home|gotosleep/) (set LS scene weiss, set Fenster_1 on)
   NAME       LxLightscene
   NR         64
   NTFY_ORDER 50-LxLightscene
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2015-07-08 21:54:42   cmd_event       EG_BM_1
     2015-07-08 21:54:42   cmd_nr          2
     2015-07-09 17:45:26   e_EG_BM_1_brightness 337
     2015-07-08 21:54:42   state           cmd_2
     2015-07-08 21:22:18   timer_1_c1      09.07.2015 18:00:00
     2015-07-08 23:00:00   timer_2_c1      09.07.2015 23:00:00
     2015-07-08 21:22:18   timer_3_c2      09.07.2015 18:00:00
     2015-07-08 23:00:00   timer_4_c2      09.07.2015 23:00:00
     2015-07-08 21:54:42   wait_timer      no timer
   Condition:
     0          DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and ReadingValDoIf('EG_BM_1','brightness','') == 0 and InternalDoIf('rgr_Bewohner','STATE','') =~ /gone|absent/
     1          DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"") and ReadingValDoIf('EG_BM_1','brightness','') == 0 and InternalDoIf('rgr_Bewohner','STATE','') =~ /home|gotosleep/
   Days:
   Devices:
     0           EG_BM_1
     1           EG_BM_1
     all         EG_BM_1
   Do:
     0          set LS scene abends_{(int(rand(4))+1)}, set Fenster_1 on
     1          set LS scene weiss, set Fenster_1 on
   Helper:
     last_timer 4
     sleepdevice EG_BM_1
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
     0           EG_BM_1:brightness
     1           EG_BM_1:brightness
     all         EG_BM_1:brightness
   Realtime:
     0          18:00:00
     1          23:00:00
     2          18:00:00
     3          23:00:00
   State:
   Time:
     0          18:00:00
     1          23:00:00
     2          18:00:00
     3          23:00:00
   Timecond:
     0          0
     1          0
     2          1
     3          1
   Timer:
     0          0
     1          0
     2          0
     3          0
   Timerfunc:
   Timers:
   Trigger:
Attributes:
   room       Unsorted
   verbose    3
   wait       1200:1200



Im Anhang noch die Kurve über den Helligkeitsverlauf.

Könnte es denn an meinem Verdacht etwas dran sein?

Max

Damian

Zitat von: Sirel am 09 Juli 2015, 17:51:57
Hallo,
war eben noch nicht zu Hause und konnte daher nicht auf die Daten zugreifen. Anbei die Daten:


Internals:
   DEF        ([?18:00-23:00] and [EG_BM_1:brightness] == 0 and [?rgr_Bewohner] =~ /gone|absent/) (set LS scene abends_{(int(rand(4))+1)}, set Fenster_1 on) DOELSEIF ([?18:00-23:00] and [EG_BM_1:brightness] == 0 and [?rgr_Bewohner] =~ /home|gotosleep/) (set LS scene weiss, set Fenster_1 on)
   NAME       LxLightscene
   NR         64
   NTFY_ORDER 50-LxLightscene
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2015-07-08 21:54:42   cmd_event       EG_BM_1
     2015-07-08 21:54:42   cmd_nr          2
     2015-07-09 17:45:26   e_EG_BM_1_brightness 337
     2015-07-08 21:54:42   state           cmd_2
     2015-07-08 21:22:18   timer_1_c1      09.07.2015 18:00:00
     2015-07-08 23:00:00   timer_2_c1      09.07.2015 23:00:00
     2015-07-08 21:22:18   timer_3_c2      09.07.2015 18:00:00
     2015-07-08 23:00:00   timer_4_c2      09.07.2015 23:00:00
     2015-07-08 21:54:42   wait_timer      no timer
   Condition:
     0          DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and ReadingValDoIf('EG_BM_1','brightness','') == 0 and InternalDoIf('rgr_Bewohner','STATE','') =~ /gone|absent/
     1          DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"") and ReadingValDoIf('EG_BM_1','brightness','') == 0 and InternalDoIf('rgr_Bewohner','STATE','') =~ /home|gotosleep/
   Days:
   Devices:
     0           EG_BM_1
     1           EG_BM_1
     all         EG_BM_1
   Do:
     0          set LS scene abends_{(int(rand(4))+1)}, set Fenster_1 on
     1          set LS scene weiss, set Fenster_1 on
   Helper:
     last_timer 4
     sleepdevice EG_BM_1
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
     0           EG_BM_1:brightness
     1           EG_BM_1:brightness
     all         EG_BM_1:brightness
   Realtime:
     0          18:00:00
     1          23:00:00
     2          18:00:00
     3          23:00:00
   State:
   Time:
     0          18:00:00
     1          23:00:00
     2          18:00:00
     3          23:00:00
   Timecond:
     0          0
     1          0
     2          1
     3          1
   Timer:
     0          0
     1          0
     2          0
     3          0
   Timerfunc:
   Timers:
   Trigger:
Attributes:
   room       Unsorted
   verbose    3
   wait       1200:1200



Im Anhang noch die Kurve über den Helligkeitsverlauf.

Könnte es denn an meinem Verdacht etwas dran sein?

Max

Wann soll denn deiner Meinung nach dein Modul in den cmd_1-Fall wechseln?

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

Hi Damian,

ich hätte es so verstanden, dass wenn der Helligkeitswert > 0 ist, dann cmd_2 (also nichts), sonst wenn Helligkeitswert = 0 dann cmd_1. Kleiner 0 gibt es ja nicht...

Ich entnehme aber Deiner Antwort, dass ich da wohl falsch liege.... :o

Was wäre denn dann richtig?

Viele Grüße und Danke,
Max

Damian

Zitat von: Sirel am 09 Juli 2015, 20:37:49
Hi Damian,

ich hätte es so verstanden, dass wenn der Helligkeitswert > 0 ist, dann cmd_2 (also nichts), sonst wenn Helligkeitswert = 0 dann cmd_1. Kleiner 0 gibt es ja nicht...

Ich entnehme aber Deiner Antwort, dass ich da wohl falsch liege.... :o

Was wäre denn dann richtig?

Viele Grüße und Danke,
Max

Den Fall Helligkeitswert > 0 sehe ich in deiner Definition nicht. Du hast zwei Fälle definiert mit Helligkeitswert == 0 und etwas mit "and" verknüpft dazu. DOELSE-Fall hast du nicht.

Was richtig ist, ist das was der Anwender umsetzen will und das habe ich aus deiner Formulierung und der Definition des Moduls noch nicht verstanden. Es ist nicht immer einfach für einen Nicht-Informatiker eine natürliche Sprache und streng logische Aussagen unter einen Hut zu bringen. Ich bin mir aber sicher, dass hier noch einige DOIF-Experten mitlesen und durch Frage-Antwort zu einer Lösung kommen, die deinen Vorstellungen entspricht.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

Hi Damian,
vielen Dank für's Mitdenken. Das glaube ich Dir auf's Wort, dass es nicht immer einfach ist nachzuvollziehen, was der FHEM Nutzer so gerade alles probieren/umsetzen möchte...
Also, den Fall >0 habe ich nicht definiert, da auch nichts passieren soll.
Ich unterscheide eigentlich nur 2 Ding:
1. Ich bin da, die Helligkeit fällt auf 0 und es ist zwischen 18 und 23 Uhr, dann Lichtszene weiss an und Rollladen runter.
2. Ich bin nicht da, die Helligkeit fällt auf 0 und es ist zwischen 18 und 23 Uhr, dann schalte eine Lichtszene mit der Endung 1,2,3,4 an und fahre den Rolladen runter.

Wenn ich ein do always als attribut setze, funktioniert alles. Führt aber dazu, dass bei jedem Statusupdate des Sensors ein Schaltsignal gesendet wird (das Relais klackt).
Ich könnte jetzt natürlich in der Bedingung noch die Position der Rollladen abfragen. Aus dem Commandref habe ich nur verstanden, dass ich das eigentlich nicht brauche, wenn ich das "do always" weglasse...

Eigentlich eher eine Verständnisfrage...

Danke nochmal und schönen Abend,

Max


Virsacer

Also so wie ich es verstanden habe, kann ohne das do always der selbe Befehl nicht mehrfach hintereinander ausgeführt werden.
Du müsstest also immer abwechselnd einen Tag zuhause und am nächsten abwesend sein, damit es funktioniert :D

Ich hab bei mir alle DOIFs auf do always gestellt und frage wenn möglich/sinvoll in der Bedingung mit ab, ob das was ich schalten will nicht schon bereits so geschaltet ist ;)

Sirel

Jetzt noch mal in der Version wenn es hätte anfangen sollen, bzw. der Timer hätte starten sollen.
Hat es aber nicht... :'(



Internals:
   DEF        ([?18:00-23:00] and [EG_BM_1:brightness] == 0 and [?rgr_Bewohner] =~ /gone|absent/) (set LS scene abends_{(int(rand(4))+1)}, set Fenster_1 on) DOELSEIF ([?18:00-23:00] and [EG_BM_1:brightness] == 0 and [?rgr_Bewohner] =~ /home|gotosleep/) (set LS scene weiss, set Fenster_1 on)
   NAME       LxLightscene
   NR         64
   NTFY_ORDER 50-LxLightscene
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2015-07-08 21:54:42   cmd_event       EG_BM_1
     2015-07-08 21:54:42   cmd_nr          2
     2015-07-09 21:17:39   e_EG_BM_1_brightness 0
     2015-07-08 21:54:42   state           cmd_2
     2015-07-09 18:00:00   timer_1_c1      10.07.2015 18:00:00
     2015-07-08 23:00:00   timer_2_c1      09.07.2015 23:00:00
     2015-07-09 18:00:00   timer_3_c2      10.07.2015 18:00:00
     2015-07-08 23:00:00   timer_4_c2      09.07.2015 23:00:00
     2015-07-08 21:54:42   wait_timer      no timer
   Condition:
     0          DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") and ReadingValDoIf('EG_BM_1','brightness','') == 0 and InternalDoIf('rgr_Bewohner','STATE','') =~ /gone|absent/
     1          DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"") and ReadingValDoIf('EG_BM_1','brightness','') == 0 and InternalDoIf('rgr_Bewohner','STATE','') =~ /home|gotosleep/
   Days:
   Devices:
     0           EG_BM_1
     1           EG_BM_1
     all         EG_BM_1
   Do:
     0          set LS scene abends_{(int(rand(4))+1)}, set Fenster_1 on
     1          set LS scene weiss, set Fenster_1 on
   Helper:
     last_timer 4
     sleepdevice EG_BM_1
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
     0           EG_BM_1:brightness
     1           EG_BM_1:brightness
     all         EG_BM_1:brightness
   Realtime:
     0          18:00:00
     1          23:00:00
     2          18:00:00
     3          23:00:00
   State:
   Time:
     0          18:00:00
     1          23:00:00
     2          18:00:00
     3          23:00:00
   Timecond:
     0          0
     1          0
     2          1
     3          1
   Timer:
     0          0
     1          0
     2          0
     3          0
   Timerfunc:
   Timers:
   Trigger:
Attributes:
   room       Unsorted
   verbose    3
   wait       1200:1200

Virsacer

Laut den Readings warst du gestern zuhause und anscheinend bist du es heute auch --> Wäre ein zweites mal cmd_2, aber es muss erst einmal cmd_1 dazwischen kommen...

Sirel

Hi Virsacer,
genau das war/ist der Punkt - besten Dank :D Gerade mal den Abwesenheitsstatus geändert und jetzt läuft es. Dann mache ich es so wie Du es machst und frage einfach den Status des Rollladens mit ab  :P

Besten Dank für Deine Hilfe und schönen Abend,

Max

Damian

Zitat von: Virsacer am 09 Juli 2015, 21:24:27
Laut den Readings warst du gestern zuhause und anscheinend bist du es heute auch --> Wäre ein zweites mal cmd_2, aber es muss erst einmal cmd_1 dazwischen kommen...

ja, der gleiche Zustand wird nicht wiederholt.

Es reicht wahrscheinlich schon ein DOELSE-Fall ohne Ausführungsteil am Ende ...s, set Fenster_1 on) DOELSE damit ein weiterer Zustand cmd_3 dazwischen kommt. Ein do always bei zyklisch sendenden Sensoren ist nicht günstig.

Gruß
Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF