Remote access to growatt inverter by esp32

I tried every contacts and inverts 1/2 and 7/8 with a short list of sensors, they still appears unknowned.

Configuration :

substitutions:
  name: growatt-spf-5000es
  device_name: growatt #name for all sensors in Home assistant
  device_description: "Esphome for growatt"
  modbus_controller_id: controller1
  modbus_update_interval: 15s #normal update
  skip_updates_slow: "6"  #how many times to skip normal update for slow updating sensors
  update_fast: 15s
  update_slow: 60s

esphome:
  name: ${name}
  friendly_name: Growatt-spf-5000es

esp32:
  board: esp32dev
  framework:
    type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "BTdytLiSzeFUJVSApEK1nPXcWP/xpNbUslT8ItpZkjg="

ota:
  - platform: esphome
    password: "d154aaa014917281620313b967a50e6b"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: ${name}
    password: "Su2cyKVUVtzv"

captive_portal:

web_server:
  port: 80
  
uart:
  id: mod_bus
  tx_pin: 17
  rx_pin: 16
  baud_rate: 9600
  stop_bits: 1
 
modbus:
  id: modbus1
  flow_control_pin: 4 #for use when you use a rs485 board without auto flow control. Like the rs485 max board.

modbus_controller:
  - id: ${modbus_controller_id}
    address: 0x1
    modbus_id: modbus1
    setup_priority: -10
    update_interval: ${modbus_update_interval}


# CAPTEURS
sensor:
  - platform: modbus_controller
    name: ${device_name} status_code
    skip_updates: $skip_updates_slow
    address: 0
    register_type: "read"
    internal: true
    accuracy_decimals: 0
    id: status
  
  - platform: modbus_controller
    name: "${device_name} PV1 voltage"
    address: 01
    register_type: "read"
    unit_of_measurement: V
    device_class: voltage
    icon: mdi:flash
    value_type: U_WORD
    accuracy_decimals: 0
    filters:
    - multiply: 0.1
    
  - platform: modbus_controller
    name: "${device_name} PV1 current"
    address: 07
    register_type: "read"
    unit_of_measurement: A
    device_class: current
    icon: mdi:flash
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1

  - platform: modbus_controller
    name: "${device_name} PV1 power"
    id: pv1_power
    address: 03
    register_type: "read"
    unit_of_measurement: W
    device_class: power
    icon: mdi:flash
    value_type: U_DWORD
    accuracy_decimals: 0
    filters:
    - multiply: 0.1

LOGS :


