Passer des valeurs d'entités depuis HA vers un ESP32 et faire un test logique dessus

Bonjour,

Je continue mon petit projet monitoring Chaudière.

Ca y est j’ai un premier ESP32 qui permet de récupérer des températures et des états binaire de marche du bruleur et autres circulateurs, la position de la vanne trois voies, ainsi que le défaut bruleur.

Maintenant niveau 2 :
Un second ESP va être installé dans la salle de bain à l’étage pour m’indiquer si le ballon d’eau chaude est à la bonne température pour la douche et éventuellement si le défaut chaudière est actif.

Je rappelle que ma chaudière fioul est capricieuse et que parfois elle tombe en défaut de façon inopinée, et c’est gonflant de s’en rendre compte quand on déjà à oilpé sous la douche que de voir désespérément couler de l’eau qui ne chauffe pas, avant de devoir aller relancer au garage. Et de remonter 20 minutes aprés quand c’est chaud.

Donc le but et d’avoir cette information en entrant dans la salle de bains par deux petites Leds, et de s’organiser en conséquence.

Bref rien de vital mais je découvre HA, et je cherche des protos utiles pour mon niveau.

Mon problème

Récupérer des valeurs d’entités depuis HA vers se second ESP et ensuite allumer ou éteindre des Leds.

Pour le capteur de température j’ai récupéré des exemples et j’ai codé ceci qui à l’air de fonctionner.

sensor:
  - platform: homeassistant
    id: temperature_ballon
    name: "Temperature Ballon"
    entity_id: sensor.ballon
.
.
 .
 - interval: 15s  
    then:
      if:
        condition:
          lambda: 'return id(temperature_ballon).state < 45;'
        then:
          - logger.log: "La température du ballon est inférieure à 45° !"
          - output.turn_off: Led_Temperature_Ballon_OK
        else:
          - logger.log: "The sensor value is above 30!"
          - output.turn_on: Led_Temperature_Ballon_OK

Là ou ça se complique, c’est que le défaut bruleur est un binary_sensor.

Donc j’ai écrit ça en pensant que c’était logique, ce qui à l’air de marcher (pas de plantage en tout cas)

binary_sensor: 
  - platform: homeassistant
    id: defaut_bruleur
    name: "Defaut_Bruleur"
    entity_id: binary_sensor.defaut_bruleur

Par contre je séche et n’arrive pas à trouver une syntaxe logique pour utiliser ce binary _sensor.
La dernière version que j’ai essayé est celle ci, mais je ne trouve pas comment faire un test tout bête sur un état logique.

#Test chaudière en défaut allumage voyant led 
  - interval: 15s
    then:
      if:
        condition:
          defaut_bruleur.state 
        then:
          - logger.log: "La chaudière est en défaut"
          - output.turn_on: Led_Defaut_Chaudiere
        else:
          - logger.log: "La chaudière est OK !"
          - output.turn_off: Led_Defaut_Chaudiere            

Ca fait 4 heures que je suis là dessus et franchement je ne comprends pas la syntaxe à utiliser.

Un petit coup de main sur ce test logique me serait bien utile.

Merci d’avance.

A+

Philippe

Salut,

Joli projet pour commencer esphome :slight_smile:

Je pense que tu t’es compliqué la vie avec les « interval 15s ».
EspHome intègre par défaut pour chaque entité des « automation » qui permettent de lancer des actions à chaque changement de l’état ou la valeur de tes composants.

Pour un sensor tu as même on_value_range qui te permet d’intégrer directement les comparaisons de valeurs.

sensor:
  - platform: homeassistant
    id: temperature_ballon
    name: "Temperature Ballon"
    entity_id: sensor.ballon
    on_value_range:
      - below: 45.0
        then:
          - logger.log: "La température du ballon est inférieure à 45° !"
          - output.turn_off: Led_Temperature_Ballon_OK
      - above: 45.0
        then:
          - logger.log: "The sensor value is above 30!"
          - output.turn_on: Led_Temperature_Ballon_OK

Pour le binary sensor c’est pareil là tu as « on_press » et « on_release ». Ou alors on_state pour lancer quelque chose au moment du changement.

Le ce serait appelé au moment d’un changement d’état de ton ninary sensor.

binary_sensor: 
  - platform: homeassistant
    id: defaut_bruleur
    name: "Defaut_Bruleur"
    entity_id: binary_sensor.defaut_bruleur
    on_press:
      then:
        - logger.log: "La chaudière est en défaut"
        - output.turn_on: Led_Defaut_Chaudiere
    on_release:
      then:
        - logger.log: "La chaudière est OK !"
        - output.turn_off: Led_Defaut_Chaudiere  

Attention, j’ai mis ce code là mais je n’ai absolument pas testé :rofl:
Pas garanti que ça compile du premier coup… mais si j’avais à le faire je el ferais comme ça

