Skip to content

Commit c3ee4c0

Browse files
authored
fix: fix some async functions (#210)
* fix: fix some async functions * version bump * update tests * formatting * update test config
1 parent 87f7dbd commit c3ee4c0

File tree

6 files changed

+98
-15
lines changed

6 files changed

+98
-15
lines changed

.github/workflows/test.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,5 @@ jobs:
5555
name: coverage-data
5656
- name: Upload coverage report
5757
uses: codecov/[email protected]
58+
with:
59+
token: ${{ secrets.CODECOV_TOKEN }}

openevsehttp/__main__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ async def test_and_get(self) -> dict:
194194
data = {"serial": serial, "model": model}
195195
return data
196196

197-
def ws_start(self):
197+
def ws_start(self) -> None:
198198
"""Start the websocket listener."""
199199
if self._ws_listening:
200200
raise AlreadyListening
@@ -218,7 +218,7 @@ def _start_listening(self):
218218
except RuntimeError:
219219
_LOGGER.info(INFO_LOOP_RUNNING)
220220

221-
def _update_status(self, msgtype, data, error):
221+
async def _update_status(self, msgtype, data, error):
222222
"""Update data from websocket listener."""
223223
if msgtype == SIGNAL_CONNECTION_STATE:
224224
if data == STATE_CONNECTED:
@@ -247,16 +247,16 @@ def _update_status(self, msgtype, data, error):
247247
data["watthour"] = data.pop("wh")
248248
# TODO: update specific endpoints based on _version prefix
249249
if any(key in keys for key in UPDATE_TRIGGERS):
250-
self.update()
250+
await self.update()
251251
self._status.update(data)
252252

253253
if self.callback is not None:
254254
self.callback() # pylint: disable=not-callable
255255

256-
def ws_disconnect(self) -> None:
256+
async def ws_disconnect(self) -> None:
257257
"""Disconnect the websocket listener."""
258258
assert self.websocket
259-
self.websocket.close()
259+
await self.websocket.close()
260260
self._ws_listening = False
261261

262262
@property

openevsehttp/websocket.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ def state(self):
4545
return self._state
4646

4747
@state.setter
48-
def state(self, value):
48+
async def state(self, value):
4949
"""Set the state."""
5050
self._state = value
5151
_LOGGER.debug("Websocket %s", value)
52-
self.callback(SIGNAL_CONNECTION_STATE, value, self._error_reason)
52+
await self.callback(SIGNAL_CONNECTION_STATE, value, self._error_reason)
5353
self._error_reason = None
5454

5555
@staticmethod
@@ -59,7 +59,7 @@ def _get_uri(server):
5959

6060
async def running(self):
6161
"""Open a persistent websocket connection and act on events."""
62-
self.state = STATE_STARTING
62+
await OpenEVSEWebsocket.state.fset(self, STATE_STARTING)
6363
auth = None
6464

6565
if self._user and self._password:
@@ -81,7 +81,7 @@ async def running(self):
8181
if message.type == aiohttp.WSMsgType.TEXT:
8282
msg = message.json()
8383
msgtype = "data"
84-
self.callback(msgtype, msg, None)
84+
await self.callback(msgtype, msg, None)
8585

8686
elif message.type == aiohttp.WSMsgType.CLOSED:
8787
_LOGGER.warning("Websocket connection closed")
@@ -98,7 +98,7 @@ async def running(self):
9898
else:
9999
_LOGGER.error("Unexpected response received: %s", error)
100100
self._error_reason = ERROR_UNKNOWN
101-
self.state = STATE_STOPPED
101+
await OpenEVSEWebsocket.state.fset(self, STATE_STOPPED)
102102
except (aiohttp.ClientConnectionError, asyncio.TimeoutError) as error:
103103
if self.failed_attempts >= MAX_FAILED_ATTEMPTS:
104104
self._error_reason = ERROR_TOO_MANY_RETRIES
@@ -111,7 +111,7 @@ async def running(self):
111111
retry_delay,
112112
error,
113113
)
114-
self.state = STATE_DISCONNECTED
114+
await OpenEVSEWebsocket.state.fset(self, STATE_DISCONNECTED)
115115
await asyncio.sleep(retry_delay)
116116
except Exception as error: # pylint: disable=broad-except
117117
if self.state != STATE_STOPPED:
@@ -129,6 +129,6 @@ async def listen(self):
129129
while self.state != STATE_STOPPED:
130130
await self.running()
131131

