EPEVER® MPPT Solar Charge Controller Tracer-AN Series

../_images/tracer-an.jpg

Warning

Enabling all modbus registers will probably cause a stack overflow in main

Tested with Tracer-AN Series 10A/20A/30A/40A and XTRA Series 10A/20A/30A/40A. Probably works for other EPEver MPPT controllers as well.

Below is the ESPHome configuration file that will get you up and running. This assumes you have a secret.yaml with ssid, password, api_password and ota_password keys.

substitutions:
  updates: 30s
  unique_id: solarstation-x

esphome:
  name: ${unique_id}
  platform: ESP32
  board: pico32
  arduino_version: latest
  platformio_options:
    ## larger stack size required with all registers enable_load_test
    ## reduce registers or wait for integration of 2.0.0 arduinoespressif32
    ## not yet working needs 2.0
    build_flags:
      - -DCONFIG_ARDUINO_LOOP_STACK_SIZE=32768

  on_boot:
    ## configure controller settings at setup
    ## make sure priority is lower than setup_priority of modbus_controller
    priority: -100
    then:
      - lambda: |-
          // get local time and sync to controller
          time_t now = ::time(nullptr);
          struct tm *time_info = ::localtime(&now);
          int seconds = time_info->tm_sec;
          int minutes = time_info->tm_min;
          int hour = time_info->tm_hour;
          int day = time_info->tm_mday;
          int month = time_info->tm_mon + 1;
          int year = time_info->tm_year % 100;
          esphome::modbus_controller::ModbusController *controller = id(epever);
          // if there is no internet connection localtime returns year 70
          if (year != 70) {
            // create the payload
            std::vector<uint16_t> rtc_data = {uint16_t((minutes << 8) | seconds), uint16_t((day << 8) | hour),
                                              uint16_t((year << 8) | month)};
            // Create a modbus command item with the time information as the payload
            esphome::modbus_controller::ModbusCommandItem set_rtc_command =
                esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x9013, 3, rtc_data);
            // Submit the command to the send queue
            epever->queue_command(set_rtc_command);
            ESP_LOGI("ModbusLambda", "EPSOLAR RTC set to %02d:%02d:%02d %02d.%02d.%04d", hour, minutes, seconds, day, month,
                    year + 2000);
          }
          // Battery settings
          // Note: these values are examples only and apply my AGM Battery
          std::vector<uint16_t> battery_settings1 = {
              0,       // 9000 Battery Type 0 =  User
              0x0073,  // 9001 Battery Cap 0x55 == 115AH
              0x012C,  // 9002 Temp compensation -3V /°C/2V
              0x05DC,  // 9003 0x5DC == 1500 Over Voltage Disconnect Voltage 15,0
              0x058C,  // 9004 0x58C == 1480 Charging Limit Voltage 14,8
              0x058C,  // 9005 Over Voltage Reconnect Voltage 14,8
              0x05BF,  // 9006 Equalize Charging Voltage 14,6
              0x05BE,  // 9007 Boost Charging Voltage 14,7
              0x0550,  // 9008 Float Charging Voltage 13,6
              0x0528,   // 9009 Boost Reconnect Charging Voltage 13,2
              0x04C4,  // 900A Low Voltage Reconnect Voltage 12,2
              0x04B0,  // 900B Under Voltage Warning Reconnect Voltage 12,0
              0x04BA,  // 900c Under Volt. Warning Volt 12,1
              0x04BA,  // 900d Low Volt. Disconnect Volt. 11.8
              0x04BA   // 900E Discharging Limit Voltage 11.8
          };

          // Boost and equalization periods
          std::vector<uint16_t> battery_settings3 = {
              0x0000,  // 906B Equalize Duration (min.) 0
              0x0075   // 906C Boost Duration (aka absorb) 117 mins
          };
          esphome::modbus_controller::ModbusCommandItem set_battery1_command =
              esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x9000, battery_settings1.size() ,
                                                                                          battery_settings1);
          //   esphome::modbus_controller::ModbusCommandItem set_battery2_command =
          //   esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x900A, battery_settings2.size() ,
          //                                                                              battery_settings2);

          esphome::modbus_controller::ModbusCommandItem set_battery3_command =
              esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x906B, battery_settings3.size(),
                                                                                          battery_settings3);
          delay(200) ;
          controller->queue_command(set_battery1_command);
          delay(200) ;
          // controller->queue_command(set_battery2_command);
          // delay(200) ;
          controller->queue_command(set_battery3_command);
          ESP_LOGI("ModbusLambda", "EPSOLAR Battery set");