Bonjour et merci à toi Alex de prendre le temps de m’aider.

Bon ça compile et ça semble tourner, le problème est que j’ai l’impression qu’il faut un changement d’état ou de seuil
pour que cela remonte qqchose.

La rien ne bouge est les log ne remonte que la connexion Wifi.

D’autre idée ?

A+ Philippe

Oui, en fait comme je disais les « on_xxx » c’est que lancé quand il y a un changement d’état… donc pour l’initialisation pas top.
Mais il doit être possible du coup d’ajouter une valeur d’initialisation directement au niveau de tes leds

Oui mais l’idée c’est de récupérer l’état courant des informations. en cas de coupure de courant les indications seront fausse avec ce système.

C’est pour cela que j’étais parti sur un intervalle qui lance un test régulièrement mais il me faut tester l’état logique.

A+ Philippe

Bonjour,

Bon et bien j’y suis arrivé à force de recherche sur le net.

Pas facile de commencer sans des exemples de codes et la doc et quand même vachement à tiroir.

Je poste ici mon code, il n’est pas encore parfait mais il fonctionne, c’est déjà ça.

Si ça peut aider quelqu’un.

Par contre j’ai encore deux question à la fin du post, si jamais quelqu’un a les réponses, je prends.

esphome:
  name: afficheursdb

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "..."

ota:
  password: "..."

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Afficheursdb Fallback Hotspot"
    password: "BEeUXM0FGWZk"

sensor:
  - platform: homeassistant    # permet de récupérer les capteur venant de HA vers l'ESP
    name: "Température ballon"
    id: temperature_ballon  # ID de la copie dans ESPHOME
    entity_id: sensor.ballon   #ID du capteur connue dans HA

binary_sensor:

  - platform: homeassistant
    name: "Defaut chaudière"
    id: defaut_chaudiere
    entity_id: sensor.defaut_bruleur    

##################################
# Création des Blinks des Leds                   #
##################################

switch:

# Led bleue

  - platform: gpio
    pin: 3 
    id: blueblink
    
  #  l'automation (template) qui permet de faire clignoter une LED.

  - platform: template
    name: "Blinking Blue LED"
    optimistic: yes
    id: blinkblueledtemplate
    turn_on_action:
    - while:
        condition:
          lambda: 'return true;'
        then:
        - switch.turn_on: blueblink
        - delay: 0.1s
        - switch.turn_off: blueblink
        - delay: 2s
    turn_off_action:
    - switch.turn_off: blueblink  
    
# Led verte ballon

  - platform: gpio
    pin: 14 
    id: balgreenblink
    
  - platform: template
    name: "Blinking Ballon Green LED"
    optimistic: yes
    id: blinkbalgreenledtemplate
    turn_on_action:
    - while:
        condition:
          lambda: 'return true;'
        then:
        - switch.turn_on: balgreenblink
        - delay: 0.1s
        - switch.turn_off: balgreenblink
        - delay: 2s
    turn_off_action:
    - switch.turn_off: balgreenblink  

# Led verte chaudiere

  - platform: gpio
    pin: 12 
    id: chaudgreenblink
    
  - platform: template
    name: "Blinking Chaudiere Green LED"
    optimistic: yes
    id: blinkchaugreenledtemplate
    turn_on_action:
    - while:
        condition:
          lambda: 'return true;'
        then:
        - switch.turn_on: chaudgreenblink
        - delay: 0.1s
        - switch.turn_off: chaudgreenblink
        - delay: 2s
    turn_off_action:
    - switch.turn_off: chaudgreenblink  

# Led rouge ballon

  - platform: gpio
    pin: 13 
    id: balredblink
    
  - platform: template
    name: "Blinking Ballon Red LED"
    optimistic: yes
    id: blinkbalredledtemplate
    turn_on_action:
    - while:
        condition:
          lambda: 'return true;'
        then:
        - switch.turn_on: balredblink
        - delay: 2s
        - switch.turn_off: balredblink
        - delay: 0.1s
    turn_off_action:
    - switch.turn_off: balredblink

# Led rouge Chaudière

  - platform: gpio
    pin: 15 
    id: chaudredblink
    
  - platform: template
    name: "Blinking Chaudiere Red LED"
    optimistic: yes
    id: blinkchaudredledtemplate
    turn_on_action:
    - while:
        condition:
          lambda: 'return true;'
        then:
        - switch.turn_on: chaudredblink
        - delay: 2s
        - switch.turn_off: chaudredblink
        - delay: 0.1s
    turn_off_action:
    - switch.turn_off: chaudredblink

# Test WIFI connecté et allumage voyant led 