Logs growatt-spf-5000es.yaml
INFO ESPHome 2025.12.3
INFO Reading configuration /config/esphome/growatt-spf-5000es.yaml...
INFO Starting log output from 192.168.1.52 using esphome API
INFO Successfully resolved growatt-spf-5000es @ 192.168.1.52 in 0.000s
INFO Successfully connected to growatt-spf-5000es @ 192.168.1.52 in 2.161s
INFO Successful handshake with growatt-spf-5000es @ 192.168.1.52 in 0.683s
[16:49:53.822][I][app:194]: ESPHome version 2025.12.2 compiled on Dec 31 2025, 16:23:43
[16:49:53.823][C][logger:261]: Logger:
[16:49:53.823][C][logger:261]:   Max Level: DEBUG
[16:49:53.823][C][logger:261]:   Initial Level: DEBUG
[16:49:53.823][C][logger:267]:   Log Baud Rate: 115200
[16:49:53.823][C][logger:267]:   Hardware UART: UART0
[16:49:53.823][C][logger:274]:   Task Log Buffer Size: 768
[16:49:53.823][C][uart.idf:238]: UART Bus 1:
[16:49:53.823][C][uart.idf:239]:   TX Pin: GPIO17
[16:49:53.824][C][uart.idf:240]:   RX Pin: GPIO16
[16:49:53.826][C][uart.idf:243]:   RX Buffer Size: 256
[16:49:53.826][C][uart.idf:243]:   RX Full Threshold: 8
[16:49:53.826][C][uart.idf:243]:   RX Timeout: 2
[16:49:53.842][C][uart.idf:249]:   Baud Rate: 9600 baud
[16:49:53.842][C][uart.idf:249]:   Data Bits: 8
[16:49:53.842][C][uart.idf:249]:   Parity: NONE
[16:49:53.842][C][uart.idf:249]:   Stop bits: 1
[16:49:53.851][C][modbus:196]: Modbus:
[16:49:53.863][C][modbus:197]:   Flow Control Pin: GPIO4
[16:49:53.863][C][modbus:198]:   Send Wait Time: 250 ms
[16:49:53.863][C][modbus:198]:   CRC Disabled: NO
[16:49:53.863][C][modbus_controller.sensor:017]: modbus_controller.sensorModbus Controller Sensor 'growatt status_code'
[16:49:53.863]modbus_controller.sensor  State Class: ''
[16:49:53.863]modbus_controller.sensor  Unit of Measurement: ''
[16:49:53.863]modbus_controller.sensor  Accuracy Decimals: 0
[16:49:53.883][C][modbus_controller.sensor:017]: modbus_controller.sensorModbus Controller Sensor 'growatt PV1 voltage'
[16:49:53.883]modbus_controller.sensor  State Class: ''
[16:49:53.883]modbus_controller.sensor  Unit of Measurement: 'V'
[16:49:53.883]modbus_controller.sensor  Accuracy Decimals: 0
[16:49:53.883][C][modbus_controller.sensor:027]: modbus_controller.sensor  Device Class: 'voltage'
[16:49:53.891][C][modbus_controller.sensor:031]: modbus_controller.sensor  Icon: 'mdi:flash'
[16:49:53.927][C][modbus_controller.sensor:017]: modbus_controller.sensorModbus Controller Sensor 'growatt PV1 current'
[16:49:53.927]modbus_controller.sensor  State Class: ''
[16:49:53.927]modbus_controller.sensor  Unit of Measurement: 'A'
[16:49:53.927]modbus_controller.sensor  Accuracy Decimals: 1
[16:49:53.944][C][modbus_controller.sensor:027]: modbus_controller.sensor  Device Class: 'current'
[16:49:53.944][C][modbus_controller.sensor:031]: modbus_controller.sensor  Icon: 'mdi:flash'
[16:49:53.944][C][modbus_controller.sensor:017]: modbus_controller.sensorModbus Controller Sensor 'growatt PV1 power'
[16:49:53.944]modbus_controller.sensor  State Class: ''
[16:49:53.944]modbus_controller.sensor  Unit of Measurement: 'W'
[16:49:53.944]modbus_controller.sensor  Accuracy Decimals: 0
[16:49:53.963][C][modbus_controller.sensor:027]: modbus_controller.sensor  Device Class: 'power'
[16:49:53.984][C][modbus_controller.sensor:031]: modbus_controller.sensor  Icon: 'mdi:flash'
[16:49:54.002][C][captive_portal:118]: Captive Portal:
[16:49:54.007][C][wifi:1132]: WiFi:
[16:49:54.007][C][wifi:1132]:   Connected: YES
[16:49:54.008][C][wifi:897]:   Local MAC: EC:E3:34:45:EA:78
[16:49:54.025][C][wifi:904]:   IP Address: 192.168.1.52
[16:49:54.026][C][wifi:908]:   SSID: [redacted]
[16:49:54.026][C][wifi:908]:   BSSID: [redacted]
[16:49:54.026][C][wifi:908]:   Hostname: 'growatt-spf-5000es'
[16:49:54.026][C][wifi:908]:   Signal strength: -19 dB ▂▄▆█
[16:49:54.026][C][wifi:908]:   Channel: 11
[16:49:54.026][C][wifi:908]:   Subnet: 255.255.255.0
[16:49:54.026][C][wifi:908]:   Gateway: 192.168.1.254
[16:49:54.026][C][wifi:908]:   DNS1: 192.168.1.254
[16:49:54.026][C][wifi:908]:   DNS2: 0.0.0.0
[16:49:54.028][C][web_server:335]: Web Server:
[16:49:54.028][C][web_server:335]:   Address: growatt-spf-5000es.local:80
[16:49:54.045][C][esphome.ota:092]: Over-The-Air updates:
[16:49:54.045][C][esphome.ota:092]:   Address: growatt-spf-5000es.local:3232
[16:49:54.045][C][esphome.ota:092]:   Version: 2
[16:49:54.046][C][esphome.ota:099]:   Password configured
[16:49:54.063][C][safe_mode:018]: Safe Mode:
[16:49:54.063][C][safe_mode:018]:   Successful after: 60s
[16:49:54.063][C][safe_mode:018]:   Invoke after: 10 attempts
[16:49:54.063][C][safe_mode:018]:   Duration: 300s
[16:49:54.086][C][web_server.ota:241]: Web Server OTA
[16:49:54.088][C][api:211]: Server:
[16:49:54.088][C][api:211]:   Address: growatt-spf-5000es.local:6053
[16:49:54.088][C][api:211]:   Listen backlog: 4
[16:49:54.088][C][api:211]:   Max connections: 8
[16:49:54.089][C][api:218]:   Noise encryption: YES
[16:49:54.104][C][mdns:177]: mDNS:
[16:49:54.104][C][mdns:177]:   Hostname: growatt-spf-5000es
[16:49:54.108][C][modbus_controller:448]: ModbusController:
[16:49:54.108][C][modbus_controller:448]:   Address: 0x01
[16:49:54.108][C][modbus_controller:448]:   Max Command Retries: 4
[16:49:54.108][C][modbus_controller:448]:   Offline Skip Updates: 0
[16:49:54.108][C][modbus_controller:448]:   Server Courtesy Response:
[16:49:54.108][C][modbus_controller:448]:     Enabled: false
[16:49:54.108][C][modbus_controller:448]:     Register Last Address: 0xFFFF
[16:49:54.108][C][modbus_controller:448]:     Register Value: 0
[16:50:05.074][D][modbus_controller:039]: Modbus command to device=1 register=0x03 no response received - removed from send queue
[16:50:06.416][D][modbus_controller:039]: Modbus command to device=1 register=0x07 no response received - removed from send queue

