Demo Mode — Try It Without Home Assistant¶
Why this exists¶
The full install (see installation.md) assumes you already run Home Assistant with a weather integration, Google Calendar, a climate entity, BLE plant sensors... That's a lot to set up just to see whether the dashboard is worth the effort.
The firmware is push-only (ADR-0001): it never asks Home Assistant for anything, it only reacts to ESPHome native API calls. That means anything that can speak the ESPHome API protocol can drive the screen — including a small script that isn't Home Assistant at all.
tools/demo/demo_pusher.py does exactly that: it connects to your flashed Tab5 with aioesphomeapi (the same library Home Assistant's own ESPHome integration uses) and pushes rotating synthetic scenes — weather, forecast, climate, planning, plant moisture, weather alerts. No Home Assistant install, no entity mapping, no account created anywhere. Stop the script with Ctrl+C and there is nothing left to clean up except the flashed device itself.
What it does not touch¶
Nothing in Tab5/paquets/*.yaml, the C++ of Tab5/socle|ecran|jeux/, Tab5/user_entities.yaml, or HomeAssistant_Config/ is modified by demo mode. It is a standalone script that talks to the same API surface real automations use — purely additive.
Steps¶
- Flash normally, but leave
Tab5/user_entities.example.yamlas-is (copy it toTab5/user_entities.yamlunmodified — you don't need real Home Assistant entities behind these placeholder IDs for the demo). You still need the signing key and the Wi-Fi ofinstallation.mdsteps 3 and 5. - Note the device's IP once it's on your Wi-Fi (your router, or the page of « Tab5 Fallback AP » right after you picked the network).
- Install the one dependency and run the script from your PC (same Wi-Fi network as the device):
Encryption key (3.0, ADR-0020): a tablet never added to Home Assistant has no key yet. The script gives it one, as HA would, within 30 minutes of the tablet's start (otherwise restart it), and keeps it in
pip install -r tools/demo/requirements.txt python tools/demo/demo_pusher.py --host <device-ip>tools/demo/cle_demo.txt(gitignored): that is the key to give Home Assistant when you add the tablet later. On a tablet HA already knows, pass HA's key:--cle, theTAB5_CLE_APIvariable, or--config-ha <HA config folder>to read it where HA keeps it. - Watch the screen. Every ~20 seconds it cycles between three scenes (sunny day, rainy day with a weather alert, a rest day with a plant that needs watering), driving nine dashboard push services, the optional-zones answer (
tab5_maj_zones) and the home's slots (tab5_maj_emplacements: lights, temperatures, PC, TV, phone, plants), as the Home Assistant blueprint would (lot 6a) — and, on a 3.2 firmware, the rooms of the bottom tiles (tab5_maj_tuiles, see Rooms), and the solar installation of the Energy popup (tab5_maj_energieandtab5_maj_energie_historique, ADR-0028;tab5_maj_energie_soleilandtab5_maj_energie_bilan, ADR-0058), and a local LLM server for the AI server popup (tab5_maj_serveur_ia, one server per scene, ADR-0059). The remaining services are out of scope by design — they belong to features a demo can't fake (tab5_maj_reponse_vocale/tab5_assist_reponseneed a voice pipeline,tab5_maj_calendrier_mois/_jourandtab5_maj_rdv_prochainsneed a real calendar,tab5_maj_alertes_ha_bulkneeds live HA entities,tab5_maj_alertes_historiquethe alerts memory of Home Assistant,tab5_maj_lecteurreal media players,tab5_maj_musique_pieces/tab5_maj_musique_listethe players and the library of Music Assistant,tab5_maj_camerasreal cameras,tab5_maj_suivithe statistics of real sensors,tab5_maj_froidthose of real fridge and freezer thermometers), andtab5_maj_planningis obsolete since 2026-09-08 (the tablet derives the planning banner from the daily forecast; kept for compatibility, it will be removed in a future major version). - Stop with
Ctrl+C. Nothing persists outside the device, excepttools/demo/cle_demo.txtfor a tablet the demo gave its key to.
Want to check, without any hardware or dependency at all, that every call has exactly the variables the firmware declares (read in Tab5/paquets/tab5-api-logic.yaml) and every payload its format (it prints them, and fails on a mismatch):
python tools/demo/demo_pusher.py --dry-run
Minimal home (optional zones)¶
A zone whose Home Assistant entity doesn't exist disappears from the screen (ADR-0018). To see what a smaller home looks like:
python tools/demo/demo_pusher.py --host <device-ip> --maison-minimale
esphome.tab5_zones request with their keys, and pushes nothing for the climate and the shutter. What stays: the PC, two lights, the living-room temperature and two plants. The greenhouse spot shows a carousel icon (its tap still switches the area left of the clock). On a 3.2 firmware, the rooms come down to one, without a name (« Pièce 1 » on screen): the PC and the two lamps, where they were in 3.x.
Restart the tablet when switching from a full demo to this one: a zone that has already received data stays on screen (data always wins). The other way round needs nothing: a full demo answers "nothing missing" as soon as it connects.
Rooms (3.2 firmware)¶
Since 3.2 (ADR-0023), each page of the five bottom tiles is a room of up to five devices that Home Assistant describes. When the tablet has the tab5_maj_tuiles action, the demo pushes its own home, as the blueprint does: the definitions (name, type, icon, options of each tile), then the states, after the slots in tab5_maj_emplacements (tRT|state|value|colour keys).
| Room | Page (reached from home by) | Devices |
|---|---|---|
| Salon | home, days 0-4 | TV (off; long press: remote), shutter opening, dimmable orange colour lamp, ceiling light, a scene |
| Entrée | days 5-9 (swipe left) | front door (closed), corridor motion (detected), a read-only wall light, a script that asks for a second tap, an offline plug |
| Chambre d'amis à l'étage | days 10-14 (swipe left twice) | bedside lamp, the climate (same mode and temperature as the climate card of the scene), presence (away): three spaced tiles, side by side in HA mode. The name is longer than the 24 bytes the tablet keeps |
| Bureau | next 5 hours (swipe right) | the PC (on, never switched off from the screen) and the solar production (1.45 kW; tap: the Energy popup): two tiles, centred in HA mode |
| Jardin | hours 5-9 (swipe right twice) | awning 60 % open, soil moisture, a speaker playing, a dark indigo string light (its name is cut), outdoor temperature |
What to look at: in weather mode, each page shows its room's devices in the « shoulders » of its tiles; the HA button shows the room's cards, and a swipe goes from room to room. On a 3.x firmware (no tab5_maj_tuiles), the demo pushes the 3.x slots only, and the screen keeps its five fixed tiles.
Interactive mode (light/climate buttons)¶
By default, the script also logs when you tap a light, climate, or shutter control on screen (confirms the touch path works), via ESPHome's subscribe_home_assistant_states_and_services hook. On a 3.2 firmware, a tile's command is logged with its room and name, e.g. t02 (Salon › Lampe d'ambiance, lum) : basculer. Disable it with --no-interactive.
Known limitation: the light popup targets id(current_light_slot), an internal firmware global set by a long-press on a card — it isn't observable over the native API protocol, so the script cannot mirror the exact on-screen light state back after a tap. It logs the button press (proof the touchscreen works) but does not fake a state change. This is a deliberate scope limit, not a bug.
Reference: what gets pushed¶
| Service | Demo behavior |
|---|---|
tab5_maj_meteo_actuelle, _probabilites, _previsions_heures_bulk, _previsions_jours_bulk |
Full 15-hour / 15-day forecast per scene |
tab5_maj_alerte_meteo_france |
11-field vigilance payload; the rainy scene triggers an Orange alert banner |
tab5_maj_pluie_1h_bulk |
9-bar short-term rain chart, one call (idx|intensity;…) |
tab5_maj_clim, _volet_etat, _info_texte |
Climate, shutter and info-banner cards (_info_texte takes 3 args: texte, couleur, meteo_id). Rain and banner use the lot 4c codes (@level,start, @ha|…), so the tablet writes them in its own language. The planning banner is derived by the tablet from the daily push, as with Home Assistant |
tab5_maj_zones |
Optional zones: empty answer (full home), or the minimal home's keys with --maison-minimale |
tab5_maj_emplacements (lot 6a) |
The home's slots, as the blueprint pushes them: lights, room temp/humidity, phone battery, PC, TV, 5 plants with their details (one deliberately low, to show the dynamic sort). On a 3.2 firmware, followed by the states of the rooms' tiles (tRT keys). The screen's commands (esphome.tab5_action) are only logged |
tab5_maj_tuiles (3.2, ADR-0023) |
The rooms: 5 rooms, 20 tiles (one room of 3 with --maison-minimale), a full snapshot sent before the states. Only when the tablet has this action |
tab5_maj_energie, _energie_historique (ADR-0028) |
A solar installation: 1.45 kW produced, 620 W for the home, 430 W sold, battery at 64 % and charging; production per hour (today), per day (30 days) and per month (12 months), pushed at every scene and on every request of the tablet (esphome.tab5_energie). Only when the tablet has these actions |
tab5_maj_energie_soleil, _energie_bilan (ADR-0058) |
The same installation for the « Aujourd'hui » and « Bilan » pages: sunrise 08:13, solar noon 13:52, sunset 19:31, 17.8 kWh forecast today and 12.1 tomorrow (learned curve × weather), best window 12:00-15:00, the 24 hours of the forecast and of the clear-sky curve; the balance in kWh (ADR-0062) of a home with only its production and consumption meters (import and export estimated hour by hour, no price): today's hours, the days of June (net of the month ahead of the grid, a few days behind), the months of the year. Only when the tablet has these actions |
tab5_maj_historique (ADR-0032) |
The Temperature popup: the curve of the room (around 21 °C) or of the greenhouse (up to 28 °C in the afternoon) over 24 h, 7 days or 30 days, ending on the home-screen value, and, for the greenhouse, the outdoor forecast. Only on a request of the tablet (esphome.tab5_historique, a long press on a temperature): the popup ignores an answer it did not ask for. Only when the tablet has this action |
Source of the exact payload contract: Tab5/paquets/tab5-api-logic.yaml and Tab5/ecran/tab5_services.cpp / tab5_forecast.cpp (parsing rules, field counts, buffer limits) — see comments in tools/demo/scenarios.py for the specifics.