FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: andi11 am 01 November 2017, 06:35:47

Titel: Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: andi11 am 01 November 2017, 06:35:47

Hallo,
ich hab ein Problem mit unserer neuen Aussenbeleuchtung. Eigentlich sollte sie angehen wenn es weniger als 200lux hat, und ausgehen wenn 23:50+etwas Zufall ist. Dann sollte sie um 4:50+etwas Zufall wieder angehen bis es >20lux hat.
Mein Verständnis war das der erste IF Zweig nur wieder angefahren wird, wenn zwischendrin ein anderer dran war. (Denn doalways ist ja nicht an)
Mein Senoser Umwelt_Licht_Aussen liefert alle paar Minuten einen aktuellen Helligkeitswert.

Allerdings sieht es so aus dass der Befehlsteil "Licht aus weil es nach 23:50 ist" nicht angesprungen wird, da immerwieder ein Wert von Umwelt_Licht_Aussen kommt.



DOIF:


Internals:
   DEF        ([Umwelt_Helligkeit_Aussen:state:d]<200)
  (set Licht_Aussen_Haustuer value on)
DOELSEIF ([([23:50]+int(rand(600)))])
  (set Licht_Aussen_Haustuer value off)
DOELSEIF ([([4:50]+int(rand(600)))])
  (set Licht_Aussen_Haustuer value on)
DOELSEIF ([Umwelt_Helligkeit_Aussen:state:d]>20)
  (set Licht_Aussen_Haustuer value off)

   NAME       DOIF_Licht_Eingang
   NR         44
   NTFY_ORDER 50-DOIF_Licht_Eingang
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2017-11-01 06:30:39   Device          Umwelt_Helligkeit_Aussen
     2017-11-01 05:00:40   cmd             1
     2017-11-01 05:00:40   cmd_event       Umwelt_Helligkeit_Aussen
     2017-11-01 05:00:40   cmd_nr          1
     2017-11-01 06:30:39   e_Umwelt_Helligkeit_Aussen_state 0.00 lux
     2017-11-01 05:00:40   state           cmd_1
     2017-10-31 23:58:51   timer_01_c02    01.11.2017 23:51:58
     2017-11-01 04:57:18   timer_02_c03    02.11.2017 04:54:59
   Condition:
     0          ReadingValDoIf($hash,'Umwelt_Helligkeit_Aussen','state','','(-?\d+(\.\d+)?)')<200
     1          DOIF_time_once($hash,0,$wday)
     2          DOIF_time_once($hash,1,$wday)
     3          ReadingValDoIf($hash,'Umwelt_Helligkeit_Aussen','state','','(-?\d+(\.\d+)?)')>20
   Days:
   Devices:
     0           Umwelt_Helligkeit_Aussen
     3           Umwelt_Helligkeit_Aussen
     all         Umwelt_Helligkeit_Aussen
   Do:
     0:
       0          set Licht_Aussen_Haustuer value on
     1:
       0          set Licht_Aussen_Haustuer value off
     2:
       0          set Licht_Aussen_Haustuer value on
     3:
       0          set Licht_Aussen_Haustuer value off
     4:
   Helper:
     event      getG1: 0.00 lux,last-sender: 1/1/3,0.00 lux
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   Umwelt_Helligkeit_Aussen
     timerevent getG1: 0.00 lux,last-sender: 1/1/3,0.00 lux
     triggerDev Umwelt_Helligkeit_Aussen
     timerevents:
       getG1: 0.00 lux
       last-sender: 1/1/3
       0.00 lux
     timereventsState:
       getG1: 0.00 lux
       last-sender: 1/1/3
       state: 0.00 lux
     triggerEvents:
       getG1: 0.00 lux
       last-sender: 1/1/3
       0.00 lux
     triggerEventsState:
       getG1: 0.00 lux
       last-sender: 1/1/3
       state: 0.00 lux
   Internals:
   Interval:
   Itimer:
   Localtime:
     0          1509576718
     1          1509594899
   Readings:
     0           Umwelt_Helligkeit_Aussen:state
     3           Umwelt_Helligkeit_Aussen:state
     all         Umwelt_Helligkeit_Aussen:state
   Realtime:
     0          23:51:58
     1          04:54:59
   Regexp:
     0:
     1:
     2:
     3:
     All:
   State:
   Time:
     0          ([23:50]+int(rand(600)))
     1          ([4:50]+int(rand(600)))
   Timecond:
     0          1
     1          2
   Timer:
     0          0
     1          0
   Timers:
     1           0
     2           1
   Trigger:
   Triggertime:
     1509576718:
       localtime  1509576718
       Hash:
     1509594899:
       localtime  1509594899
       Hash:
Attributes:
   DbLogExclude .*
   room       Aussen
   verbose    5


Sensor Umwelt_Helligkeit_Aussen:

Internals:
   DEF        6/5/1:dpt9.004
   DEVNAME    Umwelt_Helligkeit_Aussen
   IODev      tul
   LASTInputDev tul
   MSGCNT     2801
   NAME       Umwelt_Helligkeit_Aussen
   NR         41
   NTFY_ORDER 50-Umwelt_Helligkeit_Aussen
   STATE      0.00 lux
   TYPE       KNX
   tul_MSGCNT 2801
   tul_RAWMSG C1103w65010000
   tul_TIME   2017-11-01 06:30:39
   Gaddr:
     1          6/5/1
   Gcode:
     1          6501
   Helper:
     Dblog:
       State:
         Logdb:
           TIME       1509514239.93468
           VALUE      0.00
   Model:
     1          dpt9.004
   Readings:
     2017-11-01 06:30:39   getG1           0.00 lux
     2017-11-01 06:30:39   last-sender     1/1/3
     2017-11-01 06:30:39   state           0.00 lux
   Readingsname:
Attributes:
   DbLogExclude .*
   DbLogInclude .*(state).*
   IODev      tul
   room       Aussen
   
   
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: CoolTux am 01 November 2017, 06:55:43
Bedingungen werden von links nach rechts abgearbeitet. So lange deine erste Bedingung Lux < 200 immer wahr wird wird auch immer der erste Zweig genommen. Mach Mal erst die zeitenabfrage und dann die Lux Abfrage.
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: Frank_Huber am 01 November 2017, 07:33:11
Der ersten Bedingung fehlt auch die schließende klammer

Gesendet von meinem S3_32 mit Tapatalk

Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: CoolTux am 01 November 2017, 07:39:56

( [Umwelt_Helligkeit_Aussen:state:d]<200 )


Meinst Du die? Ist doch alles da? Oder übersehe ich was am frühen morgen
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: Frank_Huber am 01 November 2017, 08:00:23
Zitat von: CoolTux am 01 November 2017, 07:39:56

( [Umwelt_Helligkeit_Aussen:state:d]<200 )


