Écrans et fonctions¶
Cette page décrit ce que le Tab5 affiche et fait réellement — vérifié contre le firmware (tab5-lvgl.yaml, ui_components/*.yaml, tab5_*.cpp) le 06/07/2026, re-vérifié le 14/07/2026 (panneau info, bouton console, zones de swipe), complété le 27/07/2026 (popups assistant/calendrier/plantes, section Arcade, photos appareil réel ; depuis le 07/10/2026, ces photos sont remplacées par des rendus du firmware actuel, dessinés par le firmware lui-même sur un PC avec des données de démonstration dans le thème par défaut, sauf la photo de la page principale) et re-vérifié le 30/07/2026 (migration des jeux vers des pages LVGL dédiées, remplacement de « Flip Noir » par « Neon Apron »). L'ancienne version de cette page décrivait une navigation par barre d'onglets à 6 écrans qui n'existe plus (et n'a peut-être jamais été livrée telle quelle) — voir ADR-0002. Si quelque chose ci-dessous ne correspond plus au firmware réel, c'est le firmware qui a raison — corrigez cette page.
Vue d'ensemble de la mise en page¶
Il y a une page unique 1280×720 (page_main), pas un jeu d'écrans navigués par onglets. Trois zones :
- Zone d'accueil — toujours visible : horloge, capteurs intérieurs, actions rapides, carte clim compacte, et la rangée sous l'horloge (plantes et capteurs).
- Carte centrale — une petite zone qui alterne automatiquement entre planning, prévision de pluie, alertes météo et un panneau info (récap calendrier / texte d'alerte).
- Zone de cartes du bas — soit les 5 cartes prévisions météo (avec, dans leurs épaules, les appareils de la pièce de chaque page), soit, en mode HA, les 5 cartes d'appareil de la pièce courante.

Des fenêtres s'ouvrent par-dessus cette page — lumières, volets, clim, télécommande TV, assistant vocal, calendrier, réveil, plantes, énergie et réglages — dont la page Système est l'ancienne console système — et les jeux de l'Arcade sur des pages à eux. Quel toucher ouvre chacune et ce que fait chaque bouton : la notice d'utilisation ; cette page explique comment marche chaque partie. Les réglages s'ouvrent sur leur page Écran d'un tap sur le bouton engrenage (btn_control_console, en haut à droite) et sur leur page Système, l'ancienne console, d'un appui long ; la console ne s'ouvre plus par swipe depuis la refonte gestuelle du 14/07/2026.
Captures générées¶
Ces images ne sont pas des photos : la CI les dessine sans tablette, avec le même code d'interface, à chaque pull request qui touche l'écran (ADR-0021, workflow rendu-host.yml). Les trois scènes sont celles du mode démo, à date fixe (16 juin, 07:45, heure de Paris), en français puis en anglais. Ce sont aussi les références auxquelles la CI compare chaque nouveau rendu : elles suivent donc le firmware.
| Scène | Français | English |
|---|---|---|
| Journée ensoleillée | ![]() |
![]() |
| Pluie et alerte orange | ![]() |
![]() |
| Jour de repos, plantes à surveiller | ![]() |
![]() |
Zone d'accueil¶
Contenu toujours visible en haut de l'écran :
- Icônes d'état, en haut à gauche, de gauche à droite : PC (vert allumé), téléphone (couleur de sa batterie), Wi-Fi, réveil, la production solaire quand la section Énergie du blueprint a un capteur de puissance solaire et la puissance crête des panneaux (sa couleur donne la production en part de la crête, avec le barème des batteries : vert au-dessus de 80 %, bleu, ambre, rouge sous 20 % ; un panneau gris à 0 %, la nuit), et la batterie de la tablette quand l'interrupteur de l'appareil Tab5 Batterie montée est allumé (éteint par défaut). Une prise quand aucune batterie n'est détectée (une tension sous 6 V dans les 10 dernières minutes : la tablette vit sur l'USB), de la couleur du texte du thème ; avec une batterie, le glyphe suit le niveau (pleine au-dessus de 80 %, moitié, basse, « ! » sous 20 %, un éclair pendant la charge, « ? » sans mesure), avec les couleurs du téléphone. Une icône masquée ne laisse pas de trou : les autres se resserrent.
- Heure et date actuelles, trois zones tactiles depuis le 09/10/2026 (ADR-0039, ui_components/horloge_zone.yaml) : heures (moitié gauche des chiffres, btn_horloge_heures), minutes (moitié droite, btn_horloge_minutes), date (dessous, btn_horloge_date), coupées dans le « : » et entre les chiffres et la date dans chaque thème (tests/test_gestes.py). « Auto » : appui long sur les heures ou les minutes = réveil, appui long sur la date = calendrier, tap sur les minutes = appareil suivant de la tuile − / + (reglables_suivant()), tap sur la date = ligne suivante de la rangée sous l'horloge (rangee_toucher()), tap sur les heures = rien ; chacun se choisit dans le blueprint comme les boutons du haut plus bas. Dans le coin haut droit de l'horloge, une icône rouge fridge-alert clignote (toutes les 500 ms, sans fondu) tant qu'un réfrigérateur ou un congélateur est au niveau grave (ADR-0055, btn_froid_alerte) ; un tap dessus ouvre le popup Frigos et congélateurs
- Température et humidité intérieure
- Icône microphone avec couleur d'état du pipeline (voir Assistant vocal ci-dessous), entre les deux boutons de mode vocal (agent Home Assistant vs pipeline conversation/LLM), et dessous le large bouton Ok Nabu: ON / OFF du mot de réveil (le bouton muet est dans le popup assistant depuis le 05/10/2026). Depuis le 10/10/2026 (ADR-0051), la zone au-dessus d'Ok Nabu (x 20–425) montre un contenu choisi dans le blueprint (section « Zone à gauche de l'horloge », clé gauche de tab5_maj_emplacements) : les commandes vocales (conteneur zone_vocal), un graphique des 15 prochaines heures (zone_graphique, tab5_zone_gauche.cpp : courbe de température de 5 px lissée comme celle du popup Météo sur un dégradé discret, valeurs la plus chaude et la plus froide posées à l'écart de la courbe et des barres, barres de pluie en mm — toute pluie prévue visible — et le cumul, depuis cal_heures_data ; un tap ouvre le popup Météo) ou le lecteur de musique compact (zone_lecteur, lecteur_zone.yaml, peint par tab5_lecteur.cpp : pochette, titre, artiste du popup Musique, barre de position fine, précédent / lecture-pause / suivant ; « Rien en lecture » et autres quand rien ne joue ; un tap ailleurs ouvre le popup Musique ; la barre « en lecture » se masque pendant ce temps ; sauté quand Home Assistant dit qu'aucun lecteur n'est choisi) ou un capteur suivi (zone_suivi, suivi_zone.yaml, ADR-0054, peint par tab5_suivi.cpp : le premier capteur de « Tab5 · capteurs suivis », son nom, sa variation avec une flèche de tendance, sa valeur et sa courbe des 24 h sur le dégradé du graphique ; un tap ouvre le popup Suivi ; sauté quand Home Assistant dit qu'aucun capteur n'est suivi). Le tap sur la température de la serre et le geste zone_gauche_suivante passent au suivant ; le choix est gardé en NVS
- Boutons HA, Réglages (engrenage) et Arcade (manette), en haut à droite, chacun avec un appui long depuis le 06/10/2026 : le popup Énergie quand la production solaire est reçue (solaire_present()), la page Système des réglages, la télécommande TV quand la zone TV est présente. Une mini icône de 26 px dans le coin en haut à droite des boutons HA et manette (icon_mini_ha, icon_mini_tv : les glyphes de la ligne d'état et de l'en-tête de la télécommande) dit quand cet appui long fait quelque chose ; les boutons ne glissent plus sans TV. Depuis le 07/10/2026, chaque appui long peut ouvrir un autre écran, et depuis le 09/10/2026 (ADR-0039) chaque tap aussi, ou faire une action (mode appareils, appareil suivant de la tuile − / +, ligne suivante de la rangée sous l'horloge, mot de réveil activé / coupé), choisis dans le blueprint (« Horloge et boutons du haut · Clock and top buttons », clé gestes de tab5_maj_emplacements, l'ancienne clé appuis toujours lue) : geste_cible() le donne, le script tab5_geste le fait et tab5_ecran_ouvrir (la routine du select « Aller à l'écran ») ouvre un écran ; un tap changé change l'icône principale du bouton (tap_glyphe()), et la mini icône (icon_mini_sys sur l'engrenage aussi) montre le glyphe de l'en-tête de sa fenêtre, masquée quand l'écran manque à la maison. Les boutons de l'accueil n'affichent que leur icône, tous à la même taille (125 × 90, icônes de 70 px) ; les trois colonnes du haut sont à 20 px des bords de l'écran comme la carte centrale, hauts alignés à y 20 et bas à y 308, 25 px au-dessus de la carte centrale
- Carte clim compacte — température actuelle (capteurs salon + serre) et température cible avec boutons +/− ; taper sur la cible ouvre le popup clim (voir Climatisation ci-dessous). Taper sur la température du salon ouvre, en éventail vers le haut, la roue d'actions rapides d'une clim, dont « Détails » est le carrousel des clims (le même popup, une page par clim ; ADR-0048) ; un appui long dessus, son historique. Un appui long sur la valeur entre − et + déroule la liste de la « tuile − / + » : les boutons peuvent régler un autre appareil (voir Climatisation ci-dessous)
- Rangée sous l'horloge — la ligne des plantes (4 emplacements pour jusqu'à 5 capteurs BLE d'humidité du sol, voir Humidité des plantes ci-dessous) et jusqu'à trois lignes de capteurs choisies dans le blueprint, qui tournent avec la carte centrale (voir Rangée sous l'horloge ci-dessous)
Carte centrale — planning / pluie / alertes / info¶
Une seule carte alterne automatiquement toutes les 8 secondes (script tab5_central_rotator_auto, tab5-scripts.yaml ; pas écran éteint ni sous un popup ouvert) entre jusqu'à huit panneaux : planning, pluie, alertes météo, info et jusqu'à quatre bandeaux d'alertes HA. La rotation ne tourne que sur la fenêtre prévisions par défaut — swiper vers une autre fenêtre remplace la carte centrale par un overlay de titre de page (page_title_wrapper) et met la rotation en pause. Cet overlay tient sur une ligne, construite par forecast_page_title_parts() (tab5_central.cpp), dans la police de la date du thème : la plage réellement couverte par les 5 tuiles visibles — Du mercredi 5 août au dimanche 9 août en journalier (jours et quantièmes via SNTP, 1er pour le premier du mois), De 14:00 à 18:00 en horaire, toujours de la plus ancienne à la plus récente même si les tuiles horaires sont rangées de droite à gauche. Les points de pagination sous la carte disent quelle fenêtre est ouverte (le chapeau « Prévisions journalières · 2/3 » est retiré depuis le 05/10/2026). Si les dates ne sont pas encore disponibles (SNTP non synchronisé et aucun payload HA reçu), la carte reste vide. Taper sur la température d'une carte prévision (voir plus bas) peut aussi interrompre la rotation quelques secondes pour montrer le planning d'un jour précis.
- Planning — dans la rotation, sauf si Home Assistant n'a pas d'agenda de travail (zone optionnelle, lot 5). Affiche le planning du jour.
- Prévision de pluie — intégrée à la rotation seulement si
has_rainest vrai. Un graphique de pluie à court terme : un point toutes les 5 minutes pour la première demi-heure, puis toutes les 10 minutes pour la demi-heure suivante (9 points au total, fenêtre d'1 heure), fourni par Météo-France via le service APItab5_maj_pluie_1h_bulk(les 9 barres en un appel). - Alertes météo — intégrée à la rotation seulement si
g_central_ctx.has_mf_alertsest vrai. Affiche une icône par type de vigilance Météo-France actif (vent, inondation, orages, etc.), chaque icône colorée selon sa propre sévérité : jaune (vigilance jaune), orange, ou rouge (vigilance rouge) — les codes couleur officiels Météo-France, à ne pas modifier.
C'est la date, pas "un jour", qui prend la couleur du niveau d'alerte global en cours : indépendamment de la rotation ci-dessus, le texte de la date sous l'horloge en zone d'accueil (lbl_date, ex. "Lun 06 Juil") est recoloré à chaque réception d'un payload d'alerte, selon le niveau de vigilance global du jour (vert/défaut si aucune, jaune pâle/orange/rouge pâle pour jaune/orange/rouge) — voir tab5-api-logic.yaml dans le service tab5_maj_alerte_meteo_france. C'est distinct de la coloration par icône du panneau d'alerte ci-dessus, qui utilise le niveau propre à chaque type d'alerte plutôt que le niveau global.
- Panneau info — intégré à la rotation seulement si
has_infoest vrai. Affiche soit un récap calendrier 3 jours (multi-lignes, avec balisage couleur inline), soit une bannière d'alerte Météo-France (une ligne, colorée selon la sévérité), poussé par HA via le servicetab5_maj_info_texte(update_info_text_ui(),tab5_*.cpp). Un tap le masque (tab5_dismiss_info_tap→dismiss_central_info_immediate) : le panneau quitte le rotateur tout de suite ; l’id est stocké danstab5_dismissed_localpour qu’un re-push du même id reste caché tant que HA n’envoie pas une nouvelle alerte. - Slots infos / alertes HA (jusqu’à 4) — poussés par
tab5_maj_alertes_ha_bulkdansha_alert_wrapper_0…3. Chaque slot est son propre panneau du rotateur ; un tap masque ce slot (tab5_dismiss_ha_alert, slot 0-3 →dismiss_ha_alert_slot_immediate), même logique de dismiss local.
Si ni pluie, ni alertes MF, ni info, ni slots HA ne sont actifs, la rotation garde simplement le planning à l'écran (et laisse la carte vide sans planning).
Roue de navigation — appui long (09/10/2026, demandée par l'auteur ; ADR-0042). Un appui long sur n'importe quel panneau de la carte, ou sur le titre de la page (prévisions, pièce du mode HA), ouvre au-dessus de la carte la roue d'actions rapides des tuiles, sur les écrans de la tablette : « Aller à » et une rose des vents au moyeu, six boutons avec un mot à côté de chacun — Alertes (l'historique ; marqué quand une alerte est à l'écran), Pièces (Maison, puis chaque pièce qui a des appareils, son numéro dans le bouton : le mode HA sur elle), Appareils (Températures, Clims, Lumières, Volets, Énergie, Plantes, Musique, TV — les deux dernières depuis le 10/10/2026, huit choix sur le second anneau), Agenda (Météo, Calendrier, Réveil, Caméras, Frigos — le dernier depuis le 10/10/2026, ADR-0055, proposé sauf si Home Assistant dit qu'aucun appareil n'est déclaré, Serveur IA — depuis le 10/10/2026 aussi, ADR-0059, proposé une fois qu'Home Assistant a poussé un serveur), Tablette (Jeux, Réglages, Système), Assistant. Une famille se déplie sur le second anneau et le moyeu dit laquelle. Seul ce que la maison a est proposé ; une famille vide disparaît. Un toucher à côté replie, puis ferme. tab5_roue_navigation.cpp ; le geste « roue » l'ouvre depuis l'horloge ou un bouton du haut.
Bascule temporaire : taper sur la température max/min d'une carte de prévision journalière (pas les horaires) interrompt la rotation pendant 6 secondes pour afficher le texte des horaires de ce jour précis dans la carte centrale, puis restaure automatiquement le panneau qui était actif (show_temporary_planning(), tab5_*.cpp — anciennement un script ESPHome de tab5-scripts.yaml, passé en C++ lors du fix reboot du 12/07).
Zone de cartes du bas — les pièces¶
Depuis la 3.2 (ADR-0023), chacune des 5 pages du bas est aussi une pièce de 5 appareils au plus, décrite par Home Assistant (blueprint « Tab5 — emplacements », action tab5_maj_tuiles ; états par tab5_maj_emplacements, clés tRT). La pièce 0 est l'accueil (jours 0-4), les pièces 1 et 2 les pages journalières suivantes (swipe vers la gauche), les pièces 3 et 4 les pages horaires (swipe vers la droite) ; la tuile T est la position visuelle, 0 = gauche. Les définitions sont gardées en NVS : les pièces se dessinent avant que HA réponde ; pas les états (« -- » grisé jusqu'à la première poussée). Modèle et dessin : tab5_tuiles.cpp. Depuis l'ADR-0066 : jusqu'à 10 pièces (« pn|N » ; les pièces 5 et plus ont chacune une page après les jours 10-14) de 20 éléments (clé tRT, T = 0-9 puis a-j) ; au-delà de cinq, les dernières places sont coupées en deux puis en quatre (tab5_disposition.h, cases de tab5_tuiles_cases.cpp).
Le bouton btn_control_ha (en haut à droite, icône Home Assistant) bascule la zone entre le mode météo et le mode HA (tuiles_mode_ha(), drapeau g_central_ctx.ha_mode). Il prend une bordure et une icône d'accent quand le mode HA est actif, et disparaît quand aucune pièce n'a d'appareil. Son appui long ouvre le popup Énergie quand la production solaire est reçue. « Aller à l'écran → Accueil » (le select de Home Assistant) quitte le mode HA.
Mode météo (par défaut)¶
5 cartes, navigables par swipe gauche/droite (à partir de y 333 : la carte centrale et la rangée du bas), sur 5 fenêtres : 2 horaires + 3 journalières. L'ordre est voulu (forecast_page_suivante(), tab5_central.cpp) : un swipe vers la gauche avance dans les trois fenêtres journalières et boucle sur elles (de la dernière à la fenêtre d'accueil) ; un swipe vers la droite recule, à travers les deux fenêtres horaires, et de la dernière fenêtre horaire revient à la fenêtre d'accueil. Voir la note faux positifs dans docs/troubleshooting.md ; ce que l'utilisateur voit : notice, rangée du bas.
Fenêtres horaires (2) : les 15 prochaines tranches horaires, 5 par fenêtre. Chaque carte affiche une heure, une icône météo double couche (IconeMeteo.ttf), une température avec code couleur, et la pluie en mm (ou - si sec). Il n'y a pas de donnée de vitesse de vent séparée — "venteux" est l'une des icônes de condition météo possibles (à côté de soleil/nuage/pluie/neige/brouillard), pas un champ de donnée distinct.
Fenêtres journalières (3) : prévisions sur 15 jours, 5 jours par fenêtre. Chaque carte affiche : - Nom du jour, avec code couleur (voir Coloration ci-dessous) - Icône météo (même système double couche) - Températures max et min, chacune avec code couleur — taper dessus affiche le planning de ce jour dans la carte centrale pendant 6 secondes (voir ci-dessus)
Épaules et action rapide. Sur chaque page, une tuile qui porte un appareil de la pièce de la page le montre dans ses deux « épaules », de part et d'autre de l'onglet titre — à gauche l'icône de l'appareil (palette) colorée par son état ; à droite une ampoule (lumière) ou la flèche du prochain mouvement d'un volet (pause pendant la course), rien pour les autres types — et un bouton invisible sur l'icône météo (btn_jN_action sur les pages journalières, btn_hN_action sur les horaires) envoie la commande de la tuile ; la météo reste affichée. Une page sans appareil est comme avant la 3.2. Avec l'interrupteur de l'appareil Tab5 Appareils sur la météo éteint (allumé par défaut ; discussion #278), chaque page ressemble à une page sans appareil : les cartes de prévisions montrent la météo seule, et les appareils restent dans le mode HA.
Appui court et appui long pour chaque sorte d'appareil, et les comportements « allumer seulement », « confirmer » et « lecture seule » du blueprint : notice, rangée du bas. Dans le firmware, tuile_appui() (tab5_tuiles.cpp) applique le tableau de l'ADR-0023 au type de la tuile (lum, int, vol, med, act, cap, bin, cli) et à ses options (o allumer seulement, k second appui dans les 3 s, r lecture seule, t télécommande TV, m la clim du blueprint, e popup Énergie).
Roue d'actions rapides — appui long (07/10/2026, demandée dans la discussion #278 ; deux anneaux le même jour, à la demande de l'auteur ; ADR-0036, tab5_roue.cpp, ui_components/roue_actions.yaml). Un appui long sur une lumière, un volet ou une clim dont HA a envoyé les réglages — sa tuile météo, la pastille de sa carte du mode HA ou sa ligne du popup Maison — ouvre tout de suite une roue, devant le voile des popups à 60 %. Sur la tuile, un moyeu : l'icône de la carte dans la couleur d'état, sa ligne d'état, une fine jauge en arc (luminosité, position, consigne dans les bornes de l'appareil) et le nom de l'appareil. Au-dessus, un premier anneau de boutons ronds en verre (72 px, à 180 px de la tuile) : Maison à gauche (le popup Maison ; absent quand la roue s'ouvre depuis lui), les commandes, les familles marquées d'un point, puis Détails à droite (le popup de la tuile : lumières, volet, clim). Toucher une famille déplie ses choix sur un second anneau (290 px), centré sur elle : lumière Éteindre ou Allumer · Luminosité ▸ 10 · 25 · 50 · 75 · 100 % · avec c Blancs ▸ chaud · crème · froid et Couleurs ▸ rouge · orange · or · vert · bleu · violet (pastilles) ; une lumière sans variateur Allumer · Éteindre ; volet Ouvrir · Stop · Fermer · Position ▸ 25 · 50 · 75 % (s'il donne sa position) ; clim Arrêt · Mode ▸ (ses modes) · Consigne ▸ (la sienne et deux pas de chaque côté) · Options ▸ (Éco, Boost, Silence, Oscillation, Brise, celles qu'elle a). Chaque anneau repose sur une bande de verre (un arc à bouts ronds), la seconde teintée de la couleur d'état. L'état courant est un verre teinté de la couleur d'état, liseré plein et halo. Une commande ou un choix envoie ce que la tuile ou son popup envoie déjà (esphome.tab5_action, rien de nouveau pour HA) et ferme la roue ; toucher ailleurs ou le moyeu replie le second anneau, puis ferme la roue ; de même le délai d'inactivité des popups, l'ouverture d'un popup, l'extinction de l'écran et de nouvelles définitions des tuiles ; un changement de thème ou un état poussé la repeint ouverte. Près d'un bord, un anneau pivote par pas de 5°. Pas de roue (le popup s'ouvre directement) : option k, clim dont HA n'a pas encore envoyé les réglages.
Mode héritage (blueprint 3.x). Tant qu'aucune définition n'est arrivée (firmware mis à jour avant son blueprint), la pièce 0 est construite depuis les emplacements 3.x et ressemble à la 3.1 : carte 1 PC/TV (épaule = état de la TV, ou du PC sans TV ; appui long = télécommande), carte 2 le volet, cartes 3 à 5 les lumières chambre, salon et LEDs (appui long = popup lumière), avec les commandes 3.x. Sur la carte du volet, taper le titre inverse le sens que le prochain appui enverra (la flèche en haut à droite le montre) ; taper l'icône envoie « arrêter » si le volet bouge, sinon ouvrir ou fermer.
Mode HA¶
Les 5 cartes (switches_card.yaml) montrent la pièce de la page courante, chacune dessinée comme la carte « tile » d'un tableau de bord Home Assistant dans sa forme verticale (depuis le 06/10/2026, discussion #278) : l'icône de la palette (70 px) dans une pastille ronde de la couleur de son état (la couleur à 20 %, l'icône pleine ; tap et appui long sur la pastille), le nom dessous (coupé avec « … » ; un tap dessus inverse le sens d'un volet), et sous le nom une ligne d'état traduite par la tablette — « 60 % », « Allumé » / « Éteint », « Mouvement » / « 45 % » / « Ouvert » / « Fermé », « Lecture » / « Pause », « Lancer », la valeur et l'unité d'un capteur, « Détecté » / « Présent » / « Verrouillé »… selon la classe d'appareil, la température de la pièce d'une clim ; « Hors ligne », grisé, quand l'entité est indisponible — et une couleur selon le type et l'état (la couleur propre d'une lumière quand elle en donne une). Les tuiles vides sont masquées et les autres centrées. La carte centrale affiche le nom de la pièce ; le rotateur est en pause. Appui court et long : notice.
Swipe en mode HA : pièce suivante / précédente qui a un appareil, dans l'ordre des pages météo (même bouclage) ; les calques météo restent masqués et les pastilles suivent. Avec une seule pièce, un swipe ne fait rien. Entrer en mode HA sur une page sans appareil saute à la pièce la plus proche qui en a ; en sortir montre la météo de la page courante.
Tap sur le nom de la pièce (le titre de la carte centrale, en mode HA seulement) : le popup Maison.
Le climat de la pièce (ADR-0040, facultatif) : quand la section de la pièce dans le blueprint déclare une sonde de température, la carte clim au-dessus montre la pièce à la place du salon et de la serre — un thermomètre et la température de la pièce à gauche (l'icône teintée par l'humidité), une goutte et l'humidité à droite quand une sonde d'humidité est déclarée, rien sinon. Un appui long sur la température de la pièce ouvre son historique. Quand la section déclare aussi une clim, la tuile − / + règle cette clim (un toucher sur sa consigne ouvre le popup clim sur elle) ; sa liste garde son choix pour les autres pièces et le mode météo. Une pièce sans ces champs, ou le mode météo, montre la carte d'avant.

Climatisation¶
Deux niveaux de contrôle. La carte compacte pilote l'entité climate du blueprint (entrée « Climatisation ») ; le popup pilote la même, ou la clim de la tuile qui l'a ouvert :
- Carte compacte (toujours visible en zone d'accueil) — température actuelle et cible avec boutons +/−. Toujours la clim du blueprint.
- Tuile − / + au choix (ADR-0033,
tab5_reglables.cpp,ui_components/reglables_liste.yaml) — un appui long sur la valeur entre − et + (btn_clim_target_click; avant le 09/10/2026, taper la température du salon, devenu le carrousel des clims) déroule une liste : la clim du blueprint, jusqu'à huit appareils de la section « Tuile − / + » du blueprint (clésrN: volume, luminosité, consigne, humidité, vitesse, position, nombre), puis le volume de la tablette. L'appareil choisi reste (NVS) ; un tap sur les minutes de l'horloge (« auto ») passe au suivant sans dérouler la liste (reglables_suivant()). Clim choisie : rien de ce qui précède ne change, sauf l'icône de la clim (clim_consigne_icone,mdi_font_45) à 8 px à gauche de sa consigne depuis le 09/10/2026 ; depuis le 18/10/2026, l'icône et la consigne sont centrées ensemble entre − et + (la consigne seule au centre les laissait 27 px à gauche). Autre appareil : son icône et sa valeur remplacent la consigne, − / + déplacent la valeur de son pas tout de suite et un seulesphome.tab5_action(rN/regler, ouconsignepour une clim) part 250 ms après le dernier tap ; taper la valeur ouvre le popup de la tuile qui porte la même entité, ou la télécommande TV. - Popup clim (quasi plein écran, carte 1250×690 à 15 px des bords, ouvert en tapant la carte compacte, une tuile de clim, ou « Aller à l'écran → Climatisation ») — trois cartes de verre :
- MODE : Froid / Chaud / Sec / Ventilation / Éteint, empilés pleine largeur (icônes colorées selon le mode actif, pilotées par
tab5_maj_clim) - TEMPÉRATURE : arc thermostat 320 px avec la cible affichée en grand au centre, boutons − / +, et la température réelle de la pièce en bas. Bornes, pas et unité sont ceux de l'appareil (16–30 °C et 0,5 tant que Home Assistant ne les a pas envoyés, voir plus bas). La cible s'affiche immédiatement (optimiste) et un seul
climate.set_temperaturepart une fois le geste terminé (débounce 250 ms — les taps rapides ± sont groupés) - OPTIONS : presets Éco / Boost (toggle), Silence (fan quiet), et flux d'air Oscillation / Brise (
windnice, mode Daikin Onecta auparavant inaccessible depuis l'écran) - Toutes marques (ADR-0026) : le blueprint envoie les réglages de l'appareil (clé
climr:min_temp/max_temp,target_temp_step, °C ou °F, les modes qu'il a, son nom). Le titre devient le nom de l'appareil, l'arc et les boutons ± suivent ses bornes et son pas, et un bouton que l'appareil ne sait pas faire disparaît — une section OPTIONS restée sans bouton disparaît avec son titre, les autres remontent. Les boutons envoient toujours les noms de la Daikin (Éco =away, Silence =quiet,swing/stop), et le blueprint les traduit vers ceux de l'appareil (eco,low,off,vertical…), ou n'envoie rien quand l'appareil n'a pas d'équivalent. - Toute tuile de clim (ADR-0027) : une tuile
clid'une pièce ouvre le popup sur son propre appareil — ses réglages (clécrRT, les champs declimr) et son état (cléceRT) arrivent avec les tuiles, et ses boutons envoient les mêmes commandes avecemplacement: tRT, que le blueprint traduit de la même façon. Sa consigne et son mode arrivent tout de suite dans le popup, sa ventilation, son oscillation, son préréglage et la température de la pièce en 5 minutes au plus (avec les mesures). Une tuile avec l'optionmest la clim du blueprint. Tant que Home Assistant n'a pas envoyé les réglages de la tuile (blueprint plus ancien), la toucher ne fait rien. Pendant ce temps la carte compacte montre toujours la clim du blueprint, et fermer le popup y revient. - Carrousel des clims (ADR-0038, 09/10/2026) : le popup a une page par clim que la tablette connaît — celle du blueprint d'abord, puis chaque tuile
clisans l'optionmdont les réglages sont arrivés, pièce par pièce, puis la clim propre de chaque pièce (ADR-0040) (clims_enumerer(),tab5_clim.cpp; un appareil déjà listé sous le même nom n'a pas de seconde page). Une page est le popup entier repeint pour cet appareil (son nom en titre, les boutons qu'il n'a pas masqués ; un appareil envoyé sans nom prend celui de la pièce de sa tuile). Glisser à gauche ou à droite montre le suivant ou le précédent, en boucle ; la page change tout de suite. Des pastilles sous les trois cartes, comme celles de la carte centrale, disent lequel (8 au plus ; au-delà de huit clims, les suivantes n'ont pas de page, mais la tuile − / + et la roue de leur pièce les visent toujours, et le « Détails » de leur roue les montre ici, sans pastille allumée — 19/10/2026). Une seule clim : ni pastilles ni glisse. Taper la température du salon (btn_reglables_liste) ouvre la roue de la clim de la pièce affichée en mode HA quand elle en a une (sa clim propre d'abord), sinon de celle du blueprint (ci-dessous) ; son « Détails » ouvre le carrousel sur elle, et le toucher ouvre directement le carrousel tant que cette clim n'a pas encore ses réglages ; sans aucune clim, ce toucher déroule toujours la liste de la tuile − / +. Le glisser reste dans le popup (rien ne change derrière), et glisser l'arc de côté règle toujours la consigne. - Roue d'une clim (ADR-0048, 09/10/2026) : le toucher de la température de la pièce ouvre, en éventail entier vers le haut depuis une ancre basse (la température est trop haute pour elle), la roue d'actions rapides d'une tuile
clipour cette clim — même code (clim_roue_ouvrir(),tab5_tuiles_roue.cpp), mêmes boutons (Éteindre, Mode ▸, Consigne ▸, Options ▸, ceux de l'appareil), mêmes commandes au même emplacement (clim,tRT,cpR). Le moyeu montre la température de la pièce, une jauge de la consigne et le nom de l'appareil ; les anneaux passent sous l'ancre. « Détails » ouvre le carrousel sur cette clim. Avec deux clims ou plus, « Clims ▸ » remplace « Maison » : son second anneau les liste (consigne ou icône éteinte, nom dessous, celle de la roue marquée) et un toucher rouvre la roue sur celle touchée. Un réglage ou un état poussé repeint la roue ouverte. - Taper l'overlay sombre ou le bouton × (le bouton de verre partagé 80×44 de
modal_header.yaml) ferme le modal. 6 des 10 boutons sont des templates factorisés (froid/chaud/ventil/sec, éco/boost) ; les 4 restants (éteint/oscill/brise/silence) et les boutons ± sont volontairement laissés en YAML individuel — voir ADR-0007.
Les contrôles sont estompés (non cachés) quand le clim est éteint, pour garder la mise en page stable.

Rangée sous l'horloge¶
Sous l'horloge, une rangée de 401 × 70 px (ADR-0031, tab5_rangee.cpp, ui_components/rangee.yaml) montre une ligne à la fois : la ligne des plantes (plus bas) et jusqu'à trois lignes de quatre appareils choisies dans la section « Sous l'horloge · Under the clock » du blueprint « Tab5 — emplacements », trois lignes au plus en tout. Le blueprint règle aussi la place de la ligne des plantes (en premier d'origine, deuxième, troisième ou masquée) et la durée d'une ligne (8 à 120 s par pas de 8 s, 32 s d'origine).
- Calage. La carte centrale garde ses 8 s.
tab5_central_rotator_autoattend 7,8 s, fait tourner la rangée (rangee_tour()), attend 0,2 s et fait avancer la carte : quand la rangée change, c'est juste avant la carte, avec le même court glissement en fondu (transition_widgets()). Elle ne tourne pas écran éteint ni fenêtre ouverte. - Mise en page. Icônes seules (aucun capteur sur la ligne) : icônes de 70 px, comme les pots. Avec des valeurs : la plus grande taille qui tient — la police de la date du thème avec des icônes de 45 px, puis 32 px en gras, puis 22 px, puis l'icône au-dessus de sa valeur ; au-delà, la valeur est coupée par « … ».
- Couleurs. Une icône est colorée comme une tuile (allumé, éteint, hors ligne). Une valeur suit sa mesure : l'échelle des températures (écrite « 21.4 ° » ; °F ramené en °C pour la couleur), l'humidité celle des plantes, les batteries celle des batteries, l'or pour la puissance et l'énergie (W / kW, kWh / MWh).
- Toucher. Un appui montre la ligne suivante tout de suite et repart de zéro pour sa durée ; un appui long sur la ligne des plantes ouvre le détail des plantes. La rangée ne commande rien : un interrupteur ou une lampe montre seulement son état.
- De petits tirets sous la rangée (deux ou trois) montrent la ligne affichée ; une ligne seule n'en a pas.
Carte humidité des plantes¶
Surveille jusqu'à 5 capteurs BLE d'humidité du sol, mais seuls 4 emplacements sont affichés (sort_and_update_moisture_slots(), tab5_*.cpp). Les capteurs sont triés par niveau d'humidité (du plus sec au plus humide) à chaque mise à jour, puis mappés sur les emplacements ainsi : le plus sec, le 2e plus sec, le capteur de rang médian (ça affiche la lecture brute de ce capteur précis, ce n'est pas une moyenne arithmétique calculée sur les 5), et le plus humide. Comme le mapping se fait par rang plutôt que par identité fixe du capteur, quel pot apparaît dans quel emplacement change dans le temps selon l'évolution de l'humidité.
Chaque emplacement n'affiche que l'icône du capteur, dans sa couleur de niveau d'humidité (voir Coloration ci-dessous), à la taille des boutons de l'accueil ; le nom et la valeur de chaque pot sont dans le popup détails plantes (appui long). Le libellé « Pot N » / « Moy: » sous chaque icône est retiré depuis le 05/10/2026.
Popup détails plantes — appui long¶
Un appui long sur la ligne des plantes de la rangée sous l'horloge ouvre un modal quasi plein écran (carte 1250×690 à 15 px des bords) avec 5 cartes de verre fixes — une par capteur (carte N = capteur moisture_N, même icône que le dashboard, pas de tri dynamique ici). Chaque carte affiche :
- le nom du pot et son icône de plante, colorée par le niveau d'humidité (même échelle que le dashboard)
- le % d'humidité du sol (en grand) et un statut d'arrosage : OK (vert), Bientôt sec (≤ 20 %, ambre), À arroser ! (≤ 14 %, rouge — aligné sur la zone rouge de
get_humidity_color()) ou Hors ligne (capteur indisponible) - quatre lignes de métriques : Fertilité (conductivité EC, µS/cm), Lumière (lx), Température (°C, gradient
get_temperature_color()) et Batterie du capteur (%, échelleget_battery_color())
Les valeurs sont poussées en continu par les capteurs HA pot*_ec/lux/temp/bat (update_pot_metric_ui(), tab5_*.cpp) — le popup n'a besoin d'aucune synchro à l'ouverture. Taper l'overlay sombre ou le bouton × (le bouton de verre partagé 80×44 de modal_header.yaml) le ferme. Composants : pots_popup.yaml + pot_detail_card.yaml (5 instances).

Popup calendrier — appui long sur la date¶
Un appui long sur la date, sous l'horloge (btn_horloge_date, « auto » ; les gestes de l'horloge se choisissent dans le blueprint depuis le 09/10/2026, voir la zone d'accueil plus haut), ouvre un calendrier mensuel quasi plein écran (carte 1250×690 à 15 px des bords) : grille 7×6 lundi-en-tête, navigation ◀ / ▶ entre les mois et bouton « Aujourd'hui ». La grille elle-même — numéros, alignement lundi-dimanche, weekend estompé, aujourd'hui (bordure cyane) et jours passés grisés — est calculée en local depuis l'horloge SNTP (cal_render_month(), algorithme de Sakamoto) : le calendrier reste utilisable même HA hors ligne.
Home Assistant enrichit ensuite chaque mois consulté à la demande (script.tab5_calendrier_mois → tab5_maj_calendrier_mois, cache par mois vidé à l'ouverture) :
- heures de travail imprimées dans les cases (« 09:30-20:15 », en rose si l'embauche est avant 9 h — même convention que le bandeau planning central), depuis l'agenda de travail (les événements dont le titre contient le mot de « Tab5 · mot des événements de travail », ou tous)
- jours fériés — numéro en rose (liste blanche des vrais fériés français ; les fêtes civiles type Fête des Mères n'apparaissent que dans le détail du jour)
- vacances scolaires — fond de case violet doux, depuis l'agenda choisi dans « Tab5 · agenda des vacances scolaires » (en France, le fichier ICS du ministère pour votre zone ; jusqu'au 29/09/2026, une table fixe de la zone A)
- RDV (pastille dorée) et anniversaires (pastille rose) depuis les calendriers famille/anniversaires
Taper un jour ouvre un sous-popup détail 780×540 (script.tab5_calendrier_jour) : titre « Mardi 21 Juillet » et jusqu'à 6 lignes typées avec icônes MDI colorées — nom du férié, libellé des vacances scolaires, horaires de travail, RDV horodatés, anniversaires, fêtes civiles — avec les états « Chargement... », « Rien de prévu ce jour » et « Home Assistant hors ligne ». La fermeture suit la recette popups v2 (croix = boutons de verre partagés 80×44, scrollable: false partout). Composants : calendar_popup.yaml + cal_grid_build() (42 cellules construites en C++) + package HA HomeAssistant_Config/packages/tab5_calendar.yaml.

Réveil — appui long sur l'heure¶
Un appui long sur l'heure, heures ou minutes (btn_horloge_heures, btn_horloge_minutes, « auto »), ouvre les réglages du réveil (carte modale 1250×690) ; l'appui long sur la date ouvre le calendrier. Jusqu'au 09/10/2026, un tap court sur l'horloge l'ouvrait. Une petite cloche dans la barre d'état du haut donne l'état d'un coup d'œil : verte = armé avec une sonnerie calculée, ambre = armé mais aucun jour retenu (le piège classique du mode « jours travaillés » pendant une semaine de congés), barrée et éteinte = réveil coupé.
Le réveil sonne sans Home Assistant. L'heure vient de SNTP, les horaires de travail des 15 prochains jours sont déjà en cache dans l'appareil (cal_jours_data[], poussés toutes les 10 min), et la sonnerie est une mélodie RTTTL synthétisée sur place — un sinus pur, pas un fichier. HA n'ajoute que du confort : le briefing parlé, les rappels de rendez-vous, et une URL de sonnerie personnalisée en option (avec repli automatique et silencieux sur la mélodie locale si HA ne répond pas).
Trois modes, parce que « se baser sur le calendrier » veut dire deux choses différentes selon les jours :
| Mode | Quand ça sonne |
|---|---|
| Fixe | À l'heure réglée, les jours de la semaine cochés |
| Travail | La même heure, mais seulement quand le calendrier annonce du travail |
| Ouverture | L'heure est dérivée de l'embauche : début du service − un délai réglable, borné par « jamais avant » / « jamais après » |
L'heure de fermeture sert aussi, via le réglage « repos mini » : après une fermeture à 21:00, un repos de 9 h interdit de sonner avant 06:00 — borné par « jamais après », le repos ne peut donc jamais faire arriver en retard. Le sélecteur de jours ne gouverne QUE l'heure fixe : une journée pilotée par le calendrier sonne quel que soit le jour de la semaine, sinon décocher le samedi ferait rater une embauche du samedi matin.
Arrêt à la voix ou au toucher. Toucher n'importe où sur l'écran de sonnerie arrête le réveil ; « Répéter » reste un bouton distinct. Côté voix, le modèle microWakeWord « Stop » était déjà embarqué (il ne servait qu'à arrêter le volet) : il est armé pendant la sonnerie, et n'importe quel mot de réveil coupe l'alarme. Le moteur de mots de réveil est démarré même si « Ok Nabu » est désactivé — sinon la promesse ne tiendrait pas pour qui coupe le micro la nuit. Chaque passage de mélodie est suivi de 2,5 s de silence : c'est la fenêtre où le micro a une chance d'entendre quelque chose.
Autres réglages : 4 mélodies (un tap en choisit une et la joue), un volume dédié au réveil (indépendant du volume système), volume progressif, durée de répétition, durée maximale de sonnerie, et un briefing parlé au réveil (heure, horaires du jour, prochain rendez-vous, température).
Cinq pages depuis le 09/10/2026, comme les réglages : Heure (l'heure fixe sur deux rouleaux lv_roller, la bascule marche / arrêt, la prochaine sonnerie, Tester), Jours (le mode, les jours de l'heure fixe avec quatre préréglages, les jours de repos), Ouverture (délai, pas avant, pas après, repos mini sur quatre rouleaux, et une phrase qui les résume), Sonnerie (mélodie, volume, volume progressif, répétition et durée max) et Annonces (annonce parlée, annonce des rendez-vous et son avance, prochain rendez-vous). Une page se choisit par son nom à côté du titre ou d'un glissé sur la fenêtre, en boucle, sans animation ; le glissé et la couleur du nom affiché viennent de la brique commune des popups à pages (Tab5/ecran/tab5_pages.cpp, ADR-0046), qui ignore un glissé parti d'un rouleau. Chaque valeur se règle sur un rouleau (ui_components/rouleau.yaml) : la liste des valeurs et le calcul index ↔ valeur sont du C++ pur (rouleau_*() dans Tab5/socle/tab5_core.cpp, testés sur PC), et une valeur réglée autrement dans Home Assistant (une minute hors des multiples de 5) s'insère à sa place. La roue d'actions des tuiles (ADR-0036) n'est pas utilisée ici : son premier anneau ne porte que des icônes, et les rouleaux montrent déjà toutes les valeurs. Le popup n'écrit que les entités du réveil : rien ne change pour Home Assistant.
Annonce des rendez-vous, N minutes avant (0–120, réglable). HA pousse la liste des rendez-vous horodatés toutes les 5 minutes ; c'est le firmware qui tient le compte à rebours, donc une coupure HA entre la poussée et l'échéance ne fait rien rater. Composants : alarm_popup.yaml + alarm_ring_overlay.yaml + Tab5/paquets/tab5-alarm.yaml + Tab5/socle/alarm_clock.h/.cpp + package HA HomeAssistant_Config/packages/tab5_reveil.yaml.
Assistant vocal¶
L'icône microphone sur l'écran d'accueil est l'interface visuelle de l'assistant vocal ; sa couleur suit l'état du pipeline (assist_set_pipeline_state()) : veille (mot de réveil coupé), repos, écoute, traitement (STT + intention), synthèse (TTS), erreur. Les couleurs, le bouton du mot de réveil, les deux boutons de mode (agent de conversation de Home Assistant, ou pipeline de discussion basé sur un LLM) et le tap et l'appui long du micro : notice, voix.
Quand la liste « Tab5 · pipeline de discussion » vaut « Aucun » (pas de pipeline de discussion), les deux boutons de mode (accueil et popup assistant) disparaissent et la tablette reste en mode Home Assistant (zone discussion, installation).
Le mode est sauvegardé entre les redémarrages via l'entité HA select (select.m5stack_tab5_home_assistant_hmi_assistant).
Second wake word local — « Stop » : un second modèle microWakeWord (Stop) n'est armé que pendant que le volet est en mouvement (globale volet_en_mouvement) et désarmé dès l'arrêt. Dire « Stop » arrête alors le volet directement depuis l'appareil (script.tab5_volet_action) — sans « Okay Nabu », sans aller-retour pipeline.
Interrompre une réponse : taper l'icône micro pendant que l'assistant parle (bleu) coupe la réponse en cours (arrêt du pipeline, que Home Assistant suit, + le haut-parleur) et relance immédiatement l'écoute (tab5_vocal_interrupt_and_listen) — le moyen fiable d'écourter une longue réponse Discussion, le wake word étant inactif pendant la phase de réponse du pipeline.
Popup assistant (appui long sur le micro, btn_assist_trigger ; ses boutons : notice). En mode Discussion, une demande vocale l'ouvre seule (on_stt_end → tab5_assist_on_request) ; en mode Domotique, le bandeau de 8 s de la carte centrale reste le retour rapide. La réponse est rendue depuis du Markdown (tableaux ré-alignés approximativement — police proportionnelle depuis le 26/09/2026 —, gras, code, puces), plus une image téléchargée à la demande (online_image, PNG → RGB565, 760×360). Le moteur peut pousser une réponse riche par le service tab5_assist_reponse (variables texte = Markdown, image_url = PNG optionnel).

Page Système des réglages (ancienne console)¶
La quatrième page du popup Réglages depuis le 08/10/2026 (console_sys.yaml, un popup à part avant). Elle s'ouvre directement par un appui long sur le bouton engrenage (btn_control_console, en haut à droite de la zone d'accueil ; un tap ouvre la page Écran) ou par « Aller à l'écran → Console système » — l'option garde son nom pour Home Assistant et le blueprint. Ses rafraîchissements ne tournent que pendant que la page est montrée (reglages_page_visible(REGLAGES_PAGE_SYSTEME)). Quatre cartes de verre :
- MÉMOIRE — barres SRAM/PSRAM, bloc max, taille flash
- RÉSEAU — SSID Wi-Fi, IP, signal, et état de la connexion HA (lbl_sys_ha_val, vert/rouge)
- SYSTÈME — uptime, température CPU, charge CPU de chaque cœur (cœur 0 · cœur 1, mesurée toutes les 2 s pendant que la page est montrée), temps de boucle, batterie de la tablette (niveau et tension avec l'icône du bandeau, niveau et puissance consommée sur batterie depuis la prochaine version, « Sur USB » sans batterie détectée, « Non montée » interrupteur « Tab5 Batterie montée » éteint ; 06/10/2026, discussion #278), plus le slider volume avec % affiché en direct
- GESTION — boutons de gestion HA : « MAJ Écran » (réarme le flag de push et redéclenche l'automation de push écran — le remède direct à l'incident récurrent d'écran figé), « Recharger autos » (automation.reload), « Redémarrer HA » et « Reboot tablette » — les deux derniers derrière des overlays Annuler/Confirmer (fini l'armement invisible par double-tap) — en grille 2 × 2 depuis que la rangée du thème est passée dans le popup Réglages (06/10/2026)
Ce n'est pas un visualiseur de logs (utiliser tools/tab5_logs.py pour les payloads et événements). Voir docs/debugging.md pour plus de détails sur son usage en debug.

Popup Réglages¶
Ouvert sur sa page Écran d'un tap sur le bouton engrenage (btn_control_console, en haut à droite) ou par « Aller à l'écran → Réglages », sur sa page Système par un appui long sur l'engrenage ou par « Aller à l'écran → Console système » (reglages_popup.yaml, le chrome modal partagé de l'ADR-0009 ; scripts dans tab5-reglages.yaml, peinture dans tab5_reglages.cpp). Quatre pages depuis le 08/10/2026, nommées en haut à côté du titre, la page montrée allumée (reglages_onglet.yaml). Une tape sur un nom montre sa page ; glisser à gauche ou à droite dans le popup montre la suivante ou la précédente, en boucle, sans transition. Le popup prend le geste (LV_EVENT_GESTURE, sans remontée à page_main : l'accueil ne change pas de page derrière) ; un glissement parti d'un curseur ne bouge que le curseur, et la tape au bout d'un glissement ne choisit rien (ui_appui_glisse()). Changer de page ou fermer le popup annule une confirmation ouverte.
- ÉCRAN — un curseur de luminosité (10-100 %, il écrit lui-même le rétroéclairage), le délai d'extinction auto (Jamais, 1, 2, 5, 10, 30 min), et Oui / Non pour rallumer l'écran à « Okay Nabu » et d'une tape ;
- APPARENCE — le thème entre deux flèches (précédent / suivant, en boucle), Sombre / Clair / Auto, Oui / Non pour l'interrupteur de nuit du mode Auto, les animations (Complètes, Essentielles : seule la carte du centre tourne, Aucune : tout est instantané ; l'économie d'énergie active impose Aucune, ADR-0045), et les sept langues, chacune écrite dans sa langue. Une langue demande d'abord (Annuler / Confirmer) : la tablette redémarre pour l'appliquer ;
- BATTERIE — à gauche les réglages de la batterie : la limite de charge (100 % / 80 % : à 80 %, la charge s'arrête à 80 % et reprend à 70 %, pour une tablette toujours branchée) et le mode de charge (Classique / Rapide : la charge rapide du chargeur, seulement chargeur allumé) côte à côte, l'économie d'énergie (Jamais, Sur batterie, Toujours), le Wi-Fi éco (Jamais, Sur batterie, Toujours : l'économie légère du Wi-Fi, jamais pendant la voix, un son ou une mise à jour ; ADR-0045) et Oui / Non pour « batterie montée » ; à droite, en lecture seule, l'état (Sur batterie, En charge, Sur USB, Pas de batterie détectée, ou Mesure en cours avant la première lecture), le niveau, la tension et la consommation (« -- » sans batterie). Ces valeurs ne sont repeintes que pendant que la page est montrée (reglages_batterie_peindre()) ;
- SYSTÈME — l'ancienne console système, décrite plus haut.
Chaque bouton écrit l'entité de l'appareil que voit Home Assistant (tab5_reglages_choisir), et chacune de ces entités repeint le popup quand elle change (tab5_reglages_sync_ui, lancé depuis son on_value / on_state) : un changement fait depuis Home Assistant s'affiche aussitôt, et l'option en vigueur a une bordure d'accent. Le curseur de luminosité est relu à l'ouverture du popup. Les mêmes réglages dans Home Assistant : réglages de la tablette.
Popup Lumières — une page par pièce¶
Un appui long sur une tuile lumière — ses épaules météo ou sa carte du mode HA — (au lieu du tap court qui la bascule), puis Détails sur la roue d'actions rapides (voir plus haut ; une lumière à l'option k l'ouvre tout de suite), ouvre un modal quasi plein écran (carte 1250×690, 15 px des bords) sur la pièce de cette lumière, cette lumière choisie. « Aller à l'écran » → Lumières (ou la roue de navigation, ou un geste de l'accueil réglé dessus) l'ouvre sur la pièce affichée à l'accueil, ou la première qui a des lumières. Depuis le 09/10/2026 (ADR-0046), le popup montre toutes les lumières de la maison, une page par pièce qui en a :
- Noms des pièces en haut, sur la ligne du titre à côté de la × (pages_onglet.yaml) : la pièce affichée est dans la couleur d'accent ; toucher un nom, ou glisser à gauche / à droite n'importe où sur le popup (sauf sur l'arc), change de pièce. Une maison dont toutes les lumières sont dans une pièce n'a ni noms ni glissement.
- AMPOULES (gauche) : les lumières de la pièce (5 au plus, dans l'ordre des tuiles, piece_ligne.yaml), chacune dessinée comme sa carte du mode HA par tuile_peindre_ligne() — icône dans une pastille ronde de la couleur de son état, nom, état. La lumière choisie est encadrée en couleur d'accent ; un tap sur une ligne la choisit. Un tap sur la pastille ronde refait le toucher de la tuile (bascule, avec la confirmation de l'option k), un appui long sur une ligne ouvre la roue d'actions rapides de la tuile autour de sa pastille (tuile_appui_maison()). Tout éteindre : toutes les lumières de la pièce affichée (pR / eteindre ; en mode héritage, les trois lumières 3.x). L'ancien bouton On/Off disparaît : la pastille le fait, pour chaque ligne.
- LUMINOSITÉ (centre) : arc 320 px (0–255) avec la valeur % affichée en direct au centre — synchronisée depuis l'attribut brightness HA à l'ouverture et en live (jamais pendant un drag), débouncée 200 ms pour qu'un glissement n'envoie qu'un seul light.turn_on — plus 4 raccourcis 10/35/65/100 %
- COULEURS (droite) : 3 blancs nommés (Chaud/Crème/Froid) et une grille 4×3 de 12 pastilles rondes (chaque pastille envoie light.turn_on avec le color_name correspondant, factorisées via light_color_preset_btn.yaml)
- Taper l'overlay sombre ou le bouton × (le bouton de verre partagé 80×44 de modal_header.yaml) ferme le modal
L'arc et les couleurs commandent la lumière choisie : popup_lumiere_choisir() (tab5_tuiles_popups.cpp) règle la globale current_light_slot sur la clé de la tuile (tRT, ou lumiere_N en mode héritage) et synchronise les lignes et l'arc. Les pages viennent de la brique commune des popups à pages (tab5_pages.cpp, aussi celle du popup Réglages).

Popup télécommande TV¶
Une télécommande quasi plein écran (tv_remote_popup.yaml, carte 1250×690 — les tokens modaux partagés de l'ADR-0009, 15 px des bords) : touches marche, source et menu, pad de navigation rond avec OK, colonne du volume avec muet, touches Lecture · Pause · Retour · Accueil et une rangée de boutons d'applications (Netflix, Prime, YouTube, CANAL+, PC). Ouverte par appui long sur une tuile multimédia avec l'option TV (t ; la carte PC en mode héritage) ou par un appui long sur le bouton manette (btn_control_tv, quand la zone TV est présente) ; chaque touche émet un événement tab5_action (ADR-0025) que l'automatisation du blueprint envoie à la télécommande de la page (remote.send_command), les boutons d'applications par script.tab5_tv_app (tab5_tv.yaml) — le Tab5 n'a aucun matériel IR, ce sont les intégrations de HA qui font le travail. Taper l'overlay sombre ferme le popup. Plusieurs télécommandes depuis le 10/10/2026 (ADR-0056, tab5_telecommande.cpp) : jusqu'à quatre, celle de la TV puis « Autres télécommandes » du blueprint, poussées avec tous les états (clé telecommandes de tab5_maj_emplacements) ; une page chacune, leurs noms en haut et le glissement commun (ADR-0046) ; l'emplacement de l'événement est la page (tv, tv1, tv2, tv3). Les touches gardent les codes Samsung ; pour un boîtier de l'intégration Apple TV (Apple TV, Freebox Player), le blueprint les traduit (select, menu, top_menu, play_pause…), le popup montre Stop à la place de Source, pas de muet, et une rangée de lecture (Précédent, Reculer, Lecture / Pause, Avancer, Suivant) à la place des applications.

Popup Énergie — installation solaire (facultatif)¶
N'apparaît que si des capteurs sont choisis dans les sections « Énergie » du blueprint (ADR-0028). S'ouvre d'un toucher sur une tuile capteur de ces sections (option de tuile e ; le capteur solaire prend l'icône du panneau solaire), d'un appui long sur le bouton HA quand la production solaire est reçue, ou par « Aller à l'écran → Énergie ». Même chrome modal que les autres popups (energie_popup.yaml, ADR-0009), dessiné par tab5_energie.cpp :
- En haut, en direct : jusqu'à quatre cartes de verre — Solaire (puissance, production « Aujourd'hui »), Maison (consommation), Réseau (puissance, « Depuis le réseau » / « Vers le réseau » / « Aucun échange »), Batterie (niveau avec une icône de batterie qui le suit, « Charge » / « Décharge » / « Au repos », température). Une carte sans capteur disparaît et les autres se partagent la largeur. Unités courtes (W, kW, kWh).
- En bas, l'historique (il faut le capteur d'énergie produite) : le titre donne la période et son total (« Aujourd'hui · 3.20 kWh »), trois boutons passent des Heures (24 barres, aujourd'hui) aux Jours (30 jours) et aux Mois (12 mois). Barres dorées, le créneau en cours dans la couleur d'accent, une ligne au maximum avec sa valeur. Sans ce capteur, les cartes remplissent le popup.
- Avant la réponse de Home Assistant : « En attente de Home Assistant » ; section vide : « Aucun capteur d'énergie choisi ».
HA ne pousse que pendant que le popup est ouvert (package tab5_energie.yaml) ; transitions instantanées, comme tous les popups.

Popup Température — historique et prévision¶
S'ouvre par un appui long sur l'une des deux températures de l'accueil (ADR-0032) : celle de la pièce (emplacement salon) ou la seconde (emplacement serre, une serre ou dehors). Un tap sur la seconde passe la zone à gauche de l'horloge à son contenu suivant (ADR-0051). En mode HA sur une pièce dont le blueprint déclare la température (ADR-0040), celle de gauche est la sienne (p0 à p4), sans prévision — et celle de droite aussi quand elle montre l'humidité de la pièce (ADR-0047).
- En haut : Maintenant (et la moyenne de la période), Minimum et Maximum avec leur moment, chacun dans la couleur de température de l'écran. Pour la seconde température, une quatrième carte : la température prévue la plus haute, la plus basse dessous.
- En bas : le titre donne le lieu (la pièce du capteur, poussée par HA) et la période ; trois boutons passent de 24 h (heure par heure) à 7 jours (toutes les trois heures) et 30 jours (jour par jour). La ligne d'accent est la moyenne de chaque créneau, finie sur la valeur actuelle (un point) ; une barre pâle derrière elle va du minimum au maximum. Graduations tous les 1, 2, 5, 10… degrés, axe des temps toutes les 3 h, 6 h, un jour…
- Prévision (seconde température seulement) : une ligne or sur un fond teinté après le trait « Maintenant », avec les barres mini-maxi or d'une prévision par jour. La case du blueprint « La seconde température est dehors » lui fait prolonger la courbe (« Prévu ») ; décochée, c'est la prévision de dehors à côté d'une serre (« Dehors, prévu »).
- Humidité (ADR-0047) : quand l'emplacement a une sonde d'humidité (celle du salon, ou celle de la pièce), une seconde ligne dans la couleur de l'humidité (
HUMIDITY_WET, l'accent secondaire quand l'accent d'un thème est du même bleu) sur le même graphique, son échelle en % à droite sur les mêmes lignes de grille, les degrés passant alors en couleur d'accent ; légende « Température », « Minimum et maximum », « Humidité » ; la quatrième carte montre l'humidité du moment (dans sa couleur de l'accueil) et sa plage. Sans sonde d'humidité, le popup ne change pas. - Pages (ADR-0047) : un onglet par température connue à côté du titre (
salon, chaquepRà température déclarée,serre; aucun avec une seule), celui montré en couleur d'accent comme les pages des Réglages ; un toucher ou un glissement à gauche ou à droite (le geste s'arrête au popup) montre la suivante, à la même vue, tout de suite d'après ce que la tablette garde, puis la réponse de HA. - Avant que Home Assistant réponde : « En attente de Home Assistant » ; capteur sans statistiques : « Aucun historique ».
HA pousse une fois par demande, seulement popup ouvert (package tab5_historique.yaml, statistiques du recorder et weather.get_forecasts) ; la tablette garde en PSRAM les trois vues de chaque température déjà montrée (~40 Ko), rien en NVS.
Popup Maison — toutes les pièces d'un coup¶
Ouvert par un tap sur le nom de la pièce en mode HA, ou par « Aller à l'écran → Maison » (ADR-0037, discussion #278). Chrome partagé (ADR-0009), carte de 1250 × 690, titre « Maison ».
- Une colonne par pièce du blueprint qui a des appareils, pièce 1 → 5 (l'ordre du blueprint, pas celui des pages), largeur (1250 − 24 − 12 (n − 1)) / n : environ 235 px avec cinq pièces, 607 px avec deux. En-tête : le nom de la pièce, ou « Pièce n » ; « Aucun appareil » sans aucune pièce.
- Une ligne par appareil (104 px, carte de verre) : l'icône de la palette (32 px) dans une pastille de 56 px de la couleur de son état, le nom et la ligne d'état, peints par la même
Vueque la carte du mode HA (tuile_peindre_ligne()), coupés avec « … » à la largeur de la colonne. - Gestes de la tuile : le tap, l'appui long et le bouton « ⋯ » (36 px, seulement sur les types qui ont un appui long : ni
cap, nibin, ni une tuile à l'optionr) passent partuile_appui_piece(); l'appui long et « ⋯ » ouvrent d'abord la roue d'actions rapides de la tuile (voir plus haut, sans son lien Maison) autour de la pastille de la ligne, devant le popup Maison, et sans roue le popup de la tuile. Un popup ouvert depuis une ligne ou par le « Détails » de la roue passe devant le popup Maison, qui reste derrière ; l'inactivité ferme les deux. - « Éteindre les lumières » dans la barre de titre, visible quand une pièce a une tuile
lum: le « Tout éteindre » du popup lumière (pR/eteindre) pour chacune de ces pièces, sans confirmation.
Rien de nouveau avec Home Assistant : ni événement, ni action, ni entrée de blueprint. Les widgets sont des gabarits YAML (maison_popup.yaml, 5 en-têtes, 25 lignes), disposés et peints à chaque ouverture et repeints, tant qu'il est affiché, quand un état ou les définitions changent.
Popup Météo — les prévisions en graphiques¶
Ouvert par « Aller à l'écran → Météo », un geste de l'accueil (code meteo, ADR-0039) ou un appui long sur le corps d'une tuile de prévision qui ne porte pas d'appareil (ADR-0043, tab5_meteo.cpp, ui_components/meteo_popup.yaml). Chrome partagé (ADR-0009), titre « Météo » ; trois pages nommées à côté du titre (reglages_onglet.yaml, l'accent sur la page affichée), changées par un tap sur un nom ou un glissé gauche / droite dans le popup, en boucle, sans animation — la brique commune des popups à pages (pages_brancher(), choix_peindre(), ADR-0046).
- « Aujourd'hui » : une carte « Maintenant » (150 px) : l'icône météo (police de 120 px), la température dans sa couleur (
roboto_55_b), la condition en mots, « Minimum … · Maximum … » du jour, et à droite « Pluie sur N h » avec le total en mm (« Aucune » s'il fait sec). Dessous (432 px), jusqu'à 15 heures decal_heures_data: heures, icônes à 40 % (font_meteo_48/_32), courbe lissée monotone (lv_line, couleur de la température moyenne), points de 12 px et valeurs à la couleur de la température (4 °C d'écart au moins), barres de pluie sur un pied commun (échelle de 2 mm au moins, couleurs des niveaux de pluie) avec leurs mm. L'heure en cours a une colonne d'accent à 10 % et un libellé d'accent ; la première heure après minuit s'appelle « Demain », après un trait fin. - « 10 jours » : dix lignes de 58 px à partir d'aujourd'hui (
cal_index_for_offset()) : « Aujourd'hui » (couleur info), « Demain », puis le libellé court du jour ; icône ; minimum et maximum dans leurs couleurs ; une piste de 10 px avec une barre en dégradé horizontal du minimum au maximum sur l'échelle commune des dix jours (température du moment comprise), et un point pour la température du moment sur la ligne d'aujourd'hui. - « Détails » : « Pluie dans l'heure » avec la phrase de la carte centrale dans la couleur de son niveau, les neuf barres à l'échelle du temps (0-30 min par 5, puis par 10 min), hauteur = niveau, devant quatre lignes de niveau pointillées (« Faible » à « Très forte »), axe « Maintenant », 15, 30, 45, 60 min ; une barre sèche est un trait de 4 px. Puis quatre cartes de 288 × 210 : humidité (couleur de
get_humidity_color(), air sec / confortable / humide), indice UV (niveau de l'OMS : faible, modéré, élevé, très élevé, extrême, en couleur), probabilités de gel et de neige.
Rien de nouveau avec Home Assistant : les prévisions horaires et journalières, les barres et la phrase de pluie que reçoit déjà l'accueil, plus des champs de tab5_maj_meteo_actuelle et tab5_maj_probabilites jusque-là réservés. packages/tab5_push.yaml renvoie le troisième bloc horaire (heures 10-14). Les widgets des tracés sont créés une fois, à la première ouverture ; repeints à l'ouverture, au changement de page, à chaque poussée s'il est affiché et au changement de thème.
Popup Caméras — une image fixe de chaque caméra¶
Ouvert par « Agenda ▸ Caméras » de la roue de navigation, « Aller à l'écran → Caméras » (Home Assistant peut donc l'ouvrir, depuis une automatisation de sonnette par exemple) ou un geste de l'accueil (code cameras, ADR-0039) (ADR-0049, tab5_cameras.cpp, ui_components/cameras_popup.yaml, discussion #278). Chrome partagé (ADR-0009), titre « Caméras », icône d'en-tête cctv. Les caméras choisies dans la section « Caméras · Cameras » du blueprint (seize au plus, dans son ordre), en mosaïque à partir de deux caméras, ou une caméra en grand ; un glissé gauche / droite change de page (pages_brancher(), ADR-0046), en boucle ; les pastilles de pagination de l'accueil dessous à partir de deux pages.
- Pièces (ADR-0057) : le blueprint envoie la pièce de chaque caméra dans Home Assistant. À partir de deux pièces, une colonne de 238 px à gauche (
cameras_puce.yaml) : « Toutes », une puce par pièce avec son nombre de caméras, « Autres » pour les caméras sans pièce ; celle choisie en couleur d'accent, défilante au-delà de huit. Un tap filtre : le glissé et les pastilles ne parcourent plus que les caméras de cette pièce. Pièce et caméra gardées en NVS. Avec une seule pièce, pas de colonne. - Mosaïque (ADR-0057, lot 2) : le cadre partagé en quatre cases de 476 × 266 (
cameras_vignette.yaml), quatre caméras par page (deux côte à côte au milieu, trois avec la troisième centrée en bas) ; chaque case montre le nom de la caméra dans une pastille de verre et sa petite image (demandée à 480 × 270, recadrée sans mise à l'échelle quand elle tient presque, réduite pour couvrir la case sinon). Sous le cadre : la pièce (« Toutes les caméras ») et « Touchez une image pour l'agrandir ». Un tap sur une case montre cette caméra en grand ; un tap sur l'image en grand revient à la mosaïque. La vue est gardée en NVS avec la pièce et la caméra. - En grand : un cadre de verre de 964 × 544 avec l'image (960 × 540 au plus) — centré, ou contre le bord droit quand la colonne est là —, « Pièce · Caméra » dessous à gauche et « Image de 14:32:05 » à droite ; le glissé passe d'une caméra de la pièce à l'autre.
- Pas de vidéo, une image à la fois : les images sont téléchargées et décodées en arrière-plan (une tâche à part et le décodeur JPEG matériel de l'ESP32-P4, RGB565 en PSRAM, à la taille de l'image : plus grande, elle est montrée réduite ; plus petite, elle n'est pas agrandie), seulement tant que le popup est ouvert : en grand, la caméra montrée toutes les 5 s et ses voisines de la pièce une fois entre deux ; en mosaïque, les cases de la page l'une après l'autre, chacune toutes les 10 s. La dernière image de chaque caméra, grande et petite, reste tant que le popup est ouvert (8 Mio au plus) : revenir sur une caméra la montre tout de suite. Fermé, les images sont libérées et plus rien n'est téléchargé.
- Hors ligne : une caméra que Home Assistant dit
unavailablen'est pas demandée ; « Hors ligne depuis 14:32 » dans le cadre, sur sa dernière image atténuée à 40 % s'il y en a une. Deux échecs de suite disent la même chose ; chaque caméra attend 10 s, 30 s puis 60 s après ses échecs sans retenir les autres. - L'URL est l'
entity_picturede la caméra (/api/camera_proxy/…?token=…) avecwidth=960&height=540, pour que Home Assistant réduise un JPEG plus grand avant de l'envoyer. Le jeton tourne toutes les 5 minutes : la tablette redemande la liste (esphome.tab5_cameras) à l'ouverture, toutes les 4 minutes tant qu'il reste ouvert et après une image en échec ; le blueprint répond partab5_maj_cameras. - Messages à la place de l'image : « En attente de Home Assistant », « Aucune caméra choisie », « Chargement... », « Image indisponible », « Adresse de Home Assistant inconnue » ; « Plus d'image depuis 14:32:05 » sous une image gardée quand les suivantes échouent.
L'écran et le tactile continuent de répondre pendant qu'une image arrive (depuis le 10/10/2026 : avant, chaque image les figeait environ 2 s). Une caméra hors ligne affiche « Image indisponible », ou la dernière image avec « Plus d'image depuis … ».
Popup Suivi — capteurs suivis¶
Ouvert par un tap sur le capteur suivi à gauche de l'horloge, « Aller à l'écran → Suivi » ou un geste de l'accueil (code suivi, ADR-0039) (ADR-0054, tab5_suivi.cpp, ui_components/suivi_popup.yaml). Chrome partagé (ADR-0009), icône chart-line, titre « Suivi ». Une carte de verre par capteur choisi dans « Tab5 · capteurs suivis » (six au plus, suivi_carte.yaml) : une rangée jusqu'à trois capteurs, deux rangées au-delà (deux colonnes pour quatre), la dernière rangée centrée, dans le corps du popup. Chaque carte : le nom (accent, coupé par « … »), la valeur dans la police de la date avec son unité, une flèche de tendance et la variation en SUCCESS à la hausse / ERROR à la baisse / TEXT_DIM stable, la période (« Aujourd'hui » pour un change_pct en %, « 24 h » pour un écart dans l'unité du capteur), et la courbe des 24 h (ui_courbe_lisse(), lv_line, son dernier point cerclé de la couleur du fond). Avant toute poussée : « En attente de Home Assistant » ; liste vide : « Aucun capteur suivi » et où les choisir.
Poussé par packages/tab5_suivi.yaml (tab5_maj_suivi : 24 moyennes horaires des statistiques du recorder et la valeur actuelle, ramenées de 0 à 100), tout de suite à un changement puis au plus toutes les cinq minutes, quand la liste change, à la connexion, à « MAJ Écran », au démarrage de HA et toutes les heures. Repeint à l'ouverture, à chaque poussée s'il est affiché et au changement de thème.
Popup Frigos et congélateurs — normes sanitaires¶
Ouvert par un tap sur l'icône qui clignote dans le coin de l'horloge, « Agenda ▸ Frigos » de la roue de navigation, « Aller à l'écran → Froid » ou un geste de l'accueil (code froid, ADR-0039) (ADR-0055, tab5_froid.cpp, ui_components/froid_popup.yaml). Chrome partagé (ADR-0009), icône fridge, titre « Frigos et congélateurs ». Une carte de verre par appareil déclaré dans « Tab5 · réfrigérateurs » et « Tab5 · congélateurs » (quatre au plus en tout, froid_carte.yaml) : une rangée pour un ou deux, deux rangées de deux au-delà, la dernière rangée centrée. Chaque carte : une icône réfrigérateur ou flocon (accent), le nom (coupé par « … »), la température dans la police de la date en SUCCESS dans la norme / WARNING attention / ERROR grave, le statut (« Conforme », « Trop chaud depuis 14 h 32 », « Porte ouverte ? », « Porte mal fermée », « Capteur muet »…), la plus basse et la plus haute des 24 h et la norme, la courbe des 24 h (ui_courbe_lisse(), accent) entre les pointillés de la norme (WARNING), et le dernier incident (cause, début, durée, extrême). Avant toute poussée : « En attente de Home Assistant » ; sans appareil : « Aucun appareil déclaré » et où les déclarer.
Home Assistant décide des niveaux (packages/tab5_froid.yaml, seuils à un seul endroit) et les pousse par tab5_maj_froid : tout de suite à un changement puis au plus toutes les minutes, toutes les cinq minutes, quand une liste change, à la connexion, à « MAJ Écran » et au démarrage de HA. Chaque problème est aussi une alerte de la carte centrale (Orange / Rouge, source « froid »). Repeint à l'ouverture, à chaque poussée s'il est affiché et au changement de thème.
Popup Serveur IA — un serveur de LLM local¶
Ouvert par « Agenda ▸ Serveur IA » de la roue de navigation (une fois qu'Home Assistant a poussé un serveur), « Aller à l'écran → Serveur IA » ou un geste de l'accueil (code serveur_ia, ADR-0039) (ADR-0059, tab5_serveur_ia.cpp, ui_components/serveur_ia_popup.yaml). Chrome partagé (ADR-0009), icône server, titre « Serveur IA ». Un bandeau en haut : une pastille (verte en ligne, grise hors ligne, pâle si l'état est inconnu), l'état, le nom du serveur et le modèle chargé, coupé par « … ». Dessous, à gauche, la carte des tokens par seconde : un grand chiffre, une courbe lissée des 24 dernières poussées (gardée par la tablette, un trou pour une valeur inconnue) et les requêtes en cours et en file. À droite, quatre cartes : VRAM (utilisée, sur le total, % et une barre), GPU (température colorée vert / ambre / rouge selon le niveau que Home Assistant envoie), RAM (% et une barre), Puissance (W). Une valeur que le serveur ne donne pas s'écrit « — », jamais 0 ; sans capteur choisi, le popup dit « Aucun serveur choisi ».
Poussé par packages/tab5_serveur_ia.yaml (tab5_maj_serveur_ia : les capteurs choisis dans les dix listes « Tab5 · serveur IA, … », unités converties et arrondies par Home Assistant, seuils du GPU 80 et 90 °C à un seul endroit) à chaque changement, deux secondes au moins entre deux poussées, et tout de suite quand une liste change, à la connexion, à « MAJ Écran » et au démarrage de HA. Rien n'est peint tant que le popup est fermé ; repeint à l'ouverture, à chaque poussée s'il est affiché et au changement de thème.
Boutons d'action (ADR-0060, ui_components/serveur_ia_action.yaml) : jusqu'à trois dans le bandeau, à droite du modèle — « Décharger » (éjecter), « Réveiller » (marche), « Redémarrer » — chacun montré seulement quand Home Assistant l'offre (14e champ du payload, venu de packages/tab5_llm.yaml), grisé quand il n'a pas de sens maintenant (aucun modèle chargé, serveur déjà en ligne). Décharger et redémarrer demandent un second tap : le bouton passe en orange, « Confirmer ? », pendant 4 s. Réveiller part au premier tap. Une action envoyée affiche « Envoyé » en vert pendant 5 s, sans autre envoi pendant ce temps. La tablette n'émet que esphome.tab5_serveur_ia_action avec le code ; Home Assistant fait le reste.
Coloration sémantique¶
La couleur est utilisée de façon systématique comme canal d'information primaire — pour lire l'état d'un coup d'œil sans lire les labels.
Températures : mappées sur une échelle continue via get_temperature_color() — bleu (froid) → vert (confortable) → orange (chaud) → rouge (très chaud). Appliqué identiquement aux capteurs intérieurs et aux températures des prévisions.
Noms des jours en prévisions journalières (refresh_daily_forecast(), tab5_*.cpp) :
- Cyan — aujourd'hui
- Vert — jour de repos (hors dimanche)
- Ambre — dimanche, repos
- Rose/Rouge — dimanche travaillé, ou tout jour avec une prise de service avant 09:00 ("service tôt")
- Ardoise estompée — jour passé (prend le dessus sur les couleurs précédentes une fois le jour passé)
Humidité des plantes (get_humidity_color()) :
- Rouge — ≤ 14% (très sec, besoin d'arrosage)
- Dégradé vert → blanc cassé — 30–80%
- Bleu — ≥ 80% (trop humide)
Batteries (get_battery_color()) — icônes du téléphone, de la tablette et de la production solaire dans la barre d'état (solaire : panneau gris à 0 %), ligne Batterie du popup détails plantes :
- Vert — au-dessus de 80 %
- Bleu — 41 à 80 %
- Ambre — 20 à 40 %
- Rouge — sous 20 %
- Gris — inconnu
Icône microphone : voir Assistant vocal ci-dessus.
Toutes les couleurs de l'interface vivent dans une palette, struct Palette de tab5_tokens.h (inclus par tab5_custom.h) ; UIColor est la palette active. Le YAML les prend par les styles de rôle de tab5-styles.yaml (style_text_dim…), les jeux gardent leurs palettes sombres (ADR-0029). Vingt et un thèmes, chacun en sombre et en clair, changent les couleurs, les formes (rayons, bordures, ombres) et les polices de l'heure, de la date et des titres ; une tablette neuve démarre en « Relief doux ».

Le thème, le mode (Sombre, Clair, Auto) et l'interrupteur « Nuit (thème auto) » sont des entités de la tablette, aussi dans le popup Réglages : réglages de la tablette.
Contrôle du volet roulant¶
Depuis la 3.2, chaque tuile vol est un volet ou une vanne à elle seule (appui court : arrêter s'il bouge, sinon fermer s'il est ouvert, ouvrir sinon ; l'épaule droite montre la flèche du prochain mouvement).
Popup Volets — une page par pièce (05/10/2026, demandé dans la discussion #278 ; ADR-0023, mises à jour du 05/10/2026 et du 06/10/2026 ; une page par pièce depuis le 09/10/2026, ADR-0046). Un appui long sur une tuile vol — ses épaules météo ou sa carte du mode HA —, puis Détails sur la roue d'actions rapides (07/10/2026, voir plus haut), ouvre un modal quasi plein écran (volet_popup.yaml, chrome partagé de l'ADR-0009) sur la pièce de ce volet, ce volet choisi ; « Aller à l'écran » → Volet (ou Volets dans la roue de navigation) l'ouvre sur la pièce affichée à l'accueil, ou la première qui a des volets. Les noms des pièces en haut marchent comme dans le popup Lumières (toucher ou glisser, sauf sur le volet dessiné ; rien avec une seule pièce). Deux cartes de verre :
- VOLETS (gauche) : les volets de la pièce (5 au plus, piece_ligne.yaml, mêmes lignes et mêmes gestes que les lumières : la pastille refait le toucher de la tuile, l'appui long ouvre sa roue), et Tout ouvrir / Tout fermer pour tous les volets de la page. Une tuile de volet à l'option k ou r n'est pas dans la liste.
- POSITION (droite), du volet choisi : un volet dessiné (06/10/2026, « comme l'animation de HA, pas un simple curseur ») : une fenêtre dont le tablier à lames descend du coffre quand la position baisse (12 lames créées en C++, lames_construire()). On le fait glisser du doigt, vers le haut ou le bas, n'importe où sur la fenêtre : le tablier et le nombre suivent le doigt, et la position ne part qu'au relâcher (position, cover.set_cover_position / valve.set_valve_position sur l'entité de cette tuile, si elle sait en régler une) ; un toucher qui ne bouge pas (moins de 12 px) n'envoie rien. À sa droite, son nom, la position en grand (« 45 % ») et l'état en mots dessous (« Ouvert », « Fermé », « Partiel », « En mouvement », « Hors ligne »), puis Ouvrir, Stop et Fermer, les commandes de la tuile, chaque icône dans une pastille ronde teintée. Un volet qui ne donne pas sa position (ou le volet à course simulée de optionnel/volet_serre_tracking.yaml) ne se fait pas glisser et n'a pas de nombre : le dessin montre son état (ouvert = tablier en haut, fermé = en bas, le reste = à mi-hauteur, lames estompées) et les mots.
- Le popup suit le volet tant qu'il est ouvert (position, état) : chaque position poussée redessine le tablier tout de suite, sans animation à lui (le volet dessiné descend comme le vrai, poussée après poussée), jamais sous le doigt. Avec l'option k, l'appui long envoie toujours l'autre de ouvrir / fermer (confirmé par un second appui) ; option r : rien. En mode héritage, le volet 3.x (tab5_maj_volet_etat) est la tuile 1 de l'accueil : sa carte météo a l'inversion de sens (tap sur le titre) et le bouton d'action (tap sur l'icône) décrits plus haut, et sa carte du mode HA partage le même script.tab5_volet_tap ; il n'est pas dans ce popup.
Popup d'un appareil¶
Appui long sur un interrupteur, une scène ou un lecteur (06/10/2026, demandé dans la discussion #278 : « buttons can have pop up screen like ha dashboard » ; ADR-0023, mise à jour du 06/10/2026). Un appui long sur une tuile int ou act, ou sur une tuile med sans l'option t (avec t, la télécommande TV) — ses épaules météo ou sa carte du mode HA — ouvre la fenêtre « plus d'infos » d'un tableau de bord Home Assistant pour cet appareil : un modal quasi plein écran (appareil_popup.yaml, chrome partagé de l'ADR-0009, inscrit « Appareil ») au nom de la tuile, en deux cartes de verre :
- ÉTAT (gauche) : l'icône de la tuile dans une pastille ronde de la couleur de son état (la couleur à 20 %, l'icône pleine), l'état en mots comme sur la carte du mode HA (« Allumé », « Éteint », « Lecture », « Pause », « Hors ligne » ; « Prêt », ou « En cours » pour un script en route, pour une act), la pièce, et les options de la tuile en mots (o : « Allumer seulement », k : « Confirmer chaque commande »).
- COMMANDE (droite) : un grand interrupteur vertical (180 × 380 px) — rempli en haut dans la couleur de l'état quand l'appareil est allumé, en bas et gris quand il est éteint, plein pour une act — et dessous ce que fera l'appui (« Éteindre », « Allumer », « Lancer »). L'appui fait le toucher de la tuile, par la même fonction (tuile_appui_piece) : même commande (basculer, allumer avec o, lancer), même confirmation avec k (« Confirmer ? » en ambre ; un second appui dans les 3 s envoie), même « OK » après lancer. Aucune commande nouvelle, rien de changé côté Home Assistant.
- Le popup suit sa tuile tant qu'il est ouvert. Option r (lecture seule) : pas de popup, comme pas de toucher. Il ne montre que ce que HA pousse déjà pour les tuiles : ni « dernière modification », ni attributs, ni historique.
Arcade — 8 consoles de jeu (expérimental)¶
Statut : prototypes précoces. Premiers jets générés par IA pour tester les capacités de LVGL + C++ sur ESP32-P4. Fonctionnels mais non finalisés — preuve de concept, pas produit fini.
Ouvert par tap sur le bouton manette (btn_control_tv, en haut à droite) ou « Jeux » dans la roue de navigation. La température de la serre (btn_serre_games) l'ouvrait jusqu'au 10/10/2026 ; son tap change désormais la zone à gauche de l'horloge (ADR-0051). Le sélecteur affiche une grille 4×2 de 8 cartes (298×252 chacune), avec icône MDI, nom du jeu, et description courte.

Chaque console est sa propre page LVGL plein écran 1280×720 (page_marble, page_chess… déclarées skip: true dans tab5-lvgl.yaml, pour que le swipe ne puisse pas y naviguer) — pas un overlay posé sur le dashboard. Exception documentée ADR-0009 : pas de chrome modal. Architecture commune : YAML = conteneurs vides, tout le contenu en C++, lv_timer créé à l'ouverture / détruit à la fermeture, pool LVGL préalloué (zéro allocation dans le tick), persistance NVS, zéro dépendance HA ou réseau.
| # | Console | Description | Contrôles |
|---|---|---|---|
| 1 | Fil d'Or | Roguelite de bille, 6 salles, progression Dark Souls | Inclinaison BMI270 |
| 2 | Arcanoïde | Casse-briques 8 niveaux, power-ups, combo | Inclinaison + tactile |
| 3 | Neon Apron | Flipper néon 3 billes — bascule l'écran en portrait 720×1280 | Zones tactiles + nudge IMU |
| 4 | Coureur d'Or | Lode Runner 10 niveaux, creuser & grimper | D-pad tactile |
| 5 | Go Tab | Go 9×9/13×13/19×19, score chinois (komi 6,5), IA 4 niveaux | Tactile |
| 6 | Trial Poursuite | Quiz 1–6 équipes, roue 42 cases + 6 rayons | Tactile |
| 7 | Dames Tab | Dames 10×10 internationales (option 8×8 anglaises), IA 4 niveaux | Tactile |
| 8 | Roi Noir | Échecs FIDE, 5 niveaux IA, perft validé | Tactile |
| Roi Noir (échecs) | Arcanoïde (casse-briques) |
|---|---|
![]() |
![]() |
| Coureur d'Or (Lode Runner) |
|---|
![]() |
Sortie de chaque jeu : hub → « Quitter » (retour propre à page_arcade puis au dashboard : timer arrêté, score sauvegardé en NVS, et pour Neon Apron restauration de la rotation paysage).
→ Détails techniques complets par jeu : docs/arcade.md








