ESPHome Linky ESP32 Pourquoi faut-il déclarer les valeurs à remonter?

Je pose cette question car je possède un serveur domotique jeedom (personne n’est parfait)

Pour remonter les informations de mon linky historique hp/hc j’utilise un esp32 avec Wifinfo

La particularité, c’est qu’il remonte automatiquement toutes les valeurs retournées par l’interface, le seul paramétrage à effectuer c’est le mode historique ou standard et on envoie le tout au plugin teleinfo de jeedom et c’est tout.

Alors pour creuser un peu plus Home Assistant j’ai commencé par installer une maquette.

Je n’avais qu’un raspberry 3B sous la main (comme pour mon jeedom : pas de favoritisme).

Bref je me suis penché sur le fichier de configuration yaml et il faut déclarer tous les champs à remonter. Il existe des dizaines d’exemples et commenter et décommenter les champs un par un ce n’est pas amusant du tout ….

Bref j’ai fini par me prendre par la main : Il faut des sous fichiers pour les différentes configurations (historique, standard, monophasé, triphasé, puis par abonnement base, hp/hc, tempo (ex ejp peut-être) ).

Personne n’a voulu m’installer un linky de chaque modèle gratuitement et sans abonnement, je n’ai qu’un linky historique avec abonnement hp/hc.

Enfin je publie le tout pour le partager bien que les tests soient loin d’être terminés:

La question subsiste toujours :

Pourquoi faut-il déclarer tous les champs dans le fichier yaml ?

Merci d’avance

Salut,

je n’ia pas regardé en détail le firmware que tu utilises sur ton esp32. Mais si c’est de MQTT et qu’il ne formate pas les valeurs pour être compatible avec HA, alors il faut les configurer une par une sous le domaine MQTT.

De base si les valeurs remontent “brut” il n’y a pas de description des entités (type, classe, unité, …), une intégration prévue pour HA inclut des messages mqtt de découverte qui précisent les infos détaillées de chaque valeur/entité et permette la création automatique des entités. A voir si Wifinfo à cette option. (Tasmota couvre ça par exemple…)

J’ai tourné pdt pas mal de temps avec un firmware maison qui lisait les valeurs de mon compteur et les remontait dans HA sans découverte… tu passe 1h à les configurer au début, puis c’est oublié :wink:

Merci pour cette explication. Je comprends pourquoi il faut faire ces déclarations

Je vais continuer mon exploration de Home Assistant

Tu peux flasher ton wifinfo avec un firmware ESPhome avec le composant téléinfo, et ça remonte tout seul dans HA (mais plus dans Jeedom sauf à passer en MQTT)

C’est ce que j’ai fais avec le miens quand je suis passé de Jeedom à HA.

Pour info voilà mon yaml pour un compteur en mode standard en tarif Tempo

substitutions:
  name: esphome-teleinfo
  friendly_name: esp-teleinfo

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.6.0
  name_add_mac_suffix: false

esp8266:
  board: esp01_1m

# Enable logging
logger:
  level: DEBUG
  baud_rate: 0



# Enable Home Assistant API
api:

# Allow Over-The-Air updates
ota:
- platform: esphome


wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Set up a wifi access point
  ap: {}

uart:
  id: uart_bus
  rx_pin: GPIO13  
  baud_rate: 9600
  parity: EVEN
  data_bits: 7

teleinfo:
  id: myteleinfo
  update_interval: 30s
  historical_mode: False

###### Partie sensors Linky ######

 
sensor:

  - platform: uptime
    id: uptime_seconds
    name: "Uptime ESP"
    update_interval: 60s
    unit_of_measurement: s
    accuracy_decimals: 0
    internal: True
    force_update: false
    icon: mdi:timer

  - platform: teleinfo
    tag_name: "NTARF"
    name: "Numéro Tarif actuel"
    unit_of_measurement: ""
    state_class: measurement
    id: linky_numero_tarif_actuel
    accuracy_decimals: 0
    icon: mdi:clock-time-nine-outline
    teleinfo_id: myteleinfo

