OpenWB 2: make phase switching configurable (#18371)
This commit is contained in:
parent
3de6e9d272
commit
4adee73a88
3 changed files with 55 additions and 9 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 }}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue