Aller au contenu
Aux fils des idées English
Vigie · M5Stack · sans Home Assistant

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.

L'écran Vigie sur le M5Stack Tab5 en 1280 × 720 : barre d'état, carte du monde avec les aléas en cours, liste des cinq plus graves et panneau météo
É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.

tab5-standalone.yamlGitHub
# 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_power allumé 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ù le delay() 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 le gt911 pour 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.

  1. Installez ESPHome 2026.9.1 ou plus récent et récupérez le dépôt vigie-display.
  2. 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.
  3. 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.
  4. 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.