Plugins: add charger provider (#18037)

This commit is contained in:
andig 2025-01-05 11:06:58 +01:00 • committed by GitHub
parent 927cd391ba
commit 5b21646c49
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 118 additions and 26 deletions

View file

@ -2,14 +2,12 @@ package charger
import (
"context"
"fmt"
"strings"
"github.com/evcc-io/evcc/api"
reg "github.com/evcc-io/evcc/util/registry"
"github.com/evcc-io/evcc/charger/config"
)
var registry = reg.New[api.Charger]("charger")
var registry = config.Registry
// Types returns the list of types
func Types() []string {
@ -18,15 +16,5 @@ func Types() []string {
// NewFromConfig creates charger from configuration
func NewFromConfig(ctx context.Context, typ string, other map[string]interface{}) (api.Charger, error) {
factory, err := registry.Get(strings.ToLower(typ))
if err != nil {
return nil, err
}
v, err := factory(ctx, other)
if err != nil {
err = fmt.Errorf("cannot create charger type '%s': %w", typ, err)
}
return v, err
return config.NewFromConfig(ctx, typ, other)
}

27
charger/config/config.go Normal file
View file

@ -0,0 +1,27 @@
package config
import (
"context"
"fmt"
"strings"
"github.com/evcc-io/evcc/api"
reg "github.com/evcc-io/evcc/util/registry"
)
var Registry = reg.New[api.Charger]("charger")
// NewFromConfig creates charger from configuration
func NewFromConfig(ctx context.Context, typ string, other map[string]interface{}) (api.Charger, error) {
factory, err := Registry.Get(strings.ToLower(typ))
if err != nil {
return nil, err
}
v, err := factory(ctx, other)
if err != nil {
err = fmt.Errorf("cannot create charger type '%s': %w", typ, err)
}
return v, err
}

87
provider/charger.go Normal file
View file

@ -0,0 +1,87 @@
package provider
import (
"context"
"github.com/evcc-io/evcc/api"
charger "github.com/evcc-io/evcc/charger/config"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/config"
"github.com/spf13/cast"
)
type switchChargerProvider struct {
charger api.Charger
}
func init() {
registry.AddCtx("charger", NewChargerEnableFromConfig)
}
// NewChargerEnableFromConfig creates type conversion provider
func NewChargerEnableFromConfig(ctx context.Context, other map[string]interface{}) (Provider, error) {
var cc struct {
Config config.Typed
}
if err := util.DecodeOther(other, &cc); err != nil {
return nil, err
}
charger, err := charger.NewFromConfig(ctx, cc.Config.Type, cc.Config.Other)
if err != nil {
return nil, err
}
o := &switchChargerProvider{
charger: charger,
}
return o, nil
}
var _ FloatProvider = (*switchChargerProvider)(nil)
func (o *switchChargerProvider) FloatGetter() (func() (float64, error), error) {
return func() (float64, error) {
v, err := o.charger.Enabled()
return cast.ToFloat64(v), err
}, nil
}
var _ IntProvider = (*switchChargerProvider)(nil)
func (o *switchChargerProvider) IntGetter() (func() (int64, error), error) {
return func() (int64, error) {
v, err := o.charger.Enabled()
return cast.ToInt64(v), err
}, nil
}
var _ SetIntProvider = (*switchChargerProvider)(nil)
func (o *switchChargerProvider) IntSetter(param string) (func(int64) error, error) {
return func(val int64) error {
b, err := cast.ToBoolE(val)
if err != nil {
return err
}
return o.charger.Enable(b)
}, nil
}
var _ BoolProvider = (*switchChargerProvider)(nil)
func (o *switchChargerProvider) BoolGetter() (func() (bool, error), error) {
return func() (bool, error) {
return o.charger.Enabled()
}, nil
}
var _ SetBoolProvider = (*switchChargerProvider)(nil)
func (o *switchChargerProvider) BoolSetter(param string) (func(bool) error, error) {
return func(val bool) error {
return o.charger.Enable(val)
}, nil
}

View file

@ -33,19 +33,9 @@ func NewConstFromConfig(ctx context.Context, other map[string]interface{}) (Prov
return nil, err
}
pipe, err := pipeline.New(nil, cc.Settings)
if err != nil {
return nil, err
}
b, err := pipe.Process([]byte(cc.Value))
if err != nil {
return nil, err
}
p := &constProvider{
ctx: ctx,
str: string(b),
str: cc.Value,
set: cc.Set,
}