Intégration d'ESP sous ESPEasy via MQTT

Bonjour,

Ayant démarré il y a peu HA, j’ai passé un peu de temps pour réussir à intégrer mes ESP qui sont sous ESPEasy. Je vous propose donc ce petit tuto maintenant qu’ils sont opérationnels.

Introduction

Nativement, les ESP peuvent être intégrés dans HA en utilisant l’addon ESPHome, cependant cet addon nécessite de flasher l’ESP. Si comme moi vous avez déjà ESPEasy d’installé qui est déjà utilisé par autre chose (Jeedom dans mon cas), peut être que vous souhaitez pouvoir utiliser votre appareil dans HA directement, tout en gardant la config actuelle opérationnelle.

Pour ceux qui souhaiteraient migrer complètement, la procédure est expliquée ici

Prérequis

  • Un broker MQTT installé et lancé coté HA

Configuration coté ESPEasy

  • Connectez vous à votre ESP sur ESPEasy (navigateur sur l’url de l’ESP)
  • Onglet « Controllers » → Ajouter un controller

Vérifiez bien les paramètres encadrés, en saisissant nottament :
Protocole HA / MQTT
Controller Ip = l’IP de votre HA
Controller port = le port configuré dans votre broker MQTT
Le user / password de votre broker MQTT

  • Onglet « Config »

