Commit Graph

101 Commits

Author SHA1 Message Date
Max Gramser c8e1fb8f72 Send the first SSE event immediately (0.2.22)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 11:35:37 +02:00
Max Gramser 359c289feb Push inventory over server-sent events and log why the HA websocket closes (0.2.21)
/api/events streams the light inventory whenever the sync loop or a save
changes it (3 s check during firmware updates). The page stops polling
while the stream is open and falls back to the 10 s poll otherwise. The
websocket close is logged with duration, close code and exception.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 11:30:46 +02:00
Max Gramser 8dc5e616f5 Wake only for watched entities, registry events, light poll, 2 min keepalive (0.2.20)
The sync loop now wakes only for state changes of entities on a layout or
belonging to a screen. Registries refresh on HA registry events with a
10 minute fallback instead of every 30 s. The page polls a light inventory
(screens + update status) every 10 s and the full catalogues every 5 min or
when the tab becomes visible. The full keepalive interval is 120 s.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 11:24:17 +02:00
Max Gramser b67cd33fb3 Cache ESPHome profile metadata and stop polling hidden tabs (0.2.19)
/api/inventory re-read every ESPHome profile with pure-Python PyYAML up to
four times per request, which blocked the event loop for seconds on a Pi.
Profiles are now cached per file on (inode, mtime_ns, size), parsed with
libyaml when available, and read once per request. The sync loop computes
the inventory once per iteration. The page pauses polling while hidden.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 11:19:16 +02:00
Max Gramser ef0ca8b350 Custom icon per tile: 150 MDI icons in firmware and editor
- screen_manager/app/tile_icons.py is the single icon list (12 groups, 20 media
  and music icons); tools/generate_icons.py writes it into the three icon fonts
  of both boards and builds the editor's subset font.
- Firmware 0.2.18 shows o.icon when its fonts carry the glyph, else the domain
  icon. The app sends the chosen icon, or Home Assistant's own mdi icon on auto.
- Tile sheet gets an icon picker with search; the mockup shows the icon the
  screen actually draws.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 11:16:57 +02:00
Max Gramser efe82c9b09 Fix nightly-update checkbox layout and hide the updates block until loaded
The checkbox inherited the global 100%-wide input style, pushing its label
out of the sidebar. App 0.2.17, firmware unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 10:33:54 +02:00
Max Gramser 437e3a5046 One-click and nightly firmware updates from ESP Screens
Screens now report their ESPHome name and IP address, so the add-on can
match each screen to its YAML profile and OTA address itself. The screen
list shows an update badge with a Bijwerken button, an update-all action
and a nightly checkbox; updates run one screen at a time, wait for the
new version to report back and stop the round on the first failure.

App 0.2.16, firmware 0.2.17.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 10:14:04 +02:00
Max Gramser 437b8c55b4 Calendar analog clock with ticks and numerals; tiles without background
Firmware 0.2.16: the analog clock uses index strokes with 12/3/6/9
numerals on large cards and shows a calendar block (weekday, big day,
short month) beside the dial on single tiles; wide cards keep the digital
time and date. New palette key 'none' hides only the card fill and
border: geometry, padding and the pressed flash stay identical. Skeleton
frames and the render self-test honour the transparency.

App 0.2.15: 'Geen' in the background palette with a dashed mockup tile,
min_firmware 0.2.16 for such layouts, demo layout with the bare calendar
clock (--wide for the double-width clock). README and AGENTS note that
every push is a release and bumps the add-on version.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 09:52:33 +02:00
Max Gramser 84d9aa8f3e Open tile settings in a sheet above the mockup and remove tiles in place
App 0.2.14: clicking a card opens a settings sheet (bottom sheet on
mobile) with segmented choices that apply live to the mockup behind it,
so the page no longer scrolls to a list below. Each card gets a remove
button with an undo toast; the old per-tile list is gone.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 09:17:34 +02:00
Max Gramser 4af92e1b4c Smooth graphs, sun path card, skeleton page switches and editor drag & drop
Firmware 0.2.15: trend graphs use a Catmull-Rom curve with a soft fill
drawn by the card's draw event; sun.sun gets a wide sun-path card with
horizon, arc and the sun at its current position; page switches show
the new page's card frames immediately and fill them from a one-shot
timer; the navigation is one full-width bar without a divider; the CYD
adopts the Guition light palette in styles and overlays.

