From 39229896d4109c6e2584501950ee6305ff93167a Mon Sep 17 00:00:00 2001 From: Markus Thierolf <77847348+thierolm@users.noreply.github.com> Date: Mon, 5 Dec 2022 22:28:11 +0100 Subject: [PATCH] Shelly: add total energy (#5371) Co-authored-by: Markus Thierolf --- charger/shelly.go | 7 +++++++ meter/shelly/connection.go | 39 ++++++++++++++++++++++++++++++++++++++ meter/shelly/types.go | 7 ++++++- 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/charger/shelly.go b/charger/shelly.go index 3e44f4ac3..f987ef4e3 100644 --- a/charger/shelly.go +++ b/charger/shelly.go @@ -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() +} diff --git a/meter/shelly/connection.go b/meter/shelly/connection.go index 77fa98147..63cfe8d8c 100644 --- a/meter/shelly/connection.go +++ b/meter/shelly/connection.go @@ -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 +} diff --git a/meter/shelly/types.go b/meter/shelly/types.go index b3fa4fde0..0a37575a9 100644 --- a/meter/shelly/types.go +++ b/meter/shelly/types.go @@ -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 } }