Skip to content

Commit 47cad50

Browse files
committed
Rework event listener logic
1 parent e369816 commit 47cad50

File tree

3 files changed

+36
-17
lines changed

3 files changed

+36
-17
lines changed

pyoverkiz/client.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ class OverkizClient:
5555
setup: Setup | None
5656
devices: list[Device]
5757
gateways: list[Gateway]
58-
event_listener_id: str | None
5958
session: ClientSession
6059

6160
_refresh_token: str | None = None
@@ -86,7 +85,6 @@ def __init__(
8685
self.setup: Setup | None = None
8786
self.devices: list[Device] = []
8887
self.gateways: list[Gateway] = []
89-
self.event_listener_id: str | None = None
9088

9189
async def __aenter__(self) -> OverkizClient:
9290
return self
@@ -101,8 +99,8 @@ async def __aexit__(
10199

102100
async def close(self) -> None:
103101
"""Close the session."""
104-
if self.event_listener_id:
105-
await self.unregister_event_listener()
102+
if self.server.event_listener_id:
103+
await self.server.unregister_event_listener()
106104

107105
await self.server.session.close()
108106

@@ -286,11 +284,7 @@ async def register_event_listener(self) -> str:
286284
timeout : listening sessions are expected to call the /events/{listenerId}/fetch
287285
API on a regular basis.
288286
"""
289-
response = await self.server.post("events/register")
290-
listener_id = cast(str, response.get("id"))
291-
self.event_listener_id = listener_id
292-
293-
return listener_id
287+
return await self.server.register_event_listener()
294288

295289
@backoff.on_exception(backoff.expo, TooManyConcurrentRequestsException, max_tries=5)
296290
@backoff.on_exception(
@@ -309,7 +303,9 @@ async def fetch_events(self) -> list[Event]:
309303
Per-session rate-limit : 1 calls per 1 SECONDS period for this particular
310304
operation (polling)
311305
"""
312-
response = await self.server.post(f"events/{self.event_listener_id}/fetch")
306+
response = await self.server.post(
307+
f"events/{self.server.event_listener_id}/fetch"
308+
)
313309
events = [Event(**e) for e in humps.decamelize(response)]
314310

315311
return events
@@ -319,8 +315,7 @@ async def unregister_event_listener(self) -> None:
319315
Unregister an event listener.
320316
API response status is always 200, even on unknown listener ids.
321317
"""
322-
await self.server.post(f"events/{self.event_listener_id}/unregister")
323-
self.event_listener_id = None
318+
return await self.server.unregister_event_listener()
324319

325320
@backoff.on_exception(
326321
backoff.expo, NotAuthenticatedException, max_tries=2, on_backoff=relogin

pyoverkiz/servers/overkiz_server.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
from abc import ABC, abstractmethod
44
from json import JSONDecodeError
5-
from typing import Any
5+
from typing import Any, cast
66

77
from aiohttp import ClientResponse, ClientSession
88
from attr import define
9+
from attrs import field
910

1011
from pyoverkiz.exceptions import (
1112
AccessDeniedToGatewayException,
@@ -37,8 +38,8 @@ class OverkizServer(ABC):
3738
endpoint: str
3839
manufacturer: str
3940
session: ClientSession
40-
4141
configuration_url: str | None
42+
event_listener_id: str | None = field(default=None, init=False)
4243

4344
@abstractmethod
4445
async def login(self, username: str, password: str) -> bool:
@@ -167,3 +168,27 @@ async def check_response(response: ClientResponse) -> None:
167168
raise AccessDeniedToGatewayException(message)
168169

169170
raise Exception(message if message else result)
171+
172+
async def register_event_listener(self) -> str:
173+
"""
174+
Register a new setup event listener on the current session and return a new
175+
listener id.
176+
Only one listener may be registered on a given session.
177+
Registering an new listener will invalidate the previous one if any.
178+
Note that registering an event listener drastically reduces the session
179+
timeout : listening sessions are expected to call the /events/{listenerId}/fetch
180+
API on a regular basis.
181+
"""
182+
response = await self.post("events/register")
183+
listener_id = cast(str, response.get("id"))
184+
self.event_listener_id = listener_id
185+
186+
return listener_id
187+
188+
async def unregister_event_listener(self) -> None:
189+
"""
190+
Unregister an event listener.
191+
API response status is always 200, even on unknown listener ids.
192+
"""
193+
await self.post(f"events/{self.event_listener_id}/unregister")
194+
self.event_listener_id = None

pyoverkiz/servers/somfy.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,5 @@ async def _refresh_token_if_expired(self) -> None:
128128
):
129129
await self.refresh_token()
130130

131-
# TODO
132-
# if self.event_listener_id:
133-
# await self.register_event_listener()
131+
if self.event_listener_id:
132+
await self.register_event_listener()

0 commit comments

Comments
 (0)