App 0.2.13: pointer-based drag & drop (mouse and touch) to reorder tiles
in the mockup and to drop entities from the list, sticky save bar, a new
header with explained actions and a three-step guide, clearer firmware
dialog. New sun, weather and clock tiles start wide in their best view.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 09:09:37 +02:00
Max Gramser 517b102786 Add clock, forecast, graph, sun, timer and person cards with wide tiles
Any tile can now be double width: pack() in runtime_model.h places wide
tiles in the left column and the manager preview follows the same rules.
New cards: built-in clock (digital or analog, screen.clock), five-day
weather forecast on a wide weather card fed by weather.get_forecasts,
history sparkline for sensors, sunrise/sunset (sun.sun), live kitchen
timer (timer.*, tap starts or pauses) and presence (person.*). The
manager pre-computes time-zone and forecast extras in a new 'x' object
and refuses layouts with new domains until the screen runs 0.2.14.

The self-test follows the packing, checks custom card parts and wide
widths, and diagnostics/send_layout.py pushes a demo layout of every
card type for render checks without Home Assistant. App 0.2.12,
firmware 0.2.14.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 02:09:50 +02:00
Max Gramser 53bf1bc228 Refine large-value tiles and fade Guition backlight in hardware
Large-value (watch) tiles show a small domain icon next to the title, centre
title and value vertically, use a dedicated larger digit font, truncate long
values with dots and keep the unit in its own label. The geometry self-test
checks the unit label too.

