evcc-io/util/config/instance.go
andig 4465100a65
Config UI: allow disabling devices (#29455)
Co-authored-by: Michael Geers <michael@geers.tv>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: andig <184815+andig@users.noreply.github.com>
2026-08-11 13:24:40 +00:00

88 lines
2 KiB
Go

package config
import (
evbus "github.com/asaskevich/EventBus"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/core/loadpoint"
"github.com/evcc-io/evcc/hems/hems"
)
var bus = evbus.New()
var instance struct {
meters *handler[api.Meter]
chargers *handler[api.Charger]
vehicles *handler[api.Vehicle]
circuits *handler[api.Circuit]
hems *handler[hems.API]
messengers *handler[api.Messenger]
loadpoints *handler[loadpoint.API]
tariffs *handler[api.Tariff]
}
func init() {
Reset()
}
func Reset() {
instance.meters = &handler[api.Meter]{topic: "meter"}
instance.chargers = &handler[api.Charger]{topic: "charger"}
instance.vehicles = &handler[api.Vehicle]{topic: "vehicle"}
instance.circuits = &handler[api.Circuit]{topic: "circuit"}
instance.hems = &handler[hems.API]{topic: "hems"}
instance.messengers = &handler[api.Messenger]{topic: "messenger"}
instance.loadpoints = &handler[loadpoint.API]{topic: "loadpoint"}
instance.tariffs = &handler[api.Tariff]{topic: "tariff"}
}
type Handler[T any] interface {
Subscribe(fn func(Operation, Device[T]))
Devices() []Device[T]
Add(dev Device[T]) error
Delete(name string) error
ByName(name string) (Device[T], error)
}
func Meters() Handler[api.Meter] {
return instance.meters
}
func Chargers() Handler[api.Charger] {
return instance.chargers
}
func Vehicles() Handler[api.Vehicle] {
return instance.vehicles
}
func Messengers() Handler[api.Messenger] {
return instance.messengers
}
func Circuits() Handler[api.Circuit] {
return instance.circuits
}
func Hems() Handler[hems.API] {
return instance.hems
}
func Loadpoints() Handler[loadpoint.API] {
return instance.loadpoints
}
func Tariffs() Handler[api.Tariff] {
return instance.tariffs
}
// Instances returns the instances of the given devices
func Instances[T any](devices []Device[T]) []T {
res := make([]T, 0, len(devices))
for _, dev := range devices {
// skip disabled devices without instance
if inst := dev.Instance(); any(inst) != nil {
res = append(res, inst)
}
}
return res
}