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

Vigie sur la Waveshare ESP32-P4 7B

L'écran de 7 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. ESPHome sans Home Assistant : l'écran va chercher ses données lui-même, par le Wi-Fi.

L'écran Vigie sur la Waveshare 7B : barre d'état, carte du monde avec les aléas en cours, liste des cinq plus graves et panneau météo de la zone active
Écran
7", 1024 × 600
Micrologiciel
ESPHome 2026.9.1+, LVGL
Home Assistant
Pas nécessaire
Données
API Vigie, chaque minute
Statut
Testée sur la carte le 20/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 Vigie est dessinée pour cet écran, au pixel près : 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.

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. Changez la latitude et la longitude, ou l'adresse, pour lire une autre API.

waveshare-7b-standalone.yamlGitHub
# Waveshare ESP32-P4-WIFI6-Touch-LCD-7B 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 la carte ; cet exemple, lui, est
# compilé avec ESPHome 2026.9.1 mais pas essayé tel quel.
substitutions:
  # Le lieu affiché (ici Paris).
  latitude: "48.86"
  longitude: "2.35"

esphome:
  name: waveshare-7b-autonome
  friendly_name: Waveshare 7B autonome
  # ESPHome 2026.9.0 plante en réglant l'écran d'un ESP32-P4 révision 3 : 2026.9.1 au moins.
  min_version: 2026.9.1

esp32:
  variant: esp32p4
  # ESP32-P4 révision 3 (de série), dont 400 MHz est la fréquence normale.
  engineering_sample: false
  cpu_frequency: 400MHz
  flash_size: 32MB
  framework:
    type: esp-idf
    advanced:
      enable_idf_experimental_features: true
      execute_from_psram: true

# À sa vitesse par défaut, la PSRAM donnait une trentaine de « lcd.dsi underrun » par seconde.
psram:
  mode: hex
  speed: 200MHz

# Le Wi-Fi est sur une deuxième puce, un ESP32-C6, reliée en SDIO.
# Son reset (GPIO54) est actif à l'état haut : false donne « sdmmc_card_init failed ».
esp32_hosted:
  variant: esp32c6
  active_high: true
  clk_pin: GPIO18
  cmd_pin: GPIO19
  d0_pin: GPIO14
  d1_pin: GPIO15
  d2_pin: GPIO16
  d3_pin: GPIO17
  reset_pin: GPIO54
  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 « Waveshare 7B reglages » et sa page de réglage.
wifi:
  ap:
    ssid: "Waveshare 7B reglages"

improv_serial:

captive_portal:

ota:
  - platform: esphome

logger:
  hardware_uart: USB_SERIAL_JTAG

# Bus du tactile GT911 et des puces audio.
i2c:
  - id: bsp_bus
    sda: GPIO7
    scl: GPIO8
    frequency: 400kHz

# Alimentation du lien MIPI-DSI de l'écran : LDO 3 à 2,5 V.
esp_ldo:
  - voltage: 2.5V
    channel: 3

# Écran EK79007 : le modèle d'ESPHome connaît la carte (reset GPIO33 compris).
display:
  - id: panel
    platform: mipi_dsi
    model: WAVESHARE-ESP32-P4-WIFI6-TOUCH-LCD-7B
    dimensions:
      width: 1024
      height: 600
    pixel_mode: 16bit
    color_order: RGB
    update_interval: never
    auto_clear_enabled: false

# Le code de Waveshare dit le reset du GT911 non relié, mais il est sur GPIO23 : sans lui
# et sans les deux miroirs, un seul appui reconnu en cinq minutes.
touchscreen:
  - id: touch
    platform: gt911
    reset_pin: GPIO23
    update_interval: 50ms
    transform:
      swap_xy: false
      mirror_x: true
      mirror_y: true

# Rétroéclairage : sortie inversée, à 5 kHz.
output:
  - platform: ledc
    id: backlight_pwm
    pin:
      number: GPIO32
      inverted: true
    frequency: 5000Hz

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: 28
    glyphsets: [GF_Latin_Core]
    ignore_missing_glyphs: true
  - file: "gfonts://Roboto@700"
    id: font_big
    size: 64
    glyphsets: [GF_Latin_Core]
    ignore_missing_glyphs: true

lvgl:
  displays: [panel]
  touchscreens: [touch]
  # La dalle est montée à l'envers par rapport au pilote : 180 pour la carte à l'endroit,
  # 0 si vous la montez à l'envers. Le tactile suit tout seul.
  rotation: 180
  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: -50
            text: "--"
            text_font: font_big
        - label:
            id: level_label
            align: CENTER
            y: 70
            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 carte : ses réglages matériels sont ceux de Vigie display, qui tourne sur la mienne.

Les réglages qui comptent sur cette carte

  • ESPHome 2026.9.1 au moins : la 2026.9.0 plante en réglant l'écran des ESP32-P4 révision 3.
  • Le Wi-Fi passe par l'ESP32-C6, relié en SDIO (esp32_hosted) ; son reset, GPIO54, est actif à l'état haut.
  • La PSRAM à 200 MHz : à sa vitesse par défaut, l'écran décrochait une trentaine de fois par seconde (« lcd.dsi underrun »).
  • Le tactile GT911 a son reset sur GPIO23, même si le code de Waveshare le dit non relié, et il est inversé en X et en Y.
  • Le rétroéclairage est une sortie inversée sur GPIO32, à 5 kHz.
  • Le sens de l'image : la dalle est montée à l'envers par rapport à son pilote, d'où rotation: 180 pour une carte à l'endroit, 0 pour une carte montée à l'envers. Vigie display part de 0, le sens de ma carte : ajoutez -s board_rotation 180 si l'image est à l'envers.
  • Après un redémarrage logiciel, le lien avec l'ESP32-C6 peut ne plus monter, jusqu'à une coupure de courant. Vigie display fait de chaque redémarrage logiciel une remise à zéro de tout le cœur numérique (c6_link.cpp) ; l'exemple ne le fait pas.

Le micrologiciel complet

vigie.yaml assemble des packages : le matériel de la carte (board-waveshare-7b.yaml), la taille de l'écran, de la carte du monde et des polices (layout-waveshare-7b.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 : la 7B est la carte par défaut. esphome -s vigie_api_url https://vigie.auxfilsdesidees.fr -s vigie_language fr -s vigie_signing_key vigie_signing_key.pem compile vigie.yaml, puis installez 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 carte en écran Home Assistant : la Waveshare 7B.