OpenWB 2: make phase switching configurable (#18371)

This commit is contained in:
andig 2025-01-23 12:36:24 +01:00 • committed by GitHub
parent 3de6e9d272
commit 4adee73a88
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 55 additions and 9 deletions

View file

@ -40,12 +40,13 @@ func init() {
// https://openwb.de/main/wp-content/uploads/2023/10/ModbusTCP-openWB-series2-Pro-1.pdf
//go:generate decorate -f decorateOpenWB20 -b *OpenWB20 -r api.Charger -t "api.Identifier,Identify,func() (string, error)"
//go:generate decorate -f decorateOpenWB20 -b *OpenWB20 -r api.Charger -t "api.PhaseSwitcher,Phases1p3p,func(int) error" -t "api.Identifier,Identify,func() (string, error)"
// NewOpenWB20FromConfig creates a OpenWB20 charger from generic config
func NewOpenWB20FromConfig(other map[string]interface{}) (api.Charger, error) {
cc := struct {
Connector uint16
Phases1p3p bool
modbus.TcpSettings `mapstructure:",squash"`
}{
Connector: 1,
@ -63,12 +64,17 @@ func NewOpenWB20FromConfig(other map[string]interface{}) (api.Charger, error) {
return nil, err
}
var phases1p3p func(int) error
if cc.Phases1p3p {
phases1p3p = wb.phases1p3p
}
var identify func() (string, error)
if _, err := wb.identify(); err == nil {
identify = wb.identify
}
return decorateOpenWB20(wb, identify), nil
return decorateOpenWB20(wb, phases1p3p, identify), nil
}
// NewOpenWB20 creates OpenWB20 charger
@ -201,10 +207,8 @@ func (wb *OpenWB20) Voltages() (float64, float64, float64, error) {
return wb.getPhaseValues(wb.base + openwbRegVoltages)
}
var _ api.PhaseSwitcher = (*OpenWB20)(nil)
// Phases1p3p implements the api.PhaseSwitcher interface
func (wb *OpenWB20) Phases1p3p(phases int) error {
// phases1p3p implements the api.PhaseSwitcher interface
func (wb *OpenWB20) phases1p3p(phases int) error {
if _, err := wb.conn.WriteSingleRegister(wb.base+openwbRegPhaseTarget, uint16(phases)); err != nil {
return err
}

View file

@ -6,12 +6,23 @@ import (
"github.com/evcc-io/evcc/api"
)
func decorateOpenWB20(base *OpenWB20, identifier func() (string, error)) api.Charger {
func decorateOpenWB20(base *OpenWB20, phaseSwitcher func(int) error, identifier func() (string, error)) api.Charger {
switch {
case identifier == nil:
case identifier == nil && phaseSwitcher == nil:
return base
case identifier != nil:
case identifier == nil && phaseSwitcher != nil:
return &struct {
*OpenWB20
api.PhaseSwitcher
}{
OpenWB20: base,
PhaseSwitcher: &decorateOpenWB20PhaseSwitcherImpl{
phaseSwitcher: phaseSwitcher,
},
}
case identifier != nil && phaseSwitcher == nil:
return &struct {
*OpenWB20
api.Identifier
@ -21,6 +32,21 @@ func decorateOpenWB20(base *OpenWB20, identifier func() (string, error)) api.Cha
identifier: identifier,
},
}
case identifier != nil && phaseSwitcher != nil:
return &struct {
*OpenWB20
api.Identifier
api.PhaseSwitcher
}{
OpenWB20: base,
Identifier: &decorateOpenWB20IdentifierImpl{
identifier: identifier,
},
PhaseSwitcher: &decorateOpenWB20PhaseSwitcherImpl{
phaseSwitcher: phaseSwitcher,
},
}
}
return nil
@ -33,3 +59,11 @@ type decorateOpenWB20IdentifierImpl struct {
func (impl *decorateOpenWB20IdentifierImpl) Identify() (string, error) {
return impl.identifier()
}
type decorateOpenWB20PhaseSwitcherImpl struct {
phaseSwitcher func(int) error
}
func (impl *decorateOpenWB20PhaseSwitcherImpl) Phases1p3p(p0 int) error {
return impl.phaseSwitcher(p0)
}

View file

@ -25,7 +25,15 @@ params:
id: 1
- name: connector
default: 1
- name: phases1p3p
type: bool
description:
en: Charger is equipped with phase switching feature
de: Phasenumschaltung vorhanden
advanced: true
default: true
render: |
type: openwb-2.0
{{- include "modbus" . }}
connector: {{ .connector }}
phases1p3p: {{ .phases1p3p }}