- Python 100%
| __pycache__ | ||
| .gitignore | ||
| docker-compose.yml | ||
| dockerfile | ||
| notify_simple.txt | ||
| python_veml7700.py | ||
| README.md | ||
| start | ||
FHEM MQTT VEML7700 – Licht-/Display-Steuerung über any_on
Diese Version beschreibt die aktuelle Logik im Repository.
Der VEML7700-Lichtsensor auf dem Raspberry misst nur dann wirklich, wenn das Hue-Licht im Hausgang aus ist. Der Lichtstatus kommt per MQTT über:
- Status-Topic:
/SmartHome/Hausgang/Hausgang_Hue/any_on
Das Display wird jetzt direkt in FHEM gesteuert. Das Python-Script lauscht nur noch auf einen einfachen MQTT-State für das Display und schaltet den GPIO entsprechend.
Bei Bewegung schaltet FHEM das Display direkt ein und per at nach der eingestellten Zeit wieder aus. Neue Bewegung setzt diese Laufzeit wieder neu auf 90 Sekunden.
Übersicht
Enthalten sind:
python_veml7700.py– liest den VEML7700 aus und publiziert MQTT-Readingsnotify_simple.txt– einfache FHEM-Notify-Logik für Bewegungsmelder + Lux-Auswertung- Docker-Setup zum Start des Python-Scripts auf dem Raspberry
Zielverhalten
Wenn any_on = on
- Licht im Hausgang ist an
- Display-GPIO wird eingeschaltet
- der Sensor wird nicht ausgelesen
- MQTT publiziert:
suppressed = truelight_state = on- letzter gültiger Lux-Wert bleibt verfügbar über
last_valid_lux
Wenn any_on = off
- Display-GPIO wird ausgeschaltet
- es läuft ein Cooldown von 5 Sekunden
- erst danach wird der VEML7700 wieder real ausgelesen
MQTT-Topics und Readings
Eingehend
/SmartHome/Hausgang/Hausgang_Hue/any_on
Akzeptierte Werte für Licht an sind:
1ontrue
Alles andere wird als aus behandelt.
Ausgehend
Basis-Topic:
/SmartHome/Hausgang/Raspberry/light_sensor
Display-Command-Topic:
/SmartHome/Hausgang/Raspberry/Display/light/trigger/state
Publizierte Unter-Topics:
/lux/ambient_raw/white_raw/light_state/display_state/suppressed/cooldown_remaining/last_valid_lux/state
Verwendeter Display-State-Topic:
/SmartHome/Hausgang/Raspberry/Display/light/trigger/state
Wichtige Readings in FHEM
Das zugehörige MQTT2_DEVICE Hausgang_Lux_VEML7700 sollte mindestens diese Readings enthalten:
luxsuppressedlight_statedisplay_statecooldown_remaininglast_valid_lux
Für das Display verwendest du in FHEM ein Device Raspberry_Display, das per set on/off genau diesen Topic mit on und off beschreibt.
FHEM-Sensor-Doku
Ziel
In FHEM soll der MQTT-Sensor so ankommen, dass du die Zustände direkt in Notifies und Readings verwenden kannst:
- aktueller Lux-Wert
- letzter gültiger Lux-Wert
- ob die Messung gerade unterdrückt ist
- ob das Licht laut
any_onan oder aus ist - ob noch Cooldown aktiv ist
- ob das Display an oder aus ist
Beispiel für ein MQTT2_DEVICE
Falls du das Device neu anlegen willst, kannst du dich an diesem Aufbau orientieren:
define Hausgang_Lux_VEML7700 MQTT2_DEVICE
attr Hausgang_Lux_VEML7700 readingList \
/SmartHome/Hausgang/Raspberry/light_sensor/lux:.* lux \
/SmartHome/Hausgang/Raspberry/light_sensor/ambient_raw:.* ambient_raw \
/SmartHome/Hausgang/Raspberry/light_sensor/white_raw:.* white_raw \
/SmartHome/Hausgang/Raspberry/light_sensor/light_state:.* light_state \
/SmartHome/Hausgang/Raspberry/light_sensor/display_state:.* display_state \
/SmartHome/Hausgang/Raspberry/light_sensor/suppressed:.* suppressed \
/SmartHome/Hausgang/Raspberry/light_sensor/cooldown_remaining:.* cooldown_remaining \
/SmartHome/Hausgang/Raspberry/light_sensor/last_valid_lux:.* last_valid_lux \
/SmartHome/Hausgang/Raspberry/light_sensor/state:.* state
define Raspberry_Display MQTT2_DEVICE
attr Raspberry_Display setList on off
attr Raspberry_Display setExtensionsEvent 1
attr Raspberry_Display readingList \
/SmartHome/Hausgang/Raspberry/Display/light/trigger/state:.* state
Je nach deinem bestehenden MQTT2-Setup kann das Pattern leicht abweichen. Wichtig ist nur, dass die oben genannten Topics in Readings landen.
Komplett einfügbarer FHEM-Block
Wenn du alles direkt in FHEM anlegen willst, kannst du diesen Block als Vorlage verwenden und bei Bedarf Device-Namen/Raum/Alias anpassen:
define Hausgang_Licht_Config dummy
attr Hausgang_Licht_Config alias Hausgang Licht Konfiguration
attr Hausgang_Licht_Config room MQTT,Konfiguration,Hausgang
attr Hausgang_Licht_Config setList lux_grenze timer_sekunden tag_von tag_bis helligkeit_tag helligkeit_nacht
setreading Hausgang_Licht_Config lux_grenze 80
setreading Hausgang_Licht_Config timer_sekunden 90
setreading Hausgang_Licht_Config tag_von 06:30
setreading Hausgang_Licht_Config tag_bis 22:00
setreading Hausgang_Licht_Config helligkeit_tag 100
setreading Hausgang_Licht_Config helligkeit_nacht 10
define n_HausgangLichtConfig notify Hausgang_Licht_Config:set_.* {
my $event = $EVENT;;
if ($event =~ /^set_(lux_grenze|timer_sekunden|tag_von|tag_bis|helligkeit_tag|helligkeit_nacht)\s+(.*)$/) {
my ($reading, $value) = ($1, $2);;
fhem("setreading Hausgang_Licht_Config $reading $value");;
Log 3, "HausgangLichtConfig: $reading=$value";;
}
}
define Hausgang_Lux_VEML7700 MQTT2_DEVICE
attr Hausgang_Lux_VEML7700 alias Hausgang Luxsensor
attr Hausgang_Lux_VEML7700 room MQTT,Sensoren,Hausgang
attr Hausgang_Lux_VEML7700 readingList \
/SmartHome/Hausgang/Raspberry/light_sensor/lux:.* lux \
/SmartHome/Hausgang/Raspberry/light_sensor/ambient_raw:.* ambient_raw \
/SmartHome/Hausgang/Raspberry/light_sensor/white_raw:.* white_raw \
/SmartHome/Hausgang/Raspberry/light_sensor/light_state:.* light_state \
/SmartHome/Hausgang/Raspberry/light_sensor/display_state:.* display_state \
/SmartHome/Hausgang/Raspberry/light_sensor/suppressed:.* suppressed \
/SmartHome/Hausgang/Raspberry/light_sensor/cooldown_remaining:.* cooldown_remaining \
/SmartHome/Hausgang/Raspberry/light_sensor/last_valid_lux:.* last_valid_lux \
/SmartHome/Hausgang/Raspberry/light_sensor/state:.* state
attr Hausgang_Lux_VEML7700 stateFormat lux
define Raspberry_Display MQTT2_DEVICE
attr Raspberry_Display alias Hausgang Display
attr Raspberry_Display room MQTT,Displays,Hausgang
attr Raspberry_Display setList on off
attr Raspberry_Display setExtensionsEvent 1
attr Raspberry_Display readingList \
/SmartHome/Hausgang/Raspberry/Display/light/trigger/state:.* state
attr Raspberry_Display devStateIcon on:scene_scene@yellow off:scene_scene@gray
attr Raspberry_Display stateFormat state
# Optional, falls noch nicht vorhanden bzw. falls du das MQTT-Licht-Device separat brauchst:
# define Hausgang_Hue MQTT2_DEVICE
# attr Hausgang_Hue readingList \
# /SmartHome/Hausgang/Hausgang_Hue/any_on:.* any_on
define n_HausgangLicht_Einfach notify (IT_1527x2d936|IT_1527x62f30|HausgangDauerlicht) {
my ($sec,$min,$hour) = localtime(time());
my $AtName = "at_HausgangLichtOff";
my $DisplayAtName = "at_HausgangDisplayOff";
my $LuxGrenze = ReadingsNum("Hausgang_Licht_Config","lux_grenze",80);
my $TimerSek = ReadingsNum("Hausgang_Licht_Config","timer_sekunden",90);
my $TimerFmt = sprintf("%02d:%02d:%02d", int($TimerSek / 3600), int(($TimerSek % 3600) / 60), $TimerSek % 60);
my $Balkon = Value("IT_1527x2d936");
my $Hausgang = Value("IT_1527x62f30");
my $Dauerlicht = Value("HausgangDauerlicht");
my $LichtAn = ReadingsVal("Hausgang_Hue","any_on","0");
my $TagVon = ReadingsVal("Hausgang_Licht_Config","tag_von","06:30");
my $TagBis = ReadingsVal("Hausgang_Licht_Config","tag_bis","22:00");
my $HelligkeitTag = ReadingsNum("Hausgang_Licht_Config","helligkeit_tag",100);
my $HelligkeitNacht = ReadingsNum("Hausgang_Licht_Config","helligkeit_nacht",10);
my $Lux = ReadingsNum("Hausgang_Lux_VEML7700","lux",9999);
my $Suppressed = ReadingsVal("Hausgang_Lux_VEML7700","suppressed","true");
my $LastValidLux = ReadingsNum("Hausgang_Lux_VEML7700","last_valid_lux",9999);
my $DisplayState = ReadingsVal("Raspberry_Display","state","unknown");
my $Bewegung = ($NAME eq "IT_1527x2d936" || $NAME eq "IT_1527x62f30") && ($EVENT =~ /^on(?:\z|->on\z)/);
my $Jetzt = sprintf("%02d:%02d", $hour, $min);
my $Tagbetrieb = ($Jetzt ge $TagVon && $Jetzt le $TagBis);
my $MessLux = $Lux != 9999 ? $Lux : $LastValidLux;
my $Helligkeit = $Tagbetrieb ? $HelligkeitTag : $HelligkeitNacht;
if ($Bewegung) {
fhem("delete $DisplayAtName") if (defined($defs{$DisplayAtName}));
fhem("set Raspberry_Display on");
fhem("define $DisplayAtName at +$TimerFmt set Raspberry_Display off");
}
if ($Dauerlicht eq "on") {
fhem("delete $AtName") if (defined($defs{$AtName}));
fhem("delete $DisplayAtName") if (defined($defs{$DisplayAtName}));
fhem("set Raspberry_Display on");
fhem('set HUEGroup2 pct 100; set HUEGroup2 on');
Log 3, "HausgangLicht: Dauerlicht EIN - Licht an";
return;
}
if ($NAME eq "HausgangDauerlicht" && $EVENT eq "off") {
fhem("delete $AtName") if (defined($defs{$AtName}));
fhem("delete $DisplayAtName") if (defined($defs{$DisplayAtName}));
fhem("set Raspberry_Display off");
fhem('set HUEGroup2 off');
Log 3, "HausgangLicht: Dauerlicht AUS - Licht ausgeschaltet";
return;
}
if (!$Bewegung) {
return;
}
Log 3, "HausgangLicht: Bewegung erkannt - any_on=$LichtAn, Display=$DisplayState, Suppressed=$Suppressed, Lux=$Lux, LastValidLux=$LastValidLux";
if ($LichtAn eq "1" || defined($defs{$AtName})) {
fhem("delete $AtName") if (defined($defs{$AtName}));
fhem("define $AtName at +$TimerFmt set HUEGroup2 off");
Log 3, "HausgangLicht: Licht ist bereits an bzw. Timer aktiv - Ausschalt-Timer auf $TimerSek Sekunden neu gesetzt";
return;
}
if ($Suppressed eq "true") {
Log 3, "HausgangLicht: Keine Lichtaktion, Sensor aktuell unterdrueckt (MessLux=$MessLux, Grenze=$LuxGrenze)";
return;
}
if ($MessLux != 9999 && $MessLux < $LuxGrenze) {
fhem("delete $AtName") if (defined($defs{$AtName}));
fhem("set HUEGroup2 pct $Helligkeit; set HUEGroup2 on");
fhem("define $AtName at +$TimerFmt set HUEGroup2 off");
Log 3, "HausgangLicht: Lux-Bedingung erfüllt ($MessLux < $LuxGrenze) - Licht eingeschaltet fuer $TimerSek Sekunden";
}
else {
Log 3, "HausgangLicht: Zu hell fuer Licht - nur Display aktiv (MessLux=$MessLux, Grenze=$LuxGrenze)";
}
}
Hinweise dazu:
Hausgang_Licht_Configenthält die Werte, die du später direkt in FHEM ändern kannstn_HausgangLichtConfigspiegeltset Hausgang_Licht_Config ...in die passenden Readings zurückHausgang_Huemuss das Readingany_onenthaltenRaspberry_Displaywird jetzt direkt perset on/offin FHEM geschaltetHausgang_Lux_VEML7700zeigt dir die Sensor- und Statuswerte des Raspberry-Scripts- das Notify reagiert nur auf neue Bewegungs-Events und verhindert dadurch das sofortige Wiedereinschalten
Konfigurierbare Werte direkt in FHEM
Diese Werte kannst du dann direkt über set Hausgang_Licht_Config ... ändern, wenn das Notify n_HausgangLichtConfig angelegt ist:
set Hausgang_Licht_Config lux_grenze 80
set Hausgang_Licht_Config timer_sekunden 90
set Hausgang_Licht_Config tag_von 06:30
set Hausgang_Licht_Config tag_bis 22:00
set Hausgang_Licht_Config helligkeit_tag 100
set Hausgang_Licht_Config helligkeit_nacht 10
Alternativ geht weiterhin immer auch direkt:
setreading Hausgang_Licht_Config lux_grenze 80
setreading Hausgang_Licht_Config timer_sekunden 90
setreading Hausgang_Licht_Config tag_von 06:30
setreading Hausgang_Licht_Config tag_bis 22:00
setreading Hausgang_Licht_Config helligkeit_tag 100
setreading Hausgang_Licht_Config helligkeit_nacht 10
Bedeutung:
lux_grenze→ ab welchem Lux-Wert das Licht eingeschaltet werden darftimer_sekunden→ wie lange das Licht bei Bewegung anbleibt bzw. neu verlängert wirdtag_von/tag_bis→ Zeitraum für Tagbetriebhelligkeit_tag→ Helligkeit tagsüberhelligkeit_nacht→ Helligkeit nachts
Display nur über FHEM steuern
Wenn du das Display unabhängig vom Bewegungs-Trigger schalten willst, kannst du dafür in FHEM einen Dummy plus at verwenden.
Beispiel:
define Hausgang_Display_Manuell dummy
attr Hausgang_Display_Manuell alias Hausgang Display Manuell
attr Hausgang_Display_Manuell room MQTT,Displays,Hausgang
attr Hausgang_Display_Manuell setList on off
define n_HausgangDisplayManuell notify Hausgang_Display_Manuell:.* {
my $AtName = "at_HausgangDisplayManuellOff";;
if ($EVENT eq "on") {
fhem("set Raspberry_Display on");;
fhem("delete $AtName") if (defined($defs{$AtName}));;
fhem("define $AtName at +00:01:30 set Hausgang_Display_Manuell off");;
Log 3, "HausgangDisplay: manuell EIN fuer 90 Sekunden";;
}
elsif ($EVENT eq "off") {
fhem("delete $AtName") if (defined($defs{$AtName}));;
fhem("set Raspberry_Display off");;
Log 3, "HausgangDisplay: manuell AUS";;
}
}
Damit passiert Folgendes:
set Hausgang_Display_Manuell on→ Display geht sofort an- ein
atschaltet den Dummy nach 90 Sekunden wieder aufoff set Hausgang_Display_Manuell off→ Display geht direkt wieder aus- die Laufzeit des Displays wird komplett über FHEM gestartet
Wenn du eine andere Laufzeit willst, kannst du einfach das at +00:01:30 anpassen.
Bedeutung der wichtigsten Readings
| Reading | Bedeutung |
|---|---|
lux |
aktueller Messwert, wenn echte Messung möglich war |
last_valid_lux |
letzter brauchbarer Lux-Wert bei unterdrückter Messung |
suppressed |
true, wenn wegen Licht an oder Cooldown nicht gemessen wird |
light_state |
aus .../Hausgang_Hue/any_on abgeleiteter Lichtstatus |
display_state |
davon abgeleiteter Display-Zustand |
cooldown_remaining |
Restzeit nach Licht aus, bis wieder gemessen werden darf |
state |
JSON-Gesamtstatus aller wichtigen Werte |
Empfehlung für FHEM-Logik
Für Entscheidungen im Notify solltest du dich primär an diesen Readings orientieren:
suppressedany_onvom Licht-Device, z. B.Hausgang_Hueluxlast_valid_lux
Damit ist die Logik robust, auch wenn gerade keine frische Messung möglich ist.
Aktuelle Notify-Lösung
define n_HausgangLicht_Einfach notify (IT_1527x2d936|IT_1527x62f30|HausgangDauerlicht) {
my ($sec,$min,$hour) = localtime(time());
my $AtName = "at_HausgangLichtOff";
my $DisplayAtName = "at_HausgangDisplayOff";
my $LuxGrenze = ReadingsNum("Hausgang_Licht_Config","lux_grenze",80);
my $TimerSek = ReadingsNum("Hausgang_Licht_Config","timer_sekunden",90);
my $TagVon = ReadingsVal("Hausgang_Licht_Config","tag_von","06:30");
my $TagBis = ReadingsVal("Hausgang_Licht_Config","tag_bis","22:00");
my $TimerFmt = sprintf("%02d:%02d:%02d", int($TimerSek / 3600), int(($TimerSek % 3600) / 60), $TimerSek % 60);
my $Balkon = Value("IT_1527x2d936");
my $Hausgang = Value("IT_1527x62f30");
my $Dauerlicht = Value("HausgangDauerlicht");
my $LichtAn = ReadingsVal("Hausgang_Hue","any_on","0");
my $HelligkeitTag = ReadingsNum("Hausgang_Licht_Config","helligkeit_tag",100);
my $HelligkeitNacht = ReadingsNum("Hausgang_Licht_Config","helligkeit_nacht",10);
my $Lux = ReadingsNum("Hausgang_Lux_VEML7700","lux",9999);
my $Suppressed = ReadingsVal("Hausgang_Lux_VEML7700","suppressed","true");
my $LastValidLux = ReadingsNum("Hausgang_Lux_VEML7700","last_valid_lux",9999);
my $DisplayState = ReadingsVal("Raspberry_Display","state","unknown");
my $Bewegung = ($NAME eq "IT_1527x2d936" || $NAME eq "IT_1527x62f30") && ($EVENT =~ /^on(?:\z|->on\z)/);
my $Jetzt = sprintf("%02d:%02d", $hour, $min);
my $Tagbetrieb = ($Jetzt ge $TagVon && $Jetzt le $TagBis);
my $MessLux = $Lux != 9999 ? $Lux : $LastValidLux;
my $Helligkeit = $Tagbetrieb ? $HelligkeitTag : $HelligkeitNacht;
if ($Bewegung) {
fhem("delete $DisplayAtName") if (defined($defs{$DisplayAtName}));
fhem("set Raspberry_Display on");
fhem("define $DisplayAtName at +$TimerFmt set Raspberry_Display off");
}
if ($Dauerlicht eq "on") {
fhem("delete $AtName") if (defined($defs{$AtName}));
fhem("delete $DisplayAtName") if (defined($defs{$DisplayAtName}));
fhem("set Raspberry_Display on");
fhem('set HUEGroup2 pct 100; set HUEGroup2 on');
Log 3, "HausgangLicht: Dauerlicht EIN - Licht an";
return;
}
if ($NAME eq "HausgangDauerlicht" && $EVENT eq "off") {
fhem("delete $AtName") if (defined($defs{$AtName}));
fhem("delete $DisplayAtName") if (defined($defs{$DisplayAtName}));
fhem("set Raspberry_Display off");
fhem('set HUEGroup2 off');
Log 3, "HausgangLicht: Dauerlicht AUS - Licht ausgeschaltet";
return;
}
if (!$Bewegung) {
return;
}
Log 3, "HausgangLicht: Bewegung erkannt - any_on=$LichtAn, Display=$DisplayState, Suppressed=$Suppressed, Lux=$Lux, LastValidLux=$LastValidLux";
if ($LichtAn eq "1" || defined($defs{$AtName})) {
fhem("delete $AtName") if (defined($defs{$AtName}));
fhem("define $AtName at +$TimerFmt set HUEGroup2 off");
Log 3, "HausgangLicht: Licht ist bereits an bzw. Timer aktiv - Ausschalt-Timer auf $TimerSek Sekunden neu gesetzt";
return;
}
if ($Suppressed eq "true") {
Log 3, "HausgangLicht: Keine Lichtaktion, Sensor aktuell unterdrueckt (MessLux=$MessLux, Grenze=$LuxGrenze)";
return;
}
if ($MessLux != 9999 && $MessLux < $LuxGrenze) {
fhem("delete $AtName") if (defined($defs{$AtName}));
fhem("set HUEGroup2 pct $Helligkeit; set HUEGroup2 on");
fhem("define $AtName at +$TimerFmt set HUEGroup2 off");
Log 3, "HausgangLicht: Lux-Bedingung erfüllt ($MessLux < $LuxGrenze) - Licht eingeschaltet fuer $TimerSek Sekunden";
}
else {
Log 3, "HausgangLicht: Zu hell fuer Licht - nur Display aktiv (MessLux=$MessLux, Grenze=$LuxGrenze)";
}
}
Funktionsweise des Notifys
1. Dauerlicht EIN
- schaltet
HUEGroup2direkt auf 100 % - beendet das Notify sofort per
return
1b. Dauerlicht AUS
- wenn
HausgangDauerlichtaktiv vononaufoffwechselt - schaltet das Notify das Licht jetzt sofort mit
set HUEGroup2 offaus - danach endet dieser Notify-Lauf ebenfalls direkt
2. Nur bei Bewegung weiterarbeiten
- ohne neues Bewegungs-Event macht das Notify nichts
- dadurch ist die Logik kürzer und klarer
- weil deine Melder kein
offsenden, wird nur auf neue ON-Events reagiert
2b. Display bei Bewegung separat triggern
- bei jeder neuen Bewegung setzt das Notify
Raspberry_Displaydirekt aufon - ein eigenes
at_HausgangDisplayOffschaltet das Display nachtimer_sekundenwieder aufoff - kommt in dieser Zeit neue Bewegung, wird dieser Timer gelöscht und neu gesetzt
3. Licht nur bei gültiger Messung schalten
Die Lux-Schaltung läuft nur, wenn gleichzeitig gilt:
- Bewegung erkannt
any_on = 0suppressed = falseMessLux < 80- kein Dauerlicht aktiv
Ist es zu hell (MessLux >= LuxGrenze), bleibt das Licht aus und nur das Display läuft weiter.
MessLux ist dabei:
- der aktuelle
lux-Wert, wenn vorhanden - sonst
last_valid_lux
Die Werte für:
MessLux < 80- Timer
90 - Tagbetrieb
06:30bis22:00 - Helligkeit
100/10
kommen in der konfigurierbaren Version jetzt aus Hausgang_Licht_Config.
Damit wird verhindert, dass bei eingeschaltetem Licht erneut auf Basis verfälschter Messwerte geschaltet wird.
4. Warum das Licht nicht sofort wieder angeht
Der wichtigste Fix ist:
- das Notify reagiert nicht mehr auf Lux-/Sensor-Updates
- sondern nur noch auf neue Bewegungs-Events
Dadurch kann ein nach dem Ausschalten eintreffender Lux-Wert allein das Licht nicht wieder einschalten.
5. Neue Bewegung verlängert die Leuchtdauer
Wenn das Licht bereits an ist und erneut Bewegung erkannt wird, dann:
- wird kein neuer Lux-Check erzwungen
- stattdessen wird ein FHEM-
at-Timer für das Ausschalten gelöscht und neu angelegt
Dadurch laufen die 90 Sekunden bei neuer Bewegung wieder von vorne los.
Dasselbe gilt für das Display: jede neue Bewegung setzt den Display-Timer erneut auf die volle Laufzeit.
6. Warum kein kurzes Aus-/Wieder-An mehr passieren sollte
Die frühere Verlängerung über on-for-timer konnte bei manchen Kombinationen aus Hue/FHEM dazu führen, dass das Licht beim Neu-Setzen kurz ausgeht und wieder angeht.
Jetzt läuft die Verlängerung so:
- Licht bleibt mit
set HUEGroup2 onstabil an - ein separater FHEM-Timer
at_HausgangLichtOffschaltet es später aus - bei neuer Bewegung wird nur dieser Timer gelöscht und neu gesetzt
Damit sollte das kurze Flackern bzw. Aus-/Wieder-An vermieden werden.
Warum suppressed wichtig ist
Sobald das Licht an ist, misst der Sensor nicht mehr aktiv. In dieser Phase:
- bleibt
last_valid_luxals letzter sinnvoller Wert erhalten - zeigt
suppressed = true, dass gerade keine echte Messung stattfindet
Das Notify berücksichtigt das und schaltet nur bei suppressed = false.
Start / Betrieb
Docker Compose
version: "3.8"
services:
dominik_mqtt:
container_name: dominik_mqtt
build:
context: .
dockerfile: dockerfile
privileged: true
devices:
- /dev/i2c-1:/dev/i2c-1
restart: unless-stopped
command: ["python", "-u", "./python_veml7700.py"]
Starten mit:
docker compose up -d --build
Prüfung in FHEM
Readings ansehen
get Hausgang_Lux_VEML7700 readings
Wichtige Punkte:
- ist
light_statekorrekt? - wechselt
suppressedpassend zwischentrueundfalse? - kommt
last_valid_luxsauber an? - fällt
cooldown_remainingnach Licht aus herunter?
Display-Status prüfen:
get Raspberry_Display readings
Wichtige Punkte dort:
- ist
state=on, wenn FHEM das Display eingeschaltet hat? - geht
statenach Ablauf desatwieder aufoff?
MQTT-/Device-Debug
get Hausgang_Lux_VEML7700 debug
Empfohlene Einstellungen
| Parameter | Wert | Beschreibung |
|---|---|---|
| LuxGrenze | 80 | sinnvoller Startwert für Innenräume |
| Tag-Helligkeit | 100% | volle Helligkeit tagsüber |
| Nacht-Helligkeit | 10% | gedimmtes Licht nachts |
| Cooldown | 5s | Wartezeit nach any_on = off vor Messung |
| Licht-Timer | 90s | Einschaltdauer über on-for-timer |
Checkliste für die Inbetriebnahme
- Python-Container mit aktueller Version starten
- Prüfen, ob
.../Hausgang_Hue/any_onsauber empfangen wird - MQTT2_DEVICE
Hausgang_Lux_VEML7700auf neue Readings prüfen - Notify
n_HausgangLicht_Einfachin FHEM aktualisieren - MQTT2_DEVICE
Raspberry_Displayfür/SmartHome/Hausgang/Raspberry/Display/light/trigger/stateprüfen/anlegen - Test: Licht an →
suppressed=true, Display an, keine Messung - Test: Licht aus → Display aus, 5 Sekunden warten, dann Messung
- Test: Bewegung + dunkel → Licht wird eingeschaltet
- Test: Nach Timer-Aus geht Licht nicht ohne neues Bewegungs-Event sofort wieder an
- Test: Bei Helligkeit über Grenzwert bleibt Licht aus, aber Display geht für 90s an
Kurzfassung
Die neue Logik sorgt dafür, dass der VEML7700 nur dann echte Lux-Werte liefert, wenn das Licht wirklich aus ist. Dadurch vermeidest du Fehlmessungen durch das eigene Lampenlicht und bekommst eine deutlich sauberere Steuerung im Hausgang. Das Display kann zusätzlich komplett aus FHEM über den vorhandenen Trigger-Mechanismus gesteuert werden.