#Linky Intensité souscrite####################################
  - platform: teleinfo
    tag_name: "PREF"
    name: "Linky puissance souscrite"
    unit_of_measurement: "VA"
    device_class: apparent_power
    state_class: measurement
    icon: mdi:current-ac
    teleinfo_id: myteleinfo
    filters:
      - multiply: 1000
      - filter_out: 0


#Index option Tempo
   #Linky Heures Creuses Jours Bleus###############################
  - platform: teleinfo
    tag_name: "EASF01"
    name: "Linky Tempo Index Creuses Bleus"
    id: Linky_Tempo_Index_hcjb
    icon: mdi:flash
    teleinfo_id: myteleinfo   
    state_class: "total_increasing"
    device_class: "energy"
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - filter_out: 0

   #Linky Heures Pleines Jours Bleus#############################
  - platform: teleinfo
    tag_name: "EASF02"
    name: "Linky Tempo Index Pleines Bleus"
    id: Linky_Tempo_Index_hpjb
    icon: mdi:flash
    teleinfo_id: myteleinfo   
    state_class: "total_increasing"
    device_class: "energy"
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - filter_out: 0

    #Linky Heures Creuses Jours Blancs#########################
  - platform: teleinfo
    tag_name: "EASF03"
    name: "Linky Tempo Index Creuses Blancs"
    id: Linky_Tempo_Index_hcjw
    icon: mdi:flash
    teleinfo_id: myteleinfo   
    state_class: "total_increasing"
    device_class: "energy"
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - filter_out: 0

   #Linky Heures Pleines Jours Blancs#############################
  - platform: teleinfo
    tag_name: "EASF04"
    name: "Linky Tempo Index Pleines Blancs"
    id: Linky_Tempo_Index_hpjw
    icon: mdi:flash
    teleinfo_id: myteleinfo   
    state_class: "total_increasing"
    device_class: "energy"
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - filter_out: 0

   #Linky Heures Creuses Rouges###############################
  - platform: teleinfo
    tag_name: "EASF05"
    name: "Linky Tempo Index Creuses Rouges"
    id: Linky_Tempo_Index_hcjr
    icon: mdi:flash
    teleinfo_id: myteleinfo   
    state_class: "total_increasing"
    device_class: "energy"
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - filter_out: 0

   #Linky Heures Pleines Jours Rouges#######################
  - platform: teleinfo
    tag_name: "EASF06"
    name: "Linky Tempo Index Pleines Rouges"
    id: Linky_Tempo_Index_hpjr
    icon: mdi:flash
    teleinfo_id: myteleinfo   
    state_class: "total_increasing"
    device_class: "energy"
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001
      - filter_out: 0

    
   #Linky Intensité Instantanée############################
  - platform: teleinfo
    tag_name: "IRMS1"
    name: "Linky Intensité"
    id: linky_intensite
    unit_of_measurement: "A"
    device_class: current
    state_class: measurement
    icon: mdi:current-ac
    teleinfo_id: myteleinfo
    

   #Avertissement de Dépassement De Puissance Souscrite#############################
  #- platform: teleinfo
  #  tag_name: "ADPS"
  #  name: "Linky adps"
  #  device_class: current
  #  state_class: measurement
  #  icon: mdi:current-ac
  #  teleinfo_id: myteleinfo

   #Linky Intensité maximale appelé##################################
  #- platform: teleinfo
  #  tag_name: "IMAX"
  #  name: "Linky Intensité Max"
  #  unit_of_measurement: "A"
  #  device_class: current
  #  state_class: measurement
  #  icon: mdi:current-ac
  #  teleinfo_id: myteleinfo   

  #Linky Puissance apparente#########################################
  - platform: teleinfo
    tag_name: "SINSTS"
    name: "linky puissance consommee"
    id: linky_puissance_consommee
    unit_of_measurement: "VA"
    state_class: measurement
    device_class: apparent_power
    icon: mdi:gauge
    teleinfo_id: myteleinfo

  #Linky Tempo Couleur du Jour#########################################
  - platform: template
    name: "STGE couleur jour"
    id: linky_couleur_jour
    state_class: measurement
    icon: mdi:invert-colors
    accuracy_decimals: 0

  #Linky Tempo Couleur du Lendemain######################################
  - platform: template
    name: "STGE couleur demain"
    id: linky_couleur_lendemain
    state_class: measurement
    icon: mdi:invert-colors
    accuracy_decimals: 0
 
  #- platform: template
  #  name: "Linky Organe Coupure"
  #  id: linky_organe_coupure
  #  accuracy_decimals: 0

  #- platform: template
  #  name: "Linky Numéro Index Fournisseur"
  #  id: linky_index_fournisseur
  #  accuracy_decimals: 0

  #- platform: template
  #  name: "Linky Numéro Index Distributeur"
  #  id: linky_index_distributeur
  #  accuracy_decimals: 0

  #- platform: template
  #  name: "Linky Etat Com Euridis"
  #  id: linky_com_euridis
  #  accuracy_decimals: 0

  #- platform: template
  #  name: "Linky Status CPL"
  #  id: linky_status_cpl
  #  accuracy_decimals: 0

  #- platform: template
  #  name: "Linky préavis pointe mobile"
  #  id: linky_preavis_pointe
  #  accuracy_decimals: 0

  #- platform: template
  #  name: "Linky Pointe mobile"
  #  id: linky_pointe_mobile
  #  accuracy_decimals: 0

