From 4a1c029abdf2fa0e6fa5d1ed8ccafc3910608b14 Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 16 May 2020 15:43:53 +0200 Subject: [PATCH] Warn if EVSE is always active (#153) --- charger/evsewifi.go | 70 +++++++++++++++++++++++++++++++-------------- core/loadpoint.go | 2 +- 2 files changed, 50 insertions(+), 22 deletions(-) diff --git a/charger/evsewifi.go b/charger/evsewifi.go index 2ffe2a45d9..9f7bf6f1da 100644 --- a/charger/evsewifi.go +++ b/charger/evsewifi.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "strings" + "time" "github.com/andig/evcc/api" "github.com/andig/evcc/util" @@ -14,7 +15,7 @@ const ( evseSetStatus apiFunction = "setStatus" evseSetCurrent apiFunction = "setCurrent" - evseSuccess = "S0_EVSE" + evseSuccess = "S0_" ) // EVSEParameterResponse is the getParameters response @@ -60,11 +61,9 @@ func NewEVSEWifiFromConfig(log *util.Logger, other map[string]interface{}) api.C func NewEVSEWifi(uri string) api.Charger { evse := &EVSEWifi{ HTTPHelper: util.NewHTTPHelper(util.NewLogger("wifi")), - uri: strings.TrimRight(uri, "/") + "/", + uri: strings.TrimRight(uri, "/"), } - evse.HTTPHelper.Log.WARN.Println("-- experimental --") - return evse } @@ -72,20 +71,35 @@ func (evse *EVSEWifi) apiURL(service apiFunction) string { return fmt.Sprintf("%s/%s", evse.uri, service) } -// Status implements the Charger.Status interface -func (evse *EVSEWifi) Status() (api.ChargeStatus, error) { +// query evse parameters +func (evse *EVSEWifi) getParameters() (EVSEListEntry, error) { var pr EVSEParameterResponse url := evse.apiURL(evseGetParameters) body, err := evse.GetJSON(url, &pr) if err != nil { - return api.StatusNone, err + return EVSEListEntry{}, err } if len(pr.List) != 1 { - return api.StatusNone, fmt.Errorf("unexpected response: %s", string(body)) + return EVSEListEntry{}, fmt.Errorf("unexpected response: %s", string(body)) + } + + params := pr.List[0] + if params.AlwaysActive { + evse.HTTPHelper.Log.WARN.Println("cannot control evse- alwaysactive is on") + } + + return params, nil +} + +// Status implements the Charger.Status interface +func (evse *EVSEWifi) Status() (api.ChargeStatus, error) { + params, err := evse.getParameters() + if err != nil { + return api.StatusNone, err } - switch pr.List[0].VehicleState { + switch params.VehicleState { case 1: // ready return api.StatusA, nil case 2: // EV is present @@ -103,18 +117,8 @@ func (evse *EVSEWifi) Status() (api.ChargeStatus, error) { // Enabled implements the Charger.Enabled interface func (evse *EVSEWifi) Enabled() (bool, error) { - var pr EVSEParameterResponse - url := evse.apiURL(evseGetParameters) - body, err := evse.GetJSON(url, &pr) - if err != nil { - return false, err - } - - if len(pr.List) != 1 { - return false, fmt.Errorf("unexpected response: %s", string(body)) - } - - return pr.List[0].EvseState, nil + params, err := evse.getParameters() + return params.EvseState, err } // checkError checks for EVSE error response with HTTP 200 status @@ -136,3 +140,27 @@ func (evse *EVSEWifi) MaxCurrent(current int64) error { url := fmt.Sprintf("%s?current=%d", evse.apiURL(evseSetCurrent), current) return evse.checkError(evse.Get(url)) } + +// ChargingTime yields current charge run duration +func (evse *EVSEWifi) ChargingTime() (time.Duration, error) { + params, err := evse.getParameters() + return time.Duration(params.Duration) * time.Millisecond, err +} + +// // TotalEnergy implements the MeterEnergy interface +// func (evse *EVSEWifi) TotalEnergy() (float64, error) { +// params, err := evse.getParameters() +// return params.MeterReading, err +// } + +// // ChargedEnergy implements the ChargeRater interface +// func (evse *EVSEWifi) ChargedEnergy() (float64, error) { +// params, err := evse.getParameters() +// return params.Energy, err +// } + +// // Currents implements the MeterCurrents interface +// func (evse *EVSEWifi) Currents() (float64, float64, float64, error) { +// params, err := evse.getParameters() +// return float64(params.CurrentP1), float64(params.CurrentP2), float64(params.CurrentP3), err +// } diff --git a/core/loadpoint.go b/core/loadpoint.go index bdbb817e7c..1913748474 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -505,7 +505,7 @@ func (lp *LoadPoint) update() { // read and publish status if err := retry.Do(lp.updateChargeStatus, retry.Attempts(3)); err != nil { - log.ERROR.Printf("%s charger error: %v", lp.Name, err) + log.ERROR.Printf("%s charge controller error: %v", lp.Name, err) return }