ESPHome décodage ModBus

bonjour,

je veux récupérer les données d’un onduleur Imeon avec ESPHome32 par le protocole Modbus rtu, le fabricant m’a fourni la documentation.
avec celle-ci j’arrive a voir mes trames et visonner les données avec le logiciel "Qmodmaster’

deux exemples :
avec doc fabriquant > trames envoyées et reçu par qmodmaster et logs de ESPHome
récupération du Numéro de série

  • 1 récupération N° de série

    Trames que je récupère avec qmodmaster
    [RTU]>Tx > 18:45:38:609 - 01 03 00 01 00 04 15 C9
    [RTU]>Rx > 18:45:38:857 - 01 03 08 00 00 50 5D 2D 3C 7F EF DC 96

    Trames par ESPHome avec custom_command
    [21:51:27][D][uart_debug:114]: >>> 01:03:00:01:00:04:15:C9:00
    [21:51:27][D][modbus_controller:032]: Modbus command to device=1 register=0xE828 countdown=0 no response received - removed from send queue

  • Récupération de la tension:

    Trames que je récupère avec qmodmaster
    [RTU]>Tx > 18:46:04:110 - 01 03 01 00 00 01 85 F6
    [RTU]>Rx > 18:46:04:110 - 01 03 02 09 41 7E 24

    Trames par ESPHome: avec custom_command
    [14:35:01][D][uart_debug:114]: >>> 01:03:01:00:00:01:85:F6:00
    [14:35:01][D][modbus_controller:032]: Modbus command to device=1 register=0xAB13 countdown=0 no response received - removed from send queue

on s’apercoit que ESPHome envoie :00 en plus a la fin de la trame
je ne sais pas si cela est normal !

voici mon code ESPHome:

uart:
  id: mod_bus
  tx_pin: 17
  rx_pin: 16
  
  baud_rate: 9600
  stop_bits: 1
  debug:
  
modbus:
  
  flow_control_pin: 5
  id: modbus1

modbus_controller:
  - id: imeon
    ## the Modbus device addr
    address: 0x01
    modbus_id: modbus1
    setup_priority: -10

sensor:
  - platform: modbus_controller
    modbus_controller_id: imeon
    name: "numero de série"
    id: numero_de_serie
    custom_command: [ 0x01, 0x03,  0x00,  0x01, 0x00,  0x04, 0x15 ]
    value_type: U_QWORD_R
    
  - platform: modbus_controller
    modbus_controller_id: imeon
    name: "Tension"
    id: tension
    custom_command: [  0x01,  0x03,  0x01,  0x00, 0x00,  0x01, 0x85 ]
    value_type: U_WORD 
    unit_of_measurement: V

value_type: je ne sais pas si c’est bon mais de toute façon je n’ai pas de réponse de l’onduleur
j’espère avoir été clair dans ma demande
merci pour vos réponses

Ma config HA
avec la derrnière version je n’arrive plus a trover l’endroit

Bonjour Lucien,

pour pour ton aide pour mon onduleur IMEON et ESP32 via MODBUS: j’ai bien les remontées de l’onduleur. Il a fallu que je contacte IMEON pour passer la derniere version du Firmware : celle qui etait installée n’activait pas le MODBUS.

J’ai pu grace au support avoir en + acces à Imeon Online, chose que je n’avais pas avant, vu que j’avais acheté l’onduleur en occaz.

Merci pour le partage.

Il me semble que tu envoies un octet de trop dans les commandes.
Je n’ai jamais utilisé le Modbus sure ESPHome, mais je pense que c’est lui qui calcule le checksum.
Pour information, en Modbus le checksum est sur deux octets.

J’ai rapidement regardé la doc ESPHome Modbus.

Tu peux utiliser des commandes standards:

text_sensor:
  - platform: modbus_controller
    modbus_controller_id: imeon
    name: "numero de série"
    id: numero_de_serie
    internal: true
    register_type: holding
    address: 0x0001
    register_count: 4
    raw_encode: HEXBYTES
    response_size: 8

sensor:
  - platform: modbus_controller
    modbus_controller_id: imeon
    name: "Tension"
    id: tension
    register_type: holding
    address: 0x0100
    unit_of_measurement: "V"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

Bonjour,
je viens de m inscrire sur ce forum.

Je suis possesseur d un IMEON3.6
Je voudrais savoir si vous avez réussi à récupérer les infos de l onduleur .
j ai contacter imeon qui m’ont fourni les infos pour le modbus pour les commandes

ca fait un moment que je cherche
j’utilise un ESP32 ou un ESP8266 avec un convertisseur rs485 vers TTL

Pouvez vous m’expliquer comment vous avez procéder ( code et câblage )

Je vous remercie d’avance

bonjour,
j’ai utilisé un esp 32
je vous fourni mon code et le cablage cet après midi

re,
mon code,

uart:
  id: mod_bus
  tx_pin: GPIO1
  rx_pin: GPIO3
  
  baud_rate: 9600
  stop_bits: 1
  debug:

modbus:
  send_wait_time: 1000ms
  flow_control_pin: 5
  id: modbus1

modbus_controller:
  - id: imeon
    ## the Modbus device addr
    address: 0x01
    modbus_id: modbus1
    command_throttle: 2000ms
    setup_priority: -10

sensor:

#######################
# Général Information #
#######################


  - platform: modbus_controller
    modbus_controller_id: imeon
    id: version_imeon
    name: "Version Imeon"
    address: 0x0015
    icon: mdi:numeric
    register_type: holding


###############
# Smart Meter #
###############
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: smart_meter_power
    name: "Puissance Smart Meter"
    address: 0x0600
    unit_of_measurement: "W"
    icon: mdi:transmission-tower-import
    register_type: holding #or register_type: read
    value_type: U_DWORD

      
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: smart_meter_status
    name: "Status Smart Meter"
    address: 0x0602
    register_type: holding #or register_type: read
    value_type: U_WORD

########################     
# AC GRID  - RÉSEAU AC #
########################

  - platform: modbus_controller
    modbus_controller_id: imeon
    id: voltage_reseau
    name: "Tension du réseau AC"
    address: 0x0100  # Tension du réseau AC L1, AC Grid voltage L1
    unit_of_measurement: "V"
    icon: mdi:sine-wave
    register_type: holding # or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
      
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: puissance_reseau
    name: "Puissance du réseau"
    address: 0x0103  # Alimentation réseau AC L1(Connecteur réseau de l'onduleur sans Compteur intelligent), AC Grid power L1 (Grid connector of inverter without 
    unit_of_measurement: "W"
    icon: mdi:sine-wave
    register_type: holding #or register_type: read
    value_type: S_DWORD

  - platform: modbus_controller
    modbus_controller_id: imeon
    id: AC_Grid_frequency 
    name: "Fréquence du réseau AC"
    address: 0x0117  # Fréquence du réseau AC, AC Grid frequency 
    unit_of_measurement: "Hz"
    icon: mdi:sine-wave
    register_type: holding #or register_type: read
    value_type: U_WORD
    
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: AC_Grid_current  
    name: "Courant du réseau AC"
    address: 0x0118  # Courant du réseau CA, AC Grid current 
    unit_of_measurement: "A"
    icon: mdi:sine-wave
    register_type: holding #or register_type: read
    value_type: U_WORD
    
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: Maximum_grid_injection_power
    name: "Puissance d'injection maximale du réseau"
    address: 0x011C  # Puissance d'injection maximale du réseau, Maximum grid injection power
    unit_of_measurement: "W"
    icon: mdi:sine-wave
    register_type: holding #or register_type: read
    value_type: S_DWORD
    
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: AC_Grid_power_factor  
    name: "Facteur de puissance du réseau AC"
    address: 0x011E  # Facteur de puissance du réseau AC, AC Grid power factor 
    icon: mdi:sine-wave
    register_type: holding #or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01
      
##########################     
# AC OUTPUT  - SORTIE AC #
##########################      
      
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: AC_backup_output_voltage
    name: "Tension Backup  de sortie Onduleur"
    address: 0x0200  # Tension de sortie AC, AC output voltage
    unit_of_measurement: "V"
    icon: mdi:sine-wave
    register_type: holding #or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: imeon
    id: AC_output_power
    name: "Puissance Backup sortie Onduleur"
    address: 0x0203  # Puissance de sortie CA L1(Depuis le connecteur de sortie CA de l'onduleur), AC output power(From AC output connector of inverter)
    unit_of_measurement: "W"
    icon: mdi:sine-wave
    register_type: holding #or register_type: read
    value_type: U_DWORD
      
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: AC_output_frequency
    name: "Fréquence Backup sortie Onduleur"
    address: 0x0211 # Fréquence de sortie AC, AC output frequency
    unit_of_measurement: "Hz"
    icon: mdi:sine-wave
    register_type: holding #or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: imeon
    id: AC_output_current
    name: "Courant Backup sortie Onduleur"
    address: 0x0212 # Courant de sortie AC, AC output current
    unit_of_measurement: "V"
    icon: phu:fronius-inverter-gen24
    register_type: holding #or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1
      
