No description
Find a file
2026-07-14 14:00:26 +02:00
__pycache__ neuer versuch mehr in fhem 2026-07-14 14:00:26 +02:00
.gitignore Initial commit 2026-07-04 17:04:09 +02:00
docker-compose.yml first commit 2026-07-04 17:06:22 +02:00
dockerfile first commit 2026-07-04 17:06:22 +02:00
notify_simple.txt neuer versuch mehr in fhem 2026-07-14 14:00:26 +02:00
python_veml7700.py neuer versuch mehr in fhem 2026-07-14 14:00:26 +02:00
README.md neuer versuch mehr in fhem 2026-07-14 14:00:26 +02:00
start first commit 2026-07-04 17:06:22 +02:00

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-Readings
  • notify_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 = true
    • light_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:

  • 1
  • on
  • true

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:

  • lux
  • suppressed
  • light_state
  • display_state
  • cooldown_remaining
  • last_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_on an 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_Config enthält die Werte, die du später direkt in FHEM ändern kannst
  • n_HausgangLichtConfig spiegelt set Hausgang_Licht_Config ... in die passenden Readings zurück
  • Hausgang_Hue muss das Reading any_on enthalten
  • Raspberry_Display wird jetzt direkt per set on/off in FHEM geschaltet
  • Hausgang_Lux_VEML7700 zeigt 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 darf
  • timer_sekunden → wie lange das Licht bei Bewegung anbleibt bzw. neu verlängert wird
  • tag_von / tag_bis → Zeitraum für Tagbetrieb
  • helligkeit_tag → Helligkeit tagsüber
  • helligkeit_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 at schaltet den Dummy nach 90 Sekunden wieder auf off
  • 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:

  • suppressed
  • any_on vom Licht-Device, z. B. Hausgang_Hue
  • lux
  • last_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 HUEGroup2 direkt auf 100 %
  • beendet das Notify sofort per return

1b. Dauerlicht AUS

  • wenn HausgangDauerlicht aktiv von on auf off wechselt
  • schaltet das Notify das Licht jetzt sofort mit set HUEGroup2 off aus
  • 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 off senden, wird nur auf neue ON-Events reagiert

2b. Display bei Bewegung separat triggern

  • bei jeder neuen Bewegung setzt das Notify Raspberry_Display direkt auf on
  • ein eigenes at_HausgangDisplayOff schaltet das Display nach timer_sekunden wieder auf off
  • 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 = 0
  • suppressed = false
  • MessLux < 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:30 bis 22: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 on stabil an
  • ein separater FHEM-Timer at_HausgangLichtOff schaltet 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_lux als 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_state korrekt?
  • wechselt suppressed passend zwischen true und false?
  • kommt last_valid_lux sauber an?
  • fällt cooldown_remaining nach Licht aus herunter?

Display-Status prüfen:

get Raspberry_Display readings

Wichtige Punkte dort:

  • ist state = on, wenn FHEM das Display eingeschaltet hat?
  • geht state nach Ablauf des at wieder auf off?

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

  1. Python-Container mit aktueller Version starten
  2. Prüfen, ob .../Hausgang_Hue/any_on sauber empfangen wird
  3. MQTT2_DEVICE Hausgang_Lux_VEML7700 auf neue Readings prüfen
  4. Notify n_HausgangLicht_Einfach in FHEM aktualisieren
  5. MQTT2_DEVICE Raspberry_Display für /SmartHome/Hausgang/Raspberry/Display/light/trigger/state prüfen/anlegen
  6. Test: Licht an → suppressed=true, Display an, keine Messung
  7. Test: Licht aus → Display aus, 5 Sekunden warten, dann Messung
  8. Test: Bewegung + dunkel → Licht wird eingeschaltet
  9. Test: Nach Timer-Aus geht Licht nicht ohne neues Bewegungs-Event sofort wieder an
  10. 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.