evcc-io/vehicle/zero/api.go
2024-08-03 17:00:53 +02:00

71 lines
1.7 KiB
Go

package zero
import (
"fmt"
"net/url"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/request"
)
const BaseUrl = "https://mongol.brono.com/mongol/api.php"
// See https://www.electricmotorcycleforum.com/boards/index.php?topic=9520.0
// API is quite simple
// 1 Acquire unit id(s) by calling
// https://mongol.brono.com/mongol/api.php?commandname=get_units&format=json&user=yourusername&pass=yourpass
// 2 Query last dataset
// https://mongol.brono.com/mongol/api.php?commandname=get_last_transmit&format=json&user=yourusername&pass=yourpass&unitnumber=0000000
// API is an api.Vehicle implementation for Zero Motorcycles
type API struct {
*request.Helper
user string
password string
}
// NewAPI creates a new vehicle
func NewAPI(log *util.Logger, user, password string) (*API, error) {
var err error
v := &API{
Helper: request.NewHelper(log),
user: user,
password: password,
}
return v, err
}
func (v *API) Vehicles() ([]Unit, error) {
var res []Unit
params := url.Values{
"user": {v.user},
"pass": {v.password},
"commandname": {"get_units"},
"format": {"json"},
}
uri := fmt.Sprintf("%s?%s", BaseUrl, params.Encode())
err := v.GetJSON(uri, &res)
return res, err
}
// Status implements the /user/vehicles/<vin>/status api
func (v *API) Status(unitId string) (State, error) {
var res []State
params := url.Values{
"user": {v.user},
"pass": {v.password},
"unitnumber": {unitId},
"commandname": {"get_last_transmit"},
"format": {"json"},
}
uri := fmt.Sprintf("%s?%s", BaseUrl, params.Encode())
if err := v.GetJSON(uri, &res); err != nil {
return State{}, err
}
return res[0], nil
}