Per MQTT gesetzte Helligkeit sofort an die Anzeige senden

Am echten Broker aufgefallen: "hell_prozent = 100 uebernommen" stand im Log, die
Anzeige blieb aber auf 50 %. Der Wert landete korrekt in settings.json und der
Dimmer las ihn per reload() auch nach -- nur ging kein Helligkeitstelegramm raus.

Grund: Ein Telegramm wird nur beim *Wechsel* der Stufe gesendet (so war es schon
im alten MSP430-Programm gedacht, und fuer die LDR-Regelung ist das richtig).
Aendert man die Helligkeit von aussen, waehrend die Stufe dieselbe bleibt, gibt es
keinen Wechsel -- die Aenderung waere erst beim naechsten zufaelligen
Stufenwechsel sichtbar geworden.

run_esp32.main setzt nach dem reload() jetzt die Helligkeit der aktuellen Stufe
neu. Ohne Dimmer (kein LDR) gilt weiterhin direkt hell_prozent.

test_mqtt.TestHelligkeitWirdSofortSichtbar haelt das fest. Gegenprobe gemacht:
mit der alten Fassung schlaegt der Test fehl (keine Helligkeit gesendet), mit der
neuen geht genau ein Telegramm mit dem gesetzten Wert raus.

Am Geraet bestaetigt, Broker "nuccy": Verbindung steht, Status (ra/dec/ldr/
helligkeit/link/online) kommt retained an, Einstellungen werden uebernommen,
ungueltige Werte (500, Text) abgelehnt ohne settings.json anzufassen, und die
Anzeige reagiert jetzt sichtbar auf 100 % -> 15 % -> 50 %. 145 Tests gruen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-27 16:59:09 +02:00
parent bf39b75ac1
commit 41f5eb1821
3 changed files with 95 additions and 14 deletions
+68
View File
@@ -272,6 +272,74 @@ class TestStoerungen(MqttTest):
self.assertFalse(b.publish("ra", "x")) # wirft nicht
class TestHelligkeitWirdSofortSichtbar(MqttTest):
"""Am Geraet aufgefallen (2026-07-27): Einstellung uebernommen, Anzeige blieb.
Ein Helligkeitstelegramm geht nur beim *Wechsel* der Stufe raus. Wird per
MQTT hell_prozent geaendert, die Stufe bleibt aber dieselbe, muss die
Helligkeit trotzdem neu gesetzt werden -- sonst wirkt die Aenderung erst
beim naechsten zufaelligen Stufenwechsel.
"""
def _dimmer_und_display(self):
import brightness
from display import Display
from transport import FakeTransport
d = Display(FakeTransport(echo=False), response=True)
dimmer = brightness.BrightnessController(pfad=self.pfad)
dimmer.update(3000) # einschwingen auf HELL
return d, dimmer
def _uebernehmen_bauen(self, d, dimmer, log):
"""Dieselbe Logik wie in run_esp32.main."""
def uebernehmen(werte):
try:
if dimmer is not None:
dimmer.reload()
if dimmer.level is not None:
d.set_brightness(dimmer.percent(dimmer.level))
else:
d.set_brightness(werte["hell_prozent"])
except Exception as e:
log("Anzeige: %s" % e)
return uebernehmen
def _helligkeiten(self, transport):
"""Aus den Telegrammen die gesendeten Helligkeitswerte herausziehen."""
out = []
for frame in transport.frames:
i = frame.find(b"\x1bH")
if i >= 0:
out.append(int(frame[i + 3:i + 6]))
return out
def test_geaenderte_helligkeit_geht_an_die_anzeige(self):
d, dimmer = self._dimmer_und_display()
self.bridge._on_change = self._uebernehmen_bauen(d, dimmer,
self.meldungen.append)
self.bridge.connect()
d._t.frames.clear()
self.sende("ga/set/hell_prozent", "100")
self.assertEqual(self._helligkeiten(d._t), [100],
"Helligkeit wurde nicht an die Anzeige gesendet")
def test_ohne_dimmer_gilt_die_helle_stufe(self):
from display import Display
from transport import FakeTransport
d = Display(FakeTransport(echo=False), response=True)
self.bridge._on_change = self._uebernehmen_bauen(d, None,
self.meldungen.append)
self.bridge.connect()
d._t.frames.clear()
self.sende("ga/set/hell_prozent", "80")
self.assertEqual(self._helligkeiten(d._t), [80])
class TestOhneKonfiguration(unittest.TestCase):
def test_fehlende_mqtt_config_liefert_none(self):