Vigie sur le M5Stack Tab5
La tablette de 5 pouces en écran d'alerte autonome : la carte du monde des aléas en cours, les cinq plus graves et la météo de vos zones, en 1280 × 720. ESPHome sans Home Assistant : l'écran va chercher ses données lui-même, par le Wi-Fi.

- Écran
- 5", 1280 × 720
- Micrologiciel
- ESPHome 2026.9.1+, LVGL
- Home Assistant
- Pas nécessaire
- Données
- API Vigie, chaque minute
- Statut
- ST7121 testée le 28/10/2026
Vigie ne remplace pas les alertes officielles : suivez toujours les consignes de vos autorités.
Ce que montre l'écran
La mise en page de la Waveshare 7B, agrandie de 20 % pour remplir l'écran plus fin du Tab5 : la barre d'état (lien avec l'API, date et heure de la zone), la carte du monde avec les aléas en points colorés selon leur gravité, les cinq plus graves avec leur distance et leur direction, et le panneau météo de la zone. Un appui sur le panneau passe à la zone suivante.
Le détail de chaque partie, et ce que l'écran fait quand l'API ne répond plus : l'écran d'alerte Vigie.
Les trois versions du Tab5
M5Stack a changé deux fois la puce qui pilote l'écran et le tactile ; chacune se choisit à la compilation.
- ST7121 (depuis le 28/04/2026) : Vigie y tourne depuis le 28/10/2026, Wi-Fi et données de l'API publique en HTTPS.
- ST7123 (du 14/10/2025 au 28/04/2026) : compilée, pas encore lancée sur une tablette avec Vigie.
- ILI9881C (la première, du 09/05/2025 au 14/10/2025) : compilée, jamais lancée.
La puce est écrite au dos de la tablette, au-dessus du logo Espressif ; comment la reconnaître, et les pièges : les versions du Tab5.
La configuration ESPHome, sans Home Assistant
Pas de composant api: : rien ne relie l'écran à Home Assistant. Le Wi-Fi se donne après l'installation (Improv par USB, ou le point d'accès que l'écran ouvre seul), les données arrivent par http_request et LVGL les dessine.
Ci-dessous, un exemple complet et court, sur la même base matérielle que Vigie : il affiche la température et la vigilance météo d'un lieu, lues dans l'API publique de Vigie. Choisissez la puce de votre Tab5 en tête du fichier ; changez la latitude et la longitude, ou l'adresse, pour lire une autre API.
# M5Stack Tab5 avec ESPHome, sans Home Assistant : écran, tactile, Wi-Fi et rétroéclairage,
# et l'écran lit lui-même une API web pour afficher la température et la vigilance météo
# d'un lieu (route /v1/point de l'API publique de Vigie). Broches et réglages du micrologiciel
# Vigie display, qui tourne sur un Tab5 ST7121 ; cet exemple, lui, est compilé avec
# ESPHome 2026.9.1 mais pas essayé tel quel.
substitutions:
# La puce d'écran est écrite au dos du Tab5, au-dessus du logo Espressif :
# ST7123 : M5STACK-TAB5-ST7123, tactile st7123, 100ms
# ST7121 : M5STACK-TAB5-ST7121, tactile st7123, 100ms
# ILI9881C : M5STACK-TAB5, tactile gt911, never
panel_model: M5STACK-TAB5-ST7123
touch_chip: st7123
touch_interval: 100ms
# Le lieu affiché (ici Paris).
latitude: "48.86"
longitude: "2.35"
esphome:
name: tab5-autonome
friendly_name: Tab5 autonome
min_version: 2026.9.0
on_boot:
# Le reset de l'écran passe par un expandeur PI4IOE5V6408, qui demande une seconde
# après le démarrage : sans cette attente, écran noir après un redémarrage logiciel.
# Un delay() en C : le « delay: » d'ESPHome ne retient pas la mise en route de l'écran.
- priority: 700
then:
- lambda: "delay(1000);"
esp32:
board: esp32-p4-evboard
flash_size: 16MB
framework:
type: esp-idf
advanced:
enable_idf_experimental_features: true
execute_from_psram: true
# 32 Mo de PSRAM, où LVGL garde l'image entière (buffer_size: 100 % plus bas).
psram:
mode: hex
speed: 200MHz
# Le Wi-Fi est sur une deuxième puce, un ESP32-C6, reliée en SDIO.
# Son reset est actif à l'état haut : active_high: false donne « sdmmc_card_init failed ».
esp32_hosted:
variant: esp32c6
active_high: true
clk_pin: GPIO12
cmd_pin: GPIO13
d0_pin: GPIO11
d1_pin: GPIO10
d2_pin: GPIO9
d3_pin: GPIO8
reset_pin: GPIO15
slot: 1
sdio_frequency: 20MHz
use_psram: true
# Pas de « api: » : rien ne relie l'écran à Home Assistant. Pas de mot de passe dans le
# fichier : le Wi-Fi se donne après l'installation, par USB (Improv, depuis ESPHome Web) ou
# par le point d'accès « Tab5 reglages » et sa page de réglage.
wifi:
ap:
ssid: "Tab5 reglages"
improv_serial:
captive_portal:
ota:
- platform: esphome
logger:
hardware_uart: USB_SERIAL_JTAG
# Un seul bus I2C pour le tactile, les deux expandeurs et les puces audio.
i2c:
- id: bsp_bus
sda: GPIO31
scl: GPIO32
frequency: 400kHz
pi4ioe5v6408:
- id: pi4ioe1
address: 0x43
- id: pi4ioe2
address: 0x44
# Alimentations derrière les expandeurs. « wifi_power » alimente l'ESP32-C6 : l'expandeur
# démarre éteint, et sans cette ligne le Wi-Fi ne monte jamais (« sdmmc_card_init failed »).
# Le chargeur reste coupé, comme sans batterie.
switch:
- platform: gpio
id: wifi_power
pin:
pi4ioe5v6408: pi4ioe2
number: 0
restore_mode: ALWAYS_ON
- platform: gpio
id: usb_5v_power
pin:
pi4ioe5v6408: pi4ioe2
number: 3
restore_mode: ALWAYS_ON
- platform: gpio
id: external_5v_power
pin:
pi4ioe5v6408: pi4ioe1
number: 2
restore_mode: ALWAYS_ON
- platform: gpio
id: charge_enable
pin:
pi4ioe5v6408: pi4ioe2
number: 7
restore_mode: ALWAYS_OFF
# Alimentation du lien MIPI-DSI de l'écran : LDO 3 à 2,5 V.
esp_ldo:
- voltage: 2.5V
channel: 3
# La dalle est en portrait (720 × 1280) : LVGL la tourne en paysage plus bas.
display:
- id: panel
platform: mipi_dsi
model: ${panel_model}
dimensions:
width: 720
height: 1280
reset_pin:
pi4ioe5v6408: pi4ioe1
number: 4
pixel_mode: 16bit
color_order: RGB
update_interval: never
auto_clear_enabled: false
# Mêmes broches sur les trois versions. Pas de miroir (il abîme l'image d'une ST7121) :
# LVGL tourne les appuis avec l'image.
touchscreen:
- id: touch
platform: ${touch_chip}
update_interval: ${touch_interval}
interrupt_pin: GPIO23
reset_pin:
pi4ioe5v6408: pi4ioe1
number: 5
calibration:
x_min: 0
x_max: 720
y_min: 0
y_max: 1280
output:
- platform: ledc
id: backlight_pwm
pin: GPIO22
frequency: 1000Hz
light:
- platform: monochromatic
id: backlight
name: "Rétroéclairage"
output: backlight_pwm
restore_mode: RESTORE_DEFAULT_ON
# L'écran va chercher ses données lui-même, en HTTPS. verify_ssl: false : le certificat
# du serveur n'est pas vérifié, comme dans Vigie display ; assez pour des données
# publiques, jamais pour un mot de passe.
http_request:
id: web
timeout: 8s
verify_ssl: false
interval:
# /v1/point accepte 10 requêtes par minute et par adresse : une toutes les 5 minutes suffit.
- interval: 5min
startup_delay: 10s
then:
- if:
condition:
wifi.connected:
then:
- http_request.get:
url: "https://vigie.auxfilsdesidees.fr/v1/point?lat=${latitude}&lon=${longitude}"
capture_response: true
max_response_buffer_size: 16384
on_response:
then:
- lambda: |-
if (response->status_code != 200) {
ESP_LOGW("exemple", "HTTP %d", response->status_code);
return;
}
json::parse_json(body, [](JsonObject racine) -> bool {
// Vigilance la plus forte au point : GREEN, YELLOW, ORANGE ou RED.
std::string niveau = racine["local_alert_level"] | "";
const char *texte = "Pas de vigilance";
uint32_t couleur = 0x3FA34D;
if (niveau == "YELLOW") { texte = "Vigilance jaune"; couleur = 0xF2C230; }
if (niveau == "ORANGE") { texte = "Vigilance orange"; couleur = 0xF08A24; }
if (niveau == "RED") { texte = "Vigilance rouge"; couleur = 0xE5484D; }
lv_label_set_text(id(level_label), texte);
lv_obj_set_style_text_color(id(level_label), lv_color_hex(couleur), LV_PART_MAIN);
// Une valeur absente reste absente : rien n'est inventé.
JsonVariant temperature = racine["current"]["temp_c"];
if (temperature.is<float>()) {
char valeur[16];
snprintf(valeur, sizeof(valeur), "%.1f °C", temperature.as<float>());
lv_label_set_text(id(temperature_label), valeur);
}
return true;
});
on_error:
then:
- logger.log: "Pas de réponse (réseau ou délai dépassé)"
# Les polices intégrées à LVGL n'ont pas les accents : Roboto, téléchargée à la compilation
# (il ne lui manque que des accents combinants, d'où ignore_missing_glyphs).
font:
- file: "gfonts://Roboto"
id: font_text
size: 32
glyphsets: [GF_Latin_Core]
ignore_missing_glyphs: true
- file: "gfonts://Roboto@700"
id: font_big
size: 80
glyphsets: [GF_Latin_Core]
ignore_missing_glyphs: true
lvgl:
displays: [panel]
touchscreens: [touch]
rotation: 270
color_depth: 16
byte_order: little_endian
buffer_size: 100%
default_font: font_text
pages:
- id: home_page
widgets:
- label:
id: temperature_label
align: CENTER
y: -60
text: "--"
text_font: font_big
- label:
id: level_label
align: CENTER
y: 80
text: "En attente des données"Validé et compilé avec ESPHome 2026.9.1 le 28/10/2026, pas encore essayé tel quel sur la tablette : ses réglages matériels sont ceux de Vigie display, qui tourne sur un Tab5 ST7121.
Les réglages qui comptent sur cette tablette
- L'ESP32-C6, qui porte le Wi-Fi, est alimenté par un expandeur (PI4IOE5V6408, broche 0 du second) : sans l'interrupteur
wifi_powerallumé au démarrage, le lien SDIO ne monte jamais (« sdmmc_card_init failed », vu sur une ST7121 le 28/10/2026). Son reset, GPIO15, est actif à l'état haut. - Le reset de l'écran passe par l'autre expandeur, qui demande une seconde après le démarrage : sans l'attente de la ligne
on_boot, écran noir après un redémarrage logiciel. Elle doit bloquer, d'où ledelay()en C. - La dalle est en portrait (720 × 1280) : LVGL la tourne en paysage par
rotation: 270, et tourne les appuis avec elle. - Pas de miroir sur l'écran ni sur le tactile : il abîme l'image d'une ST7121.
- Le lien MIPI-DSI est alimenté par le LDO 3 de l'ESP32-P4, à 2,5 V (
esp_ldo). - Le modèle d'écran et la puce tactile changent avec la version : M5STACK-TAB5-ST7123 ou -ST7121 avec le tactile
st7123, M5STACK-TAB5 avec legt911pour l'ILI9881C.
Le micrologiciel complet
vigie.yaml assemble des packages : le matériel de la tablette (board-tab5.yaml, alimentations et chargeur compris), la taille de l'écran, de la carte du monde et des polices (layout-tab5.yaml), l'écran LVGL, dessiné en C++, et le client de l'API : une requête par minute, une trame refusée si sa taille ou sa somme de contrôle ne collent pas.
Installer Vigie
Pas encore de version publiée à installer depuis le navigateur : il faut compiler le micrologiciel soi-même. Comptez une demi-heure, surtout pour la première compilation.
- Installez ESPHome 2026.9.1 ou plus récent et récupérez le dépôt vigie-display.
- Créez une clé de signature : une fois installé, l'écran n'accepte que les mises à jour signées avec la même clé. Gardez-en une copie.
- Compilez pour le Tab5 :
esphome -s vigie_board tab5 -s vigie_api_url https://vigie.auxfilsdesidees.fr -s vigie_language fr -s vigie_signing_key vigie_signing_key.pem compile vigie.yaml. Avec une ST7121, ajoutez-s board_tab5_panel M5STACK-TAB5-ST7121; avec une ILI9881C,-s board_tab5_panel M5STACK-TAB5 -s board_tab5_touch gt911 -s board_tab5_touch_interval never. Installez ensuite par USB avec ESPHome ou depuis ESPHome Web. - Donnez le Wi-Fi par USB (Improv) ou par le point d'accès « Vigie setup » que l'écran ouvre au bout d'une minute. Moins d'une minute après, la barre d'état affiche « À jour ».
Les réglages et les pannes courantes sont dans le guide d'installation (en anglais). Les mises à jour suivantes passent par le Wi-Fi. La même tablette en écran Home Assistant : le M5Stack Tab5.