UI Config: add aux meters, improve reference handling (#19939)

Co-authored-by: andig <cpuidle@gmx.de>
This commit is contained in:
Michael Geers 2025-03-23 16:36:53 +01:00 • committed by GitHub
parent 7234be85a7
commit 2ea6c705d9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 571 additions and 234 deletions

View file

@ -12,6 +12,7 @@ import (
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/charger"
"github.com/evcc-io/evcc/core/circuit"
"github.com/evcc-io/evcc/core/site"
"github.com/evcc-io/evcc/meter"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/config"
@ -391,76 +392,110 @@ func deleteDevice[T any](id int, h config.Handler[T]) error {
return h.Delete(name)
}
// cleanupSiteMeterRef removes a meter reference from site configuration
func cleanupSiteMeterRef(name string, get func() []string, set func([]string)) {
var res []string
refs := get()
for _, ref := range refs {
if ref != name {
res = append(res, ref)
}
}
if len(refs) != len(res) {
set(res)
}
}
// deleteDeviceHandler deletes a device from database by class
func deleteDeviceHandler(w http.ResponseWriter, r *http.Request) {
h := config.Loadpoints()
func deleteDeviceHandler(site site.API) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
h := config.Loadpoints()
vars := mux.Vars(r)
vars := mux.Vars(r)
class, err := templates.ClassString(vars["class"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
id, err := strconv.Atoi(vars["id"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
switch class {
case templates.Charger:
err = deleteDevice(id, config.Chargers())
// cleanup references
for _, dev := range h.Devices() {
lp := dev.Instance()
if lp.GetChargerRef() == config.NameForID(id) {
lp.SetChargerRef("")
}
class, err := templates.ClassString(vars["class"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
case templates.Meter:
err = deleteDevice(id, config.Meters())
// cleanup references
for _, dev := range h.Devices() {
lp := dev.Instance()
if lp.GetMeterRef() == config.NameForID(id) {
lp.SetMeterRef("")
}
id, err := strconv.Atoi(vars["id"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
case templates.Vehicle:
err = deleteDevice(id, config.Vehicles())
switch class {
case templates.Charger:
err = deleteDevice(id, config.Chargers())
// cleanup references
for _, dev := range h.Devices() {
lp := dev.Instance()
if lp.GetDefaultVehicleRef() == config.NameForID(id) {
lp.SetDefaultVehicleRef("")
// cleanup references
for _, dev := range h.Devices() {
lp := dev.Instance()
if lp.GetChargerRef() == config.NameForID(id) {
lp.SetChargerRef("")
}
}
case templates.Meter:
err = deleteDevice(id, config.Meters())
// cleanup references
name := config.NameForID(id)
if site.GetGridMeterRef() == name {
site.SetGridMeterRef("")
}
for _, fun := range []struct {
get func() []string
set func([]string)
}{
{site.GetPVMeterRefs, site.SetPVMeterRefs},
{site.GetBatteryMeterRefs, site.SetBatteryMeterRefs},
{site.GetAuxMeterRefs, site.SetAuxMeterRefs},
{site.GetExtMeterRefs, site.SetExtMeterRefs},
} {
cleanupSiteMeterRef(name, fun.get, fun.set)
}
for _, dev := range h.Devices() {
lp := dev.Instance()
if lp.GetMeterRef() == name {
lp.SetMeterRef("")
}
}
case templates.Vehicle:
err = deleteDevice(id, config.Vehicles())
// cleanup references
for _, dev := range h.Devices() {
lp := dev.Instance()
if lp.GetDefaultVehicleRef() == config.NameForID(id) {
lp.SetDefaultVehicleRef("")
}
}
case templates.Circuit:
err = deleteDevice(id, config.Circuits())
}
case templates.Circuit:
err = deleteDevice(id, config.Circuits())
setConfigDirty()
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
res := struct {
ID int `json:"id"`
}{
ID: id,
}
jsonResult(w, res)
}
setConfigDirty()
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
res := struct {
ID int `json:"id"`
}{
ID: id,
}
jsonResult(w, res)
}
func testConfig[T any](ctx context.Context, id int, class templates.Class, req configReq, newFromConf newFromConfFunc[T], h config.Handler[T]) (T, error) {