Add carwings climater (#693)

This commit is contained in:
maku1604 2021-02-28 17:53:37 +01:00 • committed by GitHub
parent d4f8d03cb9
commit 80412100b5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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
}