ESP32 growatt diagnose :

{
  "home_assistant": {
    "installation_type": "Home Assistant OS",
    "version": "2025.12.5",
    "dev": false,
    "hassio": true,
    "virtualenv": false,
    "python_version": "3.13.9",
    "docker": true,
    "arch": "aarch64",
    "timezone": "Europe/Paris",
    "os_name": "Linux",
    "os_version": "6.12.51-haos",
    "container_arch": "aarch64",
    "supervisor": "2025.12.3",
    "host_os": "Home Assistant OS 16.3",
    "docker_version": "28.3.3",
    "chassis": "embedded",
    "run_as_root": true
  },
  "custom_components": {
    "apsystems_ecu_reader": {
      "documentation": "https://github.com/haedwin/homeassistant-apsystems_ecu_reader",
      "version": "2.14.0",
      "requirements": []
    },
    "little_monkey": {
      "documentation": "https://github.com/jmcruvellier/little_monkey/blob/536bcf281fc115496eb14c5bcab834b2e20a7a71/README.md",
      "version": "v1.2.4",
      "requirements": []
    },
    "hacs": {
      "documentation": "https://hacs.xyz/docs/use/",
      "version": "2.0.5",
      "requirements": [
        "aiogithubapi>=22.10.1"
      ]
    },
    "grott": {
      "documentation": "https://github.com/muppet3000/homeassistant-grott",
      "version": "1.1.0",
      "requirements": []
    }
  },
  "integration_manifest": {
    "domain": "esphome",
    "name": "ESPHome",
    "after_dependencies": [
      "hassio",
      "zeroconf",
      "tag"
    ],
    "codeowners": [
      "jesserockz",
      "kbx81",
      "bdraco"
    ],
    "config_flow": true,
    "dependencies": [
      "assist_pipeline",
      "bluetooth",
      "intent",
      "ffmpeg",
      "http"
    ],
    "dhcp": [
      {
        "registered_devices": true
      }
    ],
    "documentation": "https://www.home-assistant.io/integrations/esphome",
    "integration_type": "device",
    "iot_class": "local_push",
    "loggers": [
      "aioesphomeapi",
      "noiseprotocol",
      "bleak_esphome"
    ],
    "mqtt": [
      "esphome/discover/#"
    ],
    "quality_scale": "platinum",
    "requirements": [
      "aioesphomeapi==42.9.0",
      "esphome-dashboard-api==1.3.0",
      "bleak-esphome==3.4.0"
    ],
    "zeroconf": [
      "_esphomelib._tcp.local."
    ],
    "is_built_in": true,
    "overwrites_built_in": false
  },
  "setup_times": {
    "null": {
      "setup": 0.04374384400000508
    },
    "01KCVQXKH238RP1VTZ3PYYNXW7": {
      "wait_import_platforms": -4.371404385999995,
      "config_entry_setup": 4.475791113000014
    },
    "01KD8ET0FW1BM6R68HK1JX74S8": {
      "wait_import_platforms": -4.432033467999986,
      "config_entry_setup": 4.493430802999967
    }
  },
  "data": {
    "config": {
      "created_at": "2025-12-24T15:14:28.476659+00:00",
      "data": {
        "device_name": "growatt-spf-5000es",
        "host": "192.168.1.52",
        "noise_psk": "**REDACTED**",
        "password": "",
        "port": 6053
      },
      "discovery_keys": {
        "dhcp": [
          {
            "__type": "<class 'homeassistant.helpers.discovery_flow.DiscoveryKey'>",
            "repr": "DiscoveryKey(domain='dhcp', key='ece33445ea78', version=1)"
          }
        ],
        "zeroconf": [
          {
            "__type": "<class 'homeassistant.helpers.discovery_flow.DiscoveryKey'>",
            "repr": "DiscoveryKey(domain='zeroconf', key=('_esphomelib._tcp.local.', 'growatt-spf-5000es._esphomelib._tcp.local.'), version=1)"
          }
        ]
      },
      "disabled_by": null,
      "domain": "esphome",
      "entry_id": "01KD8ET0FW1BM6R68HK1JX74S8",
      "minor_version": 1,
      "modified_at": "2025-12-30T12:04:02.889675+00:00",
      "options": {
        "allow_service_calls": false
      },
      "pref_disable_new_entities": false,
      "pref_disable_polling": false,
      "source": "zeroconf",
      "subentries": [],
      "title": "Growatt-spf-5000es",
      "unique_id": "ec:e3:34:45:ea:78",
      "version": 1
    },
    "storage_data": {
      "device_info": {
        "uses_password": false,
        "name": "growatt-spf-5000es",
        "friendly_name": "Growatt-spf-5000es",
        "mac_address": "**REDACTED**",
        "compilation_time": "Dec 31 2025, 16:23:43",
        "model": "esp32dev",
        "manufacturer": "Espressif",
        "has_deep_sleep": false,
        "esphome_version": "2025.12.2",
        "project_name": "",
        "project_version": "",
        "webserver_port": 80,
        "legacy_voice_assistant_version": 0,
        "voice_assistant_feature_flags": 0,
        "legacy_bluetooth_proxy_version": 0,
        "bluetooth_proxy_feature_flags": 0,
        "zwave_proxy_feature_flags": 0,
        "zwave_home_id": 0,
        "suggested_area": "",
        "bluetooth_mac_address": "",
        "api_encryption_supported": true,
        "devices": [],
        "areas": [],
        "area": {
          "area_id": 0,
          "name": ""
        }
      },
      "services": [],
      "api_version": {
        "major": 1,
        "minor": 13
      },
      "select": [],
      "update": [],
      "number": [],
      "sensor": [
        {
          "object_id": "growatt_pv1_voltage",
          "key": 3207486632,
          "name": "growatt PV1 voltage",
          "disabled_by_default": false,
          "icon": "mdi:flash",
          "entity_category": 0,
          "device_id": 0,
          "device_class": "voltage",
          "unit_of_measurement": "V",
          "accuracy_decimals": 0,
          "force_update": false,
          "state_class": 0,
          "legacy_last_reset_type": 0
        },
        {
          "object_id": "growatt_pv1_current",
          "key": 4069468089,
          "name": "growatt PV1 current",
          "disabled_by_default": false,
          "icon": "mdi:flash",
          "entity_category": 0,
          "device_id": 0,
          "device_class": "current",
          "unit_of_measurement": "A",
          "accuracy_decimals": 1,
          "force_update": false,
          "state_class": 0,
          "legacy_last_reset_type": 0
        },
        {
          "object_id": "growatt_pv1_power",
          "key": 4120274761,
          "name": "growatt PV1 power",
          "disabled_by_default": false,
          "icon": "mdi:flash",
          "entity_category": 0,
          "device_id": 0,
          "device_class": "power",
          "unit_of_measurement": "W",
          "accuracy_decimals": 0,
          "force_update": false,
          "state_class": 0,
          "legacy_last_reset_type": 0
        }
      ],
      "text_sensor": []
    },
    "dashboard": {
      "configured": true,
      "supports_update": true,
      "last_update_success": true,
      "last_exception": null,
      "addon": "5c53de3b_esphome",
      "has_matching_name": true,
      "device": {
        "configuration": "growatt-spf-5000es.yaml",
        "current_version": "2025.12.2",
        "deployed_version": "2025.12.2",
        "loaded_integrations": [
          "api",
          "captive_portal",
          "esp32",
          "esphome",
          "json",
          "logger",
          "md5",
          "mdns",
          "modbus",
          "modbus_controller",
          "network",
          "number",
          "ota",
          "preferences",
          "safe_mode",
          "select",
          "sensor",
          "sha256",
          "socket",
          "substitutions",
          "template",
          "text_sensor",
          "uart",
          "web_server",
          "web_server_base",
          "web_server_idf",
          "wifi"
        ],
        "target_platform": "ESP32"
      }
    }
  },
  "issues": []
}