132-
def close(self):
132+
async def close(self):
133133
"""Close the listening websocket."""
134-
self.state = STATE_STOPPED
134+
await OpenEVSEWebsocket.state.fset(self, STATE_STOPPED)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
PROJECT_DIR = Path(__file__).parent.resolve()
77
README_FILE = PROJECT_DIR / "README.md"
8-
VERSION = "0.1.44"
8+
VERSION = "0.1.45"
99

1010
setup(
1111
name="python-openevse-http",

tests/fixtures/websocket.json

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"mode": "STA",
3+
"wifi_client_connected": 1,
4+
"eth_connected": 0,
5+
"net_connected": 1,
6+
"ipaddress": "192.168.21.10",
7+
"emoncms_connected": 0,
8+
"packets_sent": 0,
9+
"packets_success": 0,
10+
"mqtt_connected": 0,
11+
"ocpp_connected": 0,
12+
"rfid_failure": 0,
13+
"ohm_hour": "NotConnected",
14+
"free_heap": 195472,
15+
"comm_sent": 287724,
16+
"comm_success": 287720,
17+
"rapi_connected": 1,
18+
"evse_connected": 1,
19+
"amp": 0,
20+
"voltage": 240,
21+
"pilot": 48,
22+
"wh": 7875444,
23+
"session_energy": 7950.783333,
24+
"total_energy": 7875.444,
25+
"temp": 529,
26+
"temp_max": 576,
27+
"temp1": false,
28+
"temp2": 529,
29+
"temp3": false,
30+
"temp4": 555,
31+
"state": 254,
32+
"status": "disabled",
33+
"flags": 512,
34+
"vehicle": 0,
35+
"colour": 5,
36+
"manual_override": 0,
37+
"freeram": 195472,
38+
"divertmode": 1,
39+
"srssi": -59,
40+
"time": "2023-03-13T21:26:22Z",
41+
"offset": "-0700",
42+
"elapsed": 3685,
43+
"wattsec": 2.862282e7,
44+
"watthour": 7875444,
45+
"gfcicount": 1,
46+
"nogndcount": 0,
47+
"stuckcount": 0,
48+
"solar": 0,
49+
"grid_ie": -5073,
50+
"charge_rate": 4,
51+
"divert_update": 6319,
52+
"divert_active": false,
53+
"shaper": 0,
54+
"shaper_live_pwr": 0,
55+
"shaper_cur": 0,
56+
"shaper_updated": false,
57+
"service_level": 2,
58+
"ota_update": 0,
59+
"config_version": 14,
60+
"claims_version": 24,
61+
"override_version": 4,
62+
"schedule_version": 1,
63+
"schedule_plan_version": 14,
64+
"vehicle_state_update": 445687,
65+
"tesla_vehicle_count": false,
66+
"tesla_vehicle_id": false,
67+
"tesla_vehicle_name": false
68+
}

tests/test_main.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
TEST_URL_CONFIG = "http://openevse.test.tld/config"
2121
TEST_URL_DIVERT = "http://openevse.test.tld/divertmode"
2222
TEST_URL_RESTART = "http://openevse.test.tld/restart"
23+
TEST_URL_WS = "ws://openevse.test.tld/ws"
2324
TEST_URL_GITHUB_v4 = (
2425
"https://api.github.com/repos/OpenEVSE/ESP32_WiFi_V4.x/releases/latest"
2526
)
@@ -187,7 +188,7 @@ async def test_get_ammeter_offset(fixture, expected, request):
187188
"""Test v4 Status reply."""
188189
charger = request.getfixturevalue(fixture)
189190
await charger.update()
190-
charger.ws_disconnect()
191+
await charger.ws_disconnect()
191192
status = charger.ammeter_offset
192193
assert status == expected
193194

@@ -1389,3 +1390,15 @@ async def test_get_total_year(fixture, expected, request):
13891390
await charger.update()
13901391
status = charger.total_year
13911392
assert status == expected
1393+
1394+
1395+
async def test_websocket_functions(test_charger, mock_aioclient, caplog):
1396+
"""Test v4 Status reply."""
1397+
mock_aioclient.get(
1398+
TEST_URL_WS,
1399+
status=200,
1400+
body=load_fixture("websocket.json"),
1401+
)
1402+
await test_charger.update()
1403+
test_charger.ws_start()
1404+
await test_charger.ws_disconnect()

0 commit comments

Comments
 (0)