feat: relay inversé, LED idle solid, luminosité manuelle, auto-flash lux
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled

This commit is contained in:
2026-07-17 10:32:43 +02:00
parent 3de55821b7
commit 4b188ce819
8 changed files with 260 additions and 6 deletions
+38 -3
View File
@@ -58,6 +58,7 @@ class LEDService:
self._lock = threading.Lock()
self._on_change_cb: Callable | None = None
self._loop: asyncio.AbstractEventLoop | None = None
self._ambient_lux: float = -1.0 # -1 = inconnu
# ── Lifecycle ─────────────────────────────────────────────────────────────
@@ -111,6 +112,20 @@ class LEDService:
def set_color(self, r: int, g: int, b: int):
self._fill(WS_Color(r, g, b))
def set_brightness(self, value: int):
"""Regle la luminosite globale (0-255) et l'applique immediatement."""
value = max(0, min(255, value))
self._cfg.brightness = value
if HAS_WS281X and self._strip:
self._strip.setBrightness(value)
self._strip.show()
logger.info("Luminosite LED: %d", value)
def set_ambient_lux(self, lux: float):
"""Definit la luminosite ambiante mesuree (0-255 echelle pixel)."""
self._ambient_lux = lux
logger.debug("Lux ambiant: %.1f", lux)
# ── Thread principal ──────────────────────────────────────────────────────
def _run(self):
@@ -154,8 +169,14 @@ class LEDService:
def _effect_idle(self):
cfg = self._cfg.get_effect("idle")
c = cfg.color
speed = cfg.speed
if cfg.mode == "solid":
self._fill(WS_Color(c[0], c[1], c[2]))
self._cmd_event.wait()
return
# mode "breathe" (defaut)
speed = cfg.speed
step = 0
while not self._cmd_event.is_set() and not self._stop_event.is_set():
t = (1 + math.sin(step * 0.1)) / 2
@@ -202,9 +223,23 @@ class LEDService:
flash_color = WS_Color(cfg.color[0], cfg.color[1], cfg.color[2])
off = WS_Color(0, 0, 0)
# Boost luminosite max pendant le flash
# Calcul de la luminosite du flash
# Si auto_brightness activee et lux connu, on adapte. Sinon boost a 255.
if self._cfg.auto_brightness and self._ambient_lux >= 0:
lux = self._ambient_lux
if lux < 50:
flash_brightness = 255 # salle sombre → flash plein
elif lux < 180:
# lineaire : 255 a 50 lux → 120 a 180 lux
flash_brightness = int(255 - (lux - 50) / 130 * 135)
else:
flash_brightness = 80 # salle tres claire → flash reduit
logger.debug("Flash brightness auto: %d (lux=%.1f)", flash_brightness, lux)
else:
flash_brightness = 255
if HAS_WS281X and self._strip:
self._strip.setBrightness(255)
self._strip.setBrightness(flash_brightness)
try:
for _ in range(cfg.flashes):