##########################      
# Entrée/Sortie Batterie #
##########################
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: batterie_voltage
    name: "Tension Batterie"
    address: 0x0300
    unit_of_measurement: "V"
    icon: mdi:car-battery
    register_type: holding #or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1 
      
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: batterie_courant_charge
    name: "Courant de charge de la batterie"
    address: 0x0301
    unit_of_measurement: "A"
    icon: mdi:car-battery
    register_type: holding #or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1  
      
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: batterie_courant_decharge
    name: "Courant de décharge de la batterie"
    address: 0x0302
    unit_of_measurement: "A"
    icon: mdi:car-battery
    register_type: holding #or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1  
      
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: batterie_etat_de_charge
    name: "Batterie SOC (état de charge)"
    address: 0x0303
    unit_of_measurement: "%"
    icon: mdi:car-battery
    register_type: holding #or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
#    filters:
#      - multiply: 0.1        

  - platform: modbus_controller
    modbus_controller_id: imeon
    id: PV_puissance
    name: "Production Panneaux Solaires"
    address: 0x0400
    unit_of_measurement: "W"
    icon: mdi:solar-power-variant
    register_type: holding #or register_type: read
    value_type: U_DWORD
#    accuracy_decimals: 1
#    filters:
#      - multiply: 0.001 
      
  - platform: modbus_controller
    modbus_controller_id: imeon
    id: tension_panneaux
    name: "Tension Panneaux Solaires"
    address: 0x040A
    unit_of_measurement: "V"
    icon: mdi:solar-power-variant
    register_type: holding #or register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

text_sensor:
  - platform: wifi_info
    ip_address:
      name: ESP IP Address
    ssid:
      name: ESP Connected SSID
    bssid:
      name: ESP Connected BSSID
    mac_address:
      name: ESP Mac Wifi Address
    scan_results:
      name: ESP Latest Scan Results 

  
  - platform: modbus_controller
    modbus_controller_id: imeon
    name: "numero de série"
    id: numero_de_serie
    internal: true
    register_type: holding
    address: 0x0001
    register_count: 4
    raw_encode: HEXBYTES
    response_size: 8

tu me dis si cela fonctionne

Bonjour,
Merci pour le code. :slightly_smiling_face:
J’ai mis sur un ESP32 Mais je n ai pas d infos de l’onduleur.
peut être un souci sur le câblage.

dans le code il y a :

modbus:
  send_wait_time: 1000ms
  flow_control_pin: 5
  id: modbus1

La pin 5 elle doit etre câbler a quel endroit car moi j ai rien dessus

Merci d’avance pour votre réponse

Bonsoir,
la pin 5 n’est pas câblée ( fonctionnement interne)
par contre il te faut un :

TTL vers RS485 Module bilatéral RS485 vers TTL Module de conversion série du port UART 3.3 / 5V Signal d’alimentation

tu le trouve sur amazon, aliexpress, bangood pour 3 à 5 €
pour le branchement sur imeon dis moi si tu arrive pas, je ne l’ai pas devant moi

J’ai aussi le module
RS485 TTL

pour le branchement
je suis partie du rs485A de l’onduleur
RJ45 pin1 Vers la carte (485 TTL) en A
RJ45 Pin2 Vers la carte (485 TTL) en B
RJ45 Pin9 Vers la carte (485 TTL) en Masse

ensuite j alimente la carte 485/TTL avec l 'arduino
et TXD vers TXD
et RXDvers RXD

J ai aussi tester en croisant TXD et RXD

RE.
J ai réussi à avoir les infos de l onduleur

J ai repris depuis le début.
et je pense que le souci venais de la configuration de base de l’esp32.( qui avait été mis par défaut dans esphome de home assistant.)

J ai bien sélectionné le bon type d’esp32 en manuelle
J ai refait tout mon câblage en cas ou.

Et la impec ca fonctionne.

Je te remerci en tout cas pour l’aide que tu m’as apporté :+1: :+1: :grinning:

bonne soirée a toi

content que cela fonctionne
bonne journée

par contre
j ai des incohérence entre les actualisations
exemple % de Batteries passe de 75 % à 44 475 %
et productions panneaux solaire de 0W à 35 505 856 W

et pour le moment j arrive pas à intégrer les valeur pour le module energie de home assistant

bonjour,
j’ai eu le même problème, il m’a fallu créer des capteurs ( templates)
je retrouve ça et te recontacte

re,
sui ce lien:
'Recupérer la valeur d'un compteur a n-1 - #6 par frnchfrgg
frnchfrgg m’avait trouver la solution
voici le code pour import panneaux solaires

template:
  - sensor:
      - name: Puissance Sortie Onduleur en W
        unit_of_measurement: "W"
        device_class: "energy"
        state_class: "measurement"
        state: |
          {%- set t = states('sensor.production_panneaux_solaires')|int(None) -%}
          {%- if t == None or t > 3600 -%}
            {%- set t = this.state|int(None) -%}
          {%- endif -%}
          {{ t }}

3600 est la puissance max de mes panneaux solaire
a+