Assurez vous que le « Unit number » est unique sur votre réseau. Si vous avez plusieurs ESP, veuillez bien mettre un numéro différent pour chacun d’entres eux).
Veuillez bien garder de coté le « Unit name », c’est lui qui sera utile pour la suite pour dialoguer avec HA (nous l’appellerons [UNIT] par la suite.

image

  • Onglet « Devices »

Veuillez vous assurer que chacun des devices avec lesquels vous voulez interagir, aient bien un IDX unique, et que les data sont bien envoyés au contrôleur :

image

Veuillez bien garder de coté les « Name », « GPIO » et « Values » de chaque device, ce sont eux qui seront utiles pour la suite pour dialoguer avec HA (nous les appellerons [NAME], [GPIO] et [VALUE]).

  • Onglet « Tools » → Advanced

Assurez vous de bien cocher les paramètres MQTT :

image

A ce stade, ESPEasy est en mesure de dialoguer avec votre HA via MQTT.

Configuration coté HA

Afin de pouvoir utiliser chacun des devices ESPEasy, nous allons devoir créer manuellement une entité par device.

Ouvrez votre éditeur de fichier préféré dans HA, pour éditer configuration.yaml, puis déclarez vos entités

  • Exemple : Capteur température
sensor: 
    - platform: mqtt
      state_topic: "ESP_PC_Grenier/Temperature1/Temperature1"
      name: "PC Grenier temperature départ"

La valeur « state_topic » est renseignée avec les valeurs notées précédemment, nous avons donc [UNIT]/[NAME]/[VALUE].
Le name sera donc le nom de l’entité utilisable dans HA.

image

  • Exemple : Switch
switch:
  - platform: mqtt
    name: "Circulateur PC Grenier"
    command_topic: "ESP_PC_Grenier/gpio/14"
    state_topic: "ESP_PC_Grenier/SW1/Etat1"
    payload_on: "1"
    payload_off: "0"
    retain: true

Tout comme le capteur, la valeur « state_topic » est renseignée avec les valeurs notées précédement, nous avons donc [UNIT]/[NAME]/[VALUE].
La valeur « command_topic » est renseignée avec les valeurs notées précédement, nous avons donc [UNIT]/gpio/[GPIO].

Remarque : Si vous utilisez par exemple un PCF8574 pour augmenter le nombre de pins disponibles, alors le « gpio » est à changer en « pcfgpio », donc vous aurez [UNIT]/pcfgpio/[IDX], ou IDX correspond à l’idx spécifié dans votre device (exemple: command_topic: "ESP_Easy_Cave/pcfgpio/4").

Redémarrez HA, puis profitez de vos nouvelles entités que vous pouvez consulter dans « Outils développements »:
image

Puis ajouter dans votre dashboard avec une carte « Entités » par exemple:
image

5 « J'aime »

hello,
pas mal tu as bien avancé dans ta construction.
Je vais suivre ton tuto pour intégration si possible de mes cartes nodemcuV1; D1mini.
j’ai une D1mini dans ma serre bonsaïs connectée dans HA.
la programmation est simple (chauffage; lumière et arrosage) a été réalisée dans ESPHOME de HA
marche très bien et aucun plantage . si je coupe l’alim du D1 mini pour déconnection et que je réalimente 1/4h après pas de soucis la reconnection se fait bien dans HA et ma carte de lovelace est de nouveau mise à jour des entités.
je n’ai eu aucun bug même avec toutes les mises à jour de HA; à chaque fois répond correctement .
Toujours dans ESPHOME j’ai fait 2 applications avec des cartes nodemcuV1.
1 thermostat avec 1 entrée dallas ds18b20 et une sortie output relais
1 carte avec plusieurs entrées sorties numériques .
Là les choses se compliquent et je sais plus trop ou chercher…
Tout démarre correctement et après un temps aléatoire mes entités dans mes carte lovelace deviennent indisponibles.
si j’éteins l’alim du nodemcu aucun redémarrage
si je fais un reboot du core HA dans supervisor aucun redémarrage
je suis obligé de faire un faire un reboot du host HA. et la OK
si je suis la carte nodemcu sur son port série pendant le plantage je vois que la carte envoie chaque minute les données sur le port !
je ne vois pas du tout ce qui peut se passer sur les cartes nodemcu alors que la D1mini ne plante pas
pourtant c’est un esp8266 sur tous.

Pour le coup je ne pourrais t’aider la dessus, j’imagine qu’il y a un perte de connection a un moment donné et qu’il n’arrive pas a se reconnecter tout seul. Pour le moment je n’ai pas encore utilisé ESPHome.

Hello,
J’ai retravaillé sur mes pertes de connexions avec esphome sur nodemcuV2.
Je suis passé en IP fixe et apparemment je n’ai plus de plantage depuis !
Voici avant la déclaration wifi dans esphome:

esphome:
name: salle_de_bains
platform: ESP8266
board: nodemcuv2

wifi:
ssid: « linksys »
password: «  »

Et après :

esphome:
name: salle_de_bains
platform: ESP8266
board: nodemcuv2

wifi:
ssid: « linksys »
password: «  »
manual_ip:
static_ip: « 192.168.1.160 »
subnet: « 255.255.255.0 »
gateway: « 192.168.1.1 »

Il y a peut-être un souci dans la gestion du dhcp ??
bye

Bonjour à tous je ne sais pas si les forums interagissent ensemble mais je suis aussi sur un autre forum HA qui ressemble beaucoup à celui là, mais bon le principal est que j’arrive à me familiariser avec tout ça, et comme ça j’aiderai l’autre forum :joy:
Voilà tout comme toi Dapolux j’ai un esp déjà autonome créé par un collègue et je ne voudrais pas faire l’imbécile avec, mon esp me sert à commander mes volets roulant somfy RTS, je tape un url avec juste la fin qui change pour interagir avec mes volets. Je voudrais savoir car malgré mes recherche je ne trouve pas la réponse si je peux juste créer une carte sans device, uniquement avec 3 boutons UP, STOP, DOWN en mettant simplement sur chaque bouton un url.
Voilà j’espère avoir été assez clair, merci d’avance pour vos réponses

Hello,

Une solution est de créer 3 commandes, qui appelleraient les 3 urls, puis derrière tu appellerais ces commandes dans 3 boutons (ou mieux, directement une entité « cover »).

C’est d’une certains façon se que j’ai fait pour intégrer mes volets qui sont toujours coté jeedom, en utilisant l’API jeedom via les urls correspondantes.

Pour ce faire, j’ai suivi les explications de @golfvert, que tu trouveras ici (a adapter a ton besoin, surtout si tu n’as pas d’url pour le retour d’état):
https://forum.hacf.fr/t/recuperer-les-dimmers-zwave-de-jeedom-dans-ha/2542/2

merci je vais étudier tout ça :+1:

Holà tout le monde j’ai regardé un peu tout les liens et je m’aperçois que je suis vraiment une quiche en programmation voici quand même ce que j’ai réussi à faire mais ce n’est pas parfait:
_ j’arrive à faire fonctionner mon volet par contre ça m’ouvre la page web alors que je n’en ai pas besoin (voir ma config si dessous)


_ et je voudrais savoir comment faire pour avoir une config avec 3 boutons comme la photos
Capture d’écran du 2021-02-11 11-58-54

Merci pour votre aide

C’est parce que ton action ouvre une url, ce n’est pas la bonne approche.

Voici un exemple qui fonctionne (je viens de faire le test):

En premier, déclare ta commande (dans configuration.yaml):

rest_command:
  down_volet_cuisine:
    url: "http://192.168.1.10/D1"

Puis en suite ton bouton appellera ce service,

type: button
tap_action:
  action: call-service
  service: rest_command.down_volet_cuisine
icon: 'mdi:arrow-down'

Pour avoir visuellement quelque chose de mieux, tu peux mettre tes boutons dans un horizontal-stack. Voici un exemple de chez moi:
image

Pour aller plus loin et gérer un « vrai » volet au sens HA de la chose, tu dois créer une entité « cover » et lui paramétrer les actions correspondantes (je t’invite pour cela a revoir les liens mentionnés plus haut qui font la même chose pour une entité « light »).

Ainsi tu auras:
image

Et si tu as les urls de position et de positionnement, tu pourras aussi avoir le slider :
image

ok merci dapolux, bon je vais plancher dessus, il faut vraiment que je comprenne la façon de procéder avec ton lien. Allez go ce soir fumage de cerveau :exploding_head:

Il faut garder en tête le point de vue global:

Je veux créer un volet (cover), qu’elles sont les données/commandes d’un volet? Puis on y va :

cover:
      - platform: template
        covers:
          bureau:
            device_class: shutter
            friendly_name: "Bureau"
            # Quelle est la position de mon volet a un instant t?
            position_template: "{{ (states('sensor.bureau_position')|int) * 100 / 99 }}"
            # Quelle action dois-je lancer pour ouvrir le volet?
            open_cover:
              service: script.up_bureau
            # Quelle action dois-je lancer pour fermer le volet?
            close_cover:
              service: script.down_bureau
            # Quelle action dois-je lancer pour arrêter le volet?
            stop_cover:
              service: script.stop_bureau
            # Quelle action dois-je lancer pour positionner le volet sur un % particulier?
            set_cover_position:
              service: script.set_position_bureau
              data:
                # Valeur du % du positionnement
                position: "{{ position * 99 / 100 }}"

Remarque: je multiplie et divise par 99 par ce que dans mon cas mon volet va de 0 a 99 et non de 0 a 100, c’est donc a ajuster au besoin.

N’hésites pas a consulter la doc:

Puis il faut définir les script précédents (exemple pour le up):

script: 
    up_bureau:
      alias: up_bureau
      sequence:
          # Quel service appeler ?
        - service: rest_command.bureau_up
          data: {}
      mode: single

Sachant que le service appelle la bonne url:

rest_command:
  down_volet_cuisine:
    url: "http://192.168.1.10/D1"

Bon courage!

Bonjour à tous !!!
Merci Dapolux je commence à comprendre grâce à tes explications et je pense ne pas être très loin mais je bug sur certain endroit:
Voici ma config yaml :

cover:
      - platform: template
        covers:
          cuisine:
            device_class: shutter
            friendly_name: "Cuisine"
            # Quelle est la position de mon volet a un instant t?
            #position_template: "{{ (states('sensor.bureau_position')|int) * 100 / 99 }}"
            # Quelle action dois-je lancer pour ouvrir le volet?
            open_cover:
              service: script.up_cuisine
            # Quelle action dois-je lancer pour fermer le volet?
            close_cover:
              service: script.down_cuisine
            # Quelle action dois-je lancer pour arrêter le volet?
            stop_cover:
              service: script.stop_cuisine
            # Quelle action dois-je lancer pour positionner le volet sur un % particulier?
            #set_cover_position:
              #service: script.set_position_bureau
              #data:
                # Valeur du % du positionnement
                #position: "{{ position * 99 / 100 }}"
        rest_command:
        up_cuisine:
            url: "http://192.168.1.10/U1"
        down_cuisine:
            url: "http://192.168.1.10/D1"
        stop_cuisine:
            url: "http://192.168.1.10/S1"

J’ai chuinté volontairement pour l’instant le positionnement car je n’ai pas encore le retour d’info
ensuite j’ai été dans configuration script donc voici ce que j’ai fait:
Capture d’écran du 2021-02-12 09-38-04
Capture d’écran du 2021-02-12 09-38-23
et enfin dans aperçu j’ai créé une carte horizontale avec ce code

Pile horizontale Configuration de la carte
1
type: horizontal-stack
2
cards:
3
  - type: button
4
    tap_action:
5
      action: call-service
6
      service: rest_command.down_cuisine
7
    icon: 'mdi:arrow-down'
8
    name: Volet cuisine
9
​```

mais quand j’appui sur la flèche il me marque:
Échec d’appel du service « rest_command/down_cuisine ». Service not found.
Donc j’ai mal renseigné le rest_command
Voilà … je bute ici

Hello,

Il y a a minima un problème d’indentation, puis tu n’as pas créé le scripts.

Voilà qui devrait être mieux (je n’ai pas checké à 100% les indentations, il faut toujours avoir a l’esprit qu’un niveau inférieur doit avoir 2 espaces d’indentation):

cover:
  - platform: template
    covers:
      cuisine:
        device_class: shutter
        friendly_name: "Cuisine"
            
        # Quelle action dois-je lancer pour ouvrir le volet?
        open_cover:
          service: script.up_cuisine
        # Quelle action dois-je lancer pour fermer le volet?
        close_cover:
          service: script.down_cuisine
        # Quelle action dois-je lancer pour arrêter le volet?
        stop_cover:
          service: script.stop_cuisine
      
script: 
  up_cuisine:
    alias: up_cuisine
    sequence:
      # Quel service appeler ?
      - service: rest_command.up_cuisine
      data: {}
    mode: single    

  down_cuisine:
    alias: down_cuisine
    sequence:
      # Quel service appeler ?
      - service: rest_command.down_cuisine
      data: {}
    mode: single  

  stop_cuisine:
    alias: stop_cuisine
    sequence:
      # Quel service appeler ?
      - service: rest_command.stop_cuisine
      data: {}
    mode: single      

rest_command:
  up_cuisine:
    url: "http://192.168.1.10/U1"
  down_cuisine:
    url: "http://192.168.1.10/D1"
  stop_cuisine:
    url: "http://192.168.1.10/S1"

L’erreur te dis que qu’il ne trouve pas le service. Quand tu veux vérifier si un service est bien dispo, n’hésites pas a aller dans « outils de développement », onglet services, et vérifie (par exemple tu dois retrouver script.up_cuisine, et si cliques sur « appeler le service » tu peux vérifier qu’il fonctionne).

Pour la partie affichage, comme tu as créé une entité « cover », pas besoin de mettre une horizontal stack avec des boutons, tu peux directement afficher une card « entité », ou même « entités », pour afficher ton cover.cuisine.

Sinon avec les stacks, cela donnerai un peu comme pour mon vidéoprojecteur:

type: horizontal-stack
title: Ecran Vidéo projecteur
cards:
  - type: button
    tap_action:
      action: toggle
    entity: script.vp_up
    icon: 'mdi:arrow-up'
    name: Up
    show_state: false
    show_icon: true
    show_name: false
  - type: button
    tap_action:
      action: toggle
    entity: script.vp_stop
    icon: 'mdi:stop'
    name: Stop
    show_name: false
  - type: button
    tap_action:
      action: toggle
    entity: script.vp_down
    icon: 'mdi:arrow-down'
    name: Down
    show_name: false

Ha oui je vois mieux mes problèmes, j’avais pas compris que les scripts étaient écris dans la configuration yaml, par contre dans mon aperçu j’ai ajouté une carte entité qui est cuisine ça me met les 3 icones donc ce que je veux quand je clique sur la flèche descendre ou monter ou stop cela fonctionne jusque là nickel par contre si je fais descendre puis stop je ne peux pas refaire descendre la flèche est grisé
Capture d’écran du 2021-02-12 14-32-31

En fait, c’est grisé quand le système comprends que le volet est en position maximale (0 ou 100).
Vu que de toutes façons tu n’a pas de capteur pour cela, pour palier tu peux par exemple dire que la position est toujours a 50 (il y a peut être mieux, mais au moins c’est une solution).

cover:
  - platform: template
    covers:
      cuisine:
        device_class: shutter
        friendly_name: "Cuisine"
        # Ligne a ajouter pour faire croire que le volet est tjrs a 50%
        position_template: 50

Trop fort Dapolux :clap:, mission accomplie un grand merci plus qu’à reprogrammer mes 12 autres volets.
Après promis je reviendrai avec de nouvelles missions :laughing: en espérant me débrouiller quand même ;en tout cas je me coucherai encore une fois moins bête…

Bonsoir tout le monde, bon après avoir galérer plusieurs heures à reprogrammer tout mes volets je n’arrive pas à les mettre dans configuration yaml

cover:
  - platform: template
    covers:
      cuisine:
        device_class: shutter
        friendly_name: "Cuisine"
        position_template: 50    
        # Quelle action dois-je lancer pour ouvrir le volet?
        open_cover:
          service: script.up_cuisine
        # Quelle action dois-je lancer pour fermer le volet?
        close_cover:
          service: script.down_cuisine
        # Quelle action dois-je lancer pour arrêter le volet?
        stop_cover:
          service: script.stop_cuisine
  - platform: template
    covers:
      salle à manger:
        device_class: shutter
        friendly_name: "Salle à manger"
        position_template: 50    
        # Quelle action dois-je lancer pour ouvrir le volet?
        open_cover:
          service: script.up_salle_a_manger
        # Quelle action dois-je lancer pour fermer le volet?
        close_cover:
          service: script.down_salle_a_manger
        # Quelle action dois-je lancer pour arrêter le volet?
        stop_cover:
          service: script.stop_salle_a_manger
script: 
  up_cuisine:
    alias: up_cuisine
    sequence:
      # Quel service appeler ?
      - service: rest_command.up_cuisine
        data: {}
    mode: single    

  down_cuisine:
    alias: down_cuisine
    sequence:
      # Quel service appeler ?
      - service: rest_command.down_cuisine
        data: {}
    mode: single  

  stop_cuisine:
    alias: stop_cuisine
    sequence:
      # Quel service appeler ?
      - service: rest_command.stop_cuisine
        data: {}
    mode: single      
  up_salle_a_manger:
    alias: up_salle_a_manger
    sequence:
      # Quel service appeler ?
      - service: rest_command.salle_a_manger
        data: {}
    mode: single    

  down_salle_a_manger:
    alias: down_salle_a_manger
    sequence:
      # Quel service appeler ?
      - service: rest_command.down_salle_a_manger
        data: {}
    mode: single  

  stop_salle_a_manger:
    alias: stop_salle_a_manger
    sequence:
      # Quel service appeler ?
      - service: rest_command.stop_salle_a_manger
        data: {}
    mode: single
rest_command:
  up_cuisine:
    url: "http://192.168.1.10/U1"
  down_cuisine:
    url: "http://192.168.1.10/D1"
  stop_cuisine:
    url: "http://192.168.1.10/S1"
  up_salle_a_manger:
    url: "http://192.168.1.10/U2"
  down_salle_a_manger:
    url: "http://192.168.1.10/D2"
  stop_salle_a_manger:
    url: "http://192.168.1.10/S2"

pour il me semblait faire du copier coller et changer les intitulés, mais bon apparemment c’est dans mes rêves :roll_eyes:

Merci d’avance

Oui c’est bien sensé être du copier/coller une fois que le premier fonctionne.

N’ésite pas a utiliser un éditeur de texte « intelligent » par exemple l’add on Visual studio code. Dans ton message on vois par exemple que le nom de ton deuxième volet n’est pas bon rien qu’avec la couleur: salle à manger ==> salle_a_manger (a l’affichage c’est le friendly name qui sera utilisé).

En suite, tu n’as pas a réécrire le platform / covers, ceci par exemple devrait être mieux:

cover:
  - platform: template
    covers:
      cuisine:
        device_class: shutter
        friendly_name: "Cuisine"
        position_template: 50    
        # Quelle action dois-je lancer pour ouvrir le volet?
        open_cover:
          service: script.up_cuisine
        # Quelle action dois-je lancer pour fermer le volet?
        close_cover:
          service: script.down_cuisine
        # Quelle action dois-je lancer pour arrêter le volet?
        stop_cover:
          service: script.stop_cuisine
      salle_a_manger:
        device_class: shutter
        friendly_name: "Salle à manger"
        position_template: 50    
        # Quelle action dois-je lancer pour ouvrir le volet?
        open_cover:
          service: script.up_salle_a_manger
        # Quelle action dois-je lancer pour fermer le volet?
        close_cover:
          service: script.down_salle_a_manger
        # Quelle action dois-je lancer pour arrêter le volet?
        stop_cover:
          service: script.stop_salle_a_manger

oups j’avais pas vu et j’ai rectifié, par contre je ne trouve pas ma nouvelle entité salle à manger, jai que Cusine

vérifie bien ton indentation, et surtout n’oublie pas de redémarrer HA (ou à minima recharger les entités modèles)