binary_sensor:
  #- platform: template
  #  name: "Linky Relais"
  #  id: linky_contact_sec

  #- platform: template
  #  name: "Linky Cache-bornes"
  #  id: linky_cachebornes

  #- platform: template
  #  name: "Linky Surtension phase"
  #  id: linky_surtension_phase

  #Linky Depassement de Puissance#####################################
  - platform: template
    name: "STGE Depassement Puissance"
    id: linky_depassement_puissance
    icon: mdi:stack-overflow

  #Linky Producteur / Consommateur#####################################
  - platform: template
    name: "STGE Producteur / Consommateur"
    id: linky_producteur
    icon: mdi:arrow-left-right-bold

  #Linky Sens Energie Active############################################
  - platform: template
    name: "STGE Sens Energie Active"
    id: linky_sens_energie
    icon: mdi:arrow-left-right-bold

  #- platform: template
  #  name: "Linky Mode Dégradé Horloge"
  #  id: linky_horloge_degrade

  #- platform: template
  #  name: "Linky Mode Téléinformation"
  #  id: linky_mode_tic

  #- platform: template
  #  name: "Linky Synchro CPL"
  #  id: linky_sync_cpl

text_sensor:
  - platform: teleinfo
    tag_name: "LTARF"
    name: "Libélé Tarif actuel"
    id: linky_nom_tarif_actuel
    icon: mdi:clock-time-nine-outline
    teleinfo_id: myteleinfo
    
  - platform: teleinfo
    tag_name: "STGE"
    name: "Registre de Status"
    id: linky_registre_status
    icon: mdi:key-variant
    teleinfo_id: myteleinfo
    on_value: 
      then:
        - lambda: |-
           std::string str_registre = id(linky_registre_status).state;
           if (str_registre.length() > 1){
            uint32_t int_registre = std::stoul(str_registre, nullptr,16);
            unsigned int int_fonction = int_registre & 0b1; //masque bit 0 = Contact sec
            //id(linky_contact_sec).publish_state(int_fonction !=0);
            int_registre = int_registre >> 1;
            int_fonction = int_registre & 0b111; //masque bit 1..3 = Organe de coupure
            //id(linky_organe_coupure).publish_state((float)int_fonction);
            int_registre = int_registre >> 3;
            int_fonction = int_registre & 0b1; //masque bit 4 = Etat cache-bornes
            //id(linky_cachebornes).publish_state(int_fonction !=0);
            int_registre = int_registre >> 2;
            int_fonction = int_registre & 0b1; //masque bit 6 = Surtension
            //id(linky_surtension_phase).publish_state(int_fonction !=0);
            int_registre = int_registre >> 1;
            int_fonction = int_registre & 0b1; //masque bit 7 = Dépassement puissance
            id(linky_depassement_puissance).publish_state(int_fonction !=0);
            int_registre = int_registre >> 1;
            int_fonction = int_registre & 0b1; //masque bit 8 = Producteur
            id(linky_producteur).publish_state(int_fonction !=0);
            int_registre = int_registre >> 1;
            int_fonction = int_registre & 0b1; //masque bit 9 = Sens énergie active
            id(linky_sens_energie).publish_state(int_fonction !=0);
            int_registre = int_registre >> 1;
            int_fonction = int_registre & 0b1111; //masque bit 10..13 = Numéro index fournisseur
            //id(linky_index_fournisseur).publish_state((float)int_fonction);
            int_registre = int_registre >> 4;
            int_fonction = int_registre & 0b11; //masque bits 14 & 15 = Numéro index distributeur
            //id(linky_index_distributeur).publish_state((float)int_fonction);
            int_registre = int_registre >> 2;
            int_fonction = int_registre & 0b1; //masque bit 16 = Mode dégradé horloge
            //id(linky_horloge_degrade).publish_state(int_fonction !=0);
            int_registre = int_registre >> 1;
            int_fonction = int_registre & 0b1; //masque bit 17 = Mode Téléinformation
            //id(linky_mode_tic).publish_state(int_fonction !=0);
            int_registre = int_registre >> 2;
            int_fonction = int_registre & 0b11; //masque bits 19 & 20 = Etat communication Euridis
            //id(linky_com_euridis).publish_state((float)int_fonction);
            int_registre = int_registre >> 2;
            int_fonction = int_registre & 0b11; //masque bits 21 & 22 = Status CPL
            //id(linky_status_cpl).publish_state((float)int_fonction);  
            int_registre = int_registre >> 2;
            int_fonction = int_registre & 0b1; //masque bit 23 = Synchronisation CPL
            //id(linky_sync_cpl).publish_state(int_fonction !=0);  
            int_registre = int_registre >> 1;
            int_fonction = int_registre & 0b11; //masque bits 24 & 25 = Couleur du jour Tempo
            id(linky_couleur_jour).publish_state((float)int_fonction);            
            int_registre = int_registre >> 2;
            int_fonction = int_registre & 0b11; //masque bits 26 & 27 = Couleur du lendemain Tempo
            id(linky_couleur_lendemain).publish_state((float)int_fonction); 
            int_registre = int_registre >> 2;
            int_fonction = int_registre & 0b11; //masque bits 28 & 29 = Préavis pointes mobiles
            //id(linky_preavis_pointe).publish_state((float)int_fonction);
            int_registre = int_registre >> 2;
            int_fonction = int_registre & 0b11; //masque bits 30 & 31 = Pointes mobiles
            //id(linky_pointe_mobile).publish_state((float)int_fonction);
           } 
            

  - platform: template
    name: Uptime
    update_interval: 60s
    icon: mdi:clock-start
    lambda: |-
      int seconds = (id(uptime_seconds).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600);
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      if ( days ) {
        return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( hours ) {
        return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else if ( minutes ) {
        return { (String(minutes) +"m "+ String(seconds) +"s").c_str() };
      } else {
        return { (String(seconds) +"s").c_str() };
      } 



# To have a "next url" for improv serial
web_server:

Merci pour cette version du yaml pour linky standard avec tarif tempo