Skip to content

Commit 2778bbf

Browse files
committed
add storm_mode
1 parent 275e244 commit 2778bbf

3 files changed

Lines changed: 71 additions & 2 deletions

File tree

energysite.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,10 @@ func (s *EnergySite) gridImportExportPath() string {
255255
return strings.Join([]string{s.basePath(), "grid_import_export"}, "/")
256256
}
257257

258+
func (s *EnergySite) stormModePath() string {
259+
return strings.Join([]string{s.basePath(), "storm_mode"}, "/")
260+
}
261+
258262
func (s *EnergySite) SetBatteryReserve(percent uint64) error {
259263
url := s.basePath() + "/backup"
260264
payload := fmt.Sprintf(`{"backup_reserve_percent":%d}`, percent)
@@ -315,6 +319,22 @@ func (s *EnergySite) SetGridExport(mode string) error {
315319
return checkCommandResponse(body)
316320
}
317321

322+
// SetStormMode enables or disables storm watch mode.
323+
func (s *EnergySite) SetStormMode(enabled bool) error {
324+
payload, err := json.Marshal(map[string]bool{"enabled": enabled})
325+
if err != nil {
326+
return err
327+
}
328+
body, err := s.c.post(s.stormModePath(), payload)
329+
if err != nil {
330+
return err
331+
}
332+
if len(body) == 0 {
333+
return nil
334+
}
335+
return checkCommandResponse(body)
336+
}
337+
318338
func checkCommandResponse(body []byte) error {
319339
var outer struct {
320340
Response json.RawMessage `json:"response"`

energysite_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,47 @@ func TestSetTariff(t *testing.T) {
158158
})
159159
}
160160

161+
var StormModeCommandResponseJSON = `{"response":{"code":201,"message":"Updated"}}`
162+
163+
func TestSetStormMode(t *testing.T) {
164+
ts := serveHTTP(t)
165+
defer ts.Close()
166+
167+
client := NewTestClient(ts)
168+
169+
var lastBody []byte
170+
testMux.HandleFunc("/api/1/energy_sites/12345/storm_mode", func(w http.ResponseWriter, req *http.Request) {
171+
body, err := io.ReadAll(req.Body)
172+
if err != nil {
173+
http.Error(w, err.Error(), http.StatusInternalServerError)
174+
return
175+
}
176+
lastBody = body
177+
w.WriteHeader(http.StatusOK)
178+
_, _ = w.Write([]byte(StormModeCommandResponseJSON))
179+
})
180+
181+
Convey("Should enable storm mode", t, func() {
182+
energySite, err := client.EnergySite(12345)
183+
So(err, ShouldBeNil)
184+
err = energySite.SetStormMode(true)
185+
So(err, ShouldBeNil)
186+
var m map[string]interface{}
187+
So(json.Unmarshal(lastBody, &m), ShouldBeNil)
188+
So(m["enabled"], ShouldEqual, true)
189+
})
190+
191+
Convey("Should disable storm mode", t, func() {
192+
energySite, err := client.EnergySite(12345)
193+
So(err, ShouldBeNil)
194+
err = energySite.SetStormMode(false)
195+
So(err, ShouldBeNil)
196+
var m map[string]interface{}
197+
So(json.Unmarshal(lastBody, &m), ShouldBeNil)
198+
So(m["enabled"], ShouldEqual, false)
199+
})
200+
}
201+
161202
func TestEnergySitePaths(t *testing.T) {
162203
ts := serveHTTP(t)
163204
defer ts.Close()

examples/show_energy_site_status/main.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var reservePercentage = flag.Int64("backupPercentage", -1, "backup percentage to
1414
var operationMode = flag.String("operationMode", "", "operating mode: self_consumption, autonomous, backup")
1515
var gridExport = flag.String("gridExport", "", "grid export rule: battery_ok, pv_only, never")
1616
var gridCharging = flag.String("gridCharging", "", "grid charging enabled: true, false")
17+
var stormMode = flag.String("stormMode", "", "storm mode enabled: true, false")
1718

1819
// example that demos fetching of site information and optionally setting the battery reserve percentage for the site
1920
func main() {
@@ -24,13 +25,13 @@ func main() {
2425
os.Exit(1)
2526
}
2627

27-
if err := run(context.Background(), *tokenPath, *reservePercentage, *operationMode, *gridExport, *gridCharging); err != nil {
28+
if err := run(context.Background(), *tokenPath, *reservePercentage, *operationMode, *gridExport, *gridCharging, *stormMode); err != nil {
2829
fmt.Println(err)
2930
os.Exit(1)
3031
}
3132
}
3233

33-
func run(ctx context.Context, tokenPath string, reservePercentage int64, operationMode, gridExport, gridCharging string) error {
34+
func run(ctx context.Context, tokenPath string, reservePercentage int64, operationMode, gridExport, gridCharging, stormMode string) error {
3435
c, err := tesla.NewClient(ctx, tesla.WithTokenFile(tokenPath))
3536
if err != nil {
3637
return err
@@ -89,6 +90,13 @@ func run(ctx context.Context, tokenPath string, reservePercentage int64, operati
8990
os.Exit(1)
9091
}
9192
}
93+
if stormMode != "" {
94+
enabled := stormMode == "true"
95+
if err := es.SetStormMode(enabled); err != nil {
96+
fmt.Printf("error setting storm mode: %+v\n", err)
97+
os.Exit(1)
98+
}
99+
}
92100
}
93101
}
94102
return nil

0 commit comments

Comments
 (0)