From 80412100b5eea1c5104d6b6dc19314b300b87621 Mon Sep 17 00:00:00 2001 From: maku1604 <60327698+maku1604@users.noreply.github.com> Date: Sun, 28 Feb 2021 17:53:37 +0100 Subject: [PATCH] Add carwings climater (#693) --- vehicle/carwings.go | 48 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/vehicle/carwings.go b/vehicle/carwings.go index 5797618e8..eed745a38 100644 --- a/vehicle/carwings.go +++ b/vehicle/carwings.go @@ -17,6 +17,7 @@ type CarWings struct { region string session *carwings.Session chargeStateG func() (float64, error) + hvacG func() (interface{}, error) } func init() { @@ -47,29 +48,60 @@ func NewCarWingsFromConfig(other map[string]interface{}) (api.Vehicle, error) { } v.chargeStateG = provider.NewCached(v.chargeState, cc.Cache).FloatGetter() + v.hvacG = provider.NewCached(v.hvacAPI, cc.Cache).InterfaceGetter() return v, nil } +// Init new carwings session +func (v *CarWings) initSession() error { + v.session = &carwings.Session{ + Region: v.region, + } + + return v.session.Connect(v.user, v.password) +} + // chargeState implements the api.Vehicle interface func (v *CarWings) chargeState() (float64, error) { if v.session == nil { - session := &carwings.Session{ - Region: v.region, + if err := v.initSession(); err != nil { + return 0, api.ErrNotAvailable } - - if err := session.Connect(v.user, v.password); err != nil { - return 0, err - } - - v.session = session } bs, err := v.session.BatteryStatus() return float64(bs.StateOfCharge), err } +// hvacAPI provides hvac-status api response +func (v *CarWings) hvacAPI() (interface{}, error) { + if v.session == nil { + if err := v.initSession(); err != nil { + return 0, api.ErrNotAvailable + } + } + + return v.session.ClimateControlStatus() +} + // SoC implements the api.Vehicle interface func (v *CarWings) SoC() (float64, error) { return v.chargeStateG() } + +// Climater implements the api.Vehicle.Climater interface +func (v *CarWings) Climater() (active bool, outsideTemp float64, targetTemp float64, err error) { + res, err := v.hvacG() + if res, ok := res.(carwings.ClimateStatus); err == nil && ok { + active = res.Running + + targetTemp = float64(res.Temperature) + + outsideTemp = 0 //fixed value + + return active, outsideTemp, targetTemp, nil + } + + return false, 0, 0, api.ErrNotAvailable +}