That’s not important. What you need is response. Modbus devices supposed to respond in any case if they receive request in correct slave address. If your register address is wrong or CRC doesn’t match they still give exception response. Which you only see on esphome logs, not on HA.
Check your wiring for loose connections etc, everything has to be rock solid.

Also, the protocl sheet mentions that min interval for requests is 850ms. Add this to your modbus_controller:
command_throttle: 1s

And you didn’t reply, how long is your RS485 wiring?

1 Like

And if I can anyhow read your terrible photos, it looks to me that white wire is between RO and TX2(gpio17), which is incorrect and not what you wrote here.

The wiring RS485 from inverter to TTL converter is aproximatively 150 centimeters.
Do you think it’s too long?

When i used it to communicate between battery and inverter it was 300 centimeters long and communication was good (now i passed it to CAN with the same câble, just changed port and configuration on inverter)

So i should invert RO and DI on MAX485?

It was supposed to be like this…

Rs485 length of 150cm is ok, you don’t need to bother with terminations. I ask because otherwise after 90 posts I find out that it was 150meters…

IT WORKS !!!
you were right, the gpio16 and gpio17 were inverted.
I used pin 1 and 2 from inverter to TTL and i got values in home assistant

I will configure every sensors, make a schematic and give back to the forum my configuration.

Thanks a lot.

You are welcome. If you ever replied correctly to my first question, you saved lot of time…

Now read the protocol sheet well. Most of the values are double registers and you need to set them correctly.

For example if you need “output active power”, you read register 9 set as
value_type: U_DWORD
This way 9 and 10 are combined together.

1 Like

hello, as promised i give you my defintive cabling diagram :

and my ESPHOME configuration, for the moment there is both Bluetooth for my apexium battery (survey, control, program) and RS485 to TTL for my hybrid inverter GROWATT SPF-5000-ES :

