Hallo,
ich habe hier seit ein paar Tagen einen Zigbee Lichtsensor installiert, über den mir bei Dämmerung bzw. unterhalb eines bestimmten Luxwertes, Licht eingeschaltet werden soll.
Dazu habe ich folgendes DOIF gebastelt:
Internals:
.FhemMetaInternals 1
.lastTimee_zigbee_lichtsensor_illuminance_lux 1734190285.1094
DEF ([14:00-01:00] and [zigbee_lichtsensor:illuminance_lux] < 45 and [home_status] eq "da") ( set wz.alle on)
DOELSE
(set wz.alle off)
FUUID 5c45c648-f33f-f310-8f13-7ea40590ff25e67e
FVERSION 98_DOIF.pm:0.285460/2024-02-23
MODEL FHEM
NAME daemmerung
NOTIFYDEV global,home_status,zigbee_lichtsensor
NR 131
NTFY_ORDER 50-daemmerung
STATE cmd_1
TYPE DOIF
VERSION 28546 2024-02-23 20:11:05
eventCount 114
.attraggr:
.attrminint:
READINGS:
2024-12-14 16:46:30 Device zigbee_lichtsensor
2024-12-14 16:35:36 cmd 1
2024-12-14 16:35:36 cmd_event zigbee_lichtsensor
2024-12-14 16:35:36 cmd_nr 1
2024-12-14 16:46:30 e_zigbee_lichtsensor_illuminance_lux 0
2024-12-14 16:35:36 mode enabled
2024-12-14 16:35:36 state cmd_1
2024-12-14 16:35:36 timer_01_c01 15.12.2024 14:00:00
2024-12-14 16:35:36 timer_02_c01 15.12.2024 01:00:00
Regex:
accu:
bar:
barAvg:
collect:
cond:
home_status:
0:
&STATE ^home_status$
zigbee_lichtsensor:
0:
illuminance_lux ^zigbee_lichtsensor$:^illuminance_lux:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'zigbee_lichtsensor','illuminance_lux') < 45 and ::InternalDoIf($hash,'home_status','STATE') eq "da"
days:
do:
0:
0 set wz.alle on
1:
0 set wz.alle off
helper:
NOTIFYDEV global,home_status,zigbee_lichtsensor
event illuminance_lux: 0
globalinit 1
last_timer 2
sleeptimer -1
timerdev zigbee_lichtsensor
timerevent illuminance_lux: 0
triggerDev zigbee_lichtsensor
timerevents:
illuminance_lux: 0
timereventsState:
illuminance_lux: 0
triggerEvents:
illuminance_lux: 0
triggerEventsState:
illuminance_lux: 0
internals:
all home_status:STATE
interval:
0 -1
1 0
intervalfunc:
localtime:
0 1734267600
1 1734220800
readings:
all zigbee_lichtsensor:illuminance_lux
realtime:
0 14:00:00
1 01:00:00
time:
0 14:00:00
1 01:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
trigger:
triggertime:
1734220800:
localtime 1734220800
hash:
1734267600:
localtime 1734267600
hash:
uiState:
uiTable:
Attributes:
DbLogExclude .*
alias daemmerung
devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
group Licht
icon weather_sunset
room Module->Licht,System->Logik,Zimmer->Wohnzimmer
verbose 0
Nun habe ich aber das Problem, daß wenn der eingestellte Luxwert erreicht ist, das Licht eine kurze Zeit immer wieder ein und ausschaltet. Beobachte ich den Luxwert, kann ich sehen, daß der Luxwert schwankt, sprich er springt eine Zeit hin und her.
Vorher hatte ich einen Selbstbau Homematic Lichtsensor verbaut, der war aber wohl so träge, daß die Schwelle da nicht ins Gewicht fällt.
Ich habe schon versucht das event-min-intervall von "daemmerung" auf 120 Sekunden zu setzen, brachte aber nichts
Wo könnte ich denn da ansetzen um die Hysterese zu beeinflussen?
gm
Trägheit kannst du mit dem Attribut wait realisieren.
Ah, danke, manchmal hat man Tomaten auf den Augen.:-}
Ich weiß nicht, wie es mit DOIF geht, aber zum einschalten einen höheren Wert als fürs ausschalten definieren.
Es wird ja nur bei einem bestimmten Lux Wert eingeschaltet, abgeschaltet wird zu einer bestimmten Uhrzeit.
Zitat von: grossmaggul am 15 Dezember 2024, 16:37:04Es wird ja nur bei einem bestimmten Lux Wert eingeschaltet, abgeschaltet wird zu einer bestimmten Uhrzeit.
Das steht aber so nicht im DOIF:
([14:00-01:00] and [zigbee_lichtsensor:illuminance_lux] < 45 and [home_status] eq "da") ( set wz.alle on)
DOELSE
(set wz.alle off)
Wenn hier zwischen 14 und 01 jemand zu hause ist und die Helligkeit entsprechend sinkt, geht das Licht an. Allerdings hast du zum Ausschalten einen generischen ELSE Zweig der immer dann aufgerufen wird, wenn der erste schonmal ausgefürht wurde und dann entweder:
- außerhalb Zeitfenster
- Helligkeit > 44
- niemand zu hause
Du könntest den Lichtsensor als dem ELSE nehmen indem du ein DOELSIF setzt (geht bestimmt auch einfacher...):
DOELSIF
([01:00-14:00] or [home_status] ne "da") ( set wz.alle off)
DOELSE
Zitat von: tobi01001 am 16 Dezember 2024, 08:25:07Zitat von: grossmaggul am 15 Dezember 2024, 16:37:04Es wird ja nur bei einem bestimmten Lux Wert eingeschaltet, abgeschaltet wird zu einer bestimmten Uhrzeit.
Das steht aber so nicht im DOIF:
([14:00-01:00] and [zigbee_lichtsensor:illuminance_lux] < 45 and [home_status] eq "da") ( set wz.alle on)
DOELSE
(set wz.alle off)
Wenn hier zwischen 14 und 01 jemand zu hause ist und die Helligkeit entsprechend sinkt, geht das Licht an. Allerdings hast du zum Ausschalten einen generischen ELSE Zweig der immer dann aufgerufen wird, wenn der erste schonmal ausgefürht wurde und dann entweder:
- außerhalb Zeitfenster
- Helligkeit > 44
- niemand zu hause
Du könntest den Lichtsensor als dem ELSE nehmen indem du ein DOELSIF setzt (geht bestimmt auch einfacher...):
DOELSIF
([01:00-14:00] or [home_status] ne "da") ( set wz.alle off)
DOELSE
oder einfach ohne DOELSE als DOELSEIF die Negation des ersten DOIF-Zweigs mit Hysterese (hier z. B von einem Grad):
DOELSIF
([01:00-14:00] or [home_status] ne "da" or [zigbee_lichtsensor:illuminance_lux] >= 46) ( set wz.alle off)
Allerdings je nach Schwankung der Temperatur kann durchaus auch die Trägkeit mit wait gut funktionieren.
ZitatDas steht aber so nicht im DOIF:
Ich habe das etwas verkürzt dargestellt, als Antwort auf Wernieman. Die anderen Bedingungen haben ja auf die Hysterese keine Auswirkung.
ZitatDu könntest den Lichtsensor als dem ELSE nehmen indem du ein DOELSIF setzt (geht bestimmt auch einfacher...):
Was wäre da jetzt der Vorteil zu meiner generischen Lösung? Dadurch habe ich doch immer noch nur einen Wert auf den ich reagiere.
Zitatoder einfach ohne DOELSE als DOELSEIF die Negation des ersten DOIF-Zweigs mit Hysterese (hier z. B von einem Grad):
Ja, so könnte man das natürlich auch machen, wobei es hier nicht um Temperatur geht.;)
Ich werde das jetzt mal mit wait testen und schauen ob das wie gewünscht funktioniert, wäre für mich die einfachste Lösung. Mein Motto, in der Kürze liegt die Würze.;)
Da habe ich wohl den Kontext der Aufgabe aus den Augen verloren :)
Ich mache so etwas mit der Auswertung der aktuellen Leistung der PV-Anlage für die Beschattung. Gerade bei Wolken gibt es starke Schwankungen und da hat sich bei mir ein wait sehr nützlich gemacht.
Zitat von: grossmaggul am 16 Dezember 2024, 12:52:58ZitatDas steht aber so nicht im DOIF:
Ich habe das etwas verkürzt dargestellt, als Antwort auf Wernieman. Die anderen Bedingungen haben ja auf die Hysterese keine Auswirkung.
Ich habe das nicht auf die Antwort bezogen, sondern auf das List des DOIF.
Das DOIF triggert im DOIF Zweig auf
- Zeit - erste Angabe
- Helligkeit < 45 - zweite Angabe
- jemand "da" - dritte Angabe
Jedes Event der 3 Bedingungen wird:
- einschalten wenn alle 3 gleichzeitig wahr sind
- ausschalten wenn eines davaon nicht wahr ist, weil hier nur DOELSE steht. Also mit jedem mal wo z.B. die Helligkeit nochmal über 44 geht - daher wahrscheinlich auch dein anfängliches flackern.
Wenn gesichert ist, dass dann bis 01:00 Uhr die Helligkeit kleiner 45 bleibt, wird das auch mit wait funktionieren. Wenn man das Ausschalten zeitlich begrenzt oder einfach um 01:00 direkt ausschaltet, ist man zumindest sicher dass es zwischenzeitlich nicht durch "Helligkeitsschwankung" ausgeschaltet wird.
LG
O.K., da hast Du sicher recht.
Bisher hat das allerdings immer geklappt, erst seit ich den Zigbee-Lichtsensor habe, flackert es.
ZitatWenn gesichert ist, dass dann bis 01:00 Uhr die Helligkeit kleiner 45 bleibt, wird das auch mit wait funktionieren.
Das ist schon ziemlich gesichert, denn es handelt sich ja um die Außenhelligkeit und da wüsste ich nicht, daß die in unseren Breiten nachts über 45 Lux geht.;-)
Zitat von: grossmaggul am 16 Dezember 2024, 17:21:59in unseren Breiten nachts über 45 Lux geht.;-)
Außer bei Gewitter. Ein Blitz kann da schon so hell sein.
Kommt auf die Empfindlichkeit des Sensors an.
Zitat von: grossmaggul am 16 Dezember 2024, 17:21:59O.K., da hast Du sicher recht.
Bisher hat das allerdings immer geklappt, erst seit ich den Zigbee-Lichtsensor habe, flackert es.
ZitatWenn gesichert ist, dass dann bis 01:00 Uhr die Helligkeit kleiner 45 bleibt, wird das auch mit wait funktionieren.
Das ist schon ziemlich gesichert, denn es handelt sich ja um die Außenhelligkeit und da wüsste ich nicht, daß die in unseren Breiten nachts über 45 Lux geht.;-)
Ja, eine natürliche Lichtquelle hätte ich hier auch nicht gesehen (außer Nobby's Blitz vll). Kenne ja auch deine Installation nicht. Ich dachte eher an Taschenlampe, Straßenlampe, Auto, Fahrrad, Handy oder wz.alle selbst.
Aber die sind dann wohl auch so kurz, dass der wait timer das abfängt.
Vielleicht hilft es dir wenn ich beschreibe wie ich das Problem gelöst habe. Zerlege dein DOIF in die einzelnen Bedingungen z.B. Helligkeit:
(([15:00-23:00] and [Lichtsensor:lux] < 4) or ([{ReadingsVal("Mond","CivilTwilightEvening","23:00")}])) (set Nacht on) DOELSEIF ([{ReadingsVal("Mond","CivilTwilightMorning","10:00")}-10:00] and [Lichtsensor:lux] >2 ) (set Nacht off)
Dann kann kannst Du flexibeler reagieren z.B. mit if Nacht und .....
Gruss Roman
Danke, ich habe jetzt einen passenden wait Wert ermittelt bzw. eingetragen und es läuft wieder so wie es soll, bzw. wie ich es mir vorstelle.:)