From 1d79f75980e2cfedcd16ed7c4b0aa6e28eb2b33f Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 22 Mar 2021 12:51:10 +0100 Subject: [PATCH] Cleanup and test for optional interfaces (#799) --- api/api.go | 2 +- core/wrapper/chargemeter.go | 2 +- internal/charger/evsewifi.go | 2 ++ internal/charger/fritzdect.go | 4 ++- internal/charger/go-e.go | 12 +++++-- internal/charger/keba.go | 12 ++++++- internal/charger/mcc.go | 8 +++++ internal/charger/nrgble_linux.go | 12 +++++-- internal/charger/nrgconnect.go | 10 ++++-- internal/charger/openwb.go | 12 +++++-- internal/charger/phoenix-em-eth.go | 8 +++-- internal/charger/phoenix-ev-eth.go | 8 +++-- internal/charger/wallbe.go | 12 ++++--- internal/charger/warp.go | 6 ++-- internal/meter/meter.go | 8 ++--- internal/meter/modbus.go | 6 ++-- internal/meter/sma.go | 2 +- internal/meter/tesla.go | 2 +- internal/vehicle/bluelink/bluelink.go | 6 ++++ internal/vehicle/carwings.go | 2 ++ internal/vehicle/id/provider.go | 18 ++++++++-- internal/vehicle/kamereon/api.go | 8 +++++ internal/vehicle/porsche.go | 34 +++++++++++------- internal/vehicle/psa/provider.go | 10 ++++++ internal/vehicle/renault.go | 12 +++++-- internal/vehicle/tesla.go | 52 +++++++++++++++------------ internal/vehicle/volvo.go | 12 +++++-- internal/vehicle/vw/provider.go | 10 ++++++ 28 files changed, 212 insertions(+), 80 deletions(-) diff --git a/api/api.go b/api/api.go index bb6c56dd0..9d936e5c7 100644 --- a/api/api.go +++ b/api/api.go @@ -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 diff --git a/core/wrapper/chargemeter.go b/core/wrapper/chargemeter.go index e2dc948c0..a4aaf9a54 100644 --- a/core/wrapper/chargemeter.go +++ b/core/wrapper/chargemeter.go @@ -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() diff --git a/internal/charger/evsewifi.go b/internal/charger/evsewifi.go index 2c5a396b1..840c339b4 100644 --- a/internal/charger/evsewifi.go +++ b/internal/charger/evsewifi.go @@ -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() diff --git a/internal/charger/fritzdect.go b/internal/charger/fritzdect.go index 76c3aeb4e..d0d45ab9e 100644 --- a/internal/charger/fritzdect.go +++ b/internal/charger/fritzdect.go @@ -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") diff --git a/internal/charger/go-e.go b/internal/charger/go-e.go index ddc1e5a72..2cd727194 100644 --- a/internal/charger/go-e.go +++ b/internal/charger/go-e.go @@ -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 { diff --git a/internal/charger/keba.go b/internal/charger/keba.go index 87563cd4c..48106ee05 100644 --- a/internal/charger/keba.go +++ b/internal/charger/keba.go @@ -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 diff --git a/internal/charger/mcc.go b/internal/charger/mcc.go index a2336eb07..babf9dc13 100644 --- a/internal/charger/mcc.go +++ b/internal/charger/mcc.go @@ -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 diff --git a/internal/charger/nrgble_linux.go b/internal/charger/nrgble_linux.go index 7c7e06c69..97700986d 100644 --- a/internal/charger/nrgble_linux.go +++ b/internal/charger/nrgble_linux.go @@ -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 { diff --git a/internal/charger/nrgconnect.go b/internal/charger/nrgconnect.go index a53e16c8e..4ea328653 100644 --- a/internal/charger/nrgconnect.go +++ b/internal/charger/nrgconnect.go @@ -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 diff --git a/internal/charger/openwb.go b/internal/charger/openwb.go index 88cc1bed7..b288c769e 100644 --- a/internal/charger/openwb.go +++ b/internal/charger/openwb.go @@ -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 { diff --git a/internal/charger/phoenix-em-eth.go b/internal/charger/phoenix-em-eth.go index 9cb6c3af1..e8747a028 100644 --- a/internal/charger/phoenix-em-eth.go +++ b/internal/charger/phoenix-em-eth.go @@ -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 { diff --git a/internal/charger/phoenix-ev-eth.go b/internal/charger/phoenix-ev-eth.go index 3d5999b74..c9c472748 100644 --- a/internal/charger/phoenix-ev-eth.go +++ b/internal/charger/phoenix-ev-eth.go @@ -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 { diff --git a/internal/charger/wallbe.go b/internal/charger/wallbe.go index 89e93f682..bdac46121 100644 --- a/internal/charger/wallbe.go +++ b/internal/charger/wallbe.go @@ -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 { diff --git a/internal/charger/warp.go b/internal/charger/warp.go index 04964055f..ac7c56df2 100644 --- a/internal/charger/warp.go +++ b/internal/charger/warp.go @@ -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 diff --git a/internal/meter/meter.go b/internal/meter/meter.go index 3735a72e9..4fe725ac5 100644 --- a/internal/meter/meter.go +++ b/internal/meter/meter.go @@ -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() } diff --git a/internal/meter/modbus.go b/internal/meter/modbus.go index d43f7107c..f3ecf6a49 100644 --- a/internal/meter/modbus.go +++ b/internal/meter/modbus.go @@ -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) } diff --git a/internal/meter/sma.go b/internal/meter/sma.go index f1f793355..6dfbfe499 100644 --- a/internal/meter/sma.go +++ b/internal/meter/sma.go @@ -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 diff --git a/internal/meter/tesla.go b/internal/meter/tesla.go index fb7bb707f..084ab3dd3 100644 --- a/internal/meter/tesla.go +++ b/internal/meter/tesla.go @@ -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 { diff --git a/internal/vehicle/bluelink/bluelink.go b/internal/vehicle/bluelink/bluelink.go index e5cb59244..c2a4a6bcf 100644 --- a/internal/vehicle/bluelink/bluelink.go +++ b/internal/vehicle/bluelink/bluelink.go @@ -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() diff --git a/internal/vehicle/carwings.go b/internal/vehicle/carwings.go index eed745a38..92683f5ad 100644 --- a/internal/vehicle/carwings.go +++ b/internal/vehicle/carwings.go @@ -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() diff --git a/internal/vehicle/id/provider.go b/internal/vehicle/id/provider.go index 132d8960b..d80b8f48a 100644 --- a/internal/vehicle/id/provider.go +++ b/internal/vehicle/id/provider.go @@ -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() } diff --git a/internal/vehicle/kamereon/api.go b/internal/vehicle/kamereon/api.go index 21e58814d..f4efb5a61 100644 --- a/internal/vehicle/kamereon/api.go +++ b/internal/vehicle/kamereon/api.go @@ -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() diff --git a/internal/vehicle/porsche.go b/internal/vehicle/porsche.go index 44800484c..e54851335 100644 --- a/internal/vehicle/porsche.go +++ b/internal/vehicle/porsche.go @@ -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 -} diff --git a/internal/vehicle/psa/provider.go b/internal/vehicle/psa/provider.go index a0583fb97..cad41ca59 100644 --- a/internal/vehicle/psa/provider.go +++ b/internal/vehicle/psa/provider.go @@ -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() diff --git a/internal/vehicle/renault.go b/internal/vehicle/renault.go index fb442eced..8320f14a3 100644 --- a/internal/vehicle/renault.go +++ b/internal/vehicle/renault.go @@ -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() diff --git a/internal/vehicle/tesla.go b/internal/vehicle/tesla.go index 31872cc29..4e303e596 100644 --- a/internal/vehicle/tesla.go +++ b/internal/vehicle/tesla.go @@ -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() diff --git a/internal/vehicle/volvo.go b/internal/vehicle/volvo.go index 3f9bb31ab..ecc98d778 100644 --- a/internal/vehicle/volvo.go +++ b/internal/vehicle/volvo.go @@ -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() diff --git a/internal/vehicle/vw/provider.go b/internal/vehicle/vw/provider.go index 100c70d8a..84203baee 100644 --- a/internal/vehicle/vw/provider.go +++ b/internal/vehicle/vw/provider.go @@ -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()