ESP8266/RS485 on Growatt inverter - spurious data between updates

Hi

The DB9 can’t be used for this purpose
Next to the connection there is a small opening that has several connectors among which a RS485

Hello,
maybe someone can help, where to connect RS485_to_ETH RS485 A/B ports to inverter Growatt MOD inverter

Thank you.

pins 3,4 to A.B

1 Like

I’m not sure what goes wrong here:

I get: (probably from the growatt platform)

[08:29:47][D][modbus:123]: Modbus CRC Check failed, but ignored! 2220!=00
[08:29:47][W][modbus:155]: Got Modbus frame from unknown address 0xA1! 
[08:29:47][D][modbus:123]: Modbus CRC Check failed, but ignored! 4AB0!=00
[08:29:47][W][modbus:155]: Got Modbus frame from unknown address 0x00!

but also:

[08:29:48][D][uart_debug:114]: <<< 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:05:EB:01:C3:01:0F:67:10
[08:29:49][D][uart_debug:114]: >>> 01:04:03:F1:00:04:A0:7E
[08:29:49][D][modbus_controller.sensor:025]: Sensor new state: 0.00
[08:29:49][D][sensor:094]: 'Battery Discharging Power': Sending state 0.00000 kW with 3 decimals of accuracy
[08:29:49][D][modbus_controller.sensor:025]: Sensor new state: 0.00
[08:29:49][D][sensor:094]: 'Battery Charging Power': Sending state 0.00000 kW with 3 decimals of accuracy
[08:29:49][D][uart_debug:114]: <<< 01:04:08:00:00:00:00:00:00:00:00:24:0D
[08:29:49][D][uart_debug:114]: >>> 01:04:03:F6:00:01:D1:BC
[08:29:50][D][modbus_controller.sensor:025]: Sensor new state: 0.00
[08:29:50][D][sensor:094]: 'Battery Charge': Sending state 0.00000 % with 0 decimals of accuracy
[08:29:50][D][uart_debug:114]: <<< 01:04:02:00:00:B9:30
[08:29:50][D][uart_debug:114]: >>> 01:04:03:FD:00:02:E0:7F
[08:29:50][D][modbus_controller.sensor:025]: Sensor new state: 0.00
[08:29:50][D][sensor:094]: 'Load': Sending state 0.00000 kW with 3 decimals of accuracy
[08:29:50][D][uart_debug:114]: <<< 01:04:04:00:00:00:00:FB:84
[08:29:52][D][uart_debug:114]: >>> 01:04:00:00:00:5F:B0:32

I do not have a battery (yet) so, the values of 0 could be correct. As I do not see any comm or CRC issues with these individual modbus requests my conclusion is that Modbus is working (esp wiring, baudrate, pin config, etc)

So, whats wrong?
I have a MOD-series invertor, that is not specifically named in the esphome growatt section, is it not supported?

Ok, not sure how the esphome growatt platform should work but getting data from modbus registers seems to work fine. Maybe the addresses are different for a newer 3phase model?

For future reference, following two examples work.
Used the registers are specific in Growatt v1.24 pdf

  - platform: modbus_controller
    name: "Solar Energy Today"
    address: 53
    register_type: "read"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    icon: mdi:solar-power
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1
  - platform: modbus_controller
    name: "Solar Energy Total"
    address: 55
    register_type: "read"
    unit_of_measurement: kWh
    device_class: energy
    state_class: total_increasing
    icon: mdi:solar-power
    value_type: U_DWORD
    accuracy_decimals: 1
    filters:
    - multiply: 0.1

pins 7 its A and , pins 8 ist B conectet to TTL rs485 ?

What inverter do you have? See the posts above for resources to check which pins you need. My solution was for the SPH5000 inverter.

Previously I have not been engaging with ESPHome untill I came across this thread, because I have a Growatt 5000-TL3X. Until now I always used the Grott-solution to retrieve the information, but this seemed a good learning experience for me, because I am not that familiair with electronics/soldering etc. I used this thread to (succesfully) make a connection between Home Assistant and the Growatt inverter and the data is succesfully getting into Home Assistant. I also used a TTL-to-RS485 board with a D1 Mini. During the learning curve I also fried one D1 Mini, because the blue LED was not flashing anymore and I could not connect to the WiFi anymore. But a new one was a solution. So very happy and also wanted to appreciate the post of Gregsy!

Next step what would be interesting for me (having a dynamic energy plan - and no battery) to Set the Export Limit to 0, when the pricing is below zero. I saw that there needs to be an additional solder between DE <> RE on the RS485 board. But are there already experiences with setting this export limit through HA, while not using additional meters?