The Guition backlight now dims through the LEDC hardware fader (1.5 s to
standby, 80 ms wake) so full LVGL redraws no longer make the transition
stutter; ESPHome's light state is synced after each fade. Firmware 0.2.13;
app 0.2.11 stays compatible. Document the shared build directory pitfall.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-13 01:14:39 +02:00
Max Gramser c316d99fd7 Fix switch confirmation and details; retain compact slider icons 2026-09-13 00:47:49 +02:00
Max Gramser ba9ba414a5 Clarify ESPHome requirements and secrets in setup guide 2026-09-12 19:39:07 +02:00
Max Gramser 4c1a91c6c5 Record pastel production checks and configuration preservation 2026-09-12 19:04:38 +02:00
Max Gramser 2c48b304b3 Keep tile palette in a compact responsive grid 2026-09-12 18:56:29 +02:00
Max Gramser b327010025 Add readable pastel tile backgrounds and refresh setup documentation 2026-09-12 18:48:49 +02:00
Max Gramser ed6192e4dc Record production rotation and remote package verification 2026-09-12 18:37:03 +02:00
Max Gramser 0109bfd6d2 Add persistent native Guition rotation to screen settings 2026-09-12 18:29:06 +02:00
Max Gramser 8171629678 Fix compact tile text bounds and mini slider spacing 2026-09-12 18:15:26 +02:00
Max Gramser a14a66f699 Verify all runtime pages and document twenty-tile swipe acceptance 2026-09-12 17:36:48 +02:00
Max Gramser 439dd721f2 Support twenty runtime tiles and opt-in native LVGL page swipes 2026-09-12 17:29:58 +02:00
Max Gramser 2adf83f297 Document verified ESPHome wifi reuse on Home Assistant 2026-09-12 17:22:08 +02:00
Max Gramser 7e7f597600 Detect and reuse ESPHome wifi secrets in new screen wizard 2026-09-12 17:17:20 +02:00
Max Gramser 732a220df5 Show actual vacuum state when opening its detail card 2026-09-12 17:12:44 +02:00
Max Gramser f6efefc229 Document visual picker workflow and HA update acceptance 2026-09-12 17:06:59 +02:00
Max Gramser 06b217d503 Add visual screen layout and domain cues to tile picker 2026-09-12 16:58:31 +02:00
Max Gramser a34d7a3792 Use Home Assistant domain colors and improve tile contrast 2026-09-12 16:53:02 +02:00
Max Gramser 9328f86ae8 Close runtime detail menus when standby returns to page one 2026-09-12 16:42:05 +02:00
Max Gramser d38db1d5ac Document verified Home Assistant CLI installation and UI acceptance 2026-09-12 16:36:35 +02:00
Max Gramser 366d8ff4c2 Keep Home Assistant and project firmware versions in sync 2026-09-12 16:17:44 +02:00
Max Gramser 1d4e93227f Clarify vacuum status and exclude reproducible build caches from backups 2026-09-12 16:12:09 +02:00
Max Gramser a8b945fe3b Improve vacuum controls, slider gestures and per-tile settings discovery 2026-09-12 16:07:17 +02:00
Max Gramser 96962399a3 Refine control contrast and card typography after camera checks 2026-09-12 15:50:21 +02:00
Max Gramser f898863b1f Add rich runtime tiles and integrated ESPHome firmware management 2026-09-12 15:41:54 +02:00
Max Gramser 535838989c Record physical acceptance of the light Guition interface 2026-09-12 14:43:52 +02:00
Max Gramser 6cddac8ec6 Use native Guition panel configuration and add light card styling 2026-09-12 14:41:47 +02:00
Max Gramser 917b3d6d09 Add persistent per-screen brightness, standby and clock settings 2026-09-12 13:31:18 +02:00
Max Gramser 747ec4cceb Improve installer readability and validation feedback 2026-09-12 12:23:53 +02:00
Max Gramser a40cc58108 Merge CYD history while retaining shared runtime profiles 2026-09-12 12:10:55 +02:00
Max Gramser d271a63241 Add Home Assistant screen manager and runtime tile configuration 2026-09-12 12:09:58 +02:00
Max Gramser 09d57a81fd Record both branch checks and successful Guition lamp test 2026-09-12 11:18:22 +02:00
Max Gramser 427e4049ab Use shared light sliders on Guition and record hardware acceptance 2026-09-12 11:18:22 +02:00
Max Gramser 90dd9d38b2 Replace light presets with shared hue, temperature and brightness sliders 2026-09-12 11:17:03 +02:00
Max Gramser c8c919296b Replace light presets with shared hue, temperature and brightness sliders 2026-09-12 11:11:12 +02:00
Max Gramser 60438ff44a Add Guition 480x480 wallbox UI with GT911 and stable RGB rendering 2026-09-12 10:52:59 +02:00
Max Gramser 94546cf727 Add stable CYD firmware, USB calibration wizard and complete setup guide 2026-09-12 10:18:49 +02:00
Max Gramser 1eb65d8f71 Tegels Ambient en Alarm erbij; Woonkamer naar rij 5
Het raster is nu vol: tien tegels op vijf rijen.

- Tegel 2 (rij 1, rechts) wordt Ambient — script.ambient_morning, met een
  muzieknoot als icoon. Als script krijgt hij automatisch het paarse
  actie-accent, dus hij is meteen te onderscheiden van de lampen eromheen.
- Woonkamer (light.woonkamer_2) verhuist van tegel 2 naar tegel 9, rij 5
  links, en neemt zijn sofa-icoon mee. Verder ongewijzigd: helderheids-
  slider op long-press, en omdat de lamp color_temp/rgb/xy meldt komt de
  kleurknop in de overlay vanzelf mee.