substitutions:
  name: growatt-spf-5000es-ble-apexium
  device_name: growatt #name for all sensors in Home assistant
  device_description: "Esphome for growatt"
  modbus_controller_id: controller1
  modbus_update_interval: 15s #normal update
  skip_updates_slow: "6"  #how many times to skip normal update for slow updating sensors
  update_fast: 15s
  update_slow: 60s
  external_components_source: github://syssi/esphome-jk-bms@main
  mac_address: xx:xx:xx:xx:xx
  # Please use "JK02_24S" if you own a old JK-BMS < hardware version 11.0 (hardware version >= 6.0 and < 11.0)
  # Please use "JK02_32S" if you own a new JK-BMS >= hardware version 11.0 (f.e. JK-B2A8S20P hw 11.XW, sw 11.26)
  # Please use "JK04" if you have some old JK-BMS <= hardware version 3.0 (f.e. JK-B2A16S hw 3.0, sw. 3.3.0)
  protocol_version: JK02_32S

esphome:
  name: ${name}
  friendly_name: Growatt-spf-5000es

esp32:
  board: esp32dev
  framework:
    type: esp-idf

external_components:
  - source: ${external_components_source}
    refresh: 0s

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

ota:
  platform: esphome
  on_begin:
    then:
      - switch.turn_off: ble_client_switch0
      - logger.log: "BLE connection suspended for OTA update"
  password: "xxxxx"

logger:
  level: DEBUG
  logs:
    esp32_ble_tracker: INFO
    esp32_ble_client: INFO

esp32_ble_tracker:
  scan_parameters:
    active: false

ble_client:
  - mac_address: ${mac_address}
    id: client0

jk_bms_ble:
  - ble_client_id: client0
    protocol_version: ${protocol_version}
    throttle: 5s
    id: bms0

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: ${name}
    password: "xxxxx"

captive_portal:

web_server:
  port: 80
  
uart:
  id: mod_bus
  tx_pin: 17
  rx_pin: 16
  baud_rate: 9600
  stop_bits: 1
 
modbus:
  id: modbus1
  flow_control_pin: 4 #for use when you use a rs485 board without auto flow control. Like the rs485 max board.

modbus_controller:
  - id: ${modbus_controller_id}
    address: 0x1
    modbus_id: modbus1
    setup_priority: -10
    update_interval: ${modbus_update_interval}

# CAPTEURS
sensor:
- platform: modbus_controller
  name: ${device_name} status_code
  skip_updates: $skip_updates_slow
  address: 0
  register_type: "read"
  internal: true
  accuracy_decimals: 0
  id: status

- platform: modbus_controller
  name: "${device_name} Temp. Onduleur"
  address: 25
  register_type: "read"
  unit_of_measurement: °C
  device_class: temperature
  state_class: measurement    
  icon: mdi:thermometer
  skip_updates: $skip_updates_slow
  value_type: U_WORD
  accuracy_decimals: 2
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} % sortie Onduleur"
  skip_updates: $skip_updates_slow
  address: 27
  register_type: "read"
  unit_of_measurement: "%"
  icon: mdi:home-battery
  value_type: U_WORD
  accuracy_decimals: 0
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} % ventilateur MPPT"
  skip_updates: $skip_updates_slow
  address: 81
  register_type: "read"
  unit_of_measurement: "%"
  icon: mdi:home-battery
  value_type: U_WORD
  accuracy_decimals: 2

- platform: modbus_controller
  name: "${device_name} % ventilateur Onduleur"
  skip_updates: $skip_updates_slow
  address: 82
  register_type: "read"
  unit_of_measurement: "%"
  icon: mdi:home-battery
  value_type: U_WORD
  accuracy_decimals: 2

# onduleur - production PV  
- platform: modbus_controller
  name: "${device_name} PV1 voltage"
  address: 01
  register_type: "read"
  unit_of_measurement: V
  device_class: voltage
  icon: mdi:flash
  value_type: U_WORD
  accuracy_decimals: 0
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} PV1 Temp."
  address: 32
  register_type: "read"
  unit_of_measurement: °C
  device_class: temperature
  state_class: measurement    
  icon: mdi:thermometer
  skip_updates: $skip_updates_slow
  value_type: U_WORD
  accuracy_decimals: 2
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} PV2 voltage"
  address: 02
  register_type: "read"
  unit_of_measurement: V
  device_class: voltage
  icon: mdi:flash
  value_type: U_WORD
  accuracy_decimals: 0
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} PV2 Temp."
  address: 33
  register_type: "read"
  unit_of_measurement: °C
  device_class: temperature
  state_class: measurement    
  icon: mdi:thermometer
  skip_updates: $skip_updates_slow
  value_type: U_WORD
  accuracy_decimals: 2
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} PV1 current"
  address: 07
  register_type: "read"
  unit_of_measurement: A
  device_class: current
  icon: mdi:flash
  value_type: U_WORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} PV2 current"
  address: 08
  register_type: "read"
  unit_of_measurement: A
  device_class: current
  icon: mdi:flash
  value_type: U_WORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} PV1 power"
  id: pv1_power
  address: 03
  register_type: "read"
  unit_of_measurement: W
  device_class: power
  icon: mdi:flash
  value_type: U_DWORD
  accuracy_decimals: 0
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} PV2 power"
  id: pv2_power
  address: 05
  register_type: "read"
  unit_of_measurement: W
  device_class: power
  icon: mdi:flash
  value_type: U_DWORD
  accuracy_decimals: 0
  filters:
    - multiply: 0.1