1 Like

Hi Basimi,

I’m glad my post helped.

I’ve recently added to my code to control my inverter and not just read data from it. I currently have an automation where the mode changes from “load first” to “battery first” and charges the battery at the cheap rate at night for a couple of hours.

No modifications were need to my D1-RS485, just the code to also write data instead of just reading the addresses.

This page was very handy. There are two PDFs on here too which helped me work out which registers I needed to write to.

Below is the code I added to read and write various registers to control the inverter and read the state of modes etc. This adds a lot of entities, most are not needed but I have them anyway. The buttons (Load first and Battery first) are used to set the modes at certain times in an automation. Most of this code I copied and pasted and tweaked to suit me. I don’t know how the script section works but it does for me.

My inverter is an SPH5000, different inverters will have different addresses.

# Sensors for reading time slots for inverter/battery modes

      # Timer read sensor - internal use in esphome for lamdba
      # Grid First - Timeslot 1 read
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 1 start Hour-READ"
    id: gridfirst_timer1_start_hour
    internal: true
    register_type: holding
    address: 1080
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 1 start Minute-READ"
    id: gridfirst_timer1_start_minute
    internal: true
    register_type: holding
    address: 1080
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 1 stop Hour-READ"
    id: gridfirst_timer1_stop_hour
    internal: true
    register_type: holding
    address: 1081
    value_type: U_WORD
    lambda: !lambda |-
       return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 1 stop Minute-READ"
    id: gridfirst_timer1_stop_minute
    internal: true
    register_type: holding
    address: 1081
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
    # Grid First - Timeslot 2 read
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 2 start Hour-READ"
    id: gridfirst_timer2_start_hour
    internal: true
    register_type: holding
    address: 1084
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 2 start Minute-READ"
    id: gridfirst_timer2_start_minute
    internal: true
    register_type: holding
    address: 1084
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 2 stop Hour-READ"
    id: gridfirst_timer2_stop_hour
    internal: true
    register_type: holding
    address: 1085
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 2 stop Minute-READ"
    id: gridfirst_timer2_stop_minute
    internal: true
    register_type: holding
    address: 1085
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
    # Grid First - Timeslot 3 read
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 3 start Hour-READ"
    id: gridfirst_timer3_start_hour
    internal: true
    register_type: holding
    address: 1087
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 3 start Minute-READ"
    id: gridfirst_timer3_start_minute
    internal: true
    register_type: holding
    address: 1087
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 3 stop Hour-READ"
    id: gridfirst_timer3_stop_hour
    internal: true
    register_type: holding
    address: 1088
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 3 stop Minute-READ"
    id: gridfirst_timer3_stop_minute
    internal: true
    register_type: holding
    address: 1088
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
    # Battery First - Timeslot 1 read
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 1 start Hour-READ"
    id: batfirst_timer1_start_hour
    internal: true
    register_type: holding
    address: 1100
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 1 start Minute-READ"
    id: batfirst_timer1_start_minute
    internal: true
    register_type: holding
    address: 1100
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 1 stop Hour-READ"
    id: batfirst_timer1_stop_hour
    internal: true
    register_type: holding
    address: 1101
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 1 stop Minute-READ"
    id: batfirst_timer1_stop_minute
    internal: true
    register_type: holding
    address: 1101
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
    # Battery First - Timeslot 2 read
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 2 start Hour-READ"
    id: batfirst_timer2_start_hour
    internal: true
    register_type: holding
    address: 1103
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 2 start Minute-READ"
    id: batfirst_timer2_start_minute
    internal: true
    register_type: holding
    address: 1103
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 2 stop Hour-READ"
    id: batfirst_timer2_stop_hour
    internal: true
    register_type: holding
    address: 1104
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 2 stop Minute-READ"
    id: batfirst_timer2_stop_minute
    internal: true
    register_type: holding
    address: 1104
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
    # Battery First - Timeslot 3 read
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 3 start Hour-READ"
    id: batfirst_timer3_start_hour
    internal: true
    register_type: holding
    address: 1106
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 3 start Minute-READ"
    id: batfirst_timer3_start_minute
    internal: true
    register_type: holding
    address: 1106
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 3 stop Hour-READ"
    id: batfirst_timer3_stop_hour
    internal: true
    register_type: holding
    address: 1107
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) >> 8);
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 3 stop Minute-READ"
    id: batfirst_timer3_stop_minute
    internal: true
    register_type: holding
    address: 1107
    value_type: U_WORD
    lambda: !lambda |-
      return float(int(x) & 255);