- Tegel 10 (rij 5, rechts) wordt Alarm — input_boolean.alarm_engaged.
  Een input_boolean reageert niet op switch.toggle, vandaar de expliciete
  TAP_SERVICE input_boolean.toggle.

Tegels 9 en 10 abonneren alleen op wat ze echt lezen, zoals 7 en 8:
tegel 9 op state + brightness + supported_color_modes, tegel 10 alleen op
state. Waar een sensor ontbreekt gaat er NAN of "" naar de overlay.

Alle tien plekken per tegel zijn nagelopen met een audit over het hele
bestand: substituties, MDI-glyph, sensor, widget, ack-script, t*_on,
set_value_auto, apply_tile en de twee HA-events. Geen verwijzingen naar
sensors die niet bestaan.

Firmware: 1.329 MB flash, 72172 bytes statisch RAM. Na flashen 144 KB
vrije heap, grootste blok 90 KB.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 15:57:11 +02:00
Max Gramser 37e653f102 Secretnamen gelijktrekken met de ESPHome-map op Home Assistant
De config staat nu op twee plekken: deze repo en
/config/esphome/smartdisplay.yaml op Home Assistant. Die laatste las de
secrets van HA, deze repo zijn eigen set — met andere waarden voor de
api key en het OTA-wachtwoord. Wie het laatst flashte won, en de ander
kwam er daarna niet meer bij.

Beide configs lezen nu dezelfde namen als /config/esphome/secrets.yaml:

  smartdisplay_api_key -> api_encryption_key
  wifi_ap_password     -> ap_password
  ota_password         -> ongewijzigd van naam, wel HA's waarde

De lokale secrets.yaml (niet in git) is een kopie van die op HA, dus
beide routes leveren exact dezelfde api key en hetzelfde OTA-wachtwoord
op. home-like.yaml en /config/esphome/smartdisplay.yaml zijn nu
byte-identiek.

buttons.yaml krijgt dezelfde omzetting. Die config valideert overigens
al niet meer sinds ESPHome 2026.6 ("Invalid offsets" op de display-
transform); dat stond los van deze wijziging en is hier niet aangeraakt.

Ook opgeruimd: de header verwees nog naar achtergrondplaatjes, die sinds
de gradient niet meer bestaan. Het MDI-font is de enige asset die de
config nog nodig heeft.

Geverifieerd na het gelijktrekken: OTA vanuit de repo werkt, OTA met
HA's credentials werkt, en de ESPHome-integratie in HA bleef verbonden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 13:34:02 +02:00
Max Gramser cf211fb255 Accentkleur per tegel afleiden uit het Home Assistant-domein
Scripts en lights hadden allebei hetzelfde gele rondje, dus op het scherm
was script.goede_morgen niet te onderscheiden van light.woonkamer_2. Een
script vuur je af, een lamp zet je aan of uit; dat hoort niet hetzelfde
te zijn.

De kleur komt nu uit het domein van het entity_id — Home Assistant's
eigen indeling — in plaats van uit tien handmatige kleurvelden per tegel:

  script / scene / button / input_button / automation  -> ACCENT_ACTION (paars)
  light                                                -> ACCENT_LIGHT (amber)
  al het overige                                       -> ACCENT_DEVICE (cyaan)

TILE*_CIRCLE_ACTIVE_COLOR en TILE*_ICON_DISABLED_COLOR staan hiervoor op
de sentinel ${ACCENT_AUTO}, bewust buiten het 24-bits kleurbereik zodat
een echte hexwaarde altijd wint. Tegel 8 gebruikt dat nog steeds: de
brievenbus blijft rood zodra er post ligt.

Alleen de drie scripttegels (3, 4, 5) verschuiven van amber naar paars.
Light blijft amber en de overige apparaten blijven cyaan, dus verder
verandert er visueel niets.

De sliderkleur in de long-press-overlay lost dezelfde sentinel op, zodat
een tegel met slider ook automatisch de goede kleur krijgt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 11:45:52 +02:00