Pylontech Battery

The Pylontech component allows you to pull data from Pylontech Batteries into ESPHome. It uses UART for communication.

Once configured, you can use sensors as described below for your projects.

Hardware Setup Copy link to header

You can connect to Pylontech Batteries using the port labeled “Console”. Any connections via CAN or RS485 (e.g. to an inverter) are untouched and remain functional.

The console port offers a RS232 interface using a RJ11 or RJ45 connector. The voltage levels are not TTL-compatible. A RS232 transceiver must be placed between the Batteries and the ESPHome device. MAX3232-based transceivers have been tested and work well.

If you have multiple batteries you need to connect to the master battery’s console port.

Pylontech RJ45 Console Port (US2000C, US3000C, US5000C) Copy link to header

RJ45 PinTIA-568B ColorTIA-568A ColorFunctionConnect to
3White/GreenWhite/OrangePylontech TXESPHome RX via transceiver
6GreenOrangePylontech RXESPHome TX via transceiver
8BrownBrownGNDGND

Pylontech RJ11 Console Pinout (US2000B, US2000) Copy link to header

RJ11 PinFunctionConnect to
2Pylontech RXESPHome TX via transceiver
3Pylontech TXESPHome RX via transceiver
4GNDGND

Component/Hub Copy link to header

# Example configuration entry
pylontech:

Configuration variables: Copy link to header

  • id (Required, ID): The id to use for this Pylontech component.
  • uart_id (Optional): The uart Bus ID
  • update_interval (Optional, Time): The interval to check the sensor. Defaults to 60s.

Sensor Copy link to header

All values are reported for every Pylontech battery individually.

# Example configuration entry
sensor:
  - platform: pylontech
    battery: 1

    voltage:
      name: "Battery1 Voltage"
    current:
      name: "Battery1 Current"
    coulomb:
      name: "Battery1 State of Charge"

Configuration variables: Copy link to header

  • pylontech_id (Optional): Manually specify the ID of the pylontech instance if there are multiple.
  • battery (Required): Which battery to monitor. 1 stands for the main battery, 2..16 for child batteries.
  • voltage (Optional): Voltage of the battery. All options from Sensor.
  • current (Optional): Current flowing into the battery. Negative when discharging. All options from Sensor.
  • coulomb (Optional): State of Charge in percent. All options from Sensor.
  • temperature (Optional): Temperature. All options from Sensor.
  • temperature_low (Optional): Historic minimum temperature. All options from Sensor.
  • temperature_high (Optional): Historic maximum temperature. All options from Sensor.
  • voltage_low (Optional): Voltage of the lowest cell. All options from Sensor.
  • voltage_high (Optional): Voltage of the highest cell. All options from Sensor.
  • mos_temperature (Optional): Temperature of the mosfets. All options from Sensor.

Text Sensor Copy link to header

# Example configuration entry
text_sensor:
  - platform: pylontech
    pylontech_id: pylontech0
    battery: 1

    base_state:
      id: bat1_base_state
      name: "Battery1 Base State"

Configuration variables: Copy link to header

  • pylontech_id (Optional): Manually specify the ID of the pylontech instance if there are multiple.
  • battery (Required): Which battery to monitor. 1 stands for the main battery, 2..16 for child batteries.
  • base_state (Optional): Base state. Usually reads Dischg, Charge or Idle. All options from Text Sensor.
  • voltage_state (Optional): Voltage state. Usually reads Normal. All options from Text Sensor.
  • current_state (Optional): Current state. Usually reads Normal. All options from Text Sensor.
  • temperature_state (Optional): Temperature state. Usually reads Normal. All options from Text Sensor.

Energy Monitoring Copy link to header

By combining template sensors and integration sensors one can monitor the energy flowing into and out of all batteries combined, ready for Homeassistant Energy MonitoringExternal link.

sensor:
  - platform: template
    id: pylontech_power
    name: "Pylontech power"
    unit_of_measurement: W
    lambda: |-
      auto pwr1 = id(bat1_voltage).state * id(bat1_current).state;
      auto pwr2 = id(bat2_voltage).state * id(bat2_current).state;
      auto pwr = pwr1 + pwr2;
      id(combined_charge_power).publish_state(max(pwr, 0.0f));
      id(combined_discharge_power).publish_state(max(-pwr, 0.0f));
      return pwr;
    update_interval: 5s
    device_class: power
    state_class: measurement

  - platform: template
    id: combined_charge_power

  - platform: template
    id: combined_discharge_power

  - platform: integration
    name: "Pylontech charging"
    sensor: combined_charge_power
    time_unit: h
    state_class: total_increasing
    device_class: energy
    unit_of_measurement: "Wh"

  - platform: integration
    name: "Pylontech discharging"
    sensor: combined_discharge_power
    time_unit: h
    state_class: total_increasing
    device_class: energy
    unit_of_measurement: "Wh"

See Also Copy link to header

CURRENT