Add Solplanet hybrid inverter (Modbus TCP) (#32888)

This commit is contained in:
andig 2026-08-16 19:45:18 +02:00 • committed by GitHub
parent ba8596be96
commit bc38df1ed6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -0,0 +1,201 @@
template: solplanet-modbus
products:
- brand: Solplanet
description:
generic: Hybrid inverter (Modbus TCP)
requirements:
description:
de: |
Nur für Wechselrichter mit eigenem Modbus-TCP-Ethernet-Port (z.B. ASW-TH Serie, KACO Blueplanet Hybrid NH3, Port eth 5&6), Protokoll AISWEI "MB001_ASW GEN-Modbus" V2.1.7.
Ältere Geräte ohne diesen Port benötigen stattdessen das `solplanet-ai-dongle` Template.
Die Import-/Export-Zählerstände des Netzzählers (46443/46445) werden von dieser Firmware nicht über Modbus TCP bereitgestellt.
Bei zwei Batteriepaketen (BMS1 + BMS2) je einen Batteriezähler mit Batteriespeichernummer 1 und 2 anlegen.
en: |
Only for inverters with a dedicated Modbus TCP ethernet port (e.g. ASW-TH series, KACO Blueplanet Hybrid NH3, port eth 5&6), protocol AISWEI "MB001_ASW GEN-Modbus" V2.1.7.
Older devices without that port need the `solplanet-ai-dongle` template instead.
The grid meter import/export energy counters (46443/46445) are not exposed over Modbus TCP by this firmware.
With two battery packs (BMS1 + BMS2) add one battery meter each, using battery number 1 and 2.
capabilities: ["battery-control", "curtail"]
params:
- name: usage
choice: ["grid", "pv", "battery"]
- name: modbus
choice: ["tcpip"]
port: 502
id: 1
- name: battery
type: choice
choice: [1, 2]
required: true
usages: ["battery"]
description:
de: Batteriespeichernummer
en: Battery number
- preset: battery-params
- name: maxchargepower
required: true
render: |
type: custom
{{- if eq .usage "grid" }}
power:
source: modbus
{{- include "modbus" . | indent 2 }}
register:
address: 6433 # 46434 total system power (smart meter)
type: holding
decode: int32
{{- end }}
{{- if eq .usage "pv" }}
power:
source: modbus
{{- include "modbus" . | indent 2 }}
register:
address: 1600 # 31601 PV total power
type: input
decode: uint32
energy:
source: modbus
{{- include "modbus" . | indent 2 }}
register:
address: 1604 # 31605 PV E-Total (0.1 kWh)
type: input
decode: uint32
scale: 0.1
curtail: # allowed feed-in power as percent of nominal
source: sequence
set:
- source: modbus
{{- include "modbus" . | indent 6 }}
register:
address: 5402 # 45403 active power set (%Pn * 100)
type: writesingle
encoding: uint16
scale: 100
# active power control: disabled at 100% (unlimited), enabled while curtailed
- source: switch
switch:
- case: 100 # uncurtailed
set:
source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 14 }}
register:
address: 4000 # 44001 active power control function
type: writesingle
encoding: uint16
default:
source: const
value: 1
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 4000
type: writesingle
encoding: uint16
curtailed: # the power limit only applies while active power control is enabled
source: go
in:
- name: ena
type: int
config:
source: modbus
{{- include "modbus" . | indent 8 }}
register:
address: 4000
type: holding
decode: uint16
- name: percent
type: int
config:
source: modbus
{{- include "modbus" . | indent 8 }}
register:
address: 5402
type: holding
decode: uint16
scale: 0.01
script: |
res := 100
if ena != 0 && percent > 0 && percent < 100 {
res = percent
}
res
{{- end }}
{{- if eq .usage "battery" }}
power:
source: modbus
{{- include "modbus" . | indent 2 }}
register:
address: {{ if eq .battery "2" }}1751{{ else }}1618{{ end }} # 31752/31619 BMS2/1 battery power
type: input
decode: int32
soc:
source: modbus
{{- include "modbus" . | indent 2 }}
register:
address: {{ if eq .battery "2" }}1754{{ else }}1621{{ end }} # 31755/31622 BMS2/1 battery SoC
type: input
decode: uint16
batterymode:
source: switch
switch:
- case: 1 # normal
set:
source: const
value: 2 # normal
set:
source: modbus
{{- include "modbus" . | indent 10 }}
register:
address: 1103 # 41104 battery working mode
type: writesingle
encoding: uint16
- case: 2 # hold
set:
source: sequence
set:
- source: const
value: 4 # custom
set:
source: modbus
{{- include "modbus" . | indent 14 }}
register:
address: 1103
type: writesingle
encoding: uint16
- source: const
value: 0
set:
source: modbus
{{- include "modbus" . | indent 14 }}
register:
address: 1152 # 41153 charge/discharge power, negative charges
type: writesingle
encoding: int16
- case: 3 # charge
set:
source: sequence
set:
- source: const
value: 4
set:
source: modbus
{{- include "modbus" . | indent 14 }}
register:
address: 1103
type: writesingle
encoding: uint16
- source: const
value: {{ mul .maxchargepower -1 }}
set:
source: modbus
{{- include "modbus" . | indent 14 }}
register:
address: 1152
type: writesingle
encoding: int16
{{- include "battery-params" . }}
{{- end }}