evcc-io/server/http_vehicle_handler.go
2024-12-01 12:53:11 +01:00

163 lines
3.2 KiB
Go

package server
import (
"encoding/json"
"net/http"
"strconv"
"time"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/core/site"
"github.com/gorilla/mux"
)
// minSocHandler updates min soc
func minSocHandler(site site.API) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
v, err := site.Vehicles().ByName(vars["name"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
soc, err := strconv.Atoi(vars["value"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
v.SetMinSoc(soc)
res := struct {
Soc int `json:"soc"`
}{
Soc: v.GetMinSoc(),
}
jsonResult(w, res)
}
}
// limitSocHandler updates limit soc
func limitSocHandler(site site.API) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
v, err := site.Vehicles().ByName(vars["name"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
soc, err := strconv.Atoi(vars["value"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
v.SetLimitSoc(soc)
res := struct {
Soc int `json:"soc"`
}{
Soc: v.GetLimitSoc(),
}
jsonResult(w, res)
}
}
// planSocHandler updates plan soc and time
func planSocHandler(site site.API) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
v, err := site.Vehicles().ByName(vars["name"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
ts, err := time.ParseInLocation(time.RFC3339, vars["time"], nil)
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
soc, err := strconv.Atoi(vars["value"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
if err := v.SetPlanSoc(ts, soc); err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
ts, soc = v.GetPlanSoc()
res := struct {
Soc int `json:"soc"`
Time time.Time `json:"time"`
}{
Soc: soc,
Time: ts,
}
jsonResult(w, res)
}
}
// addRepeatingPlansHandler handles any information regarding weekday, hour, minute, soc and isActive
func addRepeatingPlansHandler(site site.API) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
v, err := site.Vehicles().ByName(vars["name"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
var plansWrapper struct {
RepeatingPlans []api.RepeatingPlanStruct `json:"plans"`
}
err = json.NewDecoder(r.Body).Decode(&plansWrapper)
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
if err := v.SetRepeatingPlans(plansWrapper.RepeatingPlans); err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
jsonResult(w, plansWrapper)
}
}
// planSocRemoveHandler removes plan soc and time
func planSocRemoveHandler(site site.API) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
v, err := site.Vehicles().ByName(vars["name"])
if err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
if err := v.SetPlanSoc(time.Time{}, 0); err != nil {
jsonError(w, http.StatusBadRequest, err)
return
}
res := struct{}{}
jsonResult(w, res)
}
}