Skip to content

Commit e5ae82f

Browse files
authored
feat: add set_service_level function (#205)
* feat: add set_service_level function * fix websocket logic * linting
1 parent 8df15fa commit e5ae82f

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

openevsehttp/__main__.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def _update_status(self, msgtype, data, error):
235235
_LOGGER.debug("Websocket data: %s", data)
236236
if "wh" in data.keys():
237237
data["watthour"] = data.pop("wh")
238-
elif "config_version" in data.keys():
238+
if "config_version" in data.keys():
239239
self.update()
240240
self._status.update(data)
241241

@@ -412,6 +412,25 @@ async def set_current(self, amps: int = 6) -> None:
412412
response, msg = await self.send_command(command)
413413
_LOGGER.debug("Set current response: %s", msg)
414414

415+
async def set_service_level(self, level: int = 2) -> None:
416+
"""Set the service level of the EVSE."""
417+
if not isinstance(level, int) or not 0 <= level <= 2:
418+
_LOGGER.error("Invalid service level: %s", level)
419+
raise ValueError
420+
421+
url = f"{self.url}config"
422+
data = {"service": level}
423+
424+
_LOGGER.debug("Set service level to: %s", level)
425+
response = await self.process_request(
426+
url=url, method="post", data=data
427+
) # noqa: E501
428+
_LOGGER.debug("service response: %s", response)
429+
result = response["msg"]
430+
if result not in ["done", "no change"]:
431+
_LOGGER.error("Problem issuing command: %s", response["msg"])
432+
raise UnknownError
433+
415434
# Restart OpenEVSE WiFi
416435
async def restart_wifi(self) -> None:
417436
"""Restart OpenEVSE WiFi module."""

tests/test_main.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,3 +1267,55 @@ async def test_charge_mode(fixture, expected, request):
12671267
await charger.update()
12681268
status = charger.charge_mode
12691269
assert status == expected
1270+
1271+
1272+
async def test_set_service_level(test_charger, mock_aioclient, caplog):
1273+
"""Test set service level."""
1274+
await test_charger.update()
1275+
value = {"msg": "done"}
1276+
mock_aioclient.post(
1277+
TEST_URL_CONFIG,
1278+
status=200,
1279+
body=json.dumps(value),
1280+
)
1281+
with caplog.at_level(logging.DEBUG):
1282+
await test_charger.set_service_level(1)
1283+
1284+
mock_aioclient.get(
1285+
TEST_URL_STATUS,
1286+
status=200,
1287+
body=load_fixture("v4_json/status.json"),
1288+
)
1289+
mock_aioclient.get(
1290+
TEST_URL_CONFIG,
1291+
status=200,
1292+
body=load_fixture("v4_json/config.json"),
1293+
)
1294+
value = {"config_version": 2, "msg": "done"}
1295+
mock_aioclient.post(
1296+
TEST_URL_CONFIG,
1297+
status=200,
1298+
body=json.dumps(value),
1299+
)
1300+
with caplog.at_level(logging.DEBUG):
1301+
await test_charger.set_service_level(2)
1302+
1303+
value = {"msg": "error"}
1304+
mock_aioclient.post(
1305+
TEST_URL_CONFIG,
1306+
status=200,
1307+
body=json.dumps(value),
1308+
)
1309+
with caplog.at_level(logging.DEBUG):
1310+
with pytest.raises(UnknownError):
1311+
await test_charger.set_service_level(1)
1312+
assert "Problem issuing command: error" in caplog.text
1313+
1314+
value = {"msg": "done"}
1315+
mock_aioclient.post(
1316+
TEST_URL_CONFIG,
1317+
status=200,
1318+
body=json.dumps(value),
1319+
)
1320+
with pytest.raises(ValueError):
1321+
await test_charger.set_service_level("A")

0 commit comments

Comments
 (0)