Skip to content

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

  1. Flash normally, but leave Tab5/user_entities.example.yaml as-is (copy it to Tab5/user_entities.yaml unmodified — 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 of installation.md steps 3 and 5.
  2. 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).
  3. Install the one dependency and run the script from your PC (same Wi-Fi network as the device):
    pip install -r tools/demo/requirements.txt
    python tools/demo/demo_pusher.py --host <device-ip>
    
    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 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, the TAB5_CLE_API variable, or --config-ha <HA config folder> to read it where HA keeps it.
  4. 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_energie and tab5_maj_energie_historique, ADR-0028; tab5_maj_energie_soleil and tab5_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_reponse need a voice pipeline, tab5_maj_calendrier_mois / _jour and tab5_maj_rdv_prochains need a real calendar, tab5_maj_alertes_ha_bulk needs live HA entities, tab5_maj_alertes_historique the alerts memory of Home Assistant, tab5_maj_lecteur real media players, tab5_maj_musique_pieces / tab5_maj_musique_liste the players and the library of Music Assistant, tab5_maj_cameras real cameras, tab5_maj_suivi the statistics of real sensors, tab5_maj_froid those of real fridge and freezer thermometers), and tab5_maj_planning is 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).
  5. Stop with Ctrl+C. Nothing persists outside the device, except tools/demo/cle_demo.txt for 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
The script then behaves like a Home Assistant without a climate unit, TV, phone, third light, greenhouse sensor, plants 3 to 5, shutter or work calendar: it pushes nothing for those slots, answers the tablet's 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.