wifi:
  ssid: !secret wifi_sid
  password: !secret wifi_password

time:
  - platform: sntp
    id: sntp_time
    timezone: "CET-1CEST,M3.5.0,M10.5.0/3"
    servers: "de.pool.ntp.org"

# Enable logging
logger:
  level: INFO

# Enable Home Assistant API
api:
  password: !secret api_password
  reboot_timeout: 0s

ota:
  password: !secret ota_password

mqtt:
  id: mqtt_client

uart:
  id: mod_bus
  tx_pin: 19
  rx_pin: 18
  baud_rate: 115200
  stop_bits: 1

modbus:
  #flow_control_pin: 23
  send_wait_time: 200ms
  id: mod_bus_epever

modbus_controller:
  - id: epever
    ## the Modbus device addr
    address: 0x1
    modbus_id: mod_bus_epever
    command_throttle: 200ms
    setup_priority: -10
    update_interval: ${updates}

packages:
  tracer-rated-datum: !include tracer-rated-datum.yaml
  tracer-real-time: !include tracer-real-time.yaml
  tracer-stats: !include tracer-stats.yaml
  #tracer-settings: !include tracer-settings.yaml

sensor:
  - platform: template
    accuracy_decimals: 0
    name: "Generated Charge today"
    id: generated_charge_today
    unit_of_measurement: "Ah"

  - platform: wifi_signal
    name: "WiFi Signal"
    update_interval: ${updates}

binary_sensor:
  - platform: modbus_controller
    modbus_controller_id: epever
    id: charging_input_volt_failure
    name: "Charging Input Volt Failure"
    register_type: read
    address: 0x3201
    bitmask: 0xC000

switch:
  - platform: modbus_controller
    modbus_controller_id: epever
    id: manual_control_load
    register_type: coil
    address: 2
    name: "manual control the load"
    bitmask: 1

  - platform: modbus_controller
    modbus_controller_id: epever
    id: default_control_the_load
    register_type: coil
    address: 3
    name: "default control the load"
    bitmask: 1

  - platform: modbus_controller
    modbus_controller_id: epever
    id: enable_load_test
    register_type: coil
    address: 5
    name: "enable load test mode"
    bitmask: 1

  - platform: modbus_controller
    modbus_controller_id: epever
    id: force_load
    register_type: coil
    address: 6
    name: "Force Load on/off"
    bitmask: 1

  # - platform: modbus_controller
  #   modbus_controller_id: epever
  #   id: clear_energy_stats
  #   register_type: coil
  #   address: 0x14
  #   name: "Clear generating  electricity statistic"
  #   bitmask: 1

#  - platform: modbus_controller
#    modbus_controller_id: epever
#    id: reset_to_fabric_default
#    name: "Reset to Factory Default"
#    register_type: coil
#    address: 0x15
#    bitmask: 1

