Cleanup and test for optional interfaces (#799)

This commit is contained in:
andig 2021-03-22 12:51:10 +01:00 • committed by GitHub
parent 154a664909
commit 1d79f75980
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 212 additions and 80 deletions

View file

@ -94,9 +94,9 @@ type ChargeRater interface {
// Vehicle represents the EV and it's battery
type Vehicle interface {
Battery
Title() string
Capacity() int64
SoC() (float64, error)
}
// VehicleFinishTimer provides estimated charge cycle finish time

View file

@ -18,7 +18,7 @@ func (m *ChargeMeter) SetPower(power float64) {
m.power = power
}
// CurrentPower implements the Meter.CurrentPower interface
// CurrentPower implements the api.Meter interface
func (m *ChargeMeter) CurrentPower() (float64, error) {
m.Lock()
defer m.Unlock()

View file

@ -210,6 +210,8 @@ func (evse *EVSEWifi) MaxCurrent(current int64) error {
return evse.checkError(evse.GetBody(url))
}
var _ api.ChargeTimer = (*EVSEWifi)(nil)
// ChargingTime yields current charge run duration
func (evse *EVSEWifi) ChargingTime() (time.Duration, error) {
params, err := evse.getParameters()

View file

@ -175,7 +175,9 @@ func (c *FritzDECT) MaxCurrent(current int64) error {
return nil
}
// CurrentPower implements the Meter interface.
var _ api.Meter = (*FritzDECT)(nil)
// CurrentPower implements the api.Meter interface
func (c *FritzDECT) CurrentPower() (float64, error) {
// power value in 0,001 W (current switch power, refresh aproximately every 2 minutes)
resp, err := c.execFritzDectCmd("getswitchpower")

View file

@ -209,7 +209,9 @@ func (c *GoE) MaxCurrent(current int64) error {
return err
}
// CurrentPower implements the Meter interface.
var _ api.Meter = (*GoE)(nil)
// CurrentPower implements the api.Meter interface
func (c *GoE) CurrentPower() (float64, error) {
status, err := c.apiStatus()
var power float64
@ -219,14 +221,18 @@ func (c *GoE) CurrentPower() (float64, error) {
return power, err
}
// ChargedEnergy implements the ChargeRater interface
var _ api.ChargeRater = (*GoE)(nil)
// ChargedEnergy implements the api.ChargeRater interface
func (c *GoE) ChargedEnergy() (float64, error) {
status, err := c.apiStatus()
energy := float64(status.Dws) / 3.6e5 // Deka-Watt-Seconds to kWh (100.000 == 0,277kWh)
return energy, err
}
// Currents implements the MeterCurrent interface
var _ api.MeterCurrent = (*GoE)(nil)
// Currents implements the api.MeterCurrent interface
func (c *GoE) Currents() (float64, float64, float64, error) {
status, err := c.apiStatus()
if len(status.Nrg) == 16 {

View file

@ -247,7 +247,9 @@ func (c *Keba) MaxCurrent(current int64) error {
return nil
}
// MaxCurrentMillis implements the ChargerEx interface
var _ api.ChargerEx = (*Keba)(nil)
// MaxCurrentMillis implements the api.ChargerEx interface
func (c *Keba) MaxCurrentMillis(current float64) error {
d := int(1000 * current)
@ -262,6 +264,8 @@ func (c *Keba) MaxCurrentMillis(current float64) error {
return nil
}
var _ api.Meter = (*Keba)(nil)
// CurrentPower implements the Meter interface
func (c *Keba) CurrentPower() (float64, error) {
var kr keba.Report3
@ -271,6 +275,8 @@ func (c *Keba) CurrentPower() (float64, error) {
return float64(kr.P) / 1e3, err
}
var _ api.MeterEnergy = (*Keba)(nil)
// TotalEnergy implements the MeterEnergy interface
func (c *Keba) TotalEnergy() (float64, error) {
var kr keba.Report3
@ -280,6 +286,8 @@ func (c *Keba) TotalEnergy() (float64, error) {
return float64(kr.ETotal) / 1e4, err
}
var _ api.ChargeRater = (*Keba)(nil)
// ChargedEnergy implements the ChargeRater interface
func (c *Keba) ChargedEnergy() (float64, error) {
var kr keba.Report3
@ -289,6 +297,8 @@ func (c *Keba) ChargedEnergy() (float64, error) {
return float64(kr.EPres) / 1e4, err
}
var _ api.MeterCurrent = (*Keba)(nil)
// Currents implements the MeterCurrents interface
func (c *Keba) Currents() (float64, float64, float64, error) {
var kr keba.Report3

View file

@ -306,6 +306,8 @@ func (mcc *MobileConnect) MaxCurrent(current int64) error {
return nil
}
var _ api.Meter = (*MobileConnect)(nil)
// CurrentPower implements the Meter interface.
func (mcc *MobileConnect) CurrentPower() (float64, error) {
var energy MCCEnergy
@ -314,6 +316,8 @@ func (mcc *MobileConnect) CurrentPower() (float64, error) {
return energy.L1.Power + energy.L2.Power + energy.L3.Power, err
}
var _ api.ChargeRater = (*MobileConnect)(nil)
// ChargedEnergy implements the ChargeRater interface.
func (mcc *MobileConnect) ChargedEnergy() (float64, error) {
var currentSession MCCCurrentSession
@ -324,6 +328,8 @@ func (mcc *MobileConnect) ChargedEnergy() (float64, error) {
return currentSession.EnergySumKwh, nil
}
var _ api.ChargeTimer = (*MobileConnect)(nil)
// ChargingTime yields current charge run duration
func (mcc *MobileConnect) ChargingTime() (time.Duration, error) {
var currentSession MCCCurrentSession
@ -334,6 +340,8 @@ func (mcc *MobileConnect) ChargingTime() (time.Duration, error) {
return time.Duration(currentSession.Duration * time.Second), nil
}
var _ api.MeterCurrent = (*MobileConnect)(nil)
// Currents implements the MeterCurrent interface
func (mcc *MobileConnect) Currents() (float64, float64, float64, error) {
var energy MCCEnergy

View file

@ -296,7 +296,9 @@ func (nrg *NRGKickBLE) MaxCurrent(current int64) error {
return nrg.write(nrgble.SettingsService, &settings)
}
// CurrentPower implements the Meter interface.
var _ api.Meter = (*NRGKickBLE)(nil)
// CurrentPower implements the api.Meter interface
func (nrg *NRGKickBLE) CurrentPower() (float64, error) {
res := nrgble.Power{}
if err := nrg.read(nrgble.PowerService, &res); err != nil {
@ -308,7 +310,9 @@ func (nrg *NRGKickBLE) CurrentPower() (float64, error) {
return float64(res.TotalPower) * 10, nil
}
// TotalEnergy implements the MeterEnergy interface.
var _ api.MeterEnergy = (*NRGKickBLE)(nil)
// TotalEnergy implements the api.MeterEnergy interface
func (nrg *NRGKickBLE) TotalEnergy() (float64, error) {
res := nrgble.Energy{}
if err := nrg.read(nrgble.EnergyService, &res); err != nil {
@ -320,7 +324,9 @@ func (nrg *NRGKickBLE) TotalEnergy() (float64, error) {
return float64(res.TotalEnergy) / 1000, nil
}
// Currents implements the MeterCurrent interface.
var _ api.MeterCurrent = (*NRGKickBLE)(nil)
// Currents implements the api.MeterCurrent interface
func (nrg *NRGKickBLE) Currents() (float64, float64, float64, error) {
res := nrgble.VoltageCurrent{}
if err := nrg.read(nrgble.VoltageCurrentService, &res); err != nil {

View file

@ -134,8 +134,8 @@ func (nrg *NRGKickConnect) Enabled() (bool, error) {
err := nrg.GetJSON(nrg.apiURL(nrgSettings), &res)
if err != nil {
if res.Message != "" {
err = errors.New(res.Message)
}
err = errors.New(res.Message)
}
return false, err
}
@ -161,6 +161,8 @@ func (nrg *NRGKickConnect) MaxCurrent(current int64) error {
return nrg.putJSON(nrg.apiURL(nrgSettings), settings)
}
var _ api.Meter = (*NRGKickConnect)(nil)
// CurrentPower implements the Meter interface
func (nrg *NRGKickConnect) CurrentPower() (float64, error) {
var res NRGMeasurements
@ -172,6 +174,8 @@ func (nrg *NRGKickConnect) CurrentPower() (float64, error) {
return 1000 * res.ChargingPower, err
}
var _ api.MeterEnergy = (*NRGKickConnect)(nil)
// TotalEnergy implements the MeterEnergy interface
func (nrg *NRGKickConnect) TotalEnergy() (float64, error) {
var res NRGMeasurements
@ -183,6 +187,8 @@ func (nrg *NRGKickConnect) TotalEnergy() (float64, error) {
return res.ChargingEnergyOverAll, err
}
var _ api.MeterCurrent = (*NRGKickConnect)(nil)
// Currents implements the MeterCurrent interface
func (nrg *NRGKickConnect) Currents() (float64, float64, float64, error) {
var res NRGMeasurements

View file

@ -125,17 +125,23 @@ func NewOpenWB(log *util.Logger, mqttconf mqtt.Config, id int, topic string, tim
return res, nil
}
// CurrentPower implements the Meter.CurrentPower interface
var _ api.Meter = (*OpenWB)(nil)
// CurrentPower implements the api.Meter interface
func (m *OpenWB) CurrentPower() (float64, error) {
return m.currentPowerG()
}
// TotalEnergy implements the Meter.TotalEnergy interface
var _ api.MeterEnergy = (*OpenWB)(nil)
// TotalEnergy implements the api.MeterEnergy interface
func (m *OpenWB) TotalEnergy() (float64, error) {
return m.totalEnergyG()
}
// Currents implements the Meter.Currents interface
var _ api.MeterCurrent = (*OpenWB)(nil)
// Currents implements the api.MeterCurrent interface
func (m *OpenWB) Currents() (float64, float64, float64, error) {
var currents []float64
for _, currentG := range m.currentsG {

View file

@ -131,6 +131,8 @@ func (wb *PhoenixEMEth) MaxCurrent(current int64) error {
return err
}
var _ api.ChargeTimer = (*PhoenixEMEth)(nil)
// ChargingTime yields current charge run duration
func (wb *PhoenixEMEth) ChargingTime() (time.Duration, error) {
b, err := wb.conn.ReadInputRegisters(phxEMEthRegChargeTime, 2)
@ -143,7 +145,7 @@ func (wb *PhoenixEMEth) ChargingTime() (time.Duration, error) {
return time.Duration(time.Duration(secs) * time.Second), nil
}
// CurrentPower implements the Meter.CurrentPower interface
// CurrentPower implements the api.Meter interface
func (wb *PhoenixEMEth) currentPower() (float64, error) {
b, err := wb.conn.ReadInputRegisters(phxEMEthRegPower, 2)
if err != nil {
@ -153,7 +155,7 @@ func (wb *PhoenixEMEth) currentPower() (float64, error) {
return rs485.RTUUint32ToFloat64Swapped(b) * 10, err
}
// totalEnergy implements the Meter.TotalEnergy interface
// totalEnergy implements the api.MeterEnergy interface
func (wb *PhoenixEMEth) totalEnergy() (float64, error) {
b, err := wb.conn.ReadInputRegisters(phxEMEthRegEnergy, 2)
if err != nil {
@ -163,7 +165,7 @@ func (wb *PhoenixEMEth) totalEnergy() (float64, error) {
return rs485.RTUUint32ToFloat64Swapped(b) / 100, err
}
// currents implements the Meter.Currents interface
// currents implements the api.MeterCurrent interface
func (wb *PhoenixEMEth) currents() (float64, float64, float64, error) {
var currents []float64
for _, regCurrent := range phxEMEthRegCurrents {

View file

@ -132,6 +132,8 @@ func (wb *PhoenixEVEth) MaxCurrent(current int64) error {
return err
}
var _ api.ChargeTimer = (*PhoenixEVEth)(nil)
// ChargingTime yields current charge run duration
func (wb *PhoenixEVEth) ChargingTime() (time.Duration, error) {
b, err := wb.conn.ReadInputRegisters(phxEVEthRegChargeTime, 2)
@ -144,7 +146,7 @@ func (wb *PhoenixEVEth) ChargingTime() (time.Duration, error) {
return time.Duration(time.Duration(secs) * time.Second), nil
}
// CurrentPower implements the Meter.CurrentPower interface
// CurrentPower implements the api.Meter interface
func (wb *PhoenixEVEth) currentPower() (float64, error) {
b, err := wb.conn.ReadInputRegisters(phxEVEthRegPower, 2)
if err != nil {
@ -154,7 +156,7 @@ func (wb *PhoenixEVEth) currentPower() (float64, error) {
return rs485.RTUUint32ToFloat64Swapped(b), err
}
// totalEnergy implements the Meter.TotalEnergy interface
// totalEnergy implements the api.MeterEnergy interface
func (wb *PhoenixEVEth) totalEnergy() (float64, error) {
b, err := wb.conn.ReadHoldingRegisters(phxEVEthRegEnergy, 2)
if err != nil {
@ -164,7 +166,7 @@ func (wb *PhoenixEVEth) totalEnergy() (float64, error) {
return rs485.RTUUint32ToFloat64Swapped(b) / 1000, err
}
// currents implements the Meter.Currents interface
// currents implements the api.MeterCurrent interface
func (wb *PhoenixEVEth) currents() (float64, float64, float64, error) {
var currents []float64
for _, regCurrent := range phxEVEthRegCurrents {

View file

@ -162,7 +162,7 @@ func (wb *Wallbe) MaxCurrent(current int64) error {
return err
}
// maxCurrentMillis implements the ChargerEx interface
// maxCurrentMillis implements the api.ChargerEx interface
func (wb *Wallbe) maxCurrentMillis(current float64) error {
if current < 6 {
return fmt.Errorf("invalid current %.5g", current)
@ -174,7 +174,9 @@ func (wb *Wallbe) maxCurrentMillis(current float64) error {
return err
}
// ChargingTime yields current charge run duration
var _ api.ChargeTimer = (*Wallbe)(nil)
// ChargingTime implements the api.ChargeTimer interface
func (wb *Wallbe) ChargingTime() (time.Duration, error) {
b, err := wb.conn.ReadInputRegisters(wbRegChargeTime, 2)
if err != nil {
@ -199,7 +201,7 @@ func (wb *Wallbe) decodeReading(b []byte) float64 {
return float64(v)
}
// currentPower implements the Meter.CurrentPower interface
// currentPower implements the api.Meter interface
func (wb *Wallbe) currentPower() (float64, error) {
b, err := wb.conn.ReadInputRegisters(wbRegPower, 2)
if err != nil {
@ -209,7 +211,7 @@ func (wb *Wallbe) currentPower() (float64, error) {
return wb.decodeReading(b), err
}
// totalEnergy implements the Meter.TotalEnergy interface
// totalEnergy implements the api.MeterEnergy interface
func (wb *Wallbe) totalEnergy() (float64, error) {
b, err := wb.conn.ReadInputRegisters(wbRegEnergy, 2)
if err != nil {
@ -219,7 +221,7 @@ func (wb *Wallbe) totalEnergy() (float64, error) {
return wb.decodeReading(b), err
}
// currents implements the Meter.Currents interface
// currents implements the api.MeterCurrent interface
func (wb *Wallbe) currents() (float64, float64, float64, error) {
var currents []float64
for _, regCurrent := range wbRegCurrents {

View file

@ -248,6 +248,8 @@ func (m *Warp) MaxCurrent(current int64) error {
return m.maxcurrentS(1000 * current)
}
var _ api.ChargerEx = (*Warp)(nil)
// MaxCurrentMillis implements the api.ChargerEx interface
func (m *Warp) MaxCurrentMillis(current float64) error {
return m.maxcurrentS(int64(1000 * current))
@ -259,7 +261,7 @@ type powerStatus struct {
EnergyAbs float64 `json:"energy_abs"`
}
// currentPower implements the Meter.CurrentPower interface
// currentPower implements the api.Meter interface
func (m *Warp) currentPower() (float64, error) {
var res powerStatus
@ -271,7 +273,7 @@ func (m *Warp) currentPower() (float64, error) {
return res.Power, err
}
// totalEnergy implements the Meter.TotalEnergy interface
// totalEnergy implements the api.MeterEnergy interface
func (m *Warp) totalEnergy() (float64, error) {
var res powerStatus

View file

@ -121,17 +121,17 @@ func (m *Meter) Decorate(
return decorateMeter(m, totalEnergy, currents, batterySoC)
}
// CurrentPower implements the Meter.CurrentPower interface
// CurrentPower implements the api.Meter interface
func (m *Meter) CurrentPower() (float64, error) {
return m.currentPowerG()
}
// totalEnergy implements the Meter.TotalEnergy interface
// totalEnergy implements the api.MeterEnergy interface
func (m *Meter) totalEnergy() (float64, error) {
return m.totalEnergyG()
}
// currents implements the Meter.Currents interface
// currents implements the api.MeterCurrent interface
func (m *Meter) currents() (float64, float64, float64, error) {
var currents []float64
for _, currentG := range m.currentsG {
@ -146,7 +146,7 @@ func (m *Meter) currents() (float64, float64, float64, error) {
return currents[0], currents[1], currents[2], nil
}
// batterySoC implements the Battery.SoC interface
// batterySoC implements the api.Battery interface
func (m *Meter) batterySoC() (float64, error) {
return m.batterySoCG()
}

View file

@ -151,17 +151,17 @@ func (m *Modbus) floatGetter(op modbus.Operation) (float64, error) {
return res.Value, err
}
// CurrentPower implements the Meter.CurrentPower interface
// CurrentPower implements the api.Meter interface
func (m *Modbus) CurrentPower() (float64, error) {
return m.floatGetter(m.opPower)
}
// totalEnergy implements the Meter.TotalEnergy interface
// totalEnergy implements the api.MeterEnergy interface
func (m *Modbus) totalEnergy() (float64, error) {
return m.floatGetter(m.opEnergy)
}
// soc implements the Battery.SoC interface
// soc implements the api.Battery interface
func (m *Modbus) soc() (float64, error) {
return m.floatGetter(m.opSoC)
}

View file

@ -163,7 +163,7 @@ func (sm *SMA) hasValue() (values, error) {
return sm.values, nil
}
// CurrentPower implements the Meter.CurrentPower interface
// CurrentPower implements the api.Meter interface
func (sm *SMA) CurrentPower() (float64, error) {
values, err := sm.hasValue()
return values.power, err

View file

@ -115,7 +115,7 @@ func (m *Tesla) Login() error {
return err
}
// CurrentPower implements the Meter.CurrentPower interface
// CurrentPower implements the api.Meter interface
func (m *Tesla) CurrentPower() (float64, error) {
var res powerwall.MeterResponse
if err := m.GetJSON(m.uri+powerwall.MeterURI, &res); err != nil {

View file

@ -352,6 +352,8 @@ func (v *API) statusAPI() (interface{}, error) {
return res, err
}
var _ api.Battery = (*API)(nil)
// SoC implements the api.Vehicle interface
func (v *API) SoC() (float64, error) {
res, err := v.apiG()
@ -363,6 +365,8 @@ func (v *API) SoC() (float64, error) {
return 0, err
}
var _ api.VehicleFinishTimer = (*API)(nil)
// FinishTime implements the api.VehicleFinishTimer interface
func (v *API) FinishTime() (time.Time, error) {
res, err := v.apiG()
@ -380,6 +384,8 @@ func (v *API) FinishTime() (time.Time, error) {
return time.Time{}, err
}
var _ api.VehicleRange = (*API)(nil)
// Range implements the api.VehicleRange interface
func (v *API) Range() (int64, error) {
res, err := v.apiG()

View file

@ -90,6 +90,8 @@ func (v *CarWings) SoC() (float64, error) {
return v.chargeStateG()
}
var _ api.VehicleClimater = (*CarWings)(nil)
// Climater implements the api.Vehicle.Climater interface
func (v *CarWings) Climater() (active bool, outsideTemp float64, targetTemp float64, err error) {
res, err := v.hvacG()

View file

@ -27,6 +27,8 @@ func NewProvider(api *API, vin string, cache time.Duration) *Provider {
return impl
}
var _ api.Battery = (*Provider)(nil)
// SoC implements the api.Vehicle interface
func (v *Provider) SoC() (float64, error) {
res, err := v.statusG()
@ -37,7 +39,9 @@ func (v *Provider) SoC() (float64, error) {
return 0, err
}
// Status implements the Vehicle.Status interface
var _ api.ChargeState = (*Provider)(nil)
// Status implements the api.ChargeState interface
func (v *Provider) Status() (api.ChargeStatus, error) {
status := api.StatusA // disconnected
@ -54,6 +58,8 @@ func (v *Provider) Status() (api.ChargeStatus, error) {
return status, err
}
var _ api.VehicleFinishTimer = (*Provider)(nil)
// FinishTime implements the api.VehicleFinishTimer interface
func (v *Provider) FinishTime() (time.Time, error) {
res, err := v.statusG()
@ -66,6 +72,8 @@ func (v *Provider) FinishTime() (time.Time, error) {
return time.Time{}, err
}
var _ api.VehicleRange = (*Provider)(nil)
// Range implements the api.VehicleRange interface
func (v *Provider) Range() (int64, error) {
res, err := v.statusG()
@ -76,7 +84,9 @@ func (v *Provider) Range() (int64, error) {
return 0, err
}
// Climater implements the Vehicle.Climater interface
var _ api.VehicleClimater = (*Provider)(nil)
// Climater implements the api.VehicleClimater interface
func (v *Provider) Climater() (active bool, outsideTemp float64, targetTemp float64, err error) {
res, err := v.statusG()
if res, ok := res.(Status); err == nil && ok {
@ -99,7 +109,9 @@ func (v *Provider) Climater() (active bool, outsideTemp float64, targetTemp floa
return active, outsideTemp, targetTemp, err
}
// StartCharge implements the VehicleStartCharge interface
var _ api.VehicleStartCharge = (*Provider)(nil)
// StartCharge implements the api.VehicleStartCharge interface
func (v *Provider) StartCharge() error {
return v.startChargeAction()
}

View file

@ -40,6 +40,8 @@ func New(apiG func() (interface{}, error)) *API {
return &API{apiG: apiG}
}
var _ api.Battery = (*API)(nil)
// SoC implements the api.Vehicle interface
func (v *API) SoC() (float64, error) {
res, err := v.apiG()
@ -51,6 +53,8 @@ func (v *API) SoC() (float64, error) {
return 0, err
}
var _ api.ChargeState = (*API)(nil)
// Status implements the Vehicle.Status interface
func (v *API) Status() (api.ChargeStatus, error) {
status := api.StatusA // disconnected
@ -68,6 +72,8 @@ func (v *API) Status() (api.ChargeStatus, error) {
return status, err
}
var _ api.VehicleRange = (*API)(nil)
// Range implements the api.VehicleRange interface
func (v *API) Range() (int64, error) {
res, err := v.apiG()
@ -79,6 +85,8 @@ func (v *API) Range() (int64, error) {
return 0, err
}
var _ api.VehicleFinishTimer = (*API)(nil)
// FinishTime implements the api.VehicleFinishTimer interface
func (v *API) FinishTime() (time.Time, error) {
res, err := v.apiG()

View file

@ -334,7 +334,9 @@ func (v *Porsche) SoC() (float64, error) {
return 0, err
}
// Status implements the VehicleStatus interface
var _ api.ChargeState = (*Porsche)(nil)
// Status implements the api.ChargeState interface
func (v *Porsche) Status() (api.ChargeStatus, error) {
res, err := v.chargerG()
if res, ok := res.(porscheEmobilityResponse); err == nil && ok {
@ -354,6 +356,8 @@ func (v *Porsche) Status() (api.ChargeStatus, error) {
return api.StatusNone, err
}
var _ api.VehicleRange = (*Porsche)(nil)
// Range implements the api.VehicleRange interface
func (v *Porsche) Range() (int64, error) {
res, err := v.chargerG()
@ -364,6 +368,22 @@ func (v *Porsche) Range() (int64, error) {
return 0, err
}
var _ api.VehicleFinishTimer = (*Porsche)(nil)
// FinishTime implements the api.VehicleFinishTimer interface
func (v *Porsche) FinishTime() (time.Time, error) {
res, err := v.chargerG()
if res, ok := res.(*porscheEmobilityResponse); err == nil && ok {
t := time.Now()
return t.Add(time.Duration(res.BatteryChargeStatus.RemainingChargeTimeUntil100PercentInMinutes) * time.Minute), err
}
return time.Time{}, err
}
var _ api.VehicleClimater = (*Porsche)(nil)
// Climater implements the api.VehicleClimater interface
func (v *Porsche) Climater() (active bool, outsideTemp float64, targetTemp float64, err error) {
res, err := v.chargerG()
@ -378,15 +398,3 @@ func (v *Porsche) Climater() (active bool, outsideTemp float64, targetTemp float
return active, outsideTemp, targetTemp, err
}
// FinishTime implements the api.VehicleFinishTimer interface
func (v *Porsche) FinishTime() (time.Time, error) {
res, err := v.chargerG()
if res, ok := res.(*porscheEmobilityResponse); err == nil && ok {
t := time.Now()
return t.Add(time.Duration(res.BatteryChargeStatus.RemainingChargeTimeUntil100PercentInMinutes) * time.Minute), err
}
return time.Time{}, err
}

View file

@ -23,6 +23,8 @@ func NewProvider(api *API, vid string, cache time.Duration) *Provider {
return impl
}
var _ api.Battery = (*Provider)(nil)
// SoC implements the api.Vehicle interface
func (v *Provider) SoC() (float64, error) {
res, err := v.statusG()
@ -37,6 +39,8 @@ func (v *Provider) SoC() (float64, error) {
return 0, err
}
var _ api.VehicleRange = (*Provider)(nil)
// Range implements the api.VehicleRange interface
func (v *Provider) Range() (int64, error) {
res, err := v.statusG()
@ -51,6 +55,8 @@ func (v *Provider) Range() (int64, error) {
return 0, err
}
var _ api.VehicleFinishTimer = (*Provider)(nil)
// FinishTime implements the api.VehicleFinishTimer interface
func (v *Provider) FinishTime() (time.Time, error) {
res, err := v.statusG()
@ -66,6 +72,8 @@ func (v *Provider) FinishTime() (time.Time, error) {
return time.Time{}, err
}
var _ api.ChargeState = (*Provider)(nil)
// Status implements the api.ChargeState interface
func (v *Provider) Status() (api.ChargeStatus, error) {
res, err := v.statusG()
@ -91,6 +99,8 @@ func (v *Provider) Status() (api.ChargeStatus, error) {
return api.StatusNone, err
}
var _ api.VehicleClimater = (*Provider)(nil)
// Climater implements the api.VehicleClimater interface
func (v *Provider) Climater() (active bool, outsideTemp float64, targetTemp float64, err error) {
res, err := v.statusG()

View file

@ -349,7 +349,9 @@ func (v *Renault) SoC() (float64, error) {
return 0, err
}
// Status implements the Vehicle.Status interface
var _ api.ChargeState = (*Renault)(nil)
// Status implements the api.ChargeState interface
func (v *Renault) Status() (api.ChargeStatus, error) {
status := api.StatusA // disconnected
@ -366,6 +368,8 @@ func (v *Renault) Status() (api.ChargeStatus, error) {
return status, err
}
var _ api.VehicleRange = (*Renault)(nil)
// Range implements the api.VehicleRange interface
func (v *Renault) Range() (int64, error) {
res, err := v.batteryG()
@ -377,6 +381,8 @@ func (v *Renault) Range() (int64, error) {
return 0, err
}
var _ api.VehicleFinishTimer = (*Renault)(nil)
// FinishTime implements the api.VehicleFinishTimer interface
func (v *Renault) FinishTime() (time.Time, error) {
res, err := v.batteryG()
@ -394,7 +400,9 @@ func (v *Renault) FinishTime() (time.Time, error) {
return time.Time{}, err
}
// Climater implements the api.Vehicle.Climater interface
var _ api.VehicleClimater = (*Renault)(nil)
// Climater implements the api.VehicleClimater interface
func (v *Renault) Climater() (active bool, outsideTemp float64, targetTemp float64, err error) {
res, err := v.hvacG()

View file

@ -116,28 +116,7 @@ func (v *Tesla) SoC() (float64, error) {
return 0, err
}
// ChargedEnergy implements the api.ChargeRater interface
func (v *Tesla) ChargedEnergy() (float64, error) {
res, err := v.chargeStateG()
if res, ok := res.(*tesla.ChargeState); err == nil && ok {
return float64(res.ChargeEnergyAdded), nil
}
return 0, err
}
// Range implements the api.VehicleRange interface
func (v *Tesla) Range() (int64, error) {
res, err := v.chargeStateG()
if res, ok := res.(*tesla.ChargeState); err == nil && ok {
// miles to km
return int64(1.609344 * res.EstBatteryRange), nil
}
return 0, err
}
var _ api.ChargeState = (*Tesla)(nil)
// Status implements the api.ChargeState interface
func (v *Tesla) Status() (api.ChargeStatus, error) {
@ -156,6 +135,35 @@ func (v *Tesla) Status() (api.ChargeStatus, error) {
return status, err
}
var _ api.ChargeRater = (*Tesla)(nil)
// ChargedEnergy implements the api.ChargeRater interface
func (v *Tesla) ChargedEnergy() (float64, error) {
res, err := v.chargeStateG()
if res, ok := res.(*tesla.ChargeState); err == nil && ok {
return float64(res.ChargeEnergyAdded), nil
}
return 0, err
}
var _ api.VehicleRange = (*Tesla)(nil)
// Range implements the api.VehicleRange interface
func (v *Tesla) Range() (int64, error) {
res, err := v.chargeStateG()
if res, ok := res.(*tesla.ChargeState); err == nil && ok {
// miles to km
return int64(1.609344 * res.EstBatteryRange), nil
}
return 0, err
}
var _ api.VehicleFinishTimer = (*Tesla)(nil)
// FinishTime implements the api.VehicleFinishTimer interface
func (v *Tesla) FinishTime() (time.Time, error) {
res, err := v.chargeStateG()

View file

@ -190,7 +190,9 @@ func (v *Volvo) SoC() (float64, error) {
return 0, err
}
// Status implements the VehicleStatus interface
var _ api.ChargeState = (*Volvo)(nil)
// Status implements the api.ChargeState interface
func (v *Volvo) Status() (api.ChargeStatus, error) {
res, err := v.statusG()
if res, ok := res.(volvoStatus); err == nil && ok {
@ -207,8 +209,10 @@ func (v *Volvo) Status() (api.ChargeStatus, error) {
return api.StatusNone, err
}
// VehicleRange implements the VehicleRange interface
func (v *Volvo) VehicleRange() (int64, error) {
var _ api.VehicleRange = (*Volvo)(nil)
// VehicleRange implements the api.VehicleRange interface
func (v *Volvo) Range() (int64, error) {
res, err := v.statusG()
if res, ok := res.(volvoStatus); err == nil && ok {
return int64(res.HvBattery.DistanceToHVBatteryEmpty), nil
@ -217,6 +221,8 @@ func (v *Volvo) VehicleRange() (int64, error) {
return 0, err
}
var _ api.VehicleFinishTimer = (*Volvo)(nil)
// FinishTime implements the VehicleFinishTimer interface
func (v *Volvo) FinishTime() (time.Time, error) {
res, err := v.statusG()

View file

@ -27,6 +27,8 @@ func NewProvider(api *API, vin string, cache time.Duration) *Provider {
return impl
}
var _ api.Battery = (*Provider)(nil)
// SoC implements the api.Vehicle interface
func (v *Provider) SoC() (float64, error) {
res, err := v.chargerG()
@ -37,6 +39,8 @@ func (v *Provider) SoC() (float64, error) {
return 0, err
}
var _ api.ChargeState = (*Provider)(nil)
// Status implements the api.ChargeState interface
func (v *Provider) Status() (api.ChargeStatus, error) {
status := api.StatusA // disconnected
@ -54,6 +58,8 @@ func (v *Provider) Status() (api.ChargeStatus, error) {
return status, err
}
var _ api.VehicleFinishTimer = (*Provider)(nil)
// FinishTime implements the api.VehicleFinishTimer interface
func (v *Provider) FinishTime() (time.Time, error) {
res, err := v.chargerG()
@ -72,6 +78,8 @@ func (v *Provider) FinishTime() (time.Time, error) {
return time.Time{}, err
}
var _ api.VehicleRange = (*Provider)(nil)
// Range implements the api.VehicleRange interface
func (v *Provider) Range() (rng int64, err error) {
res, err := v.chargerG()
@ -87,6 +95,8 @@ func (v *Provider) Range() (rng int64, err error) {
return rng, err
}
var _ api.VehicleClimater = (*Provider)(nil)
// Climater implements the api.VehicleClimater interface
func (v *Provider) Climater() (active bool, outsideTemp float64, targetTemp float64, err error) {
res, err := v.climateG()