Cleanup and test for optional interfaces (#799)
This commit is contained in:
parent
154a664909
commit
1d79f75980
28 changed files with 212 additions and 80 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue