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
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.
Der ersten Bedingung fehlt auch die schließende klammer
Gesendet von meinem S3_32 mit Tapatalk
( [Umwelt_Helligkeit_Aussen:state:d]<200 )
Meinst Du die? Ist doch alles da? Oder übersehe ich was am frühen morgen
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...
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...
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
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...
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.
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...
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.
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)
([Umwelt_Helligkeit_Aussen:state:d]>200 and [Umwelt_Helligkeit_Aussen:state:d]<20)
???
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
([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.
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)
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)
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.
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
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.
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
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...