forked from evcc-io/evcc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
homewizard.go
80 lines (63 loc) · 1.87 KB
/
homewizard.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package charger
import (
"errors"
"time"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/meter/homewizard"
"github.com/evcc-io/evcc/util"
)
// HomeWizard project homepage
// https://homewizard-energy-api.readthedocs.io/index.html
// HomeWizard charger implementation
type HomeWizard struct {
conn *homewizard.Connection
*switchSocket
}
func init() {
registry.Add("homewizard", NewHomeWizardFromConfig)
}
// NewHomeWizardFromConfig creates a HomeWizard charger from generic config
func NewHomeWizardFromConfig(other map[string]interface{}) (api.Charger, error) {
cc := struct {
embed `mapstructure:",squash"`
URI string
Usage string
StandbyPower float64
Cache time.Duration
}{
Cache: time.Second,
}
if err := util.DecodeOther(other, &cc); err != nil {
return nil, err
}
return NewHomeWizard(cc.embed, cc.URI, cc.Usage, cc.StandbyPower, cc.Cache)
}
// NewHomeWizard creates HomeWizard charger
func NewHomeWizard(embed embed, uri string, usage string, standbypower float64, cache time.Duration) (*HomeWizard, error) {
conn, err := homewizard.NewConnection(uri, usage, cache)
if err != nil {
return nil, err
}
c := &HomeWizard{
conn: conn,
}
// Check compatible product type
if c.conn.ProductType != "HWE-SKT" {
return nil, errors.New("unsupported product type: " + c.conn.ProductType)
}
c.switchSocket = NewSwitchSocket(&embed, c.Enabled, c.conn.CurrentPower, standbypower)
return c, nil
}
// Enabled implements the api.Charger interface
func (c *HomeWizard) Enabled() (bool, error) {
return c.conn.Enabled()
}
// Enable implements the api.Charger interface
func (c *HomeWizard) Enable(enable bool) error {
return c.conn.Enable(enable)
}
var _ api.MeterEnergy = (*HomeWizard)(nil)
// TotalEnergy implements the api.MeterEnergy interface
func (c *HomeWizard) TotalEnergy() (float64, error) {
return c.conn.TotalEnergy()
}