- platform: template
  id: pv_power
  name: "${device_name} PV Power"
  unit_of_measurement: W
  device_class: power
  state_class: measurement
  icon: mdi:solar-power-variant
  accuracy_decimals: 0
  lambda: |-
    return float((id(pv1_power).state)+(id(pv2_power).state));
  update_interval: ${update_fast}

# onduleur - PV - somme jour
- platform: modbus_controller
  name: "${device_name} Prod PV total jour"
  skip_updates: $skip_updates_slow
  address: 48
  register_type: "read"
  unit_of_measurement: kWh
  state_class: total_increasing
  device_class: energy
  icon: mdi:solar-power
  value_type: U_DWORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

# onduleur - PV - somme total
- platform: modbus_controller
  name: "${device_name} Prod PV total"
  skip_updates: $skip_updates_slow
  address: 50
  register_type: "read"
  unit_of_measurement: kWh
  state_class: total_increasing
  device_class: energy
  icon: mdi:solar-power
  value_type: U_DWORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

# onduleur - puissance sortie
- platform: modbus_controller
  name: "${device_name} Puissance sortie"
  id: puissance_sortie
  address: 09
  register_type: "read"
  unit_of_measurement: W
  device_class: power
  icon: mdi:flash
  value_type: U_DWORD
  accuracy_decimals: 0
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} Puissance tiree"
  id: puissance_tiree
  address: 36
  register_type: "read"
  unit_of_measurement: W
  device_class: power
  icon: mdi:flash
  value_type: U_DWORD
  accuracy_decimals: 2
  filters:
    - multiply: 0.1

# onduleur - puissance tiree EDF
- platform: modbus_controller
  name: "${device_name} Charge depuis reseau"
  id: acquis_edf
  address: 13
  register_type: "read"
  unit_of_measurement: W
  device_class: power
  icon: mdi:flash
  value_type: U_DWORD
  accuracy_decimals: 0
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} Tire EDF total jour"
  skip_updates: $skip_updates_slow
  address: 56
  register_type: "read"
  unit_of_measurement: kWh
  state_class: total_increasing
  device_class: energy
  icon: mdi:solar-power
  value_type: U_DWORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} Tire EDF total"
  skip_updates: $skip_updates_slow
  address: 58
  register_type: "read"
  unit_of_measurement: kWh
  state_class: total_increasing
  device_class: energy
  icon: mdi:solar-power
  value_type: U_DWORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} Conso EDF total jour"
  skip_updates: $skip_updates_slow
  address: 64
  register_type: "read"
  unit_of_measurement: kWh
  state_class: total_increasing
  device_class: energy
  icon: mdi:solar-power
  value_type: U_DWORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} Conso EDF total"
  skip_updates: $skip_updates_slow
  address: 66
  register_type: "read"
  unit_of_measurement: kWh
  state_class: total_increasing
  device_class: energy
  icon: mdi:solar-power
  value_type: U_DWORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

# onduleur - batterie
- platform: modbus_controller
  name: "${device_name} Batt. Volt."
  address: 17
  register_type: "read"
  unit_of_measurement: V
  device_class: voltage
  icon: mdi:flash
  value_type: U_WORD
  accuracy_decimals: 3
  filters:
    - multiply: 0.01

- platform: modbus_controller
  name: "${device_name} Temp. Batt."
  address: 26
  register_type: "read"
  unit_of_measurement: °C
  device_class: temperature
  state_class: measurement    
  icon: mdi:thermometer
  skip_updates: $skip_updates_slow
  value_type: U_WORD
  accuracy_decimals: 2
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} Batt SoC"
  skip_updates: $skip_updates_slow
  address: 18
  register_type: "read"
  unit_of_measurement: "%"
  icon: mdi:home-battery
  value_type: U_WORD
  accuracy_decimals: 0

- platform: modbus_controller
  name: "${device_name} Decharge Batt total jour"
  skip_updates: $skip_updates_slow
  address: 60
  register_type: "read"
  unit_of_measurement: kWh
  state_class: total_increasing
  device_class: energy
  icon: mdi:solar-power
  value_type: U_DWORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} Decharge Batt total"
  skip_updates: $skip_updates_slow
  address: 62
  register_type: "read"
  unit_of_measurement: kWh
  state_class: total_increasing
  device_class: energy
  icon: mdi:solar-power
  value_type: U_DWORD
  accuracy_decimals: 1
  filters:
    - multiply: 0.1

