Skip to content

Commit ee7aff3

Browse files
authored
feat: add async_override_state property (#410)
* feat: add `async_override_state` property * formatting * formatting * linting
1 parent 448d7b7 commit ee7aff3

File tree

4 files changed

+143
-6
lines changed

4 files changed

+143
-6
lines changed

openevsehttp/__main__.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,13 +1384,24 @@ def freeram(self) -> int | None:
13841384

13851385
# Safety counts
13861386
@property
1387-
def checks_count(self) -> dict | None:
1387+
def checks_count(self) -> dict:
13881388
"""Return the saftey checks counts."""
13891389
attributes = ("gfcicount", "nogndcount", "stuckcount")
1390+
counts = {}
13901391
if self._status is not None and set(attributes).issubset(self._status.keys()):
1391-
counts = {}
13921392
counts["gfcicount"] = self._status["gfcicount"]
13931393
counts["nogndcount"] = self._status["nogndcount"]
13941394
counts["stuckcount"] = self._status["stuckcount"]
1395-
return counts
1396-
return None
1395+
return counts
1396+
1397+
@property
1398+
async def async_override_state(self) -> str | None:
1399+
"""Return the unit override state."""
1400+
try:
1401+
override = await self.get_override()
1402+
except UnsupportedFeature:
1403+
_LOGGER.debug("Override state unavailable on older firmware.")
1404+
return None
1405+
if "state" in override.keys():
1406+
return override["state"]
1407+
return "auto"

tests/fixtures/v2_json/config.json

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,43 @@
1-
{"firmware":"5.0.1","protocol":"4.0.1","espflash":4194304,"version":"2.9.1","diodet":1,"gfcit":0,"groundt":0,"relayt":0,"ventt":0,"tempt":0,"service":2,"scale":220,"offset":0,"ssid":"nsavanup_IoT","pass":"_DUMMY_PASSWORD","www_username":"mark","www_password":"_DUMMY_PASSWORD","hostname":"openevse","emoncms_server":"data.openevse.com/emoncms","emoncms_node":"0","emoncms_apikey":"_DUMMY_PASSWORD","emoncms_fingerprint":"","mqtt_server":"192.168.1.142","mqtt_port":1883,"mqtt_topic":"openevse","mqtt_user":"mqtt","mqtt_pass":"_DUMMY_PASSWORD","mqtt_solar":"","mqtt_grid_ie":"emon/emonpi/power1","mqtt_vrms":"emon/emonpi/vrms","mqtt_announce_topic":"openevse/announce/0000","ohm":"","divert_attack_smoothing_factor":0.4,"divert_decay_smoothing_factor":0.05,"divert_min_charge_time":600,"flags":3,"emoncms_enabled":true,"mqtt_enabled":true,"ohm_enabled":false,"divert_enabled":false,"charge_mode":"fast"}
1+
{
2+
"firmware": "5.0.1",
3+
"protocol": "4.0.1",
4+
"espflash": 4194304,
5+
"version": "2.9.1",
6+
"diodet": 1,
7+
"gfcit": 0,
8+
"groundt": 0,
9+
"relayt": 0,
10+
"ventt": 0,
11+
"tempt": 0,
12+
"service": 2,
13+
"scale": 220,
14+
"offset": 0,
15+
"ssid": "nsavanup_IoT",
16+
"pass": "_DUMMY_PASSWORD",
17+
"www_username": "mark",
18+
"www_password": "_DUMMY_PASSWORD",
19+
"hostname": "openevse",
20+
"emoncms_server": "data.openevse.com/emoncms",
21+
"emoncms_node": "0",
22+
"emoncms_apikey": "_DUMMY_PASSWORD",
23+
"emoncms_fingerprint": "",
24+
"mqtt_server": "192.168.1.142",
25+
"mqtt_port": 1883,
26+
"mqtt_topic": "openevse",
27+
"mqtt_user": "mqtt",
28+
"mqtt_pass": "_DUMMY_PASSWORD",
29+
"mqtt_solar": "",
30+
"mqtt_grid_ie": "emon/emonpi/power1",
31+
"mqtt_vrms": "emon/emonpi/vrms",
32+
"mqtt_announce_topic": "openevse/announce/0000",
33+
"ohm": "",
34+
"divert_attack_smoothing_factor": 0.4,
35+
"divert_decay_smoothing_factor": 0.05,
36+
"divert_min_charge_time": 600,
37+
"flags": 3,
38+
"emoncms_enabled": true,
39+
"mqtt_enabled": true,
40+
"ohm_enabled": false,
41+
"divert_enabled": false,
42+
"charge_mode": "fast"
43+
}

tests/fixtures/v2_json/status.json

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,35 @@
1-
{"mode":"STA","wifi_client_connected":1,"net_connected":1,"srssi":-56,"ipaddress":"192.168.1.67","emoncms_connected":0,"packets_sent":2909,"packets_success":0,"mqtt_connected":0,"ohm_hour":"NotConnected","free_heap":12448,"comm_sent":43704,"comm_success":43704,"rapi_connected":1,"amp":0,"voltage":240,"pilot":25,"temp1":340,"temp2":false,"temp3":false,"state":1,"elapsed":8751,"wattsec":25212279,"watthour":1585443,"gfcicount":0,"nogndcount":0,"stuckcount":0,"divertmode":1,"solar":0,"grid_ie":0,"charge_rate":0,"divert_update":87648,"ota_update":0}
1+
{
2+
"mode": "STA",
3+
"wifi_client_connected": 1,
4+
"net_connected": 1,
5+
"srssi": -56,
6+
"ipaddress": "192.168.1.67",
7+
"emoncms_connected": 0,
8+
"packets_sent": 2909,
9+
"packets_success": 0,
10+
"mqtt_connected": 0,
11+
"ohm_hour": "NotConnected",
12+
"free_heap": 12448,
13+
"comm_sent": 43704,
14+
"comm_success": 43704,
15+
"rapi_connected": 1,
16+
"amp": 0,
17+
"voltage": 240,
18+
"pilot": 25,
19+
"temp1": 340,
20+
"temp2": false,
21+
"temp3": false,
22+
"state": 1,
23+
"elapsed": 8751,
24+
"wattsec": 25212279,
25+
"watthour": 1585443,
26+
"gfcicount": 0,
27+
"nogndcount": 0,
28+
"stuckcount": 0,
29+
"divertmode": 1,
30+
"solar": 0,
31+
"grid_ie": 0,
32+
"charge_rate": 0,
33+
"divert_update": 87648,
34+
"ota_update": 0
35+
}

tests/test_main.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,3 +2012,53 @@ async def test_async_charge_current(
20122012
value = await test_charger_v2.async_charge_current
20132013
assert value == 25
20142014
await test_charger_v2.ws_disconnect()
2015+
2016+
2017+
async def test_async_override_state(
2018+
test_charger, test_charger_v2, mock_aioclient, caplog
2019+
):
2020+
"""Test get override function."""
2021+
await test_charger.update()
2022+
value = {
2023+
"state": "active",
2024+
"charge_current": 0,
2025+
"max_current": 0,
2026+
"energy_limit": 0,
2027+
"time_limit": 0,
2028+
"auto_release": True,
2029+
}
2030+
mock_aioclient.get(
2031+
TEST_URL_OVERRIDE,
2032+
status=200,
2033+
body=json.dumps(value),
2034+
)
2035+
with caplog.at_level(logging.DEBUG):
2036+
status = await test_charger.async_override_state
2037+
assert status == "active"
2038+
2039+
value = {
2040+
"state": "disabled",
2041+
}
2042+
mock_aioclient.get(
2043+
TEST_URL_OVERRIDE,
2044+
status=200,
2045+
body=json.dumps(value),
2046+
)
2047+
with caplog.at_level(logging.DEBUG):
2048+
status = await test_charger.async_override_state
2049+
assert status == "disabled"
2050+
2051+
value = {}
2052+
mock_aioclient.get(
2053+
TEST_URL_OVERRIDE,
2054+
status=200,
2055+
body=json.dumps(value),
2056+
)
2057+
with caplog.at_level(logging.DEBUG):
2058+
status = await test_charger.async_override_state
2059+
assert status == "auto"
2060+
2061+
with caplog.at_level(logging.DEBUG):
2062+
await test_charger_v2.update()
2063+
await test_charger_v2.async_override_state
2064+
assert "Override state unavailable on older firmware." in caplog.text

0 commit comments

Comments
 (0)