dugolf
Septembre 27, 2025, 9:40
1
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
Wifinfo serveur web wifi pour compteur linky compatible avec jeedom V4, domoticz, mqtt
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:
Linky Téléinformation pour Home Assistant avec ESPHOME
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é
dugolf
Septembre 27, 2025, 7:03
3
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:
dugolf
Septembre 28, 2025, 9:16
5
Merci pour cette version du yaml pour linky standard avec tarif tempo