text_sensor:
  - platform: modbus_controller
    modbus_controller_id: epever
    name: "rtc_clock"
    id: rtc_clock
    internal: true
    register_type: holding
    address: 0x9013
    register_count: 3
    raw_encode: HEXBYTES
    response_size: 6
    #                /*
    #                E20 Real time clock 9013 D7-0 Sec, D15-8 Min
    #                E21 Real time clock 9014 D7-0 Hour, D15-8 Day
    #                E22 Real time clock 9015 D7-0 Month, D15-8 Year
    #                */
    on_value:
      then:
        - lambda: |-
            ESP_LOGV("main", "decoding rtc hex encoded raw data: %s", x.c_str());
            uint8_t h=0,m=0,s=0,d=0,month_=0,y = 0 ;
            m = esphome::modbus_controller::byte_from_hex_str(x,0);
            s = esphome::modbus_controller::byte_from_hex_str(x,1);
            d = esphome::modbus_controller::byte_from_hex_str(x,2);
            h = esphome::modbus_controller::byte_from_hex_str(x,3);
            y = esphome::modbus_controller::byte_from_hex_str(x,4);
            month_ = esphome::modbus_controller::byte_from_hex_str(x,5);
            // Now check if the rtc time of the controller is ok and correct it
            time_t now = ::time(nullptr);
            struct tm *time_info = ::localtime(&now);
            int seconds = time_info->tm_sec;
            int minutes = time_info->tm_min;
            int hour = time_info->tm_hour;
            int day = time_info->tm_mday;
            int month = time_info->tm_mon + 1;
            int year = time_info->tm_year % 100;
            // correct time if needed (ignore seconds)
            if (d != day || month_ != month || y != year || h != hour || m != minutes) {
              // create the payload
              std::vector<uint16_t> rtc_data = {uint16_t((minutes << 8) | seconds), uint16_t((day << 8) | hour),
                                                uint16_t((year << 8) | month)};
              // Create a modbus command item with the time information as the payload
              esphome::modbus_controller::ModbusCommandItem set_rtc_command = esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(epever, 0x9013, 3, rtc_data);
              // Submit the command to the send queue
              epever->queue_command(set_rtc_command);
              ESP_LOGI("ModbusLambda", "EPSOLAR RTC set to %02d:%02d:%02d %02d.%02d.%04d", hour, minutes, seconds, day, month, year + 2000);
            }
            char buffer[20];
            // format time as YYYY-mm-dd hh:mm:ss
            sprintf(buffer,"%04d-%02d-%02d %02d:%02d:%02d",y+2000,month_,d,h,m,s);
            id(template_rtc).publish_state(buffer);

  - platform: template
    name: "RTC Time Sensor"
    id: template_rtc

  - platform: modbus_controller
    modbus_controller_id: epever
    name: "rtc clock test 2"
    id: rtc_clock_test2
    internal: true
    register_type: holding
    address: 0x9013
    register_count: 3
    raw_encode: HEXBYTES
    response_size: 6

web_server:
  port: 80

The definitions for most sensors is included using Packages

Rated Datum registers

tracer-rated-datum.yaml

sensor:
  - platform: modbus_controller
    modbus_controller_id: epever
    id: array_rated_voltage
    name: "array_rated_voltage"
    address: 0x3000
    skip_updates: 60
    unit_of_measurement: "V"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
        - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: array_rated_current
    name: "array_rated_current"
    address: 0x3001
    unit_of_measurement: "A"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 2
    filters:
        - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: array_rated_power
    name: "array_rated_power"
    address: 0x3002
    register_count: 2
    unit_of_measurement: "W"
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_rated_voltage
    name: "battery_rated_voltage"
    address: 0x3004
    unit_of_measurement: "V"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_rated_current
    name: "battery_rated_current"
    address: 0x3005
    unit_of_measurement: "A"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_rated_power
    name: "battery_rated_power"
    address: 0x3006
    unit_of_measurement: "W"
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: charging_mode
    name: "charging_mode"
    address: 0x3008
    unit_of_measurement: ""
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: rated_current_of_load
    name: "rated_current_of_load"
    address: 0x300E
    skip_updates: 60
    unit_of_measurement: "A"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

Real TimeDatum registers tracer-real-time.yaml

sensor:
  - platform: modbus_controller
    modbus_controller_id: epever
    id: pv_input_voltage
    name: "PV array input voltage"
    address: 0x3100
    unit_of_measurement: "V" ## for any other unit the value is returned in minutes
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: pv_input_current
    name: "PV array input current"
    address: 0x3101
    unit_of_measurement: "A" ## for any other unit the value is returned in minutes
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 2
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: pv_input_power
    name: "PV array input power"
    address: 0x3102
    unit_of_measurement: "W" ## for any other unit the value is returned in minutes
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: charging_voltage
    name: "Charging voltage"
    address: 0x3104
    unit_of_measurement: "V"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: charging_current
    name: "Charging current"
    address: 0x3105
    unit_of_measurement: "A"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: charging_power
    name: "Charging power"
    address: 0x3106
    unit_of_measurement: "W"
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: load_voltage
    name: "Load voltage"
    address: 0x310C
    unit_of_measurement: "V"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: load_current
    name: "Load Current"
    address: 0x310D
    unit_of_measurement: "A"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 2
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: load_power
    name: "Load power"
    address: 0x310E
    unit_of_measurement: "W"
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_temperature
    name: "Battery temperature"
    address: 0x3110
    unit_of_measurement: °C
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: device_temperature
    name: "Device temperature"
    address: 0x3111
    unit_of_measurement: °C
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: power_components_temperature
    name: "Power components temperature"
    address: 0x3112
    unit_of_measurement: °C
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_soc
    name: "Battery SOC"
    address: 0x311A
    unit_of_measurement: "%"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: remote_battery_temperature
    name: "Remote battery temperature"
    address: 0x311B
    unit_of_measurement: °C
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01
  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_volt_settings
    name: "Remote real voltage"
    address: 0x311D
    unit_of_measurement: "°C"
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: Battery_status_volt
    name: "Battery status voltage"
    address: 0x3200
    register_type: read
    value_type: U_WORD
    bitmask: 7  #(Bits 0-3)
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: Battery_status_temp
    name: "Battery status temeratur"
    address: 0x3200
    register_type: read
    value_type: U_WORD
    bitmask: 0x38  #(Bits 4-7)
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: Charger_status
    name: "Charger status"
    address: 0x3201
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 0

