Sommaire

ESPHome : Noeuds hors ligne

Problématique

Il m’arrive souvent que, lorsque j’ouvre l’interface d’ESPHome, je voie qu’une partie de mes équipements sont dit hors ligne.
Cependant, ils répondent bien aux pings et leurs interfaces Web sont accessibles.

Du coup, il m’est presque impossible de les mettre à jour via ESPHome (des fois sa passe, des fois non…).
Pour pallier à cela, je récupérais le firmware compilé par ESPHome afin d’effectuer le flashage via l’interface Web du module.

/2022/01-09-esphome-noeuds-hors-ligne/img/Screenshot_1.webp
Obtention du firmware sur ESPHome

En souhaitant changer l’adressage réseau de mon LAN, je me suis repenché sur la question. Il semble que j’ai trouvé une manière de faire et c’est ce que je vous partage ici.

Principe

Par défaut, ESPHome utilise le protocole mDNS pour établir la connexion avec les clients.
Mon problème semble venir du fait que j’utilise des _ dans mes noms de nœuds, cela est précisé dans la FAQs d’ESPHome.

Ayant l’habitude avec Home Assistant d’utiliser des_noms_comme_cela, j’ai fait de même avec tous les modules ESPHome ! Il faut donc que j’y remédie.

J’ai aussi trouvé un moyen de faire pour qu’ESPHome utilise des adresses IP en lieu et place du mDNS. Cela permet de résoudre cette problématique pour les gens qui utilisent des VLANs. En effet, si le serveur ESPHome n’est pas dans le même sous-réseau que les modules, aucune chance que le mDNS fonctionne car ce protocole fonctionne en broadcast.
À mon sens, si on utilise des adresses IP, il faut bien qu’ESPHome les connaisse. De ce fait, mes modules utiliseront maintenant systématiquement des adresses IP fixes (statiques).

Forcer l’utilisation du ping

Pour forcer l’utilisation du ping, on va éditer notre Docker Compose afin d’y ajouter la variable d’environnement ESPHOME_DASHBOARD_USE_PING que l’on mettra à la valeur true.

Mon fichier docker-compose.yml est donc le suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
---
version: '3.8'

services:
  esphome:
    image: esphome/esphome
    container_name: esphome
    restart: unless-stopped
    healthcheck:
      test: curl -f http://localhost:6052 || exit 1
      interval: 1m
      timeout: 10s
      retries: 3
      start_period: 30s
    environment:
      - TZ=Europe/Paris
      - ESPHOME_DASHBOARD_USE_PING=true
    #ports:
    #  - 6052:6052
    volumes:
      - /var/lib/esphome/config:/config:rw
    network_mode: host

La modification effectuée, on relance la stack avec un docker-compose restart.

Pour ceux qui ont installé ESHome via l’add-ons store d’HA, il faut ajouter la variable de configuration suivante : status_use_ping=true

Utilisation d’IP fixe

Comme écris dans la documentation, on ajoute donc une section manual_ip à notre composante Wi-Fi.

Extrait de la section Wi-Fi d’un de mes modules :

1
2
3
4
5
6
7
8
wifi:
  ssid: !secret secret_wifissid
  password: !secret secret_wifimdp

  manual_ip:
    static_ip: 192.168.17.92
    subnet: 255.255.255.0
    gateway: 192.168.17.254

Renommage des modules

J’ai donc renommé mes modules afin que les noms ne contiennent plus de _ en remplaçant simplement des _ par des -.

Extrait de configuration d’un module :

1
2
3
4
esphome:
  name: sonoff-fan
  platform: ESP8266
  board: esp01_1m
Problème des substitutions

Si vous utilisez des substitutions pour vos noms de sensors et que ces derniers utilisent le nom du module qui contient des -, ben vous ne pouvez pas !
Les noms de modules ne peuvent prendre de -
Vu que je fais comme ça, j’ai contourné le problème en n’utilisant plus ma substitution dans le nom (mis en commentaire dans l’exemple ci-dessous) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
substitutions:
  fruits_des_bois: gosund_sp1_1

esphome:
  # name: ${fruits_des_bois}
  name: gosund-sp1-1
  platform: ESP8266
  board: esp8285

switch:
- platform: gpio
  name: "${fruits_des_bois}_relay"
  pin: GPIO14

Effectuer la transition

Une fois ces modifications effectuées, il faut flasher tous les modules.
Vu que plus rien ne correspond au niveau du nom et de l’adresse IP, il est normalement impossible de le faire via ESPHome.

Cependant, il existe une variable use_address qui permet de résoudre ce problème.

use_address (Optional, string): Manually override what address to use to connect to the ESP. Defaults to auto-generated value. Example, if you have changed your static IP and want to flash OTA to the previously configured IP address.
Documentation ESHome

Il faut donc ajouter l’adresse IP actuelle de notre module à la configuration pour pouvoir flasher le module en OTA.

En reprenant mon exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
wifi:
  ssid: !secret secret_wifissid
  password: !secret secret_wifimdp

  manual_ip:
    static_ip: 192.168.17.92
    subnet: 255.255.255.0
    gateway: 192.168.17.254

  use_address: 192.168.5.34
Changement de réseau
Comme j’effectue aussi un changement de réseau, mon serveur à une seconde adresse IP afin d’en avoir une dans le réseau 192.168.5.0/24 (initial) et 192.168.17.0/24 (le nouveau réseau).

Je flashe donc sans soucis mon module via cette astuce.

En vue de la configuration actuelle, si je flashe à nouveau mon module, ESHome va encore utiliser l’ancienne adresse (192.168.5.34) à cause du use_address. Il faut donc l’enlever pour le prochain flashage.
Afin d’être sur de moi, j’ai reflashé le module après avoir enlevé cette ligne.

Résultat

Depuis que j’ai fait ces modifications, je n’ai plus de problèmes de nœuds dits OFFLINE alors qu’ils sont bien en fonctionnement.

J’ai aussi effectué quelques MAJ d’ESPHome et tous fonctionnent comme attendu.