Skip to content

Commit 9dc87b4

Browse files
author
Mark Hale
committed
Add powerwall setting verification.
1 parent 9297177 commit 9dc87b4

2 files changed

Lines changed: 71 additions & 7 deletions

File tree

src/apps/powerwall/__init__.py

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ def set_tariff_data(tariff_data):
310310

311311

312312
@service("powerwall.set_settings")
313-
def set_settings(reserve_percentage=None, mode=None, allow_grid_charging=None, allow_battery_export=None):
313+
def set_settings(reserve_percentage=None, mode=None, allow_grid_charging=None, allow_battery_export=None, verify=False):
314314
"""yaml
315315
name: Set Powerwall settings
316316
description: Changes Powerwall settings
@@ -337,12 +337,61 @@ def set_settings(reserve_percentage=None, mode=None, allow_grid_charging=None, a
337337
description: enable battery export else PV only
338338
selector:
339339
boolean:
340+
verify:
341+
description: verify settings have been updated
342+
selector:
343+
boolean:
340344
"""
341-
api_wrapper.set_powerwall_settings(
345+
updated = False
346+
retry_count = 0
347+
while not updated:
348+
if retry_count == 3:
349+
raise Exception("Failed to update Powerwall settings")
350+
351+
api_wrapper.set_powerwall_settings(
352+
email=pyscript.app_config["email"],
353+
refresh_token=pyscript.app_config["refresh_token"],
354+
reserve_percentage=reserve_percentage,
355+
mode=mode,
356+
allow_grid_charging=allow_grid_charging,
357+
allow_battery_export=allow_battery_export
358+
)
359+
updated = True
360+
retry_count += 1
361+
if verify:
362+
settings = api_wrapper.get_powerwall_settings(
363+
email=pyscript.app_config["email"],
364+
refresh_token=pyscript.app_config["refresh_token"]
365+
)
366+
if reserve_percentage is not None:
367+
if settings["reserve_percentage"] == reserve_percentage:
368+
reserve_percentage = None
369+
else:
370+
updated = False
371+
if mode is not None:
372+
if settings["mode"] == mode:
373+
mode = None
374+
else:
375+
updated = False
376+
if allow_grid_charging is not None:
377+
if settings["allow_grid_charging"] == allow_grid_charging:
378+
allow_grid_charging = None
379+
else:
380+
updated = False
381+
if allow_battery_export is not None:
382+
if settings["allow_battery_export"] == allow_battery_export:
383+
allow_battery_export = None
384+
else:
385+
updated = False
386+
387+
388+
@service("powerwall.get_settings", supports_response="only")
389+
def get_settings():
390+
"""yaml
391+
name: Get Powerwall settings
392+
description: Gets Powerwall settings
393+
"""
394+
return api_wrapper.get_powerwall_settings(
342395
email=pyscript.app_config["email"],
343-
refresh_token=pyscript.app_config["refresh_token"],
344-
reserve_percentage=reserve_percentage,
345-
mode=mode,
346-
allow_grid_charging=allow_grid_charging,
347-
allow_battery_export=allow_battery_export
396+
refresh_token=pyscript.app_config["refresh_token"]
348397
)

src/modules/teslapy_wrapper.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,18 @@ def set_powerwall_settings(email, refresh_token, reserve_percentage=None, mode=N
4141
pw.set_operation(mode=mode)
4242
if allow_grid_charging is not None or allow_battery_export is not None:
4343
pw.set_import_export(allow_grid_charging=allow_grid_charging, allow_battery_export=allow_battery_export)
44+
45+
@pyscript_executor
46+
def get_powerwall_settings(email, refresh_token):
47+
retry = teslapy.Retry(total=5, allowed_methods=None, backoff_factor=1, status_forcelist=(503, 504))
48+
with teslapy.Tesla(email, retry=retry) as tesla:
49+
if not tesla.authorized:
50+
tesla.refresh_token(refresh_token=refresh_token)
51+
pw = tesla.battery_list()[0]
52+
info = pw.get_site_info()
53+
return {
54+
"reserve_percentage": info["backup_reserve_percent"],
55+
"mode": info["default_real_mode"],
56+
"allow_grid_charging": not info["components"].get("disallow_charge_from_grid_with_solar_installed", False),
57+
"allow_battery_export": info["components"]["customer_preferred_export_rule"] == "battery_ok"
58+
}

0 commit comments

Comments
 (0)