# onduleur - tension E/S
- platform: modbus_controller
  name: "${device_name} tension EDF"
  address: 20
  register_type: "read"
  unit_of_measurement: V
  device_class: voltage
  icon: mdi:flash
  value_type: U_WORD
  accuracy_decimals: 0
  filters:
    - multiply: 0.1

- platform: modbus_controller
  name: "${device_name} tension Onduleur"
  address: 22
  register_type: "read"
  unit_of_measurement: V
  device_class: voltage
  icon: mdi:flash
  value_type: U_WORD
  accuracy_decimals: 0
  filters:
    - multiply: 0.1

# onduleur - tension CC vers batt.
- platform: modbus_controller
  name: "${device_name} tension CC vers Batt."
  address: 24
  register_type: "read"
  unit_of_measurement: V
  device_class: voltage
  icon: mdi:flash
  value_type: U_WORD
  accuracy_decimals: 2
  filters:
    - multiply: 0.1

- platform: jk_bms_ble
  jk_bms_ble_id: bms0
  min_cell_voltage:
    name: "${name} min cell voltage"
  max_cell_voltage:
    name: "${name} max cell voltage"
  min_voltage_cell:
    name: "${name} min voltage cell"
  max_voltage_cell:
    name: "${name} max voltage cell"
  delta_cell_voltage:
    name: "${name} delta cell voltage"
  average_cell_voltage:
    name: "${name} average cell voltage"
  cell_voltage_1:
    name: "${name} cell voltage 1"
  cell_voltage_2:
    name: "${name} cell voltage 2"
  cell_voltage_3:
    name: "${name} cell voltage 3"
  cell_voltage_4:
    name: "${name} cell voltage 4"
  cell_voltage_5:
    name: "${name} cell voltage 5"
  cell_voltage_6:
    name: "${name} cell voltage 6"
  cell_voltage_7:
    name: "${name} cell voltage 7"
  cell_voltage_8:
    name: "${name} cell voltage 8"
  cell_voltage_9:
    name: "${name} cell voltage 9"
  cell_voltage_10:
    name: "${name} cell voltage 10"
  cell_voltage_11:
    name: "${name} cell voltage 11"
  cell_voltage_12:
    name: "${name} cell voltage 12"
  cell_voltage_13:
    name: "${name} cell voltage 13"
  cell_voltage_14:
    name: "${name} cell voltage 14"
  cell_voltage_15:
    name: "${name} cell voltage 15"
  cell_voltage_16:
    name: "${name} cell voltage 16"
  cell_resistance_1:
    name: "${name} cell resistance 1"
  cell_resistance_2:
    name: "${name} cell resistance 2"
  cell_resistance_3:
    name: "${name} cell resistance 3"
  cell_resistance_4:
    name: "${name} cell resistance 4"
  cell_resistance_5:
    name: "${name} cell resistance 5"
  cell_resistance_6:
    name: "${name} cell resistance 6"
  cell_resistance_7:
    name: "${name} cell resistance 7"
  cell_resistance_8:
    name: "${name} cell resistance 8"
  cell_resistance_9:
    name: "${name} cell resistance 9"
  cell_resistance_10:
    name: "${name} cell resistance 10"
  cell_resistance_11:
    name: "${name} cell resistance 11"
  cell_resistance_12:
    name: "${name} cell resistance 12"
  cell_resistance_13:
    name: "${name} cell resistance 13"
  cell_resistance_14:
    name: "${name} cell resistance 14"
  cell_resistance_15:
    name: "${name} cell resistance 15"
  cell_resistance_16:
    name: "${name} cell resistance 16"
  total_voltage:
    name: "${name} total voltage"
  current:
    name: "${name} current"
  heating_current:
    name: "${name} heating current"
  power:
    name: "${name} power"
  charging_power:
    name: "${name} charging power"
  discharging_power:
    name: "${name} discharging power"
  temperature_sensor_1:
    name: "${name} temperature sensor 1"
  temperature_sensor_2:
    name: "${name} temperature sensor 2"
  temperature_sensor_3:
    name: "${name} temperature sensor 3"
  temperature_sensor_4:
    name: "${name} temperature sensor 4"
  temperature_sensor_5:
    name: "${name} temperature sensor 5"
  power_tube_temperature:
    name: "${name} power tube temperature"
  balancing:
    name: "${name} balancing"
  state_of_charge:
    name: "${name} state of charge"
  state_of_health:
    name: "${name} state of health"
  capacity_remaining:
    name: "${name} capacity remaining"
  total_battery_capacity_setting:
    name: "${name} total battery capacity setting"
  charging_cycles:
    name: "${name} charging cycles"
  total_charging_cycle_capacity:
    name: "${name} total charging cycle capacity"
  total_runtime:
    name: "${name} total runtime"
  balancing_current:
    name: "${name} balancing current"
  errors_bitmask:
    name: "${name} errors bitmask"
  emergency_time_countdown:
    name: "${name} emergency time countdown"
  charge_status_id:
    name: "${name} charge status id"
  charge_status_time_elapsed:
    name: "${name} charge status time elapsed"

