217 lines
4.4 KiB
Go
217 lines
4.4 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(),
|
|
}
|
|
|
|
jsonWrite(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(),
|
|
}
|
|
|
|
jsonWrite(w, res)
|
|
}
|
|
}
|
|
|
|
// vehicleModeHandler updates the vehicle charge mode (empty value clears it)
|
|
func vehicleModeHandler(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
|
|
}
|
|
|
|
mode, err := api.ChargeModeString(vars["value"])
|
|
if err != nil {
|
|
jsonError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
v.SetMode(mode)
|
|
|
|
res := struct {
|
|
Mode api.ChargeMode `json:"mode"`
|
|
}{
|
|
Mode: v.GetMode(),
|
|
}
|
|
|
|
jsonWrite(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,
|
|
}
|
|
|
|
jsonWrite(w, res)
|
|
}
|
|
}
|
|
|
|
func planStrategyHandlerSetter(r *http.Request, set func(api.PlanStrategy) error) error {
|
|
var res api.PlanStrategy
|
|
if err := json.NewDecoder(r.Body).Decode(&res); err != nil {
|
|
return err
|
|
}
|
|
|
|
return set(res)
|
|
}
|
|
|
|
// updatePlanStrategyHandler updates plan strategy
|
|
func updatePlanStrategyHandler(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 := planStrategyHandlerSetter(r, v.SetPlanStrategy); err != nil {
|
|
jsonError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
res := v.GetPlanStrategy()
|
|
|
|
jsonWrite(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 res []api.RepeatingPlan
|
|
if err := json.NewDecoder(r.Body).Decode(&res); err != nil {
|
|
jsonError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
if err := v.SetRepeatingPlans(res); err != nil {
|
|
jsonError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
jsonWrite(w, res)
|
|
}
|
|
}
|
|
|
|
// 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
|
|
}
|
|
|
|
jsonWrite(w, struct{}{})
|
|
}
|
|
}
|