evcc-io/server/http_config_handler.go
andig 54321c0cf7
Add configuration api (#6035)
Co-authored-by: Michael Geers <michael@geers.tv>
2023-02-08 11:29:27 +01:00

118 lines
2.5 KiB
Go

package server
import (
"encoding/json"
"net/http"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/charger"
"github.com/evcc-io/evcc/meter"
"github.com/evcc-io/evcc/util/templates"
"github.com/evcc-io/evcc/vehicle"
"github.com/gorilla/mux"
)
// templatesHandler returns the list of templates by class
func templatesHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
class, err := templates.ClassString(vars["class"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
res := templates.ByClass(class)
jsonResult(w, res)
}
// testHandler tests a configuration by class
func testHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
class, err := templates.ClassString(vars["class"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
var req map[string]any
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
// var req struct {
// Type string
// Other map[string]any `mapstructure:",remain"`
// }
// if err := mapstructure.Decode(plain, &req); err != nil {
// jsonError(w, http.StatusBadRequest, err)
// return
// }
// tmpl, err := templates.ByName(class, req.Name)
// if err != nil {
// jsonError(w, http.StatusBadRequest, err)
// return
// }
// b, _, err := tmpl.RenderResult(templates.TemplateRenderModeInstance, req.Other)
// if err != nil {
// jsonError(w, http.StatusBadRequest, err)
// return
// }
// var instance any
// if err := yaml.Unmarshal(b, &instance); err != nil {
// jsonError(w, http.StatusBadRequest, err)
// return
// }
typ := "template"
if req["type"] != nil {
typ = req["type"].(string)
delete(req, "type")
}
var dev any
switch class {
case templates.Charger:
dev, err = charger.NewFromConfig(typ, req)
case templates.Meter:
dev, err = meter.NewFromConfig(typ, req)
case templates.Vehicle:
dev, err = vehicle.NewFromConfig(typ, req)
}
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
type result = struct {
Value any `json:"value"`
Error error `json:"error"`
}
res := make(map[string]result)
if dev, ok := dev.(api.Meter); ok {
val, err := dev.CurrentPower()
res["CurrentPower"] = result{val, err}
}
if dev, ok := dev.(api.MeterEnergy); ok {
val, err := dev.TotalEnergy()
res["TotalEnergy"] = result{val, err}
}
if dev, ok := dev.(api.Battery); ok {
val, err := dev.Soc()
res["Soc"] = result{val, err}
}
jsonResult(w, res)
}