# Experimental addresses


#  - platform: modbus_controller
#    name: "X AC charge status"
#    address: 1092
#    register_type: "read"
#    unit_of_measurement: V
#    device_class: voltage
#    state_class: measurement
#    icon: mdi:solar-power
#    value_type: U_DWORD
#    accuracy_decimals: 1

select:
    
  - platform: modbus_controller
    name: "Battery Mode Load/Battery/Grid"
    address: 1044
    value_type: U_WORD
    optionsmap:
      "Load First": 0
      "Battery First": 1
      "Grid First": 2

  - platform: modbus_controller
    name: "Battery AC Charging On/Off" # Only applies in battery first mode
    icon: mdi:battery-charging-100
    address: 1092
    value_type: U_WORD
    optionsmap:
      "AC Charging Off": 0
      "AC Charging On": 1


script:

  - id: setAllTimes
    then:
    - lambda: |-
        esphome::modbus_controller::ModbusController *controller = id(epever);
        std::vector<uint16_t> disable_data = {0,0,0};
        std::vector<uint16_t> enable_data  = {0,23*256+59,1};
        std::vector<uint16_t> window_data  = {0,23*256+59,0};
        std::vector<uint16_t> morning_data = {2*256+0,5*256+0,1};

        std::vector<uint16_t> charge_rates = {100,100,1};
        int size = window_data.size();

        ESP_LOGI("ModbusLambda","Enqueue Writes");
        
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1090,charge_rates.size(),charge_rates));

        //GF1
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1080,size,disable_data));
        //GF2
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1083,size,disable_data));
        //GF3
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1086,size,disable_data));

        //BF1
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1100,size,morning_data));
        //BF2
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1103,size,disable_data));
        //BF3
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1106,size,disable_data));

        //LF1
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1110,size,disable_data));
        //LF2
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1113,size,disable_data));
        //LF3
        controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1116,size,disable_data));

        ESP_LOGI("ModbusLambda","Writes");


button:
  - platform: template
    name: "Battery First"
    on_press:
      then:
          lambda: |-
            esphome::modbus_controller::ModbusController *controller = id(epever);
            std::vector<uint16_t> on={0,23*256+59,1};
            std::vector<uint16_t> off={0,23*256+59,0};
            int size = on.size();

            ESP_LOGI("ModbusLambda","Enqueue Writes");
            //BF1
            controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1100,size,on));
            //LF1
            controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1110,size,off));
            //GF1
            controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1080,size,off));
            ESP_LOGI("ModbusLambda","Writes");

  - platform: template
    name: "Load First"
    on_press:
      then:
          lambda: |-
            esphome::modbus_controller::ModbusController *controller = id(epever);
            std::vector<uint16_t> on={0,23*256+59,1};
            std::vector<uint16_t> off={0,23*256+59,0};
            int size = on.size();

            ESP_LOGI("ModbusLambda","Enqueue Writes");
            //BF1
            controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1100,size,off));
            //LF1
            controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1110,size,on));
            //GF1
            controller->queue_command(esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller,1080,size,off));
            ESP_LOGI("ModbusLambda","Writes");

  - platform: restart
    name: "Growatt ESP Restart"

