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>
This commit is contained in:
Max Gramser
2026-09-13 11:16:57 +02:00
parent efe82c9b09
commit ef0ca8b350
23 changed files with 1371 additions and 498 deletions
+17
View File
@@ -160,6 +160,23 @@ geweigerd. De ronde draait één scherm tegelijk, wacht op `Schermfirmware >=`
doelversie en één minuut stabiliteit, en stopt bij de eerste fout. Alleen de
nachtelijke ronde schrijft een `persistent_notification` in HA.
### Compatibiliteit 0.2.18 / firmware 0.2.18
Opslagversie en tegelprotocol blijven 1. `tiles[].options.icon` is additief:
`auto` of een naam uit `screen_manager/app/tile_icons.py`. Op de draad stuurt de
manager in `o.icon` alleen de opgeloste codepoint in hex (`F06B5`): de gekozen
naam, of bij `auto` het `mdi:`-icoon uit de HA-attributen als dat in de set zit.
Oudere firmware negeert het veld; nieuwe firmware controleert of de glyph in de
font zit en valt anders terug op het domeinicoon. Daarom geen `min_firmware`.
Een oude editor die `icon` weglaat behoudt de opgeslagen keuze.
`tile_icons.py` is de enige lijst. `tools/generate_icons.py` schrijft de glyphs
als YAML-anker in de drie MDI-fonts van beide bordprofielen en bouwt
`static/tile-icons.woff` voor de editor (met left bearing gelijk aan xMin, anders
staan iconen in de browser uit het midden); draai daarna `generate_packages.py`.
De substituties `MDI_GLYPH_*` zijn vervallen: `TILEn_ICON` in handmatige
profielen moet uit de set komen. Geen gewijzigde preferences of sleutels.
### Compatibiliteit 0.2.12 / firmware 0.2.14
Opslagversie en tegelprotocol blijven 1. Additief: `tiles[].options.size`
+3 -2
View File
@@ -176,7 +176,8 @@ actie, terugmelding vanuit HA en lange druk. Controleer ook dat externe
wijzigingen in HA op het scherm verschijnen. Voer daarna de
[acceptatietest](ACCEPTATIE.md) uit.
Extra iconen vereisen een glyph in de `materialdesign_icons`-fontlijst. De
bundel bevat de fonts lokaal. De oudere uitgebreide
De iconfonts bevatten de tegeliconenset uit `screen_manager/app/tile_icons.py`;
kies `TILEn_ICON` daaruit. Een ander icoon voeg je daar toe en draai je
`tools/generate_icons.py`. De bundel bevat de fonts lokaal. De oudere uitgebreide
[TILE_CONFIGURATION.md](../TILE_CONFIGURATION.md) beschrijft ook het oude
scrollprofiel; gebruik die niet als hardware-/layoutinstructie voor dit bord.
+32
View File
@@ -0,0 +1,32 @@
# App 0.2.18 / firmware 0.2.18 — eigen icoon per tegel
## Wijzigingen
- `screen_manager/app/tile_icons.py`: 150 kiesbare MDI-iconen in twaalf groepen
(20 voor media en muziek) plus 9 vaste firmwareglyphs; codepoints gecontroleerd
tegen `fonts/materialdesignicons-webfont.ttf`.
- Firmware: `tile_icon.h` (hex → codepoint → UTF-8), `Tile::icon`, `icon_for()`
gebruikt een gekozen icoon als de font de glyph bevat.
- App: validatie van `options.icon`, `o.icon` met codepoint (gekozen of uit HA),
entiteiticonen in de inventaris, icoonkiezer met zoeken in het tegelpaneel.
## Tests
- `.venv-portal/bin/python -m unittest discover -s tests`: 69 tests OK, waaronder
`tests/test_tile_icons.py` (set in alle zes fonts en beide pakketten, elke
firmwareglyph in de set, editorvoorspelling gelijk aan `icon_for`/`weather_icon`,
validatie, draadformaat, discovery, oude editor behoudt icoon).
- Alle `tests/*.cpp` OK, waaronder `test_tile_icon.cpp`.
- `tools/generate_packages.py --check` en `tools/generate_icons.py --check`: actueel.
- `esphome compile`: CYD 1.361.735 bytes flash (74,2%, was 1.339.824), RAM 30,2%;
Guition 1.454.503 bytes (17,9%).
- USB-flash na `esptool chip_id` (`usbserial-130` = ESP32/CYD, `usbserial-210` =
ESP32-S3/Guition); uploadlog toont de juiste `firmware.bin`. `device_info`:
beide 0.2.18, gecompileerd 11:10:02 (CYD) en 11:10:52 (Guition).
- Guition-render via `send_layout.py` + `capture_ui.py`: thermometer in de
grafiekstrook (mini-font), `account-child` automatisch uit HA, koksmuts op de
timer, lamp op de dubbelbrede grote waarde (watch-font). Max bevestigde dat
het op de schermen goed werkt.
- Lokale editor met nep-HA: kiezer, zoeken op "muziek", live mockup en kop,
opslaan stuurt `F04C3`/`F0769`/`F0FCE`; hint bij firmware 0.2.17. Iconen in de
browser gemeten gecentreerd na de bearing-fix (gemiddeld 0,3 px op 100 px).