- A tapped light or blind state now holds for 4s against polled state: a poll
that starts just after the tap can still return the device's old state
(a Hue light reports about a second after HA answers), which flipped the
card back and looked like the tap had failed.
- Swatches match what a light reports, not only what it was sent: a Hue
light hands rgb_color back at full intensity, so the exact comparison never
showed a swatch as selected.
- The Rollo card says "Nicht erreichbar" and disables its buttons while HA has
the cover as unavailable, instead of showing "Offen"; up/down show the
blind as moving at once, so they are not pressed again and again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Implements the room-control page from the design mockup: a scenes row above cards
for shutters, color lamps, and brightness-only lamps, all driven by a new
`general.ha` config section (server URL, token, ordered device/scene lists).
The backend proxies every Home Assistant call server-side (GET/POST /api/ha/...)
rather than the browser calling Home Assistant directly, so the long-lived token
never leaves the LAN device and Home Assistant's own CORS settings don't need to
know about musicmouse at all. Card kind (shutter/color/brightness-only) is
inferred at runtime from what Home Assistant reports about each entity, not
configured explicitly.
Also stops tracking python-backend/config.yml, which had drifted into the repo
despite its own header saying it shouldn't be - it now carries real credentials
locally and needs to stay untracked.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>