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
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
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?
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.
Thanks very much