odya/esphome-powmr-hybrid-inverter

inverter+ BMS

Opened this issue · 1 comments

fastvd commented

Greetings. I have an esp32 board that works with jk-bms via modbus with the following firmware:
github://syssi/esphome-jk-bms@main

and also your great project i have successfully connected my POW-HVM10.2M inverter on separate esp32 board...

the idea is elementary: to control the inverter and bms from one esp32 board...

I seem to have combined the code of 2 firmwares, soldered everything correctly, but in the logs I get errors on the BMS part (the data from the inverter is fine)

here is my code:

substitutions:
name: bms-home
device_name: "powmr-inverter"
node_name: "PowMr Inverter"
node_id: powmr_inverter
inverter_tx_pin: GPIO1
inverter_rx_pin: GPIO3
inverter_voltage_offset: "0"

bms_tx_pin: GPIO16
bms_rx_pin: GPIO17

pzem_tx_pin: GPIO9
pzem_rx_pin: GPIO10
pzem_voltage_offset: "1"
pzem_current_offset: "0.04"
update_interval: 30s # Minimum 10s recommended to avoid duplicate command errors
select_skip_updates: "2"
pzem_update_interval: 6s # Needs to be 1/5 of update interval because of smoothing filter on pzem readings

esp32:
board: nodemcu-32s
framework:
type: esp-idf

packages:
main: !include powmr-inverter/main.yaml

common_system: !include includes/common_system.yaml
common_sensors: !include includes/common_sensors.yaml

logger:
level: WARN
logs:
component: ERROR # Fix for issue #4717 "Component xxxxxx took a long time for an operation"

time:

  • platform: homeassistant
    id: hass_time

and uart part:

external_components:

  • source: github://syssi/esphome-jk-bms@main
    refresh: 0s

uart:

  • id: uart_bms
    baud_rate: 115200
    rx_buffer_size: 384
    tx_pin: ${bms_tx_pin}
    rx_pin: ${bms_rx_pin}

jk_modbus:

  • id: modbus_bms
    uart_id: uart_bms
    rx_timeout: 50ms

jk_bms:

  • id: bms0
    jk_modbus_id: modbus_bms
    update_interval: 5s

binary_sensor:

  • platform: jk_bms
    balancing:
    name: "${name} balancing"
    balancing_switch:
    name: "${name} balancing switch"
    charging:
    name: "${name} charging"
    discharging:
    name: "${name} discharging"
    dedicated_charger_switch:
    name: "${name} dedicated charger switch"
    online_status:
    name: "${name} online status"

sensor:

  • platform: jk_bms
    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"

    power_tube_temperature:
    name: "${name} power tube temperature"
    temperature_sensor_1:
    name: "${name} temperature sensor 1"
    temperature_sensor_2:
    name: "${name} temperature sensor 2"
    total_voltage:
    name: "${name} total voltage"
    current:
    name: "${name} current"
    power:
    name: "${name} power"
    charging_power:
    name: "${name} charging power"
    discharging_power:
    name: "${name} discharging power"
    capacity_remaining:
    name: "${name} capacity remaining"
    capacity_remaining_derived:
    name: "${name} capacity remaining derived"
    temperature_sensors:
    name: "${name} temperature sensors"
    charging_cycles:
    name: "${name} charging cycles"
    total_charging_cycle_capacity:
    name: "${name} total charging cycle capacity"
    battery_strings:
    name: "${name} battery strings"
    errors_bitmask:
    name: "${name} errors bitmask"
    operation_mode_bitmask:
    name: "${name} operation mode bitmask"
    total_voltage_overvoltage_protection:
    name: "${name} total voltage overvoltage protection"
    total_voltage_undervoltage_protection:
    name: "${name} total voltage undervoltage protection"
    cell_voltage_overvoltage_protection:
    name: "${name} cell voltage overvoltage protection"
    cell_voltage_overvoltage_recovery:
    name: "${name} cell voltage overvoltage recovery"
    cell_voltage_overvoltage_delay:
    name: "${name} cell voltage overvoltage delay"
    cell_voltage_undervoltage_protection:
    name: "${name} cell voltage undervoltage protection"
    cell_voltage_undervoltage_recovery:
    name: "${name} cell voltage undervoltage recovery"
    cell_voltage_undervoltage_delay:
    name: "${name} cell voltage undervoltage delay"
    cell_pressure_difference_protection:
    name: "${name} cell pressure difference protection"
    discharging_overcurrent_protection:
    name: "${name} discharging overcurrent protection"
    discharging_overcurrent_delay:
    name: "${name} discharging overcurrent delay"
    charging_overcurrent_protection:
    name: "${name} charging overcurrent protection"
    charging_overcurrent_delay:
    name: "${name} charging overcurrent delay"
    balance_starting_voltage:
    name: "${name} balance starting voltage"
    balance_opening_pressure_difference:
    name: "${name} balance opening pressure difference"
    power_tube_temperature_protection:
    name: "${name} power tube temperature protection"
    power_tube_temperature_recovery:
    name: "${name} power tube temperature recovery"
    temperature_sensor_temperature_protection:
    name: "${name} temperature sensor temperature protection"
    temperature_sensor_temperature_recovery:
    name: "${name} temperature sensor temperature recovery"
    temperature_sensor_temperature_difference_protection:
    name: "${name} temperature sensor temperature difference protection"
    charging_high_temperature_protection:
    name: "${name} charging high temperature protection"
    discharging_high_temperature_protection:
    name: "${name} discharging high temperature protection"
    charging_low_temperature_protection:
    name: "${name} charging low temperature protection"
    charging_low_temperature_recovery:
    name: "${name} charging low temperature recovery"
    discharging_low_temperature_protection:
    name: "${name} discharging low temperature protection"
    discharging_low_temperature_recovery:
    name: "${name} discharging low temperature recovery"
    total_battery_capacity_setting:
    name: "${name} total battery capacity setting"
    current_calibration:
    name: "${name} current calibration"
    device_address:
    name: "${name} device address"
    sleep_wait_time:
    name: "${name} sleep wait time"
    alarm_low_volume:
    name: "${name} alarm low volume"
    manufacturing_date:
    name: "${name} manufacturing date"
    total_runtime:
    name: "${name} total runtime"
    actual_battery_capacity:
    name: "${name} actual battery capacity"

switch:

  • platform: jk_bms
    charging:
    name: "${name} charging"
    discharging:
    name: "${name} discharging"

text_sensor:

  • platform: jk_bms
    errors:
    name: "${name} errors"
    operation_mode:
    name: "${name} operation mode"
    battery_type:
    name: "${name} battery type"
    password:
    name: "${name} password"
    device_type:
    name: "${name} device type"
    software_version:
    name: "${name} software version"
    manufacturer:
    name: "${name} manufacturer"
    total_runtime_formatted:
    name: "${name} total runtime formatted"

This is a perfect idea. I tried to combine these projects, but there were also errors. I would really like to have such an implementation