diff --git a/charger/openwb-2.0.go b/charger/openwb-2.0.go index 961d7b7e9..676ffddce 100644 --- a/charger/openwb-2.0.go +++ b/charger/openwb-2.0.go @@ -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 } diff --git a/charger/openwb-2.0_decorators.go b/charger/openwb-2.0_decorators.go index 4887e8dbe..aca203382 100644 --- a/charger/openwb-2.0_decorators.go +++ b/charger/openwb-2.0_decorators.go @@ -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) +} diff --git a/templates/definition/charger/openwb-2.0.yaml b/templates/definition/charger/openwb-2.0.yaml index 16d92abec..0419aa630 100644 --- a/templates/definition/charger/openwb-2.0.yaml +++ b/templates/definition/charger/openwb-2.0.yaml @@ -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 }}