diff --git a/.changeset/bundle-growatt-213.md b/.changeset/bundle-growatt-213.md new file mode 100644 index 000000000..180451062 --- /dev/null +++ b/.changeset/bundle-growatt-213.md @@ -0,0 +1,7 @@ +--- +"ftw": patch +--- + +Bundle growatt 2.1.3. A Growatt inverter with no battery no longer shows a +second battery at 0 W and 0 % beside the site's real one: the driver now +reports a battery only when its voltage, charge level or power is above 0. diff --git a/drivers/BUNDLED_SOURCE.json b/drivers/BUNDLED_SOURCE.json index 48a09db3b..073081cdb 100644 --- a/drivers/BUNDLED_SOURCE.json +++ b/drivers/BUNDLED_SOURCE.json @@ -16,7 +16,7 @@ "from the signed channel. Run scripts/sync-bundled-drivers.sh to update." ], "repository": "srcfl/device-drivers", - "commit": "e463c653763d5e5c7d28af97bd381eed4fafa47c", + "commit": "e07d27038e83e431cc01c1cd988ffcb1997355c0", "source_dir": "drivers/lua", "drivers": [ "ambibox_v2x", "ctek", "ctek_hybrid", "ctek_v2", "deye", "easee_cloud", diff --git a/go/internal/drivers/growatt_test.go b/go/internal/drivers/growatt_test.go new file mode 100644 index 000000000..1f65dd838 --- /dev/null +++ b/go/internal/drivers/growatt_test.go @@ -0,0 +1,47 @@ +package drivers + +import ( + "context" + "path/filepath" + "testing" + + "github.com/srcfl/ftw/go/internal/telemetry" +) + +// A PV-only Growatt answers its battery registers with 0. It used to emit a +// battery anyway, and Overview drew a second battery at 0 W and 0 % beside +// the site's real one (srcfl/ftw#1669). A hybrid still reports its battery. +func TestGrowattEmitsABatteryOnlyWhenOneAnswers(t *testing.T) { + for _, tc := range []struct { + name string + regs map[uint16]uint16 + battery bool + }{ + {"PV only", map[uint16]uint16{2: 25000}, false}, + {"hybrid", map[uint16]uint16{2: 25000, 1010: 100, 1013: 480, 1014: 50}, true}, + {"hybrid at 0 %", map[uint16]uint16{2: 25000, 1013: 520}, true}, + } { + t.Run(tc.name, func(t *testing.T) { + tel := telemetry.NewStore() + env := NewHostEnv("growatt", tel).WithModbus(&pixiiTestModbus{regs: tc.regs}) + d, err := NewLuaDriver(filepath.Join("..", "..", "..", "drivers", "growatt.lua"), env) + if err != nil { + t.Fatalf("load Growatt driver: %v", err) + } + t.Cleanup(d.Cleanup) + if err := d.Init(context.Background(), nil); err != nil { + t.Fatalf("init: %v", err) + } + if _, err := d.Poll(context.Background()); err != nil { + t.Fatalf("poll: %v", err) + } + if pv := tel.Get("growatt", telemetry.DerPV); pv == nil || pv.RawW != -2500 { + t.Fatalf("PV reading %+v, want -2500 W", pv) + } + bat := tel.Get("growatt", telemetry.DerBattery) + if (bat != nil) != tc.battery { + t.Fatalf("battery reading %+v, want present=%v", bat, tc.battery) + } + }) + } +}