Open softwarecrash opened 1 week ago
added some basic support for ANENJI according to the pdf registers map https://github.com/bigdigital/Solar2MQTT/commit/32304256e936716b9a5782027ee25a023019b351
added some basic support for ANENJI according to the pdf registers map bigdigital@3230425
wow great... need some PR asap to avoid more code conflicts
Hi, i'm very interested in this project and willing to help. I was trying to use it for Anenji 6.2 (blue one, no parallel) Seams it's clone of EASUN SMG II
I couldn't use code from bigdigital (compiled and upload to Wemos D1 mini) Using ESPHome component - https://github.com/syssi/esphome-smg-ii worked fine, but it's laggy and not stable (i spent 3h on configurating yaml... not to face OOM)
https://github.com/softwarecrash/Solar2MQTT/pull/174/files - created PR with @bigdigital (main kudos to Artem !) and added more info from provided pdf.
here is my esphome config:
substitutions:
name: anenji
friendly_name: anenji
tx_pin: GPIO13
rx_pin: GPIO12
esphome:
name: ${name}
friendly_name: ${friendly_name}
min_version: 2024.6.0
name_add_mac_suffix: false
project:
name: "syssi.esphome-smg-ii"
version: 1.2.0
esp8266:
board: d1_mini
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
logger:
level: INFO
# If you use Home Assistant please remove this `mqtt` section and uncomment the `api` component!
# The native API has many advantages over MQTT: https://esphome.io/components/api.html#advantages-over-mqtt
# mqtt:
# broker: !secret mqtt_host
# username: !secret mqtt_username
# password: !secret mqtt_password
# id: mqtt_client
# discovery: False
# discover_ip: True
api:
encryption:
key: !secret api_key
ota:
- platform: esphome
password: !secret ota_pass
uart:
- id: uart_0
baud_rate: 9600
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
modbus:
- id: modbus0
uart_id: uart_0
send_wait_time: 200ms
modbus_controller:
- id: smg0
address: 0x01
modbus_id: modbus0
command_throttle: 200ms
update_interval: 10s
time:
- platform: sntp
sensor:
# - platform: total_daily_energy
# name: "${name} PV energy today"
# restore: true
# icon: mdi:counter
# power_id: smg0_pv_average_power
# filters:
# # Multiplication factor from W to kW is 0.001
# - multiply: 0.001
# unit_of_measurement: kWh
# Fault code ULong 100 2 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} fault code"
address: 100
register_type: holding
value_type: U_DWORD
accuracy_decimals: 0
# # Warning code ULong 108 2 R
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} warning code"
# address: 108
# register_type: holding
# value_type: U_DWORD
# accuracy_decimals: 0
# Operation Mode UInt 201 1 R 0: Power On
# 1: Standby
# 2: Mains
# 3: Off-Grid
# 4: Bypass
# 5: Charging
# 6: Fault
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} operation mode id"
address: 201
register_type: holding
value_type: U_WORD
accuracy_decimals: 0
# Effective mains voltage 0.1V Int 202 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} ac voltage"
address: 202
register_type: holding
value_type: S_WORD
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# Mains Frequency 0.01Hz Int 203 1 R
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} ac frequency"
# address: 203
# register_type: holding
# value_type: S_WORD
# unit_of_measurement: "Hz"
# device_class: frequency
# state_class: measurement
# accuracy_decimals: 2
# filters:
# - multiply: 0.01
# Average mains power 1W Int 204 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} average mains power"
address: 204
register_type: holding
value_type: S_WORD
unit_of_measurement: "W"
device_class: power
state_class: measurement
accuracy_decimals: 0
# Effective inverter voltage 0.1V Int 205 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} effective inverter voltage"
address: 205
register_type: holding
value_type: S_WORD
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# Effective inverter current 0.1A Int 206 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} effective inverter current"
address: 206
register_type: holding
value_type: S_WORD
unit_of_measurement: "A"
device_class: current
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# Inverter frequency 0.01Hz Int 207 1 R
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} inverter frequency"
# address: 207
# register_type: holding
# value_type: S_WORD
# unit_of_measurement: "Hz"
# device_class: frequency
# state_class: measurement
# accuracy_decimals: 2
# filters:
# - multiply: 0.01
# Average inverter power 1W Int 208 1 R Positive numbers indicate inverter output, negative numbers indicate inverter input
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} average inverter power"
address: 208
register_type: holding
value_type: S_WORD
unit_of_measurement: "W"
device_class: power
state_class: measurement
accuracy_decimals: 0
# Inverter charging power 1W Int 209 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} inverter charging power"
address: 209
register_type: holding
value_type: S_WORD
unit_of_measurement: "W"
device_class: power
state_class: measurement
accuracy_decimals: 0
# Output effective voltage 0.1V Int 210 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} output effective voltage"
address: 210
register_type: holding
value_type: S_WORD
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# Output effective Current 0.1A Int 211 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} output effective Current"
address: 211
register_type: holding
value_type: S_WORD
unit_of_measurement: "A"
device_class: current
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# Output frequency 0.01Hz Int 212 1 R
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} output frequency"
# address: 212
# register_type: holding
# value_type: S_WORD
# unit_of_measurement: "Hz"
# device_class: frequency
# state_class: measurement
# accuracy_decimals: 2
# filters:
# - multiply: 0.01
# Output active power 1W Int 213 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} output active power"
address: 213
register_type: holding
value_type: S_WORD
unit_of_measurement: "W"
device_class: power
state_class: measurement
accuracy_decimals: 0
# Output apparent power 1VA Int 214 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} output apparent power"
address: 214
register_type: holding
value_type: S_WORD
unit_of_measurement: "VA"
device_class: apparent_power
state_class: measurement
accuracy_decimals: 0
# Battery average voltage 0.1V Int 215 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery average voltage"
address: 215
register_type: holding
value_type: S_WORD
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# Battery average Current 0.1A Int 216 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery average Current"
address: 216
register_type: holding
value_type: S_WORD
unit_of_measurement: "A"
device_class: current
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# Battery average power 1W Int 217 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery average power"
address: 217
register_type: holding
value_type: S_WORD
unit_of_measurement: "W"
device_class: power
state_class: measurement
accuracy_decimals: 0
# PV average voltage 0.1V Int 219 1 R
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} pv average voltage"
# address: 219
# register_type: holding
# value_type: S_WORD
# unit_of_measurement: "V"
# device_class: voltage
# state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# PV average current 0.1A Int 220 1 R
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} pv average current"
# address: 220
# register_type: holding
# value_type: S_WORD
# unit_of_measurement: "A"
# device_class: current
# state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# PV average power 1W Int 223 1 R
# - platform: modbus_controller
# modbus_controller_id: smg0
# id: smg0_pv_average_power
# name: "${name} pv average power"
# address: 223
# register_type: holding
# value_type: S_WORD
# unit_of_measurement: "W"
# device_class: power
# state_class: measurement
# accuracy_decimals: 0
# PV charging average power 1W Int 224 1 R
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} pv charging average power"
# address: 224
# register_type: holding
# value_type: S_WORD
# unit_of_measurement: "W"
# device_class: power
# state_class: measurement
# accuracy_decimals: 0
# Load percentage 1% Int 225 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} load percentage"
address: 225
register_type: holding
value_type: S_WORD
unit_of_measurement: "%"
# device_class: battery
state_class: measurement
accuracy_decimals: 0
# DCDC Temperature 1°C Int 226 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} dcdc temperature"
address: 226
register_type: holding
value_type: S_WORD
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
accuracy_decimals: 0
# Inverter Temperature 1°C Int 227 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} inverter temperature"
address: 227
register_type: holding
value_type: S_WORD
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
accuracy_decimals: 0
# Battery state of charge 1% UInt 229 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery state of charge"
address: 229
register_type: holding
value_type: U_WORD
unit_of_measurement: "%"
device_class: battery
state_class: measurement
accuracy_decimals: 0
# Battery average current 0.1A Int 232 1 R Positive number means charging, negative number means discharging
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery average current"
address: 232
register_type: holding
value_type: S_WORD
unit_of_measurement: "A"
device_class: current
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# Inverter charging average current 0.1A Int 233 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} inverter charging average current"
address: 233
register_type: holding
value_type: S_WORD
unit_of_measurement: "A"
device_class: current
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# PV charging average current 0.1A Int 234 1 R
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} pv charging average current"
# address: 234
# register_type: holding
# value_type: S_WORD
# unit_of_measurement: "A"
# device_class: current
# state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# # Output voltage 0.1V Uint 320 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} output voltage"
# address: 320
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "V"
# device_class: voltage
# # state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# # Output frequency setting 0.01Hz Uint 321 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} output frequency setting"
# address: 321
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "Hz"
# device_class: frequency
# # state_class: measurement
# accuracy_decimals: 2
# filters:
# - multiply: 0.01
# # Battery overvoltage protection point 0.1V Uint 323 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} battery overvoltage protection point"
# address: 323
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "V"
# device_class: voltage
# # state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# # Max charging voltage 0.1V Uint 324 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} max charging voltage"
# address: 324
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "V"
# device_class: voltage
# # state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# # Floating charging voltage 0.1V Uint 325 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} floating charging voltage"
# address: 325
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "V"
# device_class: voltage
# # state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# # Battery discharge recovery point in mains mode 0.1V Uint 326 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} battery discharge recovery point in mains mode"
# address: 326
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "V"
# device_class: voltage
# # state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# # Battery low voltage protection point in mains mode 0.1V Uint 327 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} battery low voltage protection point in mains mode"
# address: 327
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "V"
# device_class: voltage
# # state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# # Battery low voltage protection point in off-grid mode 0.1V Uint 329 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} battery low voltage protection point in off-grid mode"
# address: 329
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "V"
# device_class: voltage
# # state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# Maximum charging current 0.1A Uint 332 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} maximum charging current"
address: 332
register_type: holding
value_type: U_WORD
unit_of_measurement: "A"
device_class: current
# state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
# # Maximum mains charging current 0.1A Uint 333 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} maximum mains charging current"
# address: 333
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "A"
# device_class: current
# # state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# # Eq Charging voltage 0.1V Uint 334 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} Eq Charging voltage"
# address: 334
# register_type: holding
# value_type: U_WORD
# unit_of_measurement: "V"
# device_class: voltage
# # state_class: measurement
# accuracy_decimals: 1
# filters:
# - multiply: 0.1
# Rated power W Uint 643 1 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} rated power"
address: 643
register_type: holding
value_type: U_WORD
unit_of_measurement: "W"
device_class: power
# state_class: measurement
accuracy_decimals: 0
select:
# # Output Mode Uint 300 1 R/W 0: Single, 1: Parallel, 2: 3 Phase-P1, 3: 3 Phase-P2, 4: 3 Phase-P3
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} output mode"
# use_write_multiple: true
# address: 300
# value_type: U_WORD
# optionsmap:
# "Single": 0
# "Parallel": 1
# "Phase P1": 2
# "Phase P2": 3
# "Phase P3": 4
# Output priority Uint 301 1 R/W 0: Utility-PV-Battery, 1: PV-Utility-Battery, 2: PV-Battery-Utility
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} output priority"
use_write_multiple: true
address: 301
value_type: U_WORD
optionsmap:
"Utility-PV-Battery (UTI)": 0
"PV-Utility-Battery (SOL)": 1
"PV-Battery-Utility (SBU)": 2
"PV-Utility-Battery (SUB)": 3
# Input voltage range Uint 302 1 R/W 0: Wide range, 1: Narrow range
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} input voltage range"
use_write_multiple: true
address: 302
value_type: U_WORD
optionsmap:
"Wide range": 0
"Narrow range": 1
# Buzzer mode Uint 303 1 R/W 0: Mute in all situations, 1: Sound when the input source is changed or there is a specific warning or fault, 2: Sound when there is aspecific warning or fault, 3: Sound when fault occurs
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} buzzer mode"
use_write_multiple: true
address: 303
value_type: U_WORD
optionsmap:
"Silent": 0
"Beep on input source changes, warnings and faults": 1
"Beep on warnings and faults": 2
"Beep on faults": 3
# LCD backlight Uint 305 1 R/W 0: Timed off, 1: Always on
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} lcd backlight"
use_write_multiple: true
address: 305
value_type: U_WORD
optionsmap:
"Timed off": 0
"Always on": 1
# Battery charging priority Uint 331 1 R/W 0: Utility priority, 1: PV priority, 2: PV is at the same level as the Utility, 3: Only PV charging is allowed
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery charging priority"
use_write_multiple: true
address: 331
value_type: U_WORD
optionsmap:
"Utility priority": 0
"PV priority": 1
"PV is at the same level as the Utility": 2
"Only PV charging is allowed": 3
# Turn on mode Uint 406 1 R/W 0: Can be turn-on locally or remotely, 1: Only local turn-on, 2: Only remote turn-on
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} turn on mode"
use_write_multiple: true
address: 406
value_type: U_WORD
optionsmap:
"Local and remotely turn-on allowed": 0
"Local turn-on only": 1
"Remote turn-on only": 2
switch:
# LCD automatically returns to the homepage Uint 306 1 R/W 0: Do not return automatically, 1: Automatically return after 1 minute
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} lcd automatically returns to the homepage"
use_write_multiple: true
address: 306
register_type: holding
bitmask: 1
# Energy-saving mode Uint 307 1 R/W 0: Energy-saving mode is off, 1: Energy-saving mode is on
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} energy-saving mode"
# use_write_multiple: true
# address: 307
# register_type: holding
# bitmask: 1
# Overload automatic restart Uint 308 1 R/W 0: Overload failure will not restart, 1: Automatic restart after overload failure
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} overload automatic restart"
use_write_multiple: true
address: 308
register_type: holding
bitmask: 1
# Over temperature automatic restart Uint 309 1 R/W 0: Over temperature failure will not restart, 1: Automatic restart after over-temperature fault
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} over temperature automatic restart"
use_write_multiple: true
address: 309
register_type: holding
bitmask: 1
# Overload transfer to bypass enabled Uint 310 1 R/W 0: Disable, 1: Enable
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} overload transfer to bypass enabled"
use_write_multiple: true
address: 310
register_type: holding
bitmask: 1
# Battery Eq mode is enabled Uint 313 1 R/W 0: Disable, 1: Enable
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery Eq mode is enabled"
use_write_multiple: true
address: 313
register_type: holding
bitmask: 1
# Remote switch Uint 420 1 R/W 0: Remote shutdown, 1: Remote turn-on
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} remote switch"
use_write_multiple: true
address: 420
register_type: holding
bitmask: 1
text_sensor:
# Fault code ULong 100 2 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} fault"
address: 100
register_type: holding
register_count: 2
response_size: 4
raw_encode: HEXBYTES
lambda: |-
static const uint8_t FAULTS_SIZE = 27;
static const char *const FAULTS[FAULTS_SIZE] = {
"Over temperature of inverter module", // 0000 0000 0000 0000 0000 0000 0000 0001 (1)
"Over temperature of DCDC module", // 0000 0000 0000 0000 0000 0000 0000 0010 (2)
"Battery over voltage", // 0000 0000 0000 0000 0000 0000 0000 0100 (3)
"PV module over temperature", // 0000 0000 0000 0000 0000 0000 0000 1000 (4)
"Output short circuit", // 0000 0000 0000 0000 0000 0000 0001 0000 (5)
"Inverter over voltage", // 0000 0000 0000 0000 0000 0000 0010 0000 (6)
"Output over load", // 0000 0000 0000 0000 0000 0000 0100 0000 (7)
"Bus over voltage", // 0000 0000 0000 0000 0000 0000 1000 0000 (8)
"Bus soft start timed out", // 0000 0000 0000 0000 0000 0001 0000 0000 (9)
"PV over current", // 0000 0000 0000 0000 0000 0010 0000 0000 (10)
"PV over voltage", // 0000 0000 0000 0000 0000 0100 0000 0000 (11)
"Battery over current", // 0000 0000 0000 0000 0000 1000 0000 0000 (12)
"Inverter over current", // 0000 0000 0000 0000 0001 0000 0000 0000 (13)
"Bus low voltage", // 0000 0000 0000 0000 0010 0000 0000 0000 (14)
"Reserve (Bit 15)", // 0000 0000 0000 0000 0100 0000 0000 0000 (15)
"Inverter DC component is too high", // 0000 0000 0000 0000 1000 0000 0000 0000 (16)
"Reserve (Bit 17)", // 0000 0000 0000 0001 0000 0000 0000 0000 (17)
"The zero bias of output current is too large", // 0000 0000 0000 0010 0000 0000 0000 0000 (18)
"The zero bias of inverter current is too large", // 0000 0000 0000 0100 0000 0000 0000 0000 (19)
"The zero bias of battery current is too large", // 0000 0000 0000 1000 0000 0000 0000 0000 (20)
"The zero bias of PV current is too large", // 0000 0000 0001 0000 0000 0000 0000 0000 (21)
"Inverter low voltage", // 0000 0000 0010 0000 0000 0000 0000 0000 (22)
"Inverter negative power protection", // 0000 0000 0100 0000 0000 0000 0000 0000 (23)
"The host in the parallel system is lost", // 0000 0000 1000 0000 0000 0000 0000 0000 (24)
"Synchronization signal abnormal in the parallel system", // 0000 0001 0000 0000 0000 0000 0000 0000 (25)
"The battery type is incompatible", // 0000 0010 0000 0000 0000 0000 0000 0000 (26)
"Parallel versions are incompatible", // 0000 0100 0000 0000 0000 0000 0000 0000 (27)
};
std::string values = "";
uint32_t mask = modbus_controller::dword_from_hex_str(x, 0);
if (mask) {
for (int i = 0; i < FAULTS_SIZE; i++) {
if (mask & (1 << i)) {
values.append(FAULTS[i]);
values.append(";");
}
}
if (!values.empty()) {
values.pop_back();
}
}
return values;
# Warning code ULong 108 2 R
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} warning"
address: 108
register_type: holding
register_count: 2
response_size: 4
raw_encode: HEXBYTES
lambda: |-
static const uint8_t WARNINGS_SIZE = 19;
static const char *const WARNINGS[WARNINGS_SIZE] = {
"Reserve (Bit 0)", // 0000 0000 0000 0000 0000 0000 0000 0001 (1)
"Mains waveform abnormal", // 0000 0000 0000 0000 0000 0000 0000 0010 (2)
"Reserve (Bit 2)", // 0000 0000 0000 0000 0000 0000 0000 0100 (3)
"Mains low voltage", // 0000 0000 0000 0000 0000 0000 0000 1000 (4)
"Mains over frequency", // 0000 0000 0000 0000 0000 0000 0001 0000 (5)
"Mains low frequency", // 0000 0000 0000 0000 0000 0000 0010 0000 (6)
"PV low voltage", // 0000 0000 0000 0000 0000 0000 0100 0000 (7)
"Over temperature", // 0000 0000 0000 0000 0000 0000 1000 0000 (8)
"Battery low voltage", // 0000 0000 0000 0000 0000 0001 0000 0000 (9)
"Battery is not connected", // 0000 0000 0000 0000 0000 0010 0000 0000 (10)
"Overload", // 0000 0000 0000 0000 0000 0100 0000 0000 (11)
"Battery Eq charging", // 0000 0000 0000 0000 0000 1000 0000 0000 (12)
"Battery undervoltage", // 0000 0000 0000 0000 0001 0000 0000 0000 (13)
"Output power derating", // 0000 0000 0000 0000 0010 0000 0000 0000 (14)
"Fan blocked", // 0000 0000 0000 0000 0100 0000 0000 0000 (15)
"PV energy is too low to be use", // 0000 0000 0000 0000 1000 0000 0000 0000 (16)
"Parallel communication interrupted", // 0000 0000 0000 0001 0000 0000 0000 0000 (17)
"Output mode of Single and Parallel systems inconsistent", // 0000 0000 0000 0010 0000 0000 0000 0000 (18)
"Battery voltage difference of parallel system is too large", // 0000 0000 0000 0100 0000 0000 0000 0000 (19)
};
std::string values = "";
uint32_t mask = modbus_controller::dword_from_hex_str(x, 0);
if (mask) {
for (int i = 0; i < WARNINGS_SIZE; i++) {
if (mask & (1 << i)) {
values.append(WARNINGS[i]);
values.append(";");
}
}
if (!values.empty()) {
values.pop_back();
}
}
return values;
# Operation Mode UInt 201 1 R 0: Power On, 1: Standby, 2: Mains, 3: Off-Grid, 4: Bypass, 5: Charging, 6: Fault
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} operation mode"
address: 201
register_type: holding
raw_encode: HEXBYTES
lambda: |-
uint16_t value = modbus_controller::word_from_hex_str(x, 0);
switch (value) {
case 0: return std::string("Power On");
case 1: return std::string("Standby");
case 2: return std::string("Mains");
case 3: return std::string("Off-Grid");
case 4: return std::string("Bypass");
case 5: return std::string("Charging");
case 6: return std::string("Fault");
}
return std::string("Unknown");
number:
# Output voltage 0.1V Uint 320 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} output voltage"
use_write_multiple: true
address: 320
register_type: holding
value_type: U_WORD
min_value: 0.0
# max_value: 100.0
step: 0.1
unit_of_measurement: "V"
lambda: "return x * 0.1f;"
write_lambda: |-
return x * 10.0f;
# Output frequency setting 0.01Hz Uint 321 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} output frequency setting"
# use_write_multiple: true
# address: 321
# register_type: holding
# value_type: U_WORD
# min_value: 0.0
# # max_value: 100.0
# step: 0.01
# unit_of_measurement: "Hz"
# lambda: "return x * 0.01f;"
# write_lambda: |-
# return x * 100.0f;
# Battery overvoltage protection point 0.1V Uint 323 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery overvoltage protection point"
use_write_multiple: true
address: 323
register_type: holding
value_type: U_WORD
min_value: 0.0
# max_value: 100.0
step: 0.1
unit_of_measurement: "V"
lambda: "return x * 0.1f;"
write_lambda: |-
return x * 10.0f;
# Max charging voltage 0.1V Uint 324 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} max charging voltage"
use_write_multiple: true
address: 324
register_type: holding
value_type: U_WORD
min_value: 0.0
max_value: 100.0
step: 0.1
unit_of_measurement: "V"
lambda: "return x * 0.1f;"
write_lambda: |-
return x * 10.0f;
# Floating charging voltage 0.1V Uint 325 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} floating charging voltage"
use_write_multiple: true
address: 325
register_type: holding
value_type: U_WORD
min_value: 0.0
# max_value: 100.0
step: 0.1
unit_of_measurement: "V"
lambda: "return x * 0.1f;"
write_lambda: |-
return x * 10.0f;
# Battery discharge recovery point in mains mode 0.1V Uint 326 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery discharge recovery point in mains mode"
use_write_multiple: true
address: 326
register_type: holding
value_type: U_WORD
min_value: 0.0
# max_value: 100.0
step: 0.1
unit_of_measurement: "V"
lambda: "return x * 0.1f;"
write_lambda: |-
return x * 10.0f;
# Battery low voltage protection point in mains mode 0.1V Uint 327 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery low voltage protection point in mains mode"
use_write_multiple: true
address: 327
register_type: holding
value_type: U_WORD
min_value: 0.0
# max_value: 100.0
step: 0.1
unit_of_measurement: "V"
lambda: "return x * 0.1f;"
write_lambda: |-
return x * 10.0f;
# Battery low voltage protection point in off-grid mode 0.1V Uint 329 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} battery low voltage protection point in off-grid mode"
use_write_multiple: true
address: 329
register_type: holding
value_type: U_WORD
min_value: 0.0
# max_value: 100.0
step: 0.1
unit_of_measurement: "V"
lambda: "return x * 0.1f;"
write_lambda: |-
return x * 10.0f;
# Maximum charging current 0.1A Uint 332 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} maximum charging current"
use_write_multiple: true
address: 332
register_type: holding
value_type: U_WORD
min_value: 0.0
max_value: 100.0
step: 0.1
unit_of_measurement: "A"
lambda: "return x * 0.1f;"
write_lambda: |-
return x * 10.0f;
# Maximum mains charging current 0.1A Uint 333 1 R/W
- platform: modbus_controller
modbus_controller_id: smg0
name: "${name} maximum mains charging current"
use_write_multiple: true
address: 333
register_type: holding
value_type: U_WORD
min_value: 0.0
max_value: 100.0
step: 0.1
unit_of_measurement: "A"
lambda: "return x * 0.1f;"
write_lambda: |-
return x * 10.0f;
# # Eq Charging voltage 0.1V Uint 334 1 R/W
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} Eq Charging voltage"
# use_write_multiple: true
# address: 334
# register_type: holding
# value_type: U_WORD
# min_value: 0.0
# max_value: 100.0
# step: 0.1
# unit_of_measurement: "V"
# lambda: "return x * 0.1f;"
# write_lambda: |-
# return x * 10.0f;
# # Battery equalization time min Uint 335 1 R/W Range: 0~900
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} battery equalization time"
# use_write_multiple: true
# address: 335
# register_type: holding
# value_type: U_WORD
# min_value: 0.0
# max_value: 900.0
# step: 1
# unit_of_measurement: "min"
# # Equalization Timeout exit min Uint 336 1 R/W Range: 0~900
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} equalization Timeout exit"
# use_write_multiple: true
# address: 336
# register_type: holding
# value_type: U_WORD
# min_value: 0.0
# max_value: 900.0
# step: 1
# unit_of_measurement: "min"
# # Two equalization charging intervals day Uint 337 1 R/W Range: 1~90
# - platform: modbus_controller
# modbus_controller_id: smg0
# name: "${name} two equalization charging intervals"
# use_write_multiple: true
# address: 337
# register_type: holding
# value_type: U_WORD
# min_value: 0.0
# max_value: 90.0
# step: 1
# unit_of_measurement: "day"
# Button entities
Hi, i'm very interested in this project and willing to help. I was trying to use it for Anenji 6.2 (blue one, no parallel) Seams it's clone of EASUN SMG II
I couldn't use code from bigdigital (compiled and upload to Wemos D1 mini) Using ESPHome component - https://github.com/syssi/esphome-smg-ii worked fine, but it's laggy and not stable (i spent 3h on configurating yaml... not to face OOM)
https://github.com/softwarecrash/Solar2MQTT/pull/174/files - created PR with @bigdigital (main kudos to Artem !) and added more info from provided pdf.
here is my esphome config:
substitutions: name: anenji friendly_name: anenji tx_pin: GPIO13 rx_pin: GPIO12 esphome: name: ${name} friendly_name: ${friendly_name} min_version: 2024.6.0 name_add_mac_suffix: false project: name: "syssi.esphome-smg-ii" version: 1.2.0 esp8266: board: d1_mini wifi: ssid: !secret wifi_ssid password: !secret wifi_password logger: level: INFO # If you use Home Assistant please remove this `mqtt` section and uncomment the `api` component! # The native API has many advantages over MQTT: https://esphome.io/components/api.html#advantages-over-mqtt # mqtt: # broker: !secret mqtt_host # username: !secret mqtt_username # password: !secret mqtt_password # id: mqtt_client # discovery: False # discover_ip: True api: encryption: key: !secret api_key ota: - platform: esphome password: !secret ota_pass uart: - id: uart_0 baud_rate: 9600 tx_pin: ${tx_pin} rx_pin: ${rx_pin} modbus: - id: modbus0 uart_id: uart_0 send_wait_time: 200ms modbus_controller: - id: smg0 address: 0x01 modbus_id: modbus0 command_throttle: 200ms update_interval: 10s time: - platform: sntp sensor: # - platform: total_daily_energy # name: "${name} PV energy today" # restore: true # icon: mdi:counter # power_id: smg0_pv_average_power # filters: # # Multiplication factor from W to kW is 0.001 # - multiply: 0.001 # unit_of_measurement: kWh # Fault code ULong 100 2 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} fault code" address: 100 register_type: holding value_type: U_DWORD accuracy_decimals: 0 # # Warning code ULong 108 2 R # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} warning code" # address: 108 # register_type: holding # value_type: U_DWORD # accuracy_decimals: 0 # Operation Mode UInt 201 1 R 0: Power On # 1: Standby # 2: Mains # 3: Off-Grid # 4: Bypass # 5: Charging # 6: Fault - platform: modbus_controller modbus_controller_id: smg0 name: "${name} operation mode id" address: 201 register_type: holding value_type: U_WORD accuracy_decimals: 0 # Effective mains voltage 0.1V Int 202 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} ac voltage" address: 202 register_type: holding value_type: S_WORD unit_of_measurement: "V" device_class: voltage state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # Mains Frequency 0.01Hz Int 203 1 R # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} ac frequency" # address: 203 # register_type: holding # value_type: S_WORD # unit_of_measurement: "Hz" # device_class: frequency # state_class: measurement # accuracy_decimals: 2 # filters: # - multiply: 0.01 # Average mains power 1W Int 204 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} average mains power" address: 204 register_type: holding value_type: S_WORD unit_of_measurement: "W" device_class: power state_class: measurement accuracy_decimals: 0 # Effective inverter voltage 0.1V Int 205 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} effective inverter voltage" address: 205 register_type: holding value_type: S_WORD unit_of_measurement: "V" device_class: voltage state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # Effective inverter current 0.1A Int 206 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} effective inverter current" address: 206 register_type: holding value_type: S_WORD unit_of_measurement: "A" device_class: current state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # Inverter frequency 0.01Hz Int 207 1 R # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} inverter frequency" # address: 207 # register_type: holding # value_type: S_WORD # unit_of_measurement: "Hz" # device_class: frequency # state_class: measurement # accuracy_decimals: 2 # filters: # - multiply: 0.01 # Average inverter power 1W Int 208 1 R Positive numbers indicate inverter output, negative numbers indicate inverter input - platform: modbus_controller modbus_controller_id: smg0 name: "${name} average inverter power" address: 208 register_type: holding value_type: S_WORD unit_of_measurement: "W" device_class: power state_class: measurement accuracy_decimals: 0 # Inverter charging power 1W Int 209 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} inverter charging power" address: 209 register_type: holding value_type: S_WORD unit_of_measurement: "W" device_class: power state_class: measurement accuracy_decimals: 0 # Output effective voltage 0.1V Int 210 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} output effective voltage" address: 210 register_type: holding value_type: S_WORD unit_of_measurement: "V" device_class: voltage state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # Output effective Current 0.1A Int 211 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} output effective Current" address: 211 register_type: holding value_type: S_WORD unit_of_measurement: "A" device_class: current state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # Output frequency 0.01Hz Int 212 1 R # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} output frequency" # address: 212 # register_type: holding # value_type: S_WORD # unit_of_measurement: "Hz" # device_class: frequency # state_class: measurement # accuracy_decimals: 2 # filters: # - multiply: 0.01 # Output active power 1W Int 213 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} output active power" address: 213 register_type: holding value_type: S_WORD unit_of_measurement: "W" device_class: power state_class: measurement accuracy_decimals: 0 # Output apparent power 1VA Int 214 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} output apparent power" address: 214 register_type: holding value_type: S_WORD unit_of_measurement: "VA" device_class: apparent_power state_class: measurement accuracy_decimals: 0 # Battery average voltage 0.1V Int 215 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery average voltage" address: 215 register_type: holding value_type: S_WORD unit_of_measurement: "V" device_class: voltage state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # Battery average Current 0.1A Int 216 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery average Current" address: 216 register_type: holding value_type: S_WORD unit_of_measurement: "A" device_class: current state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # Battery average power 1W Int 217 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery average power" address: 217 register_type: holding value_type: S_WORD unit_of_measurement: "W" device_class: power state_class: measurement accuracy_decimals: 0 # PV average voltage 0.1V Int 219 1 R # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} pv average voltage" # address: 219 # register_type: holding # value_type: S_WORD # unit_of_measurement: "V" # device_class: voltage # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # PV average current 0.1A Int 220 1 R # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} pv average current" # address: 220 # register_type: holding # value_type: S_WORD # unit_of_measurement: "A" # device_class: current # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # PV average power 1W Int 223 1 R # - platform: modbus_controller # modbus_controller_id: smg0 # id: smg0_pv_average_power # name: "${name} pv average power" # address: 223 # register_type: holding # value_type: S_WORD # unit_of_measurement: "W" # device_class: power # state_class: measurement # accuracy_decimals: 0 # PV charging average power 1W Int 224 1 R # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} pv charging average power" # address: 224 # register_type: holding # value_type: S_WORD # unit_of_measurement: "W" # device_class: power # state_class: measurement # accuracy_decimals: 0 # Load percentage 1% Int 225 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} load percentage" address: 225 register_type: holding value_type: S_WORD unit_of_measurement: "%" # device_class: battery state_class: measurement accuracy_decimals: 0 # DCDC Temperature 1°C Int 226 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} dcdc temperature" address: 226 register_type: holding value_type: S_WORD unit_of_measurement: "°C" device_class: temperature state_class: measurement accuracy_decimals: 0 # Inverter Temperature 1°C Int 227 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} inverter temperature" address: 227 register_type: holding value_type: S_WORD unit_of_measurement: "°C" device_class: temperature state_class: measurement accuracy_decimals: 0 # Battery state of charge 1% UInt 229 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery state of charge" address: 229 register_type: holding value_type: U_WORD unit_of_measurement: "%" device_class: battery state_class: measurement accuracy_decimals: 0 # Battery average current 0.1A Int 232 1 R Positive number means charging, negative number means discharging - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery average current" address: 232 register_type: holding value_type: S_WORD unit_of_measurement: "A" device_class: current state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # Inverter charging average current 0.1A Int 233 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} inverter charging average current" address: 233 register_type: holding value_type: S_WORD unit_of_measurement: "A" device_class: current state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # PV charging average current 0.1A Int 234 1 R # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} pv charging average current" # address: 234 # register_type: holding # value_type: S_WORD # unit_of_measurement: "A" # device_class: current # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # # Output voltage 0.1V Uint 320 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} output voltage" # address: 320 # register_type: holding # value_type: U_WORD # unit_of_measurement: "V" # device_class: voltage # # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # # Output frequency setting 0.01Hz Uint 321 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} output frequency setting" # address: 321 # register_type: holding # value_type: U_WORD # unit_of_measurement: "Hz" # device_class: frequency # # state_class: measurement # accuracy_decimals: 2 # filters: # - multiply: 0.01 # # Battery overvoltage protection point 0.1V Uint 323 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} battery overvoltage protection point" # address: 323 # register_type: holding # value_type: U_WORD # unit_of_measurement: "V" # device_class: voltage # # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # # Max charging voltage 0.1V Uint 324 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} max charging voltage" # address: 324 # register_type: holding # value_type: U_WORD # unit_of_measurement: "V" # device_class: voltage # # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # # Floating charging voltage 0.1V Uint 325 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} floating charging voltage" # address: 325 # register_type: holding # value_type: U_WORD # unit_of_measurement: "V" # device_class: voltage # # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # # Battery discharge recovery point in mains mode 0.1V Uint 326 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} battery discharge recovery point in mains mode" # address: 326 # register_type: holding # value_type: U_WORD # unit_of_measurement: "V" # device_class: voltage # # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # # Battery low voltage protection point in mains mode 0.1V Uint 327 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} battery low voltage protection point in mains mode" # address: 327 # register_type: holding # value_type: U_WORD # unit_of_measurement: "V" # device_class: voltage # # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # # Battery low voltage protection point in off-grid mode 0.1V Uint 329 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} battery low voltage protection point in off-grid mode" # address: 329 # register_type: holding # value_type: U_WORD # unit_of_measurement: "V" # device_class: voltage # # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # Maximum charging current 0.1A Uint 332 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} maximum charging current" address: 332 register_type: holding value_type: U_WORD unit_of_measurement: "A" device_class: current # state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # # Maximum mains charging current 0.1A Uint 333 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} maximum mains charging current" # address: 333 # register_type: holding # value_type: U_WORD # unit_of_measurement: "A" # device_class: current # # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # # Eq Charging voltage 0.1V Uint 334 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} Eq Charging voltage" # address: 334 # register_type: holding # value_type: U_WORD # unit_of_measurement: "V" # device_class: voltage # # state_class: measurement # accuracy_decimals: 1 # filters: # - multiply: 0.1 # Rated power W Uint 643 1 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} rated power" address: 643 register_type: holding value_type: U_WORD unit_of_measurement: "W" device_class: power # state_class: measurement accuracy_decimals: 0 select: # # Output Mode Uint 300 1 R/W 0: Single, 1: Parallel, 2: 3 Phase-P1, 3: 3 Phase-P2, 4: 3 Phase-P3 # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} output mode" # use_write_multiple: true # address: 300 # value_type: U_WORD # optionsmap: # "Single": 0 # "Parallel": 1 # "Phase P1": 2 # "Phase P2": 3 # "Phase P3": 4 # Output priority Uint 301 1 R/W 0: Utility-PV-Battery, 1: PV-Utility-Battery, 2: PV-Battery-Utility - platform: modbus_controller modbus_controller_id: smg0 name: "${name} output priority" use_write_multiple: true address: 301 value_type: U_WORD optionsmap: "Utility-PV-Battery (UTI)": 0 "PV-Utility-Battery (SOL)": 1 "PV-Battery-Utility (SBU)": 2 "PV-Utility-Battery (SUB)": 3 # Input voltage range Uint 302 1 R/W 0: Wide range, 1: Narrow range - platform: modbus_controller modbus_controller_id: smg0 name: "${name} input voltage range" use_write_multiple: true address: 302 value_type: U_WORD optionsmap: "Wide range": 0 "Narrow range": 1 # Buzzer mode Uint 303 1 R/W 0: Mute in all situations, 1: Sound when the input source is changed or there is a specific warning or fault, 2: Sound when there is aspecific warning or fault, 3: Sound when fault occurs - platform: modbus_controller modbus_controller_id: smg0 name: "${name} buzzer mode" use_write_multiple: true address: 303 value_type: U_WORD optionsmap: "Silent": 0 "Beep on input source changes, warnings and faults": 1 "Beep on warnings and faults": 2 "Beep on faults": 3 # LCD backlight Uint 305 1 R/W 0: Timed off, 1: Always on - platform: modbus_controller modbus_controller_id: smg0 name: "${name} lcd backlight" use_write_multiple: true address: 305 value_type: U_WORD optionsmap: "Timed off": 0 "Always on": 1 # Battery charging priority Uint 331 1 R/W 0: Utility priority, 1: PV priority, 2: PV is at the same level as the Utility, 3: Only PV charging is allowed - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery charging priority" use_write_multiple: true address: 331 value_type: U_WORD optionsmap: "Utility priority": 0 "PV priority": 1 "PV is at the same level as the Utility": 2 "Only PV charging is allowed": 3 # Turn on mode Uint 406 1 R/W 0: Can be turn-on locally or remotely, 1: Only local turn-on, 2: Only remote turn-on - platform: modbus_controller modbus_controller_id: smg0 name: "${name} turn on mode" use_write_multiple: true address: 406 value_type: U_WORD optionsmap: "Local and remotely turn-on allowed": 0 "Local turn-on only": 1 "Remote turn-on only": 2 switch: # LCD automatically returns to the homepage Uint 306 1 R/W 0: Do not return automatically, 1: Automatically return after 1 minute - platform: modbus_controller modbus_controller_id: smg0 name: "${name} lcd automatically returns to the homepage" use_write_multiple: true address: 306 register_type: holding bitmask: 1 # Energy-saving mode Uint 307 1 R/W 0: Energy-saving mode is off, 1: Energy-saving mode is on # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} energy-saving mode" # use_write_multiple: true # address: 307 # register_type: holding # bitmask: 1 # Overload automatic restart Uint 308 1 R/W 0: Overload failure will not restart, 1: Automatic restart after overload failure - platform: modbus_controller modbus_controller_id: smg0 name: "${name} overload automatic restart" use_write_multiple: true address: 308 register_type: holding bitmask: 1 # Over temperature automatic restart Uint 309 1 R/W 0: Over temperature failure will not restart, 1: Automatic restart after over-temperature fault - platform: modbus_controller modbus_controller_id: smg0 name: "${name} over temperature automatic restart" use_write_multiple: true address: 309 register_type: holding bitmask: 1 # Overload transfer to bypass enabled Uint 310 1 R/W 0: Disable, 1: Enable - platform: modbus_controller modbus_controller_id: smg0 name: "${name} overload transfer to bypass enabled" use_write_multiple: true address: 310 register_type: holding bitmask: 1 # Battery Eq mode is enabled Uint 313 1 R/W 0: Disable, 1: Enable - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery Eq mode is enabled" use_write_multiple: true address: 313 register_type: holding bitmask: 1 # Remote switch Uint 420 1 R/W 0: Remote shutdown, 1: Remote turn-on - platform: modbus_controller modbus_controller_id: smg0 name: "${name} remote switch" use_write_multiple: true address: 420 register_type: holding bitmask: 1 text_sensor: # Fault code ULong 100 2 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} fault" address: 100 register_type: holding register_count: 2 response_size: 4 raw_encode: HEXBYTES lambda: |- static const uint8_t FAULTS_SIZE = 27; static const char *const FAULTS[FAULTS_SIZE] = { "Over temperature of inverter module", // 0000 0000 0000 0000 0000 0000 0000 0001 (1) "Over temperature of DCDC module", // 0000 0000 0000 0000 0000 0000 0000 0010 (2) "Battery over voltage", // 0000 0000 0000 0000 0000 0000 0000 0100 (3) "PV module over temperature", // 0000 0000 0000 0000 0000 0000 0000 1000 (4) "Output short circuit", // 0000 0000 0000 0000 0000 0000 0001 0000 (5) "Inverter over voltage", // 0000 0000 0000 0000 0000 0000 0010 0000 (6) "Output over load", // 0000 0000 0000 0000 0000 0000 0100 0000 (7) "Bus over voltage", // 0000 0000 0000 0000 0000 0000 1000 0000 (8) "Bus soft start timed out", // 0000 0000 0000 0000 0000 0001 0000 0000 (9) "PV over current", // 0000 0000 0000 0000 0000 0010 0000 0000 (10) "PV over voltage", // 0000 0000 0000 0000 0000 0100 0000 0000 (11) "Battery over current", // 0000 0000 0000 0000 0000 1000 0000 0000 (12) "Inverter over current", // 0000 0000 0000 0000 0001 0000 0000 0000 (13) "Bus low voltage", // 0000 0000 0000 0000 0010 0000 0000 0000 (14) "Reserve (Bit 15)", // 0000 0000 0000 0000 0100 0000 0000 0000 (15) "Inverter DC component is too high", // 0000 0000 0000 0000 1000 0000 0000 0000 (16) "Reserve (Bit 17)", // 0000 0000 0000 0001 0000 0000 0000 0000 (17) "The zero bias of output current is too large", // 0000 0000 0000 0010 0000 0000 0000 0000 (18) "The zero bias of inverter current is too large", // 0000 0000 0000 0100 0000 0000 0000 0000 (19) "The zero bias of battery current is too large", // 0000 0000 0000 1000 0000 0000 0000 0000 (20) "The zero bias of PV current is too large", // 0000 0000 0001 0000 0000 0000 0000 0000 (21) "Inverter low voltage", // 0000 0000 0010 0000 0000 0000 0000 0000 (22) "Inverter negative power protection", // 0000 0000 0100 0000 0000 0000 0000 0000 (23) "The host in the parallel system is lost", // 0000 0000 1000 0000 0000 0000 0000 0000 (24) "Synchronization signal abnormal in the parallel system", // 0000 0001 0000 0000 0000 0000 0000 0000 (25) "The battery type is incompatible", // 0000 0010 0000 0000 0000 0000 0000 0000 (26) "Parallel versions are incompatible", // 0000 0100 0000 0000 0000 0000 0000 0000 (27) }; std::string values = ""; uint32_t mask = modbus_controller::dword_from_hex_str(x, 0); if (mask) { for (int i = 0; i < FAULTS_SIZE; i++) { if (mask & (1 << i)) { values.append(FAULTS[i]); values.append(";"); } } if (!values.empty()) { values.pop_back(); } } return values; # Warning code ULong 108 2 R - platform: modbus_controller modbus_controller_id: smg0 name: "${name} warning" address: 108 register_type: holding register_count: 2 response_size: 4 raw_encode: HEXBYTES lambda: |- static const uint8_t WARNINGS_SIZE = 19; static const char *const WARNINGS[WARNINGS_SIZE] = { "Reserve (Bit 0)", // 0000 0000 0000 0000 0000 0000 0000 0001 (1) "Mains waveform abnormal", // 0000 0000 0000 0000 0000 0000 0000 0010 (2) "Reserve (Bit 2)", // 0000 0000 0000 0000 0000 0000 0000 0100 (3) "Mains low voltage", // 0000 0000 0000 0000 0000 0000 0000 1000 (4) "Mains over frequency", // 0000 0000 0000 0000 0000 0000 0001 0000 (5) "Mains low frequency", // 0000 0000 0000 0000 0000 0000 0010 0000 (6) "PV low voltage", // 0000 0000 0000 0000 0000 0000 0100 0000 (7) "Over temperature", // 0000 0000 0000 0000 0000 0000 1000 0000 (8) "Battery low voltage", // 0000 0000 0000 0000 0000 0001 0000 0000 (9) "Battery is not connected", // 0000 0000 0000 0000 0000 0010 0000 0000 (10) "Overload", // 0000 0000 0000 0000 0000 0100 0000 0000 (11) "Battery Eq charging", // 0000 0000 0000 0000 0000 1000 0000 0000 (12) "Battery undervoltage", // 0000 0000 0000 0000 0001 0000 0000 0000 (13) "Output power derating", // 0000 0000 0000 0000 0010 0000 0000 0000 (14) "Fan blocked", // 0000 0000 0000 0000 0100 0000 0000 0000 (15) "PV energy is too low to be use", // 0000 0000 0000 0000 1000 0000 0000 0000 (16) "Parallel communication interrupted", // 0000 0000 0000 0001 0000 0000 0000 0000 (17) "Output mode of Single and Parallel systems inconsistent", // 0000 0000 0000 0010 0000 0000 0000 0000 (18) "Battery voltage difference of parallel system is too large", // 0000 0000 0000 0100 0000 0000 0000 0000 (19) }; std::string values = ""; uint32_t mask = modbus_controller::dword_from_hex_str(x, 0); if (mask) { for (int i = 0; i < WARNINGS_SIZE; i++) { if (mask & (1 << i)) { values.append(WARNINGS[i]); values.append(";"); } } if (!values.empty()) { values.pop_back(); } } return values; # Operation Mode UInt 201 1 R 0: Power On, 1: Standby, 2: Mains, 3: Off-Grid, 4: Bypass, 5: Charging, 6: Fault - platform: modbus_controller modbus_controller_id: smg0 name: "${name} operation mode" address: 201 register_type: holding raw_encode: HEXBYTES lambda: |- uint16_t value = modbus_controller::word_from_hex_str(x, 0); switch (value) { case 0: return std::string("Power On"); case 1: return std::string("Standby"); case 2: return std::string("Mains"); case 3: return std::string("Off-Grid"); case 4: return std::string("Bypass"); case 5: return std::string("Charging"); case 6: return std::string("Fault"); } return std::string("Unknown"); number: # Output voltage 0.1V Uint 320 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} output voltage" use_write_multiple: true address: 320 register_type: holding value_type: U_WORD min_value: 0.0 # max_value: 100.0 step: 0.1 unit_of_measurement: "V" lambda: "return x * 0.1f;" write_lambda: |- return x * 10.0f; # Output frequency setting 0.01Hz Uint 321 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} output frequency setting" # use_write_multiple: true # address: 321 # register_type: holding # value_type: U_WORD # min_value: 0.0 # # max_value: 100.0 # step: 0.01 # unit_of_measurement: "Hz" # lambda: "return x * 0.01f;" # write_lambda: |- # return x * 100.0f; # Battery overvoltage protection point 0.1V Uint 323 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery overvoltage protection point" use_write_multiple: true address: 323 register_type: holding value_type: U_WORD min_value: 0.0 # max_value: 100.0 step: 0.1 unit_of_measurement: "V" lambda: "return x * 0.1f;" write_lambda: |- return x * 10.0f; # Max charging voltage 0.1V Uint 324 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} max charging voltage" use_write_multiple: true address: 324 register_type: holding value_type: U_WORD min_value: 0.0 max_value: 100.0 step: 0.1 unit_of_measurement: "V" lambda: "return x * 0.1f;" write_lambda: |- return x * 10.0f; # Floating charging voltage 0.1V Uint 325 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} floating charging voltage" use_write_multiple: true address: 325 register_type: holding value_type: U_WORD min_value: 0.0 # max_value: 100.0 step: 0.1 unit_of_measurement: "V" lambda: "return x * 0.1f;" write_lambda: |- return x * 10.0f; # Battery discharge recovery point in mains mode 0.1V Uint 326 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery discharge recovery point in mains mode" use_write_multiple: true address: 326 register_type: holding value_type: U_WORD min_value: 0.0 # max_value: 100.0 step: 0.1 unit_of_measurement: "V" lambda: "return x * 0.1f;" write_lambda: |- return x * 10.0f; # Battery low voltage protection point in mains mode 0.1V Uint 327 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery low voltage protection point in mains mode" use_write_multiple: true address: 327 register_type: holding value_type: U_WORD min_value: 0.0 # max_value: 100.0 step: 0.1 unit_of_measurement: "V" lambda: "return x * 0.1f;" write_lambda: |- return x * 10.0f; # Battery low voltage protection point in off-grid mode 0.1V Uint 329 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} battery low voltage protection point in off-grid mode" use_write_multiple: true address: 329 register_type: holding value_type: U_WORD min_value: 0.0 # max_value: 100.0 step: 0.1 unit_of_measurement: "V" lambda: "return x * 0.1f;" write_lambda: |- return x * 10.0f; # Maximum charging current 0.1A Uint 332 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} maximum charging current" use_write_multiple: true address: 332 register_type: holding value_type: U_WORD min_value: 0.0 max_value: 100.0 step: 0.1 unit_of_measurement: "A" lambda: "return x * 0.1f;" write_lambda: |- return x * 10.0f; # Maximum mains charging current 0.1A Uint 333 1 R/W - platform: modbus_controller modbus_controller_id: smg0 name: "${name} maximum mains charging current" use_write_multiple: true address: 333 register_type: holding value_type: U_WORD min_value: 0.0 max_value: 100.0 step: 0.1 unit_of_measurement: "A" lambda: "return x * 0.1f;" write_lambda: |- return x * 10.0f; # # Eq Charging voltage 0.1V Uint 334 1 R/W # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} Eq Charging voltage" # use_write_multiple: true # address: 334 # register_type: holding # value_type: U_WORD # min_value: 0.0 # max_value: 100.0 # step: 0.1 # unit_of_measurement: "V" # lambda: "return x * 0.1f;" # write_lambda: |- # return x * 10.0f; # # Battery equalization time min Uint 335 1 R/W Range: 0~900 # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} battery equalization time" # use_write_multiple: true # address: 335 # register_type: holding # value_type: U_WORD # min_value: 0.0 # max_value: 900.0 # step: 1 # unit_of_measurement: "min" # # Equalization Timeout exit min Uint 336 1 R/W Range: 0~900 # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} equalization Timeout exit" # use_write_multiple: true # address: 336 # register_type: holding # value_type: U_WORD # min_value: 0.0 # max_value: 900.0 # step: 1 # unit_of_measurement: "min" # # Two equalization charging intervals day Uint 337 1 R/W Range: 1~90 # - platform: modbus_controller # modbus_controller_id: smg0 # name: "${name} two equalization charging intervals" # use_write_multiple: true # address: 337 # register_type: holding # value_type: U_WORD # min_value: 0.0 # max_value: 90.0 # step: 1 # unit_of_measurement: "day" # Button entities
Hello, Thanks for your Work, but badly its for the wrong Branch. Actual i Work on the rework Branch and Change a Lot of Things. So the whole Thing from bigdigital needs to implement in this Branch. When you Like to do this you can Join the discord Server and write ne for more Details.
RS232 Communication Protocol V1.0-220209.pdf