UI Config: add aux meters, improve reference handling (#19939)
Co-authored-by: andig <cpuidle@gmx.de>
This commit is contained in:
parent
7234be85a7
commit
2ea6c705d9
18 changed files with 571 additions and 234 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue