diff --git a/meter/tasmota.go b/meter/tasmota.go index a0ae9842f..2a18d1606 100644 --- a/meter/tasmota.go +++ b/meter/tasmota.go @@ -53,7 +53,7 @@ var _ api.Meter = (*Tasmota)(nil) // CurrentPower implements the api.Meter interface func (c *Tasmota) CurrentPower() (float64, error) { if c.usage == "grid" { - return c.conn.GridCurrentPower() + return c.conn.SmlPower() } return c.conn.CurrentPower() } @@ -63,7 +63,7 @@ var _ api.MeterEnergy = (*Tasmota)(nil) // TotalEnergy implements the api.MeterEnergy interface func (c *Tasmota) TotalEnergy() (float64, error) { if c.usage == "grid" { - return c.conn.GridTotalEnergy() + return c.conn.SmlTotalEnergy() } return c.conn.TotalEnergy() } diff --git a/meter/tasmota/connection.go b/meter/tasmota/connection.go index 903bbb586..0d3136b99 100644 --- a/meter/tasmota/connection.go +++ b/meter/tasmota/connection.go @@ -44,54 +44,33 @@ func (d *Connection) ExecCmd(cmd string, res interface{}) error { "cmnd": []string{cmd}, } - err := d.GetJSON(fmt.Sprintf("%s/cm?%s", d.uri, parameters.Encode()), res) - if err != nil { - return err - } - - return nil + return d.GetJSON(fmt.Sprintf("%s/cm?%s", d.uri, parameters.Encode()), res) } -// CurrentPower provides current power consumption +// CurrentPower implements the api.Meter interface func (d *Connection) CurrentPower() (float64, error) { - var res *StatusSNSResponse + var res StatusSNSResponse err := d.ExecCmd("Status 8", &res) - if err != nil { - return 0, err - } - - return float64(res.StatusSNS.Energy.Power), nil + return float64(res.StatusSNS.Energy.Power), err } // TotalEnergy implements the api.MeterEnergy interface func (d *Connection) TotalEnergy() (float64, error) { - var res *StatusSNSResponse + var res StatusSNSResponse err := d.ExecCmd("Status 8", &res) - if err != nil { - return 0, err - } - - return float64(res.StatusSNS.Energy.Total), nil + return res.StatusSNS.Energy.Total, err } -// GridCurrentPower provides current power consumption -func (d *Connection) GridCurrentPower() (float64, error) { - var res *StatusSNSResponse +// SmlPower provides the sml sensor power +func (d *Connection) SmlPower() (float64, error) { + var res StatusSNSResponse err := d.ExecCmd("Status 8", &res) - if err != nil { - return 0, err - } - - return float64(res.StatusSNS.SML.Power_curr), nil + return float64(res.StatusSNS.SML.PowerCurr), err } -// GridTotalEnergy implements the api.MeterEnergy interface -func (d *Connection) GridTotalEnergy() (float64, error) { - var res *StatusSNSResponse +// SmlTotalEnergy provides the sml sensor total import energy +func (d *Connection) SmlTotalEnergy() (float64, error) { + var res StatusSNSResponse err := d.ExecCmd("Status 8", &res) - if err != nil { - return 0, err - } - - return float64(res.StatusSNS.SML.Total_in), nil + return res.StatusSNS.SML.TotalIn, err } diff --git a/meter/tasmota/types.go b/meter/tasmota/types.go index 13cc5fadd..61b4d7abf 100644 --- a/meter/tasmota/types.go +++ b/meter/tasmota/types.go @@ -60,7 +60,9 @@ type PowerResponse struct { // https://tasmota.github.io/docs/JSON-Status-Responses/ type StatusSNSResponse struct { StatusSNS struct { - Time string + Time string + + // Energy readings Energy struct { TotalStartTime string Total float64 @@ -73,10 +75,12 @@ type StatusSNSResponse struct { Voltage int Current float64 } + + // SML sensor readings SML struct { - Total_in float64 - Total_out float64 - Power_curr int + TotalIn float64 `json:"total_in"` + TotalOut float64 `json:"total_out"` + PowerCurr int `json:"power_curr"` } } } diff --git a/meter/tplink/connection.go b/meter/tplink/connection.go index 5d91765b8..be24bf447 100644 --- a/meter/tplink/connection.go +++ b/meter/tplink/connection.go @@ -75,7 +75,7 @@ func (d *Connection) ExecCmd(cmd string, res interface{}) error { return json.Unmarshal(buf.Bytes(), res) } -// CurrentPower provides current power consumption +// CurrentPower implements the api.Meter interface func (d *Connection) CurrentPower() (float64, error) { var res EmeterResponse if err := d.ExecCmd(`{"emeter":{"get_realtime":null}}`, &res); err != nil { @@ -83,7 +83,7 @@ func (d *Connection) CurrentPower() (float64, error) { } if err := res.Emeter.GetRealtime.ErrCode; err != 0 { - return 0, fmt.Errorf("get_realtime error %d", err) + return 0, fmt.Errorf("get_realtime: %d", err) } power := res.Emeter.GetRealtime.PowerMw / 1000 @@ -102,7 +102,7 @@ func (d *Connection) TotalEnergy() (float64, error) { } if err := res.Emeter.GetRealtime.ErrCode; err != 0 { - return 0, fmt.Errorf("get_realtime error %d", err) + return 0, fmt.Errorf("get_realtime: %d", err) } energy := res.Emeter.GetRealtime.TotalWh / 1000