substitutions: updates: 5s name: "rvbattsg5k" bms0: "${name} bms0" bms1: "${name} bms1" device_description: "Integrated SRNE and JBD BMS Monitor/Control" external_components_source: github://syssi/esphome-jbd-bms@main bms0_mac_address: A4:C1:37:11:2C:14 bms1_mac_address: 70:3e:97:07:c0:3f esphome: name: ${name} project: name: "syssi.esphome-jbd-bms" version: 2.0.0 on_boot: priority: -10 then: - lambda: |- auto time = id(sntp_time).now(); ESP_LOGD("Time Update", "Current time: %04d-%02d-%02d %02d:%02d:%02d", time.year, time.month, time.day_of_month, time.hour, time.minute, time.second); uint16_t year_month = ((time.year % 100) << 8) | time.month; uint16_t day_hour = (time.day_of_month << 8) | time.hour; uint16_t minute_second = (time.minute << 8) | time.second; ESP_LOGD("Time Update", "Year/Month: 0x%04X, Day/Hour: 0x%04X, Minute/Second: 0x%04X", year_month, day_hour, minute_second); id(srne)->send(0x06, 0x020C, year_month); id(srne)->send(0x06, 0x020D, day_hour); id(srne)->send(0x06, 0x020E, minute_second); esp32: board: esp32dev framework: type: esp-idf sdkconfig_options: CONFIG_FREERTOS_UNICORE: y partitions: "/config/esphome/no_fs.csv" external_components: - source: ${external_components_source} refresh: 0s # Enable logging logger: level: INFO # Enable Home Assistant API api: encryption: key: "88888888" ota: - platform: esphome password: "888888" wifi: networks: - ssid: !secret wifi_ssid2 password: !secret wifi_password2 - ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "${name} Fallback Hotspot" password: "KosRJpr7nlJf" captive_portal: time: - platform: sntp id: sntp_time timezone: "CST6CDT,M3.2.0,M11.1.0" #https://sites.google.com/a/usapiens.com/opnode/time-zones servers: - "0.pool.ntp.org" - "1.pool.ntp.org" - "2.pool.ntp.org" # on_time: # - seconds: 59 # minutes: 59 # hours: 23 esp32_ble_server: manufacturer: "ARV LLC" model: "ESP2SRNE-JBD" esp32_ble_tracker: scan_parameters: active: false ble_client: - mac_address: ${bms0_mac_address} id: client0 - mac_address: ${bms1_mac_address} id: client1 jbd_bms_ble: - id: bms0 ble_client_id: client0 update_interval: 5s # - id: bms1 # ble_client_id: client1 # update_interval: 5s web_server: port: 80 version: 3 # Version 3 allows for better organization of entities local: true # Serve assets locally to not require internet access sorting_groups: - id: cb name: "Control Board" sorting_weight: -10 - id: iset name: "Inverter Settings" sorting_weight: -9 - id: istats name: "Inverter Stats" sorting_weight: -7 - id: bsum name: "BMS Summary" sorting_weight: -8 - id: bcell name: "BMS Cell Stats" sorting_weight: -6 uart: - id: mod_bus tx_pin: 19 rx_pin: 18 baud_rate: 9600 data_bits: 8 stop_bits: 1 rx_buffer_size: 1024 modbus: uart_id: mod_bus id: tdt1_modbus send_wait_time: 200ms flow_control_pin: 4 # disable_crc: true modbus_controller: - id: srne address: '1' modbus_id: tdt1_modbus command_throttle: 200ms setup_priority: -10 update_interval: 5s #data refresh rate offline_skip_updates: 15 binary_sensor: - platform: status name: ${name}_status - platform: jbd_bms_ble jbd_bms_ble_id: bms0 balancing: name: "${bms0} balancing" web_server: sorting_group_id: bsum charging: name: "${bms0} charging" web_server: sorting_group_id: bsum discharging: name: "${bms0} discharging" web_server: sorting_group_id: bsum online_status: name: "${bms0} online status" web_server: sorting_group_id: bsum # - platform: jbd_bms_ble # jbd_bms_ble_id: bms1 # balancing: # name: "${bms1} balancing" # web_server: # sorting_group_id: bsum # charging: # name: "${bms1} charging" # web_server: # sorting_group_id: bsum # discharging: # name: "${bms1} discharging" # web_server: # sorting_group_id: bsum # online_status: # name: "${bms1} online status" # web_server: # sorting_group_id: bsum ##### Update Inverter time once a year ###### interval: - interval: 365d # Update every year then: - lambda: |- auto time = id(sntp_time).now(); ESP_LOGD("Time Update", "Current time: %04d-%02d-%02d %02d:%02d:%02d", time.year, time.month, time.day_of_month, time.hour, time.minute, time.second); uint16_t year_month = ((time.year % 100) << 8) | time.month; uint16_t day_hour = (time.day_of_month << 8) | time.hour; uint16_t minute_second = (time.minute << 8) | time.second; ESP_LOGD("Time Update", "Year/Month: 0x%04X, Day/Hour: 0x%04X, Minute/Second: 0x%04X", year_month, day_hour, minute_second); id(srne)->send(0x06, 0x020C, year_month); id(srne)->send(0x06, 0x020D, day_hour); id(srne)->send(0x06, 0x020E, minute_second); sensor: # JBD BMS0 - platform: jbd_bms_ble jbd_bms_ble_id: bms0 battery_strings: name: "${bms0} battery strings" current: name: "${bms0} current" web_server: sorting_group_id: bsum power: name: "${bms0} power" web_server: sorting_group_id: bsum charging_power: name: "${bms0} charging power" discharging_power: name: "${bms0} discharging power" state_of_charge: name: "${bms0} state of charge" web_server: sorting_group_id: bsum nominal_capacity: name: "${bms0} nominal capacity" web_server: sorting_group_id: bsum charging_cycles: name: "${bms0} charging cycles" web_server: sorting_group_id: bsum capacity_remaining: name: "${bms0} capacity remaining" web_server: sorting_group_id: bsum battery_cycle_capacity: name: "${bms0} battery cycle capacity" web_server: sorting_group_id: bsum total_voltage: name: "${bms0} total voltage" web_server: sorting_group_id: bsum average_cell_voltage: name: "${bms0} average cell voltage" web_server: sorting_group_id: bsum delta_cell_voltage: name: "${bms0} delta cell voltage" min_cell_voltage: name: "${bms0} min cell voltage" web_server: sorting_group_id: bsum max_cell_voltage: name: "${bms0} max cell voltage" web_server: sorting_group_id: bsum min_voltage_cell: name: "${bms0} min voltage cell" max_voltage_cell: name: "${bms0} max voltage cell" temperature_1: name: "${bms0} temperature 1" web_server: sorting_group_id: bsum temperature_2: name: "${bms0} temperature 2" web_server: sorting_group_id: bsum temperature_3: name: "${bms0} temperature 3" web_server: sorting_group_id: bsum # temperature_4: # name: "${bms0} temperature 4" # temperature_5: # name: "${bms0} temperature 5" # temperature_6: # name: "${bms0} temperature 6" cell_voltage_1: name: "${bms0} cell voltage 1" web_server: sorting_group_id: bcell cell_voltage_2: name: "${bms0} cell voltage 2" web_server: sorting_group_id: bcell cell_voltage_3: name: "${bms0} cell voltage 3" web_server: sorting_group_id: bcell cell_voltage_4: name: "${bms0} cell voltage 4" web_server: sorting_group_id: bcell cell_voltage_5: name: "${bms0} cell voltage 5" web_server: sorting_group_id: bcell cell_voltage_6: name: "${bms0} cell voltage 6" web_server: sorting_group_id: bcell cell_voltage_7: name: "${bms0} cell voltage 7" web_server: sorting_group_id: bcell cell_voltage_8: name: "${bms0} cell voltage 8" web_server: sorting_group_id: bcell cell_voltage_9: name: "${bms0} cell voltage 9" web_server: sorting_group_id: bcell cell_voltage_10: name: "${bms0} cell voltage 10" web_server: sorting_group_id: bcell cell_voltage_11: name: "${bms0} cell voltage 11" web_server: sorting_group_id: bcell cell_voltage_12: name: "${bms0} cell voltage 12" web_server: sorting_group_id: bcell cell_voltage_13: name: "${bms0} cell voltage 13" web_server: sorting_group_id: bcell cell_voltage_14: name: "${bms0} cell voltage 14" web_server: sorting_group_id: bcell cell_voltage_15: name: "${bms0} cell voltage 15" web_server: sorting_group_id: bcell cell_voltage_16: name: "${bms0} cell voltage 16" web_server: sorting_group_id: bcell operation_status_bitmask: name: "${bms0} operation status bitmask" errors_bitmask: name: "${bms0} errors bitmask" balancer_status_bitmask: name: "${bms0} balancer status bitmask" software_version: name: "${bms0} software version" # #JBD BMS1 # - platform: jbd_bms_ble # jbd_bms_ble_id: bms1 # battery_strings: # name: "${bms1} battery strings" # current: # name: "${bms1} current" # power: # name: "${bms1} power" # charging_power: # name: "${bms1} charging power" # discharging_power: # name: "${bms1} discharging power" # state_of_charge: # name: "${bms1} state of charge" # nominal_capacity: # name: "${bms1} nominal capacity" # charging_cycles: # name: "${bms1} charging cycles" # capacity_remaining: # name: "${bms1} capacity remaining" # battery_cycle_capacity: # name: "${bms1} battery cycle capacity" # total_voltage: # name: "${bms1} total voltage" # average_cell_voltage: # name: "${bms1} average cell voltage" # delta_cell_voltage: # name: "${bms1} delta cell voltage" # min_cell_voltage: # name: "${bms1} min cell voltage" # max_cell_voltage: # name: "${bms1} max cell voltage" # min_voltage_cell: # name: "${bms1} min voltage cell" # max_voltage_cell: # name: "${bms1} max voltage cell" # temperature_1: # name: "${bms1} temperature 1" # temperature_2: # name: "${bms1} temperature 2" # temperature_3: # name: "${bms1} temperature 3" # temperature_4: # name: "${bms1} temperature 4" # temperature_5: # name: "${bms1} temperature 5" # temperature_6: # name: "${bms1} temperature 6" # cell_voltage_1: # name: "${bms1} cell voltage 1" # cell_voltage_2: # name: "${bms1} cell voltage 2" # cell_voltage_3: # name: "${bms1} cell voltage 3" # cell_voltage_4: # name: "${bms1} cell voltage 4" # cell_voltage_5: # name: "${bms1} cell voltage 5" # cell_voltage_6: # name: "${bms1} cell voltage 6" # cell_voltage_7: # name: "${bms1} cell voltage 7" # cell_voltage_8: # name: "${bms1} cell voltage 8" # cell_voltage_9: # name: "${bms1} cell voltage 9" # cell_voltage_10: # name: "${bms1} cell voltage 10" # cell_voltage_11: # name: "${bms1} cell voltage 11" # cell_voltage_12: # name: "${bms1} cell voltage 12" # cell_voltage_13: # name: "${bms1} cell voltage 13" # cell_voltage_14: # name: "${bms1} cell voltage 14" # cell_voltage_15: # name: "${bms1} cell voltage 15" # cell_voltage_16: # name: "${bms1} cell voltage 16" # operation_status_bitmask: # name: "${bms1} operation status bitmask" # errors_bitmask: # name: "${bms1} errors bitmask" # balancer_status_bitmask: # name: "${bms1} balancer status bitmask" # software_version: # name: "${bms1} software version" # - platform: modbus_controller # modbus_controller_id: srne # name: "Example Sensor" # address: 0x100 # register_type: holding # value_type: U_WORD # on_value_range: # - above: -999999 # Trigger for any read attempt # then: # - lambda: |- # if (x == -1) { // Assuming -1 indicates an error # id(modbus_error_count) += 1; # } else { # id(modbus_error_count) = 0; // Reset on success # } # if (id(modbus_error_count) > 3) { # id(modbus_update_interval) = "60s"; // Slow down updates # } else { # id(modbus_update_interval) = "5s"; // Normal update rate # } - platform: uptime name: "${name} Uptime" id: ${name}_uptime_sec filters: - lambda: |- if ((uint64_t) x > 31536000U) { return (uint64_t) x % 31536000U; // Limit uptime to 1 year } return (uint64_t) x; - platform: modbus_controller modbus_controller_id: srne name: "${name} Time Year Month" address: 0x020C register_type: holding value_type: U_WORD #update_interval: 60s id: ${name}_time_year_month - platform: modbus_controller modbus_controller_id: srne name: "${name} Time Day Hour" address: 0x020D value_type: U_WORD register_type: holding #update_interval: 60s id: ${name}_time_day_hour - platform: modbus_controller modbus_controller_id: srne name: "${name} Time Minute Second" address: 0x020E value_type: U_WORD register_type: holding #update_interval: 60s id: ${name}_time_minute_second # - platform: modbus_controller # modbus_controller_id: srne # name: "Software Version" # id: ${name}_swver # address: 0x014 # register_type: holding # register_count: 2 # value_type: U_WORD # accuracy_decimals: 3 # #skip_updates: 1000 # - platform: modbus_controller # modbus_controller_id: srne # name: "CB HW Version" # id: ${name}_CBhwver # address: 0x016 # register_type: holding # register_count: 2 # value_type: U_WORD # accuracy_decimals: 3 # skip_updates: 1000 # - platform: modbus_controller # modbus_controller_id: srne # name: "PB HW Version" # id: ${name}_PBhwver # address: 0x017 # register_type: holding # register_count: 2 # value_type: U_WORD # accuracy_decimals: 3 # skip_updates: 1000 # - platform: modbus_controller # modbus_controller_id: srne # id: ${name}_product_serial_number # name: "Serial Number" # register_type: holding # address: 0x018 # value_type: U_DWORD # #response_size: 4 # register_count: 2 # #response_size: 4 # #raw_encode: NONE - platform: modbus_controller modbus_controller_id: srne name: "Total Running Days" id: ${name}_total_running_days address: 0x0F031 register_type: holding value_type: U_WORD accuracy_decimals: 1 skip_updates: 1000 # - platform: modbus_controller # modbus_controller_id: srne # name: "BMS Protocol" # id: ${name}_bmsproto # address: 0x0E21B # register_type: holding # value_type: U_WORD # skip_updates: 1000 - platform: modbus_controller modbus_controller_id: srne name: "Battery Voltage" id: ${name}_battery_voltage address: 0x101 unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne name: "Battery Current" id: ${name}_battery_current address: 0x102 unit_of_measurement: "A" register_type: holding value_type: S_WORD accuracy_decimals: 1 filters: - multiply: -0.1 web_server: sorting_group_id: istats - platform: template name: "Battery Power" id: ${name}_battery_power unit_of_measurement: "W" lambda: |- return (id(${name}_battery_voltage).state * id(${name}_battery_current).state); accuracy_decimals: 1 device_class: power update_interval: 1s web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne name: "MPPT 1 Voltage" id: ${name}_mppt1_voltage address: 0x107 unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne name: "MPPT 1 Current" id: ${name}_mppt1_current address: 0x108 unit_of_measurement: "A" register_type: holding value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne name: "MPPT 1 Power" id: ${name}_mppt1_power address: 0x109 unit_of_measurement: "W" register_type: holding value_type: U_WORD device_class: Power accuracy_decimals: 1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne name: "Charge Power" id: ${name}_charge_power address: 0x10E unit_of_measurement: "W" register_type: holding value_type: U_WORD accuracy_decimals: 1 web_server: sorting_group_id: istats # - platform: modbus_controller # modbus_controller_id: srne # name: "MPPT 2 Voltage" # id: ${name}_mppt2_voltage # address: 0x10F # unit_of_measurement: "V" # register_type: holding # value_type: U_WORD # accuracy_decimals: 1 # filters: # - multiply: 0.1 # web_server: # sorting_group_id: istats # - platform: modbus_controller # modbus_controller_id: srne # name: "MPPT 2 Current" # id: ${name}_mppt2_current # address: 0x110 # unit_of_measurement: "A" # register_type: holding # value_type: U_WORD # accuracy_decimals: 1 # filters: # - multiply: 0.1 # - platform: modbus_controller # modbus_controller_id: srne # name: "MPPT 2 Power" # id: ${name}_mppt2_power # address: 0x111 # unit_of_measurement: "W" # register_type: holding # value_type: U_WORD # device_class: Power # accuracy_decimals: 1 - platform: template name: "Solar Power" id: ${name}_solar_power unit_of_measurement: "W" lambda: |- return (id(${name}_mppt1_power).state); accuracy_decimals: 0 device_class: Power update_interval: 1s #Inverter Data - platform: modbus_controller modbus_controller_id: srne id: ${name}_battery_rated_voltage name: "Rated Voltage" address: 0x204 unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: 1 skip_updates: 1000 filters: - multiply: 0.01 web_server: sorting_group_id: istats # - platform: modbus_controller # modbus_controller_id: srne # id: ${name}_time_year # name: "Time Year" # address: 0x020C # register_type: holding # bitmask: 0xFF00 # value_type: U_WORD - platform: modbus_controller modbus_controller_id: srne id: ${name}_grid_voltage name: "Grid Voltage" address: 0x213 unit_of_measurement: "V" register_type: holding value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 web_server: sorting_group_id: istats # - platform: modbus_controller # modbus_controller_id: srne # id: ${name}_grid_voltage_b # name: "Grid Voltage B" # address: 0x022A # unit_of_measurement: "V" # register_type: holding # value_type: U_WORD # accuracy_decimals: 1 # filters: # - multiply: 0.1 # web_server: # sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_grid_current_a name: "Grid Current" address: 0x214 unit_of_measurement: "A" register_type: holding value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 web_server: sorting_group_id: istats # - platform: modbus_controller # modbus_controller_id: srne # id: ${name}_grid_current_b # name: "Grid Current B" # address: 0x0238 # unit_of_measurement: "A" # register_type: holding # value_type: U_WORD # accuracy_decimals: 1 # filters: # - multiply: 0.1 - platform: modbus_controller modbus_controller_id: srne id: ${name}_grid_frequency name: "Grid Frequency" address: 0x215 unit_of_measurement: "Hz" register_type: holding value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.01 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_inverter_frequency name: "Inverter Frequency" address: 0x218 unit_of_measurement: "Hz" register_type: holding value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.01 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_inverter_load_a name: "Inverter Power" address: 0x021B unit_of_measurement: "W" register_type: holding value_type: U_WORD accuracy_decimals: 0 filters: - multiply: 1 web_server: sorting_group_id: istats - platform: template name: "Grid Power" id: ${name}_grid_power unit_of_measurement: "W" lambda: |- return (id(${name}_grid_voltage).state * (id(${name}_grid_current_a).state)); accuracy_decimals: 0 update_interval: 1s # ################# Battery voltage sensors ########## # # ######## 1 ######## # - platform: modbus_controller modbus_controller_id: srne id: ${name}_over_voltage_threshold name: "Over voltage threshold" address: 0xE005 register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 100 #filters: # - multiply: 0.1 lambda: |- return x*0.4; web_server: sorting_group_id: iset # ######## 2 ######## # - platform: modbus_controller modbus_controller_id: srne id: ${name}_charging_voltage_limit name: "Charging voltage limit" address: 0xE006 register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 100 #filters: # - multiply: 0.1 lambda: |- return x*0.4; web_server: sorting_group_id: iset # ######## 3 ######## # # - platform: modbus_controller # modbus_controller_id: srne # id: ${name}_equalizing_charge_voltage # name: ${name}_equalizing_charge_voltage # address: 0xE007 # register_type: holding # value_type: U_WORD # accuracy_decimals: 1 # unit_of_measurement: "V" # skip_updates: 1 # # filters: # # - multiply: 0.1 # lambda: |- # return x*0.4; # # ######## 4 ######## # - platform: modbus_controller modbus_controller_id: srne id: ${name}_boost_voltage name: "Boost voltage" address: 0xE008 register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 100 #filters: # - multiply: 0.1 lambda: |- return x*0.4; web_server: sorting_group_id: iset # ######## 5 ######## # # - platform: modbus_controller # modbus_controller_id: srne # id: ${name}_float_voltage # name: ${name}_float_voltage # address: 0xE009 # register_type: holding # value_type: U_WORD # accuracy_decimals: 1 # unit_of_measurement: "V" # skip_updates: 1 # # filters: # # - multiply: 0.1 # lambda: |- # return x*0.4; # # ######## 6 ######## # - platform: modbus_controller modbus_controller_id: srne id: ${name}_boost_charging_recovery_voltage name: "Boost charging recovery voltage" address: 0xE00A register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 100 #filters: # - multiply: 0.1 lambda: |- return x*0.4; web_server: sorting_group_id: iset # ######## 7 ######## - platform: modbus_controller modbus_controller_id: srne id: ${name}_over_discharge_recovery_voltage name: "Over discharge recovery voltage" address: 0xE00B register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 100 #filters: # - multiply: 0.1 lambda: |- return x*0.4; web_server: sorting_group_id: iset # ######## 8 ######## - platform: modbus_controller modbus_controller_id: srne id: ${name}_under_voltage_warning name: "Under voltage warning" address: 0xE00C register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 100 #filters: # - multiply: 0.1 lambda: |- return x*0.4; web_server: sorting_group_id: iset # ######## 9 ######## # - platform: modbus_controller modbus_controller_id: srne id: ${name}_over_discharge_voltage name: "Over discharge voltage" address: 0xE00D register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 100 #filters: # - multiply: 0.1 lambda: |- return x*0.4; web_server: sorting_group_id: iset # # ######## 10 ######## - platform: modbus_controller modbus_controller_id: srne id: ${name}_discharge_limit_voltage name: "Discharge limit voltage" address: 0xE00E register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 100 #filters: # - multiply: 0.1 lambda: |- return x*0.4; web_server: sorting_group_id: iset - platform: modbus_controller modbus_controller_id: srne id: ${name}_inverter_to_grid name: "Inverter to Grid" address: 0xE01B register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 1 # filters: # - multiply: 0.1 lambda: |- return x*0.4; icon: mdi:sine-wave web_server: sorting_group_id: iset - platform: modbus_controller modbus_controller_id: srne id: ${name}_grid_to_inverter name: "Grid to Inverter" address: 0xE022 register_type: holding value_type: U_WORD accuracy_decimals: 1 unit_of_measurement: "V" skip_updates: 1 # filters: # - multiply: 0.1 lambda: |- return x*0.4; icon: mdi:sine-wave web_server: sorting_group_id: iset ##Power Statics## - platform: modbus_controller modbus_controller_id: srne id: ${name}_solar_today name: "Solar Power Today" address: 0x0F02F unit_of_measurement: "kWh" register_type: holding value_type: U_WORD accuracy_decimals: 1 device_class: "Energy" state_class: "total" skip_updates: 10 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_load_today name: "Load Power Today" address: 0x0F030 unit_of_measurement: "kWh" register_type: holding value_type: U_WORD accuracy_decimals: 1 device_class: "Energy" state_class: "total" skip_updates: 10 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_grid_today name: "Grid Power Today" address: 0x0F03D unit_of_measurement: "kWh" register_type: holding value_type: U_WORD accuracy_decimals: 1 device_class: "energy" state_class: "total" skip_updates: 10 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_grid_charge_today name: "Grid Charge Power Today" address: 0x0F04C unit_of_measurement: "kWh" register_type: holding value_type: U_WORD accuracy_decimals: 1 device_class: "energy" state_class: "total" skip_updates: 10 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_solar_accumulated name: "Accumulated Solar Power" address: 0x0F038 unit_of_measurement: "kWh" register_type: holding value_type: U_WORD accuracy_decimals: 1 device_class: "Energy" state_class: "total" skip_updates: 10 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_load_accumulated name: "Accumulated Load Power" address: 0x0F03A unit_of_measurement: "kWh" register_type: holding value_type: U_WORD accuracy_decimals: 1 device_class: "Energy" state_class: "total" skip_updates: 10 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_grid_charge_accumulated name: "Accumulated Grid Charge Power" address: 0x0F046 unit_of_measurement: "kWh" register_type: holding value_type: U_WORD accuracy_decimals: 1 device_class: "Energy" state_class: "total" skip_updates: 10 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_batt_charge_accumulated name: "Accumulated Battery Charge" address: 0x0F034 unit_of_measurement: "AH" register_type: holding value_type: U_WORD accuracy_decimals: 2 skip_updates: 10 device_class: "Energy" state_class: "total" web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_batt_discharge_accumulated name: "Accumulated Battery Discharge" address: 0x0F036 unit_of_measurement: "AH" register_type: holding value_type: U_WORD accuracy_decimals: 2 skip_updates: 10 device_class: "Energy" state_class: "total" web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_grid_accumulated name: "Accumulated Grid Power" address: 0x0F048 unit_of_measurement: "kWh" register_type: holding value_type: U_WORD accuracy_decimals: 1 device_class: "Energy" state_class: "total" skip_updates: 10 filters: - multiply: 0.1 web_server: sorting_group_id: istats - platform: modbus_controller modbus_controller_id: srne id: ${name}_bypass_time name: "Bypass Time" address: 0x0F03F unit_of_measurement: "min" register_type: holding value_type: U_WORD accuracy_decimals: 1 web_server: sorting_group_id: istats number: #Inverter Parameters - platform: modbus_controller id: ${name}_boost_charging_time_number name: "Boost Charging Time" address: 0xE012 value_type: U_WORD unit_of_measurement: "min" icon: mdi:timer-sand min_value: 10 max_value: 600 step: 10 mode: BOX web_server: sorting_group_id: iset - platform: modbus_controller modbus_controller_id: srne name: "Inverter to Grid Voltage" id: ${name}_inverter_togrid_bvoltage address: 0xE01B value_type: U_WORD register_type: holding unit_of_measurement: "V" min_value: 40 max_value: 60 step: 0.4 mode: BOX lambda: "return x * 0.4; " write_lambda: "return x * 2.5; " use_write_multiple: True web_server: sorting_group_id: iset - platform: modbus_controller modbus_controller_id: srne name: "Grid to Inverter Voltage" id: ${name}_grid_toinverter_bvoltage address: 0xE022 value_type: U_WORD register_type: holding unit_of_measurement: "V" min_value: 40 max_value: 60 step: 0.4 mode: BOX lambda: "return x * 0.4; " write_lambda: "return x * 2.5; " web_server: sorting_group_id: iset - platform: modbus_controller modbus_controller_id: srne name: Bulk Charge Voltage id: ${name}_bulk_voltage address: 0xE008 value_type: U_WORD register_type: holding unit_of_measurement: "V" min_value: 48 max_value: 58.4 step: 0.4 mode: BOX lambda: "return x * 0.4; " write_lambda: "return x * 2.5; " # use_write_multiple: true web_server: sorting_group_id: iset - platform: modbus_controller modbus_controller_id: srne name: Float Charge Voltage id: ${name}_float_voltage address: 0xE009 value_type: U_WORD register_type: holding unit_of_measurement: "V" min_value: 48 max_value: 58.4 step: 0.4 mode: BOX lambda: "return x * 0.4; " write_lambda: "return x * 2.5; " # use_write_multiple: true web_server: sorting_group_id: iset - platform: modbus_controller modbus_controller_id: srne name: Grid Charge Current address: 0xE205 value_type: U_WORD register_type: holding unit_of_measurement: "A" min_value: 0 max_value: 40 step: 1 # mode: auto multiply: 10 web_server: sorting_group_id: cb - platform: modbus_controller modbus_controller_id: srne name: Total Charge Current address: 0xE20A value_type: U_WORD register_type: holding unit_of_measurement: "A" min_value: 0 max_value: 100 step: 5 # mode: BOX lambda: "return x * 0.1; " write_lambda: "return x * 10; " web_server: sorting_group_id: cb select: #Inverter Parameters - platform: modbus_controller modbus_controller_id: srne name: "Output Priority" id: ${name}_output_priority address: 0xE204 value_type: U_WORD optionsmap: "Solar": 0 "Utlity": 1 "Solar-Battery": 2 web_server: sorting_group_id: cb - platform: modbus_controller modbus_controller_id: srne name: "AC Input Voltage Range" address: 0xE20B value_type: U_WORD optionsmap: "Appliance": 0 "UPS": 1 web_server: sorting_group_id: cb - platform: modbus_controller modbus_controller_id: srne name: "ECO Mode" id: ${name}_ecomode address: 0xE20C value_type: U_WORD optionsmap: "Disable": 0 "Enable": 1 web_server: sorting_group_id: cb - platform: modbus_controller modbus_controller_id: srne name: "Overload Restart" address: 0xE20D value_type: U_WORD optionsmap: "Disable": 0 "Enable": 1 web_server: sorting_group_id: cb # - platform: modbus_controller # modbus_controller_id: srne # name: "Alarm" # address: 0xE210 # value_type: U_WORD # optionsmap: # "Disable": 0 # "Enable": 1 - platform: modbus_controller modbus_controller_id: srne name: "Charge Priority" address: 0xE20F value_type: U_WORD optionsmap: "Solar and Utility": 0 "Utility-Solar": 1 "Solar-Utility": 2 "Solar Only": 3 web_server: sorting_group_id: cb - platform: modbus_controller modbus_controller_id: srne name: "Overload Bypass" address: 0xE212 value_type: U_WORD optionsmap: "Disable": 0 "Enable": 1 web_server: sorting_group_id: cb switch: - platform: safe_mode name: "${name} (Safe Mode)" - platform: modbus_controller use_write_multiple: true modbus_controller_id: srne name: AlarmS register_type: holding address: 0xE210 bitmask: 1 entity_category: config icon: "mdi:toggle-switch" web_server: sorting_group_id: cb - platform: modbus_controller modbus_controller_id: srne name: "BMS Enabled" id: ${name}_bmsen address: 0x0E215 register_type: holding bitmask: 1 entity_category: config icon: "mdi:toggle-switch" - platform: ble_client ble_client_id: client0 name: "${bms0} enable bluetooth connection" web_server: sorting_group_id: cb - platform: ble_client ble_client_id: client1 name: "${bms1} enable bluetooth connection" web_server: sorting_group_id: cb - platform: jbd_bms_ble jbd_bms_ble_id: bms0 charging: name: "${bms0} charging" web_server: sorting_group_id: cb discharging: name: "${bms0} discharging" web_server: sorting_group_id: cb # - platform: jbd_bms_ble # jbd_bms_ble_id: bms1 # charging: # name: "${bms1} charging" # discharging: # name: "${bms1} discharging" text_sensor: - platform: modbus_controller modbus_controller_id: srne name: "Inverter State" id: ${name}_inverter_state address: 0x0210 register_type: holding raw_encode: HEXBYTES lambda: |- uint16_t value = modbus_controller::word_from_hex_str(x, 0); switch (value) { case 0: return std::string("Power-up delay"); case 1: return std::string("Waiting State"); case 2: return std::string("Initialization"); case 3: return std::string("Soft Start"); case 4: return std::string("Mains"); case 5: return std::string("Inverter"); case 6: return std::string("Inverter to Mains"); case 7: return std::string("Mains to Inverter"); case 8: return std::string("Battery Active"); case 9: return std::string("Shutdown User"); case 10: return std::string("Fault"); } return std::string("Unknown"); web_server: sorting_group_id: cb # lambda: |- # uint16_t value = modbus_controller::word_from_hex_str(x, 0); # switch (value) { # case 0: return std::string("Power On"); # case 1: return std::string("Standby"); # case 2: return std::string("Mains"); # case 3: return std::string("Off-Grid"); # case 4: return std::string("Bypass"); # case 5: return std::string("Charging"); # case 6: return std::string("Fault"); # } # return std::string("Unknown"); # - platform: modbus_controller # modbus_controller_id: srne # name: "Inverter State" # id: ${name}_inverter_state # address: 0x0210 # register_type: holding # raw_encode: HEXBYTES - platform: modbus_controller modbus_controller_id: srne name: "Charge State" id: ${name}_charge_state address: 0x010B register_type: holding raw_encode: HEXBYTES lambda: |- uint16_t value = modbus_controller::word_from_hex_str(x, 0); switch (value) { case 0: return std::string("Charge Off"); case 1: return std::string("Quick Charge"); case 2: return std::string("Cons Volt Charge"); case 4: return std::string("Float Charge"); case 5: return std::string("Reserved"); case 6: return std::string("Li Batt Activate"); case 7: return std::string("Reserved"); } return std::string("Unknown"); web_server: sorting_group_id: cb - platform: template name: "${name} Date & Time" lambda: |- int year_month = id(${name}_time_year_month).state; int day_hour = id(${name}_time_day_hour).state; int minute_second = id(${name}_time_minute_second).state; int year = (year_month >> 8) & 255; int month = year_month & 255; int day = (day_hour >> 8) & 255; int hour = day_hour & 255; int minute = (minute_second >> 8) & 255; int second = minute_second & 255; char buffer[50]; sprintf(buffer, "%02d/%02d/%02d %02d:%02d:%02d", year, month, day, hour, minute, second); return std::string(buffer); update_interval: 60s - platform: jbd_bms_ble jbd_bms_ble_id: bms0 errors: name: "${bms0} errors" web_server: sorting_group_id: bsum operation_status: name: "${bms0} operation status" web_server: sorting_group_id: bsum device_model: name: "${bms0} device model" web_server: sorting_group_id: bsum # - platform: jbd_bms_ble # jbd_bms_ble_id: bms1 # errors: # name: "${bms1} errors" # web_server: # sorting_group_id: bsum # operation_status: # name: "${bms1} operation status" # web_server: # sorting_group_id: bsum # device_model: # name: "${bms1} device model" # web_server: # sorting_group_id: bsum