syssi / esphome-jk-bms

ESPHome component to monitor and control a Jikong Battery Management System (JK-BMS) via UART-TTL or BLE
Apache License 2.0
409 stars 137 forks source link

CRC Check Fail after months of working almost properly #360

Closed DragotaDarius closed 11 months ago

DragotaDarius commented 11 months ago

Hi, I have been using your implementation with an esp8266(nodemcu v3 Variant) with direct connection to the bms and It was working almost perfectly, excluding the during the charging where I was always getting the crc check fail. Here is a small dump of the logs, but I cannot see anything relevant other than nan for every value. I want to mention that nothing changed on the hardware side, since it started to not work. logs_esphome-web-0bbb4b_run (1).txt

DragotaDarius commented 11 months ago

Here is the logs with the raw data to and from the bms: logs_esphome-web-0bbb4b_logs.txt

syssi commented 11 months ago

Some ideas:

  1. Try to reduce the cable length between the ESP and the BMS
  2. Try to use a ESP32 just for testing. There a some users here which cannot communicate with the BMS using a ESP8266 but a ESP32 works flawlessly for unknown reasons.
DragotaDarius commented 11 months ago

Some ideas:

  1. Try to reduce the cable length between the ESP and the BMS
  2. Try to use a ESP32 just for testing. There a some users here which cannot communicate with the BMS using a ESP8266 but a ESP32 works flawlessly for unknown reasons.

I will try by the end of this week, but it is strange that it worked for a long time and suddenly stopped :) The length is very short, around 10-15cm if I remember correctly.

syssi commented 11 months ago

I've updated my setup to ESPHome 2023.7.1 + esphome-jk-bms.git@main today to reproduce your issue.

syssi commented 11 months ago

My setup isn't affected. The ESP is stable (no availability drop-outs) and no CRC errrors since 24h.

DragotaDarius commented 11 months ago

Thank you for your help. Sadly I couldn't manage to solve the error and I have finally switched to the esp32 and I am finally able to also view the stats while charging, which didn't work at all in the previous setup. image Thank you for your help.

syssi commented 11 months ago

Perfect! In other words: The hardware UART of th ESP32 works much better as the one of the ESP8266?

DragotaDarius commented 11 months ago

Perfect! In other words: The hardware UART of th ESP32 works much better as the one of the ESP8266?

I think we can definetely say that. I kept the exact same wires, just resoldered to the esp32 and it works since I moved to the new "platform". This is a screenshot of the logs, which look very good so far: image

And to maybe help other people, here is the exact picture of the esp32 variant that I have: image

Here is also my .yaml for anyone that may need it. I had to put power_save_mode: none because I had poor coverage with the default, which I think it is something like "Light" or similar. Even tho the board is not the right one, so far it worked without a problem. I wasn't able to use the ble because of the interference with the wifi connection, by having my esp32 under 20cm of reinforced concrete, in the underground garage.

substitutions:
  name: esphome-web-68c0ec
  # friendly_name: BMS ESP32
  device_description: "Monitor a JK-BMS via UART-TTL"
  external_components_source: github://syssi/esphome-jk-bms@main
  tx_pin: GPIO01
  rx_pin: GPIO03

esphome:
  name: ${name}
  comment: ${device_description}
  project:
    name: "syssi.esphome-jk-bms"
    version: 1.5.0

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

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

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

ota:

logger:
  level: INFO

# If you use Home Assistant please remove this `mqtt` section and uncomment the `api` component!
# The native API has many advantages over MQTT: https://esphome.io/components/api.html#advantages-over-mqtt
# mqtt:
#   broker: !secret mqtt_host
#   username: !secret mqtt_username
#   password: !secret mqtt_password
#   id: mqtt_client

api:
  encryption:
    key: "Redacted, Inser yors"
  reboot_timeout: 10s

uart:
  - id: uart_0
    baud_rate: 115200
    rx_buffer_size: 384
    tx_pin: ${tx_pin}
    rx_pin: ${rx_pin}

jk_modbus:
  - id: modbus0
    uart_id: uart_0
    rx_timeout: 50ms

jk_bms:
  - id: bms0
    jk_modbus_id: modbus0
    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"
    # cell_voltage_17:
    #   name: "${name} cell voltage 17"
    # cell_voltage_18:
    #   name: "${name} cell voltage 18"
    # cell_voltage_19:
    #   name: "${name} cell voltage 19"
    # cell_voltage_20:
    #   name: "${name} cell voltage 20"
    # cell_voltage_21:
    #   name: "${name} cell voltage 21"
    # cell_voltage_22:
    #   name: "${name} cell voltage 22"
    # cell_voltage_23:
    #   name: "${name} cell voltage 23"
    # cell_voltage_24:
    #   name: "${name} cell voltage 24"
    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"
#    start_current_calibration:
#      name: "${name} start current calibration"
    actual_battery_capacity:
      name: "${name} actual battery capacity"
#    protocol_version:
#      name: "${name} protocol version"

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"