From a34e7ae46ce509ed72cf31b2b14045bc345d67e5 Mon Sep 17 00:00:00 2001 From: Markus Thierolf <77847348+thierolm@users.noreply.github.com> Date: Tue, 2 Jul 2024 20:23:43 +0200 Subject: [PATCH] Shelly PM Mini Gen3: read device status (#14670) --- meter/shelly/switch.go | 12 ++++++------ meter/shelly/types.go | 3 +++ meter/shelly/types_test.go | 27 ++++++++++++++++++++------- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/meter/shelly/switch.go b/meter/shelly/switch.go index 20a4ebbeb..48dad7fc8 100644 --- a/meter/shelly/switch.go +++ b/meter/shelly/switch.go @@ -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 } } @@ -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 } } diff --git a/meter/shelly/types.go b/meter/shelly/types.go index 229df8851..c06228c53 100644 --- a/meter/shelly/types.go +++ b/meter/shelly/types.go @@ -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 { diff --git a/meter/shelly/types_test.go b/meter/shelly/types_test.go index d6ab28753..ad4006749 100644 --- a/meter/shelly/types_test.go +++ b/meter/shelly/types_test.go @@ -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) + } }