172 lines
3.6 KiB
Go
172 lines
3.6 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)
|
|
}
|
|
}
|
|
|
|
// 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)
|
|
query := r.URL.Query()
|
|
|
|
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
|
|
}
|
|
|
|
precondition, err := parseDuration(query.Get("precondition"))
|
|
if err != nil {
|
|
jsonError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
if err := v.SetPlanSoc(ts, precondition, soc); err != nil {
|
|
jsonError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
ts, precondition, soc = v.GetPlanSoc()
|
|
|
|
res := struct {
|
|
Soc int `json:"soc"`
|
|
Precondition int64 `json:"precondition"`
|
|
Time time.Time `json:"time"`
|
|
}{
|
|
Soc: soc,
|
|
Precondition: int64(precondition.Seconds()),
|
|
Time: ts,
|
|
}
|
|
|
|
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 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
|
|
}
|
|
|
|
jsonWrite(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, 0); err != nil {
|
|
jsonError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
res := struct{}{}
|
|
jsonWrite(w, res)
|
|
}
|
|
}
|