binary_sensor:
  - platform: jk_bms_ble
    balancing:
      name: "${name} balancing"
    charging:
      name: "${name} charging"
    discharging:
      name: "${name} discharging"
    heating:
      name: "${name} heating"
    online_status:
      name: "${name} online status"
    dry_contact_1:
      name: "${name} dry contact 1"
    dry_contact_2:
      name: "${name} dry contact 2"

button:
  - platform: jk_bms_ble
    retrieve_settings:
      name: "${name} retrieve settings"
    retrieve_device_info:
      name: "${name} retrieve device info"

number:
  - platform: jk_bms_ble
    jk_bms_ble_id: bms0
    balance_trigger_voltage:
      name: "${name} balance trigger voltage"
    cell_count:
      name: "${name} cell count"
    total_battery_capacity:
      name: "${name} total battery capacity"
    cell_voltage_overvoltage_protection:
      name: "${name} cell voltage overvoltage protection"
    cell_voltage_overvoltage_recovery:
      name: "${name} cell voltage overvoltage recovery"
    cell_voltage_undervoltage_protection:
      name: "${name} cell voltage undervoltage protection"
    cell_voltage_undervoltage_recovery:
      name: "${name} cell voltage undervoltage recovery"
    balance_starting_voltage:
      name: "${name} balance starting voltage"
    voltage_calibration:
      name: "${name} voltage calibration"
    current_calibration:
      name: "${name} current calibration"
    power_off_voltage:
      name: "${name} power off voltage"
    max_balance_current:
      name: "${name} max balance current"
    max_charge_current:
      name: "${name} max charge current"
    max_discharge_current:
      name: "${name} max discharge current"
    smart_sleep_voltage:
      name: "${name} smart sleep voltage"
    cell_soc100_voltage:
      name: "${name} cell soc100 voltage"
    cell_soc0_voltage:
      name: "${name} cell soc0 voltage"
    cell_request_charge_voltage:
      name: "${name} cell request charge voltage"
    cell_request_float_voltage:
      name: "${name} cell request float voltage"
    cell_request_charge_voltage_time:
      name: "${name} cell request charge voltage time"
    cell_request_float_voltage_time:
      name: "${name} cell request float voltage time"
    charge_overcurrent_protection_delay:
      name: "${name} charge overcurrent protection delay"
    charge_overcurrent_protection_recovery_time:
      name: "${name} charge overcurrent protection recovery time"
    discharge_overcurrent_protection_delay:
      name: "${name} discharge overcurrent protection delay"
    discharge_overcurrent_protection_recovery_time:
      name: "${name} discharge overcurrent protection recovery time"
    short_circuit_protection_delay:
      name: "${name} short circuit protection delay"
    short_circuit_protection_recovery_time:
      name: "${name} short circuit protection recovery time"
    charge_overtemperature_protection:
      name: "${name} charge overtemperature protection"
    charge_overtemperature_protection_recovery:
      name: "${name} charge overtemperature protection recovery"
    discharge_overtemperature_protection:
      name: "${name} discharge overtemperature protection"
    discharge_overtemperature_protection_recovery:
      name: "${name} discharge overtemperature protection recovery"
    charge_undertemperature_protection:
      name: "${name} charge undertemperature protection"
    charge_undertemperature_protection_recovery:
      name: "${name} charge undertemperature protection recovery"
    power_tube_overtemperature_protection:
      name: "${name} power tube overtemperature protection"
    power_tube_overtemperature_protection_recovery:
      name: "${name} power tube overtemperature protection recovery"
    discharge_precharge_time:
      name: "${name} discharge precharge time"
    heating_start_temperature:
      name: "${name} heating start temperature"
    heating_stop_temperature:
      name: "${name} heating stop temperature"

switch:
  - platform: jk_bms_ble
    charging:
      name: "${name} charging"
    discharging:
      name: "${name} discharging"
    balancer:
      name: "${name} balancer"
    emergency:
      name: "${name} emergency"
    heating:
      name: "${name} heating"
    disable_temperature_sensors:
      name: "${name} disable temperature sensors"
    display_always_on:
      name: "${name} display always on"
    smart_sleep:
      name: "${name} smart sleep"
    disable_pcl_module:
      name: "${name} disable pcl module"
    timed_stored_data:
      name: "${name} timed stored data"
    charging_float_mode:
      name: "${name} charging float mode"

  - platform: ble_client
    ble_client_id: client0
    name: "${name} enable bluetooth connection"
    id: ble_client_switch0

text_sensor:
  - platform: jk_bms_ble
    errors:
      name: "${name} errors"
    total_runtime_formatted:
      name: "${name} total runtime formatted"
    charge_status:
      name: "${name} charge status"
    software_version:
      name: "${name} software version"
    hardware_version:
      name: "${name} hardware version"   
  • you can see that password needs to be replaced by your own password.

in a second time i will insert controls for the inverter.