Statistic registers
tracer-stats.yaml

.. code-block:: yaml

sensor:
  - platform: modbus_controller
    modbus_controller_id: epever
    id: max_pv_voltage_today
    name: "Maximum PV voltage today"
    address: 0x3300
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: min_pv_voltage_today
    name: "Minimum PV voltage today"
    address: 0x3301
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: max_battery_voltage_today
    name: "Maximum battery voltage today"
    address: 0x3302
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: min_battery_today
    name: "Minimum battery voltage today"
    address: 0x3303
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: consumed_energy_today
    name: "Consumed energy today"
    address: 0x3304
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 0
    unit_of_measurement: "Wh"
    filters:
      - multiply: 10.0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: consumed_energy_month
    name: "Consumed Energy Month"
    address: 0x3306
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 0
    unit_of_measurement: "Wh"
    filters:
      - multiply: 10.0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: consumed_energy_year
    name: "Consumed energy year"
    address: 0x3308
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    unit_of_measurement: "kWh"
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: consumed_energy_total
    name: "Consumed energy total"
    address: 0x330A
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    unit_of_measurement: "kWh"
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: generated_energy_today
    name: "Generated energy today"
    address: 0x330C
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 0
    unit_of_measurement: "Wh"
    on_value:
      then:
        - sensor.template.publish:
            id: generated_charge_today
            state: !lambda "return x/12.0;"
    filters:
      - multiply: 10.0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: generated_energy_month
    name: "Generated energy month"
    address: 0x330E
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 0
    unit_of_measurement: "Wh"
    filters:
      - multiply: 10.0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: generated_energy_year
    name: "Generated energy year"
    address: 0x3310
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    unit_of_measurement: "kWh"
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: generated_energy_total
    name: "Generated energy total"
    address: 0x3312
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: co2_reduction
    name: "CO2 reduction"
    address: 0x3314
    register_type: read
    value_type: U_DWORD_R
    accuracy_decimals: 1
    unit_of_measurement: "kg"
    filters:
      - multiply: 10.0

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_voltage
    name: "Battery voltage"
    address: 0x331A
    register_type: read
    value_type: U_WORD
    accuracy_decimals: 1
    unit_of_measurement: "V"
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_current
    name: "Battery current"
    address: 0x331B
    register_type: read
    value_type: S_DWORD_R
    register_count: 2
    accuracy_decimals: 2
    unit_of_measurement: "A"
    filters:
      - multiply: 0.01

Setting registers (commented out to save stack space) tracer-settings.yaml