number:
  # Number Holding registers - ordered by register id
  - platform: modbus_controller
    name: "Inverter - Max Active Power output percent"
    register_type: holding
    mode: box
    address: 3
    value_type: U_WORD
    min_value: 1
    max_value: 100
    step: 1
    use_write_multiple: true
  - platform: modbus_controller
    name: "Inverter - Export Limit Power percent"
    register_type: holding
    mode: box
    address: 123
    value_type: U_WORD
    min_value: 0
    max_value: 100
    step: 1
    multiply: 10
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Load First Discharge stop SOC"
    register_type: holding
    mode: box
    address: 608
    value_type: U_WORD
    min_value: 10
    max_value: 100
    step: 1
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Grid First Discharge Power"
    register_type: holding
    mode: box
    address: 1070
    value_type: U_WORD
    min_value: 0
    max_value: 100
    step: 1
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Grid First Discharge stop SOC"
    register_type: holding
    mode: box
    address: 1071
    value_type: U_WORD
    min_value: 10
    max_value: 100
    step: 1
    use_write_multiple: true
  
    # Grid First - Timeslot 1
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 1 start Hour"
    register_type: holding
    mode: box
    address: 1080
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = gridfirst_timer1_start_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 1 start Minute"
    register_type: holding
    mode: box
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = gridfirst_timer1_start_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
    address: 1080
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 1 stop Hour"
    register_type: holding
    mode: box
    address: 1081
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = gridfirst_timer1_stop_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 1 stop Minute"
    register_type: holding
    mode: box
    address: 1081
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = gridfirst_timer1_stop_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;

    # Grid First - Timeslot 2
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 2 start Hour"
    register_type: holding
    mode: box
    address: 1083
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = gridfirst_timer2_start_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 2 start Minute"
    register_type: holding
    mode: box
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = gridfirst_timer2_start_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
    address: 1083
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 2 stop Hour"
    register_type: holding
    mode: box
    address: 1084
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = gridfirst_timer2_stop_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 2 stop Minute"
    register_type: holding
    mode: box
    address: 1084
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = gridfirst_timer2_stop_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;

    # Grid First - Timeslot 3
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 3 start Hour"
    register_type: holding
    mode: box
    address: 1086
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = gridfirst_timer3_start_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 3 start Minute"
    register_type: holding
    mode: box
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = gridfirst_timer3_start_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
    address: 1086
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 3 stop Hour"
    register_type: holding
    mode: box
    address: 1087
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = gridfirst_timer3_stop_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Grid First Timeslot 3 stop Minute"
    register_type: holding
    mode: box
    address: 1087
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = gridfirst_timer3_stop_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;

  - platform: modbus_controller
    name: "Battery - Battery First Charge Power"
    register_type: holding
    mode: box
    address: 1090
    value_type: U_WORD
    min_value: 1
    max_value: 100
    step: 1
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Battery First Charge stop SOC"
    register_type: holding
    mode: box
    address: 1091
    value_type: U_WORD
    min_value: 10
    max_value: 100
    step: 1
    use_write_multiple: true

    # Battery First - Timeslot 1
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 1 start Hour"
    register_type: holding
    mode: box
    address: 1100
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = batfirst_timer1_start_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 1 start Minute"
    register_type: holding
    mode: box
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = batfirst_timer1_start_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
    address: 1100
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 1 stop Hour"
    register_type: holding
    mode: box
    address: 1101
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = batfirst_timer1_stop_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 1 stop Minute"
    register_type: holding
    mode: box
    address: 1101
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = batfirst_timer1_stop_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;

    # Battery First - Timeslot 2
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 2 start Hour"
    register_type: holding
    mode: box
    address: 1103
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = batfirst_timer2_start_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 2 start Minute"
    register_type: holding
    mode: box
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = batfirst_timer2_start_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
    address: 1103
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 2 stop Hour"
    register_type: holding
    mode: box
    address: 1104
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = batfirst_timer2_stop_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 2 stop Minute"
    register_type: holding
    mode: box
    address: 1104
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = batfirst_timer2_stop_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;

    # Battery First - Timeslot 3
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 3 start Hour"
    register_type: holding
    mode: box
    address: 1106
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = batfirst_timer3_start_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 3 start Minute"
    register_type: holding
    mode: box
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = batfirst_timer3_start_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
    address: 1106
    use_write_multiple: true
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 3 stop Hour"
    register_type: holding
    mode: box
    address: 1107
    value_type: U_WORD
    min_value: 0
    max_value: 23
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) >> 8);
    write_lambda: !lambda |-
      float hour = x;
      float minute = batfirst_timer3_stop_minute->get_state();
      ESP_LOGD("main","hour set to : %f", hour);
      ESP_LOGD("main","minute set to : %f", minute);
      float returnval = float((int(hour) << 8 ) + minute );
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;
  - platform: modbus_controller
    name: "Battery - Battery First Timeslot 3 stop Minute"
    register_type: holding
    mode: box
    address: 1107
    value_type: U_WORD
    min_value: 0
    max_value: 59
    step: 1
    use_write_multiple: true
    lambda: !lambda |-
      return float(int(x) & 255);
    write_lambda: !lambda |-
      int hour = batfirst_timer3_stop_hour->get_state();
      int minute = x;
      ESP_LOGD("main","hour set to : %d", hour);
      ESP_LOGD("main","minute set to : %d", minute);
      float returnval = (hour << 8 ) + minute;
      ESP_LOGD("main","returnval: %f", returnval);
      return returnval;


I’m trying to read Modbus data from my SPH6000. I’m using the RS485 output. Or should I use the METER output? Can I leave the CT clamp connected? I’m a bit confused. Thanks.

Use rs485 and leave CT connected.

1 Like

Thanks very much