- modbus:
- - name: modbus_hub
- type: rtuovertcp
- host: 192.168.1.245
- port: 4196
- delay: 0
- message_wait_milliseconds: 30
- timeout: 5
- id: mod_bus_sofar
- modbus_controller:
- - id: sofarsolar
- address: 0x01
- modbus_id: mod_bus_sofar
- update_interval: 1s
- text_sensor:
- - platform: template
- name: "ESP-Sofar Uptime (human readable)"
- id: uptime_human
- icon: "mdi:clock-start"
- update_interval: 5s
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} Status
- id: inverter_status
- register_type: holding
- icon: "mdi:information-outline"
- address: 0x0000
- response_size: 2
- lambda: |-
- auto z = "Unknown";
- char d = data[item->offset+1];
- if (d == 0) z = "Wait";
- else if (d == 1) z = "Check";
- else if (d == 2) z = "Normal";
- else if (d == 3) z = "Fault";
- else if (d == 4) z = "Permanent";
- return {z};
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} Fault Message
- id: inverter_fault_message
- register_type: holding
- icon: "mdi:alert-outline"
- address: 0x0001
- response_size: 10
- lambda: |-
- std::string z = "";
- int idx = item->offset;
- //byte[0]
- if ((data[idx] & 0x1) != 0) z += "GridOVP,";
- if ((data[idx] & 0x2) != 0) z += "GridUVP,";
- if ((data[idx] & 0x4) != 0) z += "GridOFP,";
- if ((data[idx] & 0x8) != 0) z += "GridUFP,";
- if ((data[idx] & 0x10) != 0) z += "PVUVP,";
- if ((data[idx] & 0x20) != 0) z += "GridLVRT,";
- if ((data[idx] & 0x40) != 0) z += "reserve-ID7,";
- if ((data[idx] & 0x80) != 0) z += "reserve-ID8,";
- //byte[1]
- idx++;
- if ((data[idx] & 0x1) != 0) z += "PVOVP,";
- if ((data[idx] & 0x2) != 0) z += "IpvUnbalance,";
- if ((data[idx] & 0x4) != 0) z += "PvConfigSetWrong,";
- if ((data[idx] & 0x8) != 0) z += "GFCIFault,";
- if ((data[idx] & 0x10) != 0) z += "PhaseSequenceFault,";
- if ((data[idx] & 0x20) != 0) z += "HwBoostOCP,";
- if ((data[idx] & 0x40) != 0) z += "HwAcOCP,";
- if ((data[idx] & 0x80) != 0) z += "AcRmsOCP,";
- //byte[2]
- idx++;
- if ((data[idx] & 0x1) != 0) z += "HwADFaultIGrid,";
- if ((data[idx] & 0x2) != 0) z += "HwADFaultDCI,";
- if ((data[idx] & 0x4) != 0) z += "HwADFaultVGrid,";
- if ((data[idx] & 0x8) != 0) z += "GFCIDeviceFault,";
- if ((data[idx] & 0x10) != 0) z += "MChip_Fault,";
- if ((data[idx] & 0x20) != 0) z += "HwAuxPowerFault,";
- if ((data[idx] & 0x40) != 0) z += "BusVoltZeroFault,";
- if ((data[idx] & 0x80) != 0) z += "IacRmsUnbalance,";
- //byte[3]
- idx++;
- if ((data[idx] & 0x1) != 0) z += "BusUVP,";
- if ((data[idx] & 0x2) != 0) z += "BusOVP,";
- if ((data[idx] & 0x4) != 0) z += "VbusUnbalance,";
- if ((data[idx] & 0x8) != 0) z += "DciOCP,";
- if ((data[idx] & 0x10) != 0) z += "SwOCPInstant,";
- if ((data[idx] & 0x20) != 0) z += "SwBOCPInstant,";
- if ((data[idx] & 0x40) != 0) z += "reserved-ID31,";
- if ((data[idx] & 0x80) != 0) z += "reserved-ID32,";
- //byte[4]
- idx++;
- if (data[idx] != 0) z += "reserved-ID33~40,";
- //byte[5]
- idx++;
- if (data[idx] != 0) z += "reserved-ID41~48,";
- //byte[6]
- idx++;
- if ((data[idx] & 0x1) != 0) z += "ConsistentFault_VGrid,";
- if ((data[idx] & 0x2) != 0) z += "ConsistentFault_FGrid,";
- if ((data[idx] & 0x4) != 0) z += "ConsistentFault_DCI,";
- if ((data[idx] & 0x8) != 0) z += "ConsistentFault_GFCI,";
- if ((data[idx] & 0x10) != 0) z += "SpiCommLose,";
- if ((data[idx] & 0x20) != 0) z += "SciCommLose,";
- if ((data[idx] & 0x40) != 0) z += "RelayTestFail,";
- if ((data[idx] & 0x80) != 0) z += "PvIsoFault,";
- //byte[7]
- idx++;
- if ((data[idx] & 0x1) != 0) z += "OverTempFault_Inv,";
- if ((data[idx] & 0x2) != 0) z += "OverTempFault_Boost,";
- if ((data[idx] & 0x4) != 0) z += "OverTempFault_Env,";
- if ((data[idx] & 0x8) != 0) z += "PEConnectFault,";
- if ((data[idx] & 0x10) != 0) z += "reserved-ID61,";
- if ((data[idx] & 0x20) != 0) z += "reserved-ID62,";
- if ((data[idx] & 0x40) != 0) z += "reserved-ID63,";
- if ((data[idx] & 0x80) != 0) z += "reserved-ID64,";
- //byte[8]
- idx++;
- if ((data[idx] & 0x1) != 0) z += "unrecoverHwAcOCP,";
- if ((data[idx] & 0x2) != 0) z += "unrecoverBusOVP,";
- if ((data[idx] & 0x4) != 0) z += "unrecoverIacRmsUnbalance,";
- if ((data[idx] & 0x8) != 0) z += "unrecoverIpvUnbalance,";
- if ((data[idx] & 0x10) != 0) z += "unrecoverVbusUnbalance,";
- if ((data[idx] & 0x20) != 0) z += "unrecoverOCPInstant,";
- if ((data[idx] & 0x40) != 0) z += "unrecoverPvConfigSetWrong,";
- if ((data[idx] & 0x80) != 0) z += "reserved-ID72,";
- //byte[9]
- idx++;
- if ((data[idx] & 0x1) != 0) z += "reserved-ID73,";
- if ((data[idx] & 0x2) != 0) z += "unrecoverIPVInstant,";
- if ((data[idx] & 0x4) != 0) z += "unrecoverWRITEEEPROM,";
- if ((data[idx] & 0x8) != 0) z += "unrecoverREADEEPROM,";
- if ((data[idx] & 0x10) != 0) z += "unrecoverRelayFail,";
- if ((data[idx] & 0x20) != 0) z += "reserved-ID78,";
- if ((data[idx] & 0x40) != 0) z += "reserved-ID79,";
- if ((data[idx] & 0x80) != 0) z += "reserved-ID80,";
- if(z.length() > 0){
- z.pop_back();
- }
- return {z};
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} DC1 Voltage
- id: inverter_dc_v1
- register_type: holding
- address: 0x0006
- unit_of_measurement: "V"
- state_class: "measurement"
- device_class: "voltage"
- icon: "mdi:alpha-v-circle-outline"
- value_type: U_WORD
- accuracy_decimals: 1
- filters:
- - multiply: 0.1
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} DC1 Current
- id: inverter_dc_c1
- register_type: holding
- address: 0x0007
- unit_of_measurement: "A"
- state_class: "measurement"
- device_class: "current"
- icon: "mdi:alpha-a-circle-outline"
- value_type: U_WORD
- accuracy_decimals: 2
- filters:
- - multiply: 0.01
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} DC2 Voltage
- id: inverter_dc_v2
- register_type: holding
- address: 0x0008
- unit_of_measurement: "V"
- state_class: "measurement"
- device_class: "voltage"
- icon: "mdi:alpha-v-circle-outline"
- value_type: U_WORD
- accuracy_decimals: 1
- filters:
- - multiply: 0.1
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} DC2 Current
- id: inverter_dc_c2
- register_type: holding
- address: 0x0009
- unit_of_measurement: "A"
- state_class: "measurement"
- device_class: "current"
- icon: "mdi:alpha-a-circle-outline"
- value_type: U_WORD
- accuracy_decimals: 2
- filters:
- - multiply: 0.01
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} DC1 Power
- id: inverter_dc_power1
- register_type: holding
- address: 0x000a
- unit_of_measurement: "W"
- state_class: "measurement"
- device_class: "power"
- icon: "mdi:solar-power"
- value_type: U_WORD
- filters:
- - multiply: 10
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} DC2 Power
- id: inverter_dc_power2
- register_type: holding
- address: 0x000b
- unit_of_measurement: "W"
- state_class: "measurement"
- device_class: "power"
- icon: "mdi:solar-power"
- value_type: U_WORD
- filters:
- - multiply: 10
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} AC Power
- id: inverter_ac_power
- register_type: holding
- address: 0x000c
- unit_of_measurement: "W"
- state_class: "measurement"
- device_class: "power"
- icon: "mdi:solar-power-variant-outline"
- value_type: U_WORD
- filters:
- - multiply: 10
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} AC Reactive Power
- id: inverter_ac_reactive_power
- register_type: holding
- address: 0x000d
- unit_of_measurement: "kVar"
- state_class: "measurement"
- #device_class: "reactive_power"
- icon: "mdi:math-cos"
- value_type: S_WORD
- filters:
- - multiply: 10
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} AC Freq
- id: inverter_ac_freq
- register_type: holding
- address: 0x000e
- unit_of_measurement: "Hz"
- state_class: "measurement"
- #device_class: "frequency"
- icon: "mdi:current-ac"
- value_type: U_WORD
- accuracy_decimals: 2
- filters:
- - multiply: 0.01
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} L1 Voltage
- id: inverter_ac_v1
- register_type: holding
- address: 0x000f
- unit_of_measurement: "V"
- state_class: "measurement"
- device_class: "voltage"
- icon: "mdi:alpha-v-circle"
- value_type: U_WORD
- accuracy_decimals: 1
- filters:
- - multiply: 0.1
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} L1 Current
- id: inverter_ac_c1
- register_type: holding
- address: 0x0010
- unit_of_measurement: "A"
- state_class: "measurement"
- device_class: "current"
- icon: "mdi:alpha-a-circle"
- value_type: U_WORD
- accuracy_decimals: 2
- filters:
- - multiply: 0.01
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} L2 Voltage
- id: inverter_ac_v2
- register_type: holding
- address: 0x0011
- unit_of_measurement: "V"
- state_class: "measurement"
- device_class: "voltage"
- icon: "mdi:alpha-v-circle"
- value_type: U_WORD
- accuracy_decimals: 1
- filters:
- - multiply: 0.1
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} L2 Current
- id: inverter_ac_c2
- register_type: holding
- address: 0x0012
- unit_of_measurement: "A"
- state_class: "measurement"
- device_class: "current"
- icon: "mdi:alpha-a-circle"
- value_type: U_WORD
- accuracy_decimals: 2
- filters:
- - multiply: 0.01
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} L3 Voltage
- id: inverter_ac_v3
- register_type: holding
- address: 0x0013
- unit_of_measurement: "V"
- state_class: "measurement"
- device_class: "voltage"
- icon: "mdi:alpha-v-circle"
- value_type: U_WORD
- accuracy_decimals: 1
- filters:
- - multiply: 0.1
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} L3 Current
- id: inverter_ac_c3
- register_type: holding
- address: 0x0014
- unit_of_measurement: "A"
- state_class: "measurement"
- device_class: "current"
- icon: "mdi:alpha-a-circle"
- value_type: U_WORD
- accuracy_decimals: 2
- filters:
- - multiply: 0.01
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} Energy total
- id: inverter_energy_total
- register_type: holding
- address: 0x0015
- unit_of_measurement: "kWh"
- accuracy_decimals: 2
- device_class: "energy"
- state_class: "total_increasing"
- icon: "mdi:solar-power-variant-outline"
- value_type: U_DWORD
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} Energy generation time total
- id: inverter_energy_generation_time_total
- register_type: holding
- address: 0x0017
- unit_of_measurement: "h"
- icon: "mdi:timeline-clock"
- value_type: U_DWORD
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} Energy today
- id: inverter_energy_today
- register_type: holding
- address: 0x0019
- unit_of_measurement: "kWh"
- state_class: "measurement"
- device_class: "energy"
- icon: "mdi:solar-power-variant-outline"
- value_type: U_WORD
- accuracy_decimals: 2
- filters:
- - multiply: 0.01
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} Energy generation time today
- id: inverter_energy_generation_time_today
- register_type: holding
- address: 0x001A
- unit_of_measurement: "min"
- icon: "mdi:timeline-clock"
- value_type: U_WORD
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} Temprature module
- id: inverter_temp_module
- register_type: holding
- address: 0x001B
- unit_of_measurement: "°C"
- state_class: "measurement"
- device_class: "temperature"
- icon: "mdi:temperature-celsius"
- value_type: U_WORD
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} Temprature inverter
- id: inverter_temp_inverter
- register_type: holding
- address: 0x001C
- unit_of_measurement: "°C"
- state_class: "measurement"
- device_class: "temperature"
- icon: "mdi:temperature-celsius"
- value_type: U_WORD
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} Bus voltage
- id: inverter_bus_voltage
- register_type: holding
- address: 0x001D
- unit_of_measurement: "V"
- state_class: "measurement"
- device_class: "voltage"
- icon: "mdi:alpha-v-circle-outline"
- value_type: U_WORD
- accuracy_decimals: 1
- filters:
- - multiply: 0.1
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} PV1+ isolation resistance
- id: inverter_dc_isolation_resistance1
- register_type: holding
- address: 0x0024
- unit_of_measurement: "Ohm"
- state_class: "measurement"
- icon: "mdi:omega"
- value_type: U_WORD
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} PV2+ isolation resistance
- id: inverter_dc_isolation_resistance2
- register_type: holding
- address: 0x0025
- unit_of_measurement: "Ohm"
- state_class: "measurement"
- icon: "mdi:omega"
- value_type: U_WORD
- - platform: modbus_controller
- modbus_controller_id: sofarsolar
- name: ${friendly_name} PV- isolation resistance
- id: inverter_cathode_to_ground_impedance
- register_type: holding
- address: 0x0026
- unit_of_measurement: "Ohm"
- state_class: "measurement"
- icon: "mdi:omega"
- value_type: U_WORD
- - platform: template
- name: ${friendly_name} AC Current (total)
- lambda: |-
- return (id(inverter_ac_c1).state + id(inverter_ac_c2).state + id(inverter_ac_c3).state);
- unit_of_measurement: A
- accuracy_decimals: 2
- icon: "mdi:alpha-a-circle"
- device_class: "current"
- state_class: "measurement"
- update_interval: 5s
- - platform: template
- name: ${friendly_name} DC Current (total)
- lambda: |-
- return (id(inverter_dc_c1).state + id(inverter_dc_c2).state);
- unit_of_measurement: A
- accuracy_decimals: 1
- state_class: "measurement"
- device_class: "current"
- icon: "mdi:alpha-a-circle-outline"
- update_interval: 5s
- - platform: template
- name: ${friendly_name} DC Power (total)
- lambda: |-
- return (id(inverter_dc_power2).state + id(inverter_dc_power1).state);
- unit_of_measurement: W
- state_class: "measurement"
- device_class: "power"
- accuracy_decimals: 0
- icon: "mdi:alpha-a-circle-outline"
- update_interval: 5s