diff --git a/charger/config.go b/charger/config.go index 6449c3d78..05b95ae91 100644 --- a/charger/config.go +++ b/charger/config.go @@ -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) } diff --git a/charger/config/config.go b/charger/config/config.go new file mode 100644 index 000000000..33a88b06a --- /dev/null +++ b/charger/config/config.go @@ -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 +} diff --git a/provider/charger.go b/provider/charger.go new file mode 100644 index 000000000..6696f3311 --- /dev/null +++ b/provider/charger.go @@ -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 +} diff --git a/provider/const.go b/provider/const.go index 638e048cf..692f15dc8 100644 --- a/provider/const.go +++ b/provider/const.go @@ -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, }