Shelly: no return energy register on gen1 relay and plug meters (#33111)

This commit is contained in:
andig 2026-08-23 12:43:13 +02:00 • committed by GitHub
parent 3159126248
commit f7b3f394f3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 24 additions and 2 deletions

View file

@ -149,9 +149,11 @@ func (c *gen1) IsReversed() bool {
return false
}
// HasReturnEnergy reports whether the device measures energy in the return direction
// HasReturnEnergy reports whether the device measures energy in the return direction.
// Only the EM variants have a total_returned register, relay/plug meters don't.
func (c *gen1) HasReturnEnergy() bool {
return true
res, err := c.status.Get()
return err == nil && c.channel >= len(res.Meters) && c.channel < len(res.EMeters)
}
// IsThreePhase reports whether the device is a three-phase energy meter.

View file

@ -3,7 +3,9 @@ package shelly
import (
"encoding/json"
"testing"
"time"
"github.com/evcc-io/evcc/util"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -46,3 +48,21 @@ func TestUnmarshalGen1Status(t *testing.T) {
assert.Equal(t, -620.34, res.EMeters[0].Power)
}
}
// TestGen1HasReturnEnergy asserts that only the EM variants report a return
// register - a 1PM's production must not be booked in return direction (#33062).
func TestGen1HasReturnEnergy(t *testing.T) {
status := func(s string) util.Cacheable[Gen1Status] {
var res Gen1Status
require.NoError(t, json.Unmarshal([]byte(s), &res))
return util.ResettableCached(func() (Gen1Status, error) { return res, nil }, time.Minute)
}
// Shelly 1PM: meters without total_returned
g := &gen1{status: status(`{"meters":[{"power":198.0,"total":31510486}]}`)}
assert.False(t, g.HasReturnEnergy(), "1PM has no return register")
// Shelly EM: emeters with total_returned
g = &gen1{status: status(`{"emeters":[{"power":-620.34,"total":401472.9,"total_returned":653673.7}]}`)}
assert.True(t, g.HasReturnEnergy())
}