Skip to content

Commit

Permalink
Shelly PM Mini Gen3: read device status (#14670)
Browse files Browse the repository at this point in the history
  • Loading branch information
thierolm committed Jul 2, 2024
1 parent 50d5362 commit a34e7ae
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 13 deletions.
12 changes: 6 additions & 6 deletions meter/shelly/switch.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ func (sh *Switch) CurrentPower() (float64, error) {

switch d.channel {
case 1:
power = res.Switch1.Apower
power = res.Switch1.Apower + res.Pm1.Apower
case 2:
power = res.Switch2.Apower
power = res.Switch2.Apower + res.Pm2.Apower
default:
power = res.Switch0.Apower
power = res.Switch0.Apower + res.Pm0.Apower
}
}

Expand Down Expand Up @@ -130,11 +130,11 @@ func (sh *Switch) TotalEnergy() (float64, error) {

switch d.channel {
case 1:
energy = res.Switch1.Aenergy.Total
energy = res.Switch1.Aenergy.Total + res.Pm1.Aenergy.Total
case 2:
energy = res.Switch2.Aenergy.Total
energy = res.Switch2.Aenergy.Total + res.Pm2.Aenergy.Total
default:
energy = res.Switch0.Aenergy.Total
energy = res.Switch0.Aenergy.Total + res.Pm0.Aenergy.Total
}
}

Expand Down
3 changes: 3 additions & 0 deletions meter/shelly/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ type Gen2StatusResponse struct {
Switch0 Gen2Switch `json:"switch:0"`
Switch1 Gen2Switch `json:"switch:1"`
Switch2 Gen2Switch `json:"switch:2"`
Pm0 Gen2Switch `json:"pm1:0"`
Pm1 Gen2Switch `json:"pm2:1"`
Pm2 Gen2Switch `json:"pm3:2"`
}

type Gen2EmStatusResponse struct {
Expand Down
27 changes: 20 additions & 7 deletions meter/shelly/types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,27 @@ func TestUnmarshalGen1StatusResponse(t *testing.T) {
}
}

// Test Gen2StatusResponse response
// Test Gen2+ status responses
func TestUnmarshalGen2StatusResponse(t *testing.T) {
// Shelly Pro 1PM channel 0 (1)
var res Gen2StatusResponse
{
// Shelly Pro 1PM channel 0 (1)
var res Gen2StatusResponse

jsonstr := `{"ble":{},"cloud":{"connected":true},"eth":{"ip":null},"input:0":{"id":0,"state":false},"input:1":{"id":1,"state":false},"mqtt":{"connected":false},"switch:0":{"id":0, "source":"HTTP", "output":false, "apower":47.11, "voltage":232.0, "current":0.000, "pf":0.00, "aenergy":{"total":5.125,"by_minute":[0.000,0.000,0.000],"minute_ts":1675718520},"temperature":{"tC":25.3, "tF":77.5}},"sys":{"mac":"30C6F78BB4D8","restart_required":false,"time":"22:22","unixtime":1675718522,"uptime":45070,"ram_size":234204,"ram_free":137716,"fs_size":524288,"fs_free":172032,"cfg_rev":13,"kvs_rev":1,"schedule_rev":0,"webhook_rev":0,"available_updates":{"beta":{"version":"0.13.0-beta3"}}},"wifi":{"sta_ip":"192.168.178.64","status":"got ip","ssid":"***","rssi":-62},"ws":{"connected":false}}`
require.NoError(t, json.Unmarshal([]byte(jsonstr), &res))
jsonstr := `{"ble":{},"cloud":{"connected":true},"eth":{"ip":null},"input:0":{"id":0,"state":false},"input:1":{"id":1,"state":false},"mqtt":{"connected":false},"switch:0":{"id":0, "source":"HTTP", "output":false, "apower":47.11, "voltage":232.0, "current":0.000, "pf":0.00, "aenergy":{"total":5.125,"by_minute":[0.000,0.000,0.000],"minute_ts":1675718520},"temperature":{"tC":25.3, "tF":77.5}},"sys":{"mac":"30C6F78BB4D8","restart_required":false,"time":"22:22","unixtime":1675718522,"uptime":45070,"ram_size":234204,"ram_free":137716,"fs_size":524288,"fs_free":172032,"cfg_rev":13,"kvs_rev":1,"schedule_rev":0,"webhook_rev":0,"available_updates":{"beta":{"version":"0.13.0-beta3"}}},"wifi":{"sta_ip":"192.168.178.64","status":"got ip","ssid":"***","rssi":-62},"ws":{"connected":false}}`
require.NoError(t, json.Unmarshal([]byte(jsonstr), &res))

assert.Equal(t, 5.125, res.Switch0.Aenergy.Total)
assert.Equal(t, 47.11, res.Switch0.Apower)
assert.Equal(t, 5.125, res.Switch0.Aenergy.Total)
assert.Equal(t, 47.11, res.Switch0.Apower)
}

{
// Shelly PM Mini Gen3 channel 0 (1)
var res Gen2StatusResponse

jsonstr := `{"ble":{},"cloud":{"connected":true},"mqtt":{"connected":false},"pm1:0":{"id":0, "voltage":239.9, "current":7.434, "apower":1780.1 ,"freq":50.1,"aenergy":{"total":3551.682,"by_minute":[15234.772,29611.247,29825.821],"minute_ts":1719917850},"ret_aenergy":{"total":0.000,"by_minute":[0.000,0.000,0.000],"minute_ts":1719917850}},"sys":{"mac":"84FCE638D818","restart_required":false,"time":"12:57","unixtime":1719917851,"uptime":62328,"ram_size":261744,"ram_free":151436,"fs_size":1048576,"fs_free":712704,"cfg_rev":10,"kvs_rev":1,"schedule_rev":0,"webhook_rev":0,"available_updates":{"stable":{"version":"1.3.3"}},"reset_reason":1},"wifi":{"sta_ip":"192.168.178.89","status":"got ip","ssid":"FritzBox 8 2.4","rssi":-62},"ws":{"connected":false}}`
require.NoError(t, json.Unmarshal([]byte(jsonstr), &res))

assert.Equal(t, 3551.682, res.Pm0.Aenergy.Total)
assert.Equal(t, 1780.1, res.Pm0.Apower)
}
}

0 comments on commit a34e7ae

Please sign in to comment.