sensor:
  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_type
    address: 0x9000
    name: "Battery Type"
    register_type: holding
    value_type: U_WORD
    skip_updates: 50

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_capacity
    address: 0x9001
    name: "Battery Capacity"
    register_type: holding
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: temperature_compensation_coefficient
    address: 0x9002
    name: "Temperature compensation coefficient"
    unit_of_measurement: "mV/°C/2V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: high_voltage_disconnect
    address: 0x9003
    name: "High Voltage disconnect"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: charging_limit_voltage
    address: 0x9004
    name: "Charging limit voltage"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: over_voltage_reconnect
    address: 0x9005
    name: "Over voltage reconnect"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: equalization_voltage
    address: 0x9006
    name: "Equalization voltage"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: boost_voltage
    address: 0x9007
    name: "Boost voltage"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: float_voltage
    address: 0x9008
    name: "Float voltage"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: boost_reconnect_voltage
    address: 0x9009
    name: "Boost reconnect voltage"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: low_voltage_reconnect
    address: 0x900A
    name: "Low voltage reconnect"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: under_voltage_recover
    address: 0x900B
    name: "Under voltage recover"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: under_voltage_warning
    address: 0x900C
    name: "Under voltage warning"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: low_voltage_disconnect
    address: 0x900D
    name: "Low voltage disconnect"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: discharging_limit_voltage
    address: 0x900E
    name: "Discharging limit voltage"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_temperature_warning_upper_limit
    address: 0x9017
    name: "Battery temperature warning upper limit"
    unit_of_measurement: "°C"
    register_type: holding
    value_type: U_WORD
    # new range add 'skip_updates' again
    skip_updates: 50
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: battery_temperature_warning_lower_limit
    address: 0x9018
    name: "Battery temperature warning lower limit"
    unit_of_measurement: "°C"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: controller_inner_temperature_upper_limit
    address: 0x9019
    name: "Controller inner temperature upper limit"
    unit_of_measurement: "°C"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: controller_inner_temperature_upper_limit_recover
    address: 0x901A
    name: "Controller inner temperature upper limit recover"
    unit_of_measurement: "°C"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: power_component_temperature_upper_limit
    address: 0x901B
    name: "Power component temperature upper limit"
    unit_of_measurement: "°C"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: power_component_temperature_upper_limit_recover
    address: 0x901C
    name: "Power component temperature upper limit recover"
    unit_of_measurement: "°C"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: line_impedance
    address: 0x901D
    name: "Line Impedance"
    unit_of_measurement: "mOhm"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: dttv
    address: 0x901E
    name: "Day Time Threshold Voltage"
    unit_of_measurement: "V"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: light_signal_startup_delay_time
    address: 0x901F
    name: "Light signal startup delay time"
    unit_of_measurement: "mins"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: nttv
    address: 0x9020
    name: "Light Time Threshold Voltage"
    unit_of_measurement: "mins"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id: light_signal_close_delay_time
    address: 0x9021
    name: "Light signal close delay time"
    unit_of_measurement: "mins"
    register_type: holding
    value_type: U_WORD
    filters:
      - multiply: 0.01

  - platform: modbus_controller
    modbus_controller_id: epever
    id:
      load_controlling_modes
      # 0000H Manual Control
      # 0001H Light ON/OFF
      # 0002H Light ON+ Timer/
      # 0003H Time Control
    address: 0x903D
    name: "Load controlling modes"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD
    skip_updates: 50

  - platform: modbus_controller
    modbus_controller_id: epever
    id: working_time_length_1
    # The length of load output timer1,
    # D15-D8,hour, D7-D0, minute
    address: 0x903E
    name: "Working_time length 1"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: working_time_length_2
    address: 0x903F
    name: "Working_time length 1"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_on_timing_1_seconds
    address: 0x9042
    name: "Turn on timing 1 seconds"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD
    skip_updates: 50

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_on_timing_1_minutes
    address: 0x9043
    name: "Turn on timing 1 minutes"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_on_timing_1_hours
    address: 0x9044
    name: "Turn on timing 1 hours"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_off_timing_1_seconds
    address: 0x9045
    name: "Turn off timing 1 seconds"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_off_timing_1_minutes
    address: 0x9046
    name: "Turn off timing 1 minutes"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_off_timing_1_hours
    address: 0x9047
    name: "Turn off timing 1 hours"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_on_timing_2_seconds
    address: 0x9048
    name: "Turn on timing 2 seconds"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_on_timing_2_minutes
    address: 0x9049
    name: "Turn on timing 2 minutes"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_on_timing_2_hours
    address: 0x904A
    name: "Turn on timing 2 hours"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_off_timing_2_seconds
    address: 0x904B
    name: "Turn off timing 2 seconds"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_off_timing_2_minutes
    address: 0x904C
    name: "Turn off timing 2 minutes"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: turn_off_timing_2_hours
    address: 0x904D
    name: "Turn off timing 2 hours"
    register_type: holding
    accuracy_decimals: 0
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: backlight_time
    address: 0x9063
    name: "Backlight time"
    register_type: holding
    accuracy_decimals: 0
    unit_of_measurement: "s"
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: length_of_night_minutes
    address: 0x9065
    internal: true
    bitmask: 0xFF
    unit_of_measurement: "m"
    name: "Length of night-mins"
    register_type: holding
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: epever
    id: length_of_night
    address: 0x9065
    bitmask: 0xFF00
    unit_of_measurement: "m"
    name: "Length of night"
    register_type: holding
    value_type: U_WORD
    skip_updates: 50
    filters:
      - lambda: return id(length_of_night_minutes).state  + ( 60 * x);

See Also