Meinst Du die? Ist doch alles da? Oder übersehe ich was am frühen morgen
DEF        ([Umwelt_Helligkeit_Aussen:state:d]  (set Licht_Aussen_Haustuer value on)


SOLL:
( Bedingung ) ( Befehl)

IST:
Er hat ( Bedingung ( Befehl)

Mit dem Handy online, daher kurz gefasst...
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: Frank_Huber am 01 November 2017, 08:05:05
OK, Fehler gefunden.
Tapatalk schneidet Code ab...

Im Browser seh ich alles.

Als Lösunsansatz:
Setz mal das Attribut do always

Mit dem Handy online, daher kurz gefasst...

Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: CoolTux am 01 November 2017, 08:07:31
Ah das hatten wir ja schon mal mit Tapatalk.

Aber die Lösung ist nicht do always sondern die korrekte Reihenfolge bei der Auswertung zu beachten. Siehe meinen ersten Post
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: Frank_Huber am 01 November 2017, 08:32:24
Ja, deswegen kam mir das in den Sinn und habs geprüft.
Werd Screenshots machen und denen melden.

Richtige Reihenfolge oder / und do  always geht beides.

Ich habs bei mir über do always gelöst da die Reihenfolge übers Jahr variieren kann je nach sr und ss.

Mit dem Handy online, daher kurz gefasst...

Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: andi11 am 01 November 2017, 09:00:19
Danke für die vielen Antworten zu so früher stunde.
Ich habe jetzt die Reihenfolge geädert, und werde testen.
Das ihr mir stattdessen aber auch "do always" empfehlt, verwirrt mich. Ich dachte es sorgt dafür das der Befehl unabhängig vom Zustand des doif ausgeführt wird.
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: Frank_Huber am 01 November 2017, 09:04:30


Zitat von: andi11 am 01 November 2017, 09:00:19
Das ihr mir stattdessen aber auch "do always" empfehlt, verwirrt mich. Ich dachte es sorgt dafür das der Befehl unabhängig vom Zustand des doif ausgeführt wird.

Ohne do always = Reihenfolge MUSS stimmen, sonst klemmts.
Mit do always = bei jedem trigger wird jeder Zweig geprüft, Reihenfolge egal.

Mit dem Handy online, daher kurz gefasst...

Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: automatisierer am 01 November 2017, 09:15:31
Zitat von: Frank_Huber am 01 November 2017, 09:04:30

Ohne do always = Reihenfolge MUSS stimmen, sonst klemmts.
Mit do always = bei jedem trigger wird jeder Zweig geprüft, Reihenfolge egal.

Mit dem Handy online, daher kurz gefasst...

Das ist richtig, bewirkt aber auch, dass
[Umwelt_Helligkeit_Aussen:state:d]<200
immer wieder wahr wird, egal wo es steht.
Davon ab, wird dir das alleinige umstellen des DOIF mMn auch nichts bringen, da
[Umwelt_Helligkeit_Aussen:state:d]<200
halt immer wahr ist wenn dunkel und alle paar Minuten getriggert wird.

Mein DOIF sieht so aus:
defmod Flur_eg_LichtAussen_doif DOIF (([06:30-21:00]) and [Sens_Lichtsensor_tr:brightness] <= 12) (set Flur_eg_ak_LichtTA on) \
DOELSE \
(set Flur_eg_ak_LichtTA off)

Die Rand-Zeiten solltest du da auch noch mit rein packen können, einzig die verschiedenen Helligkeitswerte stelle ich mir grad schwierig vor.

Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: Frank_Huber am 01 November 2017, 09:25:45
Ja, in seinem Fall ist das tatsächlich etwas tricky da er Zeit und Helligkeit nutzen will.
2 von 4 Pfaden haben jeweils den gleichen Befehl.
Ich würde versuchen das in Zwei Pfade zu reduzieren.

ungetestet, in diesem Fall ohne "DO always", sonst könnte sich Helligkeit und Uhrzeit beissen.
([Umwelt_Helligkeit_Aussen:state:d]<190 or [([4:50]+int(rand(600)))])
  (set Licht_Aussen_Haustuer value on)
DOELSEIF ([Umwelt_Helligkeit_Aussen:state:d]>210 or [([23:50]+int(rand(600)))])
  (set Licht_Aussen_Haustuer value off)
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: automatisierer am 01 November 2017, 09:32:18
([Umwelt_Helligkeit_Aussen:state:d]>200 and [Umwelt_Helligkeit_Aussen:state:d]<20)???

Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: Frank_Huber am 01 November 2017, 09:41:33
Zitat von: automatisierer am 01 November 2017, 09:32:18
([Umwelt_Helligkeit_Aussen:state:d]>200 and [Umwelt_Helligkeit_Aussen:state:d]<20)???

LOL, beim Zusammenkopieren passiert. Hast ja Recht. muss ich nochmal editieren.

Zuden denke ich dass er in beiden Fällen auf 200 Helligkeit prüfen wollte.
Hier sollten sich die Werte aber etwas auseinander bewegen. sonst kommt es zu unerwünschten an/aus Effekten in der Dämmerung
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: automatisierer am 01 November 2017, 10:03:47
([Umwelt_Helligkeit_Aussen:state:d]<190 or [([4:50]+int(rand(600)))])
  (set Licht_Aussen_Haustuer value on)
DOELSEIF ([Umwelt_Helligkeit_Aussen:state:d]>210 or [([23:50]+int(rand(600)))])
  (set Licht_Aussen_Haustuer value off)


Das wird auch nicht funktionieren, wenn
[([23:50]+int(rand(600)))]
das Licht aus schaltet, ist
[Umwelt_Helligkeit_Aussen:state:d]<190
mit sicherheit wahr und wird bei der nächsten triggerung das Licht wieder einschalten.

Das kannst du nur hin bekommen, indem du den Helligkeitswert mit <and> an die Zeit knüpfst. Solange die Helligkeit alleine steht (und das tut es bei <or>), wird das DOIF nicht wie gewünscht schalten.
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: amenomade am 01 November 2017, 11:30:15
DOIF (
[Umwelt_Helligkeit_Aussen:state:d] < 200 and [15:00-([23:50]+int(rand(600)))]
or [([04:50]+int(rand(600)))-11:00] and [Umwelt_Helligkeit_Aussen:state:d] < 20
)
   (set Licht_Aussen_Haustuer value on)
DOELSE
   (set Licht_Aussen_Haustuer value off)
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: andi11 am 02 November 2017, 06:58:11
Ich habe die Variante mit der geänderten Reihenfolge getestet.
=> Wegen eines anderen Fehlers ging garnichts (set Licht_Aussen_Haustuer value on muss bei KNX Elementen set Licht_Aussen_Haustuer on sein wenn dpt1)
Vorteil an dieser Schreibweise ist dass der WAF höher ist....

( [Umwelt_Helligkeit_Aussen:state:d]<200 ) sollte doch nicht immer triggern wenn vorher schon eine andere Bedingung wahr war oder? Ein neuer Wert bei Umwelt_Helligkeit_Aussen sorgt doch dafür, dass das DOIF von Anfang an durchlaufen wird und nicht nur dessen IF Zeilen mit Umwelt_Helligkeit_Aussen oder?
Aktueller Stand:
DOELSEIF ([Umwelt_Helligkeit_Aussen:state:d]>20)
  (set Licht_Aussen_Haustuer off)
DOELSEIF ([([23:50]+int(rand(600)))])
  (set Licht_Aussen_Haustuer off)
DOELSEIF ([([4:50]+int(rand(600)))])
  (set Licht_Aussen_Haustuer on)
([Umwelt_Helligkeit_Aussen:state:d]<200)
  (set Licht_Aussen_Haustuer on)
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: amenomade am 02 November 2017, 09:02:18
Dein Copy/Paste ist ein bisschen durcheinander oder?

Mit der geänderte Reihenfolge, wird es auch nicht funktionieren. Wenn dann, dann nur einmal, und schon am nächsten Tag nicht mehr.

Zitat( [Umwelt_Helligkeit_Aussen:state:d]<200 ) sollte doch nicht immer triggern wenn vorher schon eine andere Bedingung wahr war oder? Ein neuer Wert bei Umwelt_Helligkeit_Aussen sorgt doch dafür, dass das DOIF von Anfang an durchlaufen wird und nicht nur dessen IF Zeilen mit Umwelt_Helligkeit_Aussen oder?

Triggern schon. Ja, bei jeder Änderung. Aber wenn die Bedingung immer noch wahr ist, dann bleibt der DOIF im gleichen Zustand (so lange Du kein "attr do always" dazu gesetzt hast). Und deswegen auch wirst Du m.M.n. bei einer der Bedingungen mit Helligkeit irgendwann stehen bleiben.  Oder es wird passieren, was automatisierer gesagt hat. Das Problem ist: die Helligkeitsbedingungen sind permanent wiederkehrend wahr, die Zeitbedingungen dagegen nur pünktlich bei der Uhrzeit und dann wieder falsch.

Will keine Werbung machen, aber... nimm doch meine Variante ;) Die kombiniert Zeit-perioden und Helligkeit in der gleiche Bedingung, so dass der Zustand sich nicht permanent ändert.
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: andi11 am 02 November 2017, 09:18:22
Mein copy&paste war "1. Post von mir nehmen und verändern" da ich nicht zuhause bin, wir dort aber auch noch kein Internet haben.

Werde deine heute ausprobieren, da ich heute vermutlich den von dir beschriebenen Fehler beim heimkommen bemerken werde  :D
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: andi11 am 04 November 2017, 08:19:43
es funktioniert astrein mit deiner Lösung.
Könnte ich es auch irgendwie so abändern dass er nur einmalig auf den Sensorwert reagiert in dem definierten Zeitraum?
=> Spätestens beim nächsten Sensorwert der ankommt geht das Licht wieder in den automatischen Zustand.

event on change will ich nicht verwenden, da es bei dem Sensor doch recht gut versteckt wäre.
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: automatisierer am 04 November 2017, 08:36:38
hast du do always gesetzt? Das solltest du nicht benötigen.
mit wird bei jedem neuen sensorwert der befehl ausgeführt. event on change reading hilft da auch nicht, da sich der Wert ja ständig verändert.
angesehen davon sollte man event on change reading dennoch setzen, um die Flut an events ein wenig einzugrenzen. Ist aber nen anders Thema
Titel: Antw:Aussenlicht verhält sich nicht so wie gewünscht
Beitrag von: andi11 am 04 November 2017, 08:39:54
Ah stimmt, ich habe es mit meinen neuen DOIFs für die Rollos verwechselt. Die haben das Problem, dort ist aber auch doalways gesetzt.
Dort ist die Vorgabe aber genau anders rum "runter wenn Dunkel spätestens 22Uhr"

Hab solche Sachen bisher mit Perl gelöst und beschäftige mich seit dem neuen Haus mehr mit DOIF. Schon das Thema "schalten bei Dunkelheit" könnte Bücher füllen...