interval:
  - interval: 14.7s
    then:
      if:
        condition:
          wifi.connected:
        then:
          - switch.turn_on: blinkblueledtemplate
          - logger.log: WiFi is connected!

        else:
          - switch.turn_off: blinkblueledtemplate
          - logger.log: WiFi is disconnected!

# Test temperature ballon

  - interval: 14.7s
    then:

      if:
        condition:
          lambda: return id(temperature_ballon).state > 45;  # Test avec une expression lambda sur la valeur de la température du ballon d'eau chaude. Notez que j'utilise l'ID connu dans l'ESP
        then:
          - logger.log: 
              format: "La température du ballon est au dessus de 45° ! Elle est à %.1f degrés"
              args: 'id(temperature_ballon).state'
          - switch.turn_on: blinkbalgreenledtemplate
          - switch.turn_off: blinkbalredledtemplate          


        else: 
          - logger.log: 
              format: "La température du ballon est inférieure à 45° ! Elle est à %.1f degrés"
              args: 'id(temperature_ballon).state'          
          - switch.turn_off: blinkbalgreenledtemplate
          - switch.turn_on: blinkbalredledtemplate          
             
# Test défaut chaudière

  - interval: 14.7s  
    then:
      if:
        condition:
          binary_sensor.is_on: defaut_chaudiere  # Test logique de l'état d'un capteur binaire
        then:
          - logger.log: "La chaudiere est en défaut !"
          - switch.turn_on: blinkchaudredledtemplate
          - switch.turn_off: blinkchaugreenledtemplate      

             
        else: 
          - logger.log: "Pas de défaut chaudière !"
          - switch.turn_off: blinkchaudredledtemplate
          - switch.turn_on: blinkchaugreenledtemplate




captive_portal:

Voila il me reste des défauts que j’aimerai traiter :

Comment synchroniser les différents test, je n’ai pas trouvé de syntaxe qui permettrai un seul appel à l’intervalle de 14.7 secondes et de faire les trois test dans la même échelle de temps, là les led clignotent toutes avec un déphasage les unes par rapport aux autres.

Je n’ai pas non plus trouvé comment ne pas clooner le code pour chaque led, en Python j’aurai créer une seule fonction et j’y aurait passé les variables pour chaque appel, mais je n’ai pas trouvé si on peut appeler un template en y passant des variables.

A+ Philippe

Salut,

tu peux faire un « script » qui regroupe tous les tests et qui est lancé par ton interval.
Ou tout regrouper sous un interval, ce n’est pas obligatoire de n’avoir qu’un seul « if ».

Salut,

J’ai essayé pas mal de syntaxe mais je n’arrive pas à faire fonctionner plusieurs IF avec le même intervalle dans le code.
Par exemple cette syntaxe ne met pas de message d’erreur, compile, mais l’ESP ne se connecte plus au Wifi et ne lance même pas le Hot spot, je pense qu’il plante en fait.

interval:
  - interval: 14.7s
    then:
      - if:
        condition:
          wifi.connected:
        then:
          - switch.turn_on: blinkblueledtemplate
          - logger.log: WiFi is connected!

        else:
          - switch.turn_off: blinkblueledtemplate
          - logger.log: WiFi is disconnected!

# Test temperature ballon


      - if:
        condition:
          lambda: return id(temperature_ballon).state > 45;
        then:
          - logger.log: 
              format: "La température du ballon est au dessus de 45° ! Elle est à %.1f degrés"
              args: 'id(temperature_ballon).state'
          - switch.turn_on: blinkbalgreenledtemplate
          - switch.turn_off: blinkbalredledtemplate          


        else: 
          - logger.log: 
              format: "La température du ballon est inférieure à 45° ! Elle est à %.1f degrés"
              args: 'id(temperature_ballon).state'          
          - switch.turn_off: blinkbalgreenledtemplate
          - switch.turn_on: blinkbalredledtemplate          
             
# Test défaut chaudière

      - if:
        condition:
          binary_sensor.is_on: defaut_chaudiere
        then:
          - logger.log: "La chaudiere est en défaut !"
          - switch.turn_on: blinkchaudredledtemplate
          - switch.turn_off: blinkchaugreenledtemplate                   
        else: 
          - logger.log: "Pas de défaut chaudière !"
          - switch.turn_off: blinkchaudredledtemplate
          - switch.turn_on: blinkchaugreenledtemplate

Bref je ne vois pas comment faire.

A+ Philippe

Je n’avais jamais ce besoin, je pensais vraiment que les if pouvaient se cumuler.
Mais du coup en revanche, les scripts ça devrait le faire.
Tu fais 1 script par test avec tes if…then…else
Et dans l’interval:

interval:
  - interval: 14.7s
    then:
      - script.execute: test_wifi
      - script.execute: test_ballon
      - script.execute: test_defaut