Aide sur info TIC compteur Linky avec esp32

Bonjour a tous,
Je viens quérir voir aider sur comment avoir les données de consommation du compteur électrique Linky.
Historiquement j’ai un Ecodevice,.mais depuis l’installation du compteur linky je ne me suis pas intéressé a l’exploitation des données du linky. Et bizarrement ça ne fonctionne pas.
Possédant quelques esp32, j’ai voulu testé avec.
J’ai donc trouvé plusieurs solutions :

Pour le moment, je n’ai essayé que le montage électronique. Comme le projet donne les sources du code avec l’environnement Arduino, je préférerais passer par esphome…

Sans succès. Je me suis demandé si mon linky avait sa sortie TIC fonctionnelle (précision j’ai fait la demande a engie et mon linky est depuis en mode standard).

Je suis tombé ensuite sur gammatroniques : GammaTroniques - GammaTroniques
Et la vidéo youtube : https://youtu.be/3NFsX_dUdyY?si=glS3Ho8UHeAf8okY

Et j’ai notamment essayé le montage avec le ftdi :

Dans la vidéo youtube degammatronique, il dit notamment que la résistance en entrée peut être retirée si on arrive pas à lire avec l’uart la sortie TIC. Et la en la retirant, j’ai enfin eu quelque chose :

PJOURF+1 00008001 NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE 9
[03][02]
ADSC 811775150598 F
VTIC 02 J
DATE E250609174445 M
NGTF BASE <
LTARF BASE F
EAST 035627991 9
EASF01 035627991 L
EASF02 000000000 #
EASF03 000000000 $
EASF04 000000000 %
EASF05 000000000 &
EASF06 000000000 ’
EASF07 000000000 (
EASF08 000000000 )
EASF09 000000000 *
EASF10 000000000 "
EASD01 011323978 B
EASD02 011700855 <
EASD03 003697295 K
EASD04 008905863 J
IRMS1 003 1
URMS1 235 D
PREF 06 E
PCOUP 06 _
SINSTS 00656 W
SMAXSN E250609111324 04990 B
SMAXSN-1 E250603205232 03990 [
CCASN E250609173000 00690 H
CCASN-1 E250609170000 00808 $
UMOY1 E250609174000 235 7
STGE 003A4001 >
MSG1 PAS DE MESSAGE <
PRM 05163675805536 =
RELAIS 000 B
NTARF 01 N
NJOURF 00 &
NJOURF+1 00 B

Bon, ça me semble prometteur, non ?

Mais dès que je test avec l’esp32, je n’ai plus rien…

Vous auriez une idée ?
Sur f1atb, l’auteur dit qu’il faut une résistance d’au moins 1kohm…

Salut

Il y a des lots de mosfets qui ne respectent pas les brochages

J’ai passé des heures a trouver le problème

Pour enfin comprendre que drain et source était inversé.
Fait un demi tour a ton MOSFET et teste a nouveau.

voir extrait de message sur amazon
image

tu peux voir un exemple d’utilisation

edit

assure toi aussi d’être dans le bon mode historique ou standard c’est important pour la definition du firmware

voir le depot github suivant pour les differentes config

1 « J'aime »

Merci de ton retour !

Je vais réessayer sur une breadboard, j’essaie de te faire un retour vite!

En mode standard, la valeur des résistances est importante… et ce qui est généralement préconisé (2K côté led et 10K côté transistor) ne fonctionne que rarement.
Chez moi ça fonctionne avec une résistance de 2K7 côté LED de l’optocoupleur, et une de 4K7 côté émetteur.

Si ça peut aider voilà mon YAML pour un compteur en mode standard avec un abonnement Tempo

esphome:
  name: esphome-teleinfo
  friendly_name: esp-teleinfo
  min_version: 2024.6.0
  name_add_mac_suffix: false
  project:
    name: esphome.web
    version: dev

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: ""
    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
    icon: mdi:invert-colors
    accuracy_decimals: 0

  #Linky Tempo Couleur du Lendemain######################################
  - platform: template
    name: "STGE couleur demain"
    id: linky_couleur_lendemain
    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() };
      } 


web_server:
1 « J'aime »

Super, Merci beaucoup pour ton retour.

J’ai pas de pompe à désouder pour démonter le mosfet, donc je peux guère tenter pour le moment…
Dès la pompe reçue, modulo le timing, je démonte le mosfet et je tente 2,7kohm et 4,7kohm :wink: