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>
This commit is contained in:
Max Gramser
2026-09-13 10:14:04 +02:00
parent 437b8c55b4
commit 437e3a5046
18 changed files with 875 additions and 23 deletions
+1 -1
View File
@@ -137,7 +137,7 @@ zodra het scherm terugkomt. De app moet blijven draaien voor actuele tegeldata.
| --- | --- | --- |
| Andere entiteiten, namen of volgorde | Opslaan in ESP Screens | Wifi, sleutels, kalibratie |
| Nieuwe beheerpagina/appversie | Appwinkel → ESP Screen Manager → Update | Alle indelingen in `/data/screens.json` |
| Nieuwe schermfunctie/kaart | Firmware & USB → bestaand profiel → Wifi / OTA | Eigen YAML, sleutels en CYD-kalibratie; app stuurt tegels opnieuw |
| Nieuwe schermfunctie/kaart | Knop **Bijwerken** bij het scherm, of vinkje **Elke nacht automatisch bijwerken** (handmatig: Firmware & USB → Wifi / OTA) | Eigen YAML, sleutels en CYD-kalibratie; app stuurt tegels opnieuw |
De eigen YAML verwijst naar de firmwarepakketten in `main`. Bij een nieuwe build
haalt ESPHome de nieuwste gepubliceerde pakket- en componentcode op. Je vervangt
+20
View File
@@ -140,6 +140,26 @@ pressed-feedback op de PRESSED-state blijven gelijk. De analoge klok wijzigt
alleen de tekening (streepjes, cijfers, kalenderblok op enkele tegels); er is
geen nieuw veld voor nodig. Geen gewijzigde preferences of sleutels.
### Compatibiliteit 0.2.16 / firmware 0.2.17
`FIRMWARE_VERSION` in `screen_manager/app/core.py` is de firmware die bij deze
app hoort; `tests/test_updates.py` eist dat hij gelijk is aan
`SCREEN_FIRMWARE_VERSION` in beide bordprofielen en pakketten. Verhoog ze samen.
Een scherm met een lagere `Schermfirmware` krijgt een update-aanbod; een build
haalt `main`, dus publiceer firmware en app in dezelfde commit.
Firmware 0.2.17 voegt de diagnostische text sensors `Apparaatnaam`
(`${DEVICE_NAME}`) en `IP-adres` (`wifi_info`) toe. De app koppelt een scherm
via `Apparaatnaam` aan het profiel met dezelfde `esphome.name`; oudere firmware
valt terug op één profiel met gelijke `friendly_name` en een handmatig ingevuld
adres. Hernoem deze sensors niet zonder `core.discover` aan te passen.
Updatestatus staat in `/data/updates.json` (`version: 1`: `auto`, `hosts`,
`results`, `last_round`), los van `screens.json`. Onbekende versies worden
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.12 / firmware 0.2.14
Opslagversie en tegelprotocol blijven 1. Additief: `tiles[].options.size`
+54
View File
@@ -0,0 +1,54 @@
# App 0.2.16 / firmware 0.2.17 — bijwerken met één knop en nachtelijke ronde
## Wijzigingen
- **Firmware**: twee diagnostische text sensors per scherm, `Apparaatnaam`
(`${DEVICE_NAME}`, elke 60 s) en `IP-adres` (`wifi_info`). Verder ongewijzigd;
geen preferences, protocol of layoutcode aangeraakt.
- **App** (`screen_manager/app/updates.py`): `Updater` met `FIRMWARE_VERSION`
als doelversie, profielkoppeling via `Apparaatnaam` → `esphome.name` in de
ESPHome-map (`Firmware.profile_names`, leest YAML zonder `!secret` uit te
voeren), terugval op één profiel met dezelfde `friendly_name` plus een
handmatig adres. Eén ronde tegelijk: `install` (bestaande `Firmware.start`),
wachten op `Schermfirmware >= doel` (max 240 s), 60 s stabiliteit, 120 s pauze
tot het volgende scherm; de eerste fout beëindigt de ronde. Nachtelijke ronde
tussen 03:00 en 06:00 in de HA-tijdzone, één keer per dag, alleen met het
vinkje aan; bij een fout een `persistent_notification` in HA.
- **UI**: schermkaart is nu een `div` met een selectieknop en een updaterij
(badge *Update x.y.z* + **Bijwerken**, spinner met fase, resultaat een dag
zichtbaar). Blok *Firmware-updates* met **Alle schermen bijwerken** (zichtbaar
bij twee of meer bij te werken schermen) en het vinkje voor de nachtronde.
Een open IP-formulier overleeft de periodieke verversing; polling versnelt naar
3 s zolang er een update loopt.
- Opslag `/data/updates.json` (`version: 1`), naast `screens.json`.
## Tests
- `.venv-portal/bin/python -m unittest discover -s tests`: 62 tests OK, waaronder
de nieuwe `tests/test_updates.py` (versiebron gelijk in app en beide pakketten,
discovery van naam en adres, profielen lezen zonder secrets, aanbod en
handmatig adres, ronde stopt na fout en meldt alleen automatisch, scherm dat
niet terugkomt faalt, nachtvenster en persistentie, HTTP-endpoints met CSRF).
- `python3 tools/generate_packages.py --check`: beide pakketten actueel.
- `esphome compile` voor `easy-cyd-device.yaml` en `easy-guition-device.yaml`
(lokale pakketten met dezelfde inhoud als `packages/*.yaml`): geslaagd.
- USB-flash na `esptool chip_id` per poort (`usbserial-130` = ESP32/CYD,
`usbserial-210` = ESP32-S3/Guition). Uploadlog toont
`.esphome/build/cyd-2432s028/…/firmware.bin` resp.
`.esphome/build/guition-wallbox/…/firmware.bin`.
- `device_info` via de API: CYD `cyd-2432s028` project_version 0.2.17,
Guition `guition-wallbox` project_version 0.2.17, beide gecompileerd
2026-09-13 10:03. Beide melden `Schermfirmware=0.2.17`, `Apparaatnaam` gelijk
aan de profielnaam en `IP-adres` 192.168.146.134 resp. 192.168.146.136.
- Lokale preview van de beheerpagina met een nep-HA en een trage nep-CLI:
badge en knop bij een scherm op 0.2.16, spinner met "Bouwen en installeren…",
daarna "Bijgewerkt naar firmware 0.2.17." bij het scherm; scherm zonder
gemeld IP vraagt eenmalig het adres en start daarna; scherm op 0.2.17 toont
geen aanbod; het vinkje bewaart `auto` via `PUT /api/updates`.
## Nog te doen in productie
- Add-on bijwerken vanuit de HA-appwinkel (0.2.16) en beide schermen (nu al
0.2.17 via USB) moeten *geen* aanbod tonen. De eerste echte OTA-ronde volgt
bij de volgende firmwareversie; controleer dan het log onder Firmware & USB,
de spinnerfases en de melding bij een geforceerde fout.