Shelly: add total energy (#5371)

Co-authored-by: Markus Thierolf <m.thierolf@googlemail.com>
This commit is contained in:
Markus Thierolf 2022-12-05 22:28:11 +01:00 • committed by GitHub
parent cfeb281b62
commit 39229896d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 52 additions and 1 deletions

View file

@ -79,3 +79,10 @@ func (c *Shelly) Enable(enable bool) error {
func (c *Shelly) MaxCurrent(current int64) error {
return nil
}
var _ api.MeterEnergy = (*Shelly)(nil)
// TotalEnergy implements the api.MeterEnergy interface
func (c *Shelly) TotalEnergy() (float64, error) {
return c.conn.TotalEnergy()
}

View file

@ -170,3 +170,42 @@ func (d *Connection) execGen2Cmd(method string, enable bool, res interface{}) er
return d.DoJSON(req, &res)
}
// TotalEnergy implements the api.Meter interface
func (d *Connection) TotalEnergy() (float64, error) {
var energy float64
switch d.gen {
case 0, 1:
var res Gen1StatusResponse
uri := fmt.Sprintf("%s/status", d.uri)
if err := d.GetJSON(uri, &res); err != nil {
return 0, err
}
switch {
case d.channel < len(res.Meters):
energy = float64(res.Meters[d.channel].Total) / 60
case d.channel < len(res.EMeters):
energy = float64(res.EMeters[d.channel].Total) / 60
default:
return 0, errors.New("invalid channel, missing power meter")
}
default:
var res Gen2StatusResponse
if err := d.execGen2Cmd("Shelly.GetStatus", false, &res); err != nil {
return 0, err
}
switch d.channel {
case 1:
energy = res.Switch1.Aenergy.Total
case 2:
energy = res.Switch2.Aenergy.Total
default:
energy = res.Switch0.Aenergy.Total
}
}
return energy / 1000, nil
}

View file

@ -25,7 +25,10 @@ type Gen2SwitchResponse struct {
}
type Gen2Switch struct {
Apower float64
Apower float64
Aenergy struct {
Total float64
}
}
type Gen2StatusResponse struct {
@ -41,9 +44,11 @@ type Gen1SwitchResponse struct {
type Gen1StatusResponse struct {
Meters []struct {
Power float64
Total int64
}
// Shelly EM meter JSON response
EMeters []struct {
Power float64
Total int64
}
}