Skip to content

Commit 6af8595

Browse files
committedJun 4, 2022
Cleanup, cleanup, everybody everywhere
1 parent c2f97a0 commit 6af8595

19 files changed

+100
-50
lines changed
 

‎custom_components/matter_experimental/__init__.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@
22
from __future__ import annotations
33

44
import asyncio
5-
import async_timeout
65

7-
import voluptuous as vol
6+
import async_timeout
87
from homeassistant.config_entries import ConfigEntry
98
from homeassistant.const import EVENT_HOMEASSISTANT_STOP
109
from homeassistant.core import Event, HomeAssistant, ServiceCall, callback
1110
from homeassistant.exceptions import ConfigEntryNotReady, HomeAssistantError
1211
from homeassistant.helpers import device_registry as dr
1312
from homeassistant.helpers.service import async_register_admin_service
14-
from homeassistant.helpers.start import async_at_start
13+
import voluptuous as vol
1514

1615
from matter_server.client.exceptions import CannotConnect, FailedCommand
1716
from matter_server.client.matter import Matter

‎custom_components/matter_experimental/adapter.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
"""Matter to HA adapter."""
22
from __future__ import annotations
3+
4+
from abc import abstractmethod
35
import asyncio
6+
import json
47
import logging
5-
from abc import abstractmethod
68
from typing import TYPE_CHECKING, Callable
7-
import json
89

910
import aiohttp
1011
from homeassistant.config_entries import ConfigEntry
1112
from homeassistant.const import CONF_URL, Platform
1213
from homeassistant.core import HomeAssistant
1314
from homeassistant.exceptions import HomeAssistantError
15+
from homeassistant.helpers import device_registry as dr
1416
from homeassistant.helpers.aiohttp_client import async_get_clientsession
15-
from homeassistant.helpers.storage import Store
1617
from homeassistant.helpers.entity_platform import AddEntitiesCallback
17-
from homeassistant.helpers import device_registry as dr
18+
from homeassistant.helpers.storage import Store
1819

1920
from matter_server.client.adapter import AbstractMatterAdapter
2021
from matter_server.common.json_utils import CHIPJSONDecoder, CHIPJSONEncoder

‎custom_components/matter_experimental/config_flow.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
import logging
55
from typing import Any
66

7-
import voluptuous as vol
87
from homeassistant import config_entries
98
from homeassistant.const import CONF_URL
109
from homeassistant.core import HomeAssistant
1110
from homeassistant.data_entry_flow import FlowResult
1211
from homeassistant.exceptions import HomeAssistantError
1312
from homeassistant.helpers import aiohttp_client
13+
import voluptuous as vol
1414

1515
from matter_server.client.client import Client
1616

‎custom_components/matter_experimental/device_platform.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from __future__ import annotations
2+
23
from typing import TYPE_CHECKING
34

45
from homeassistant.const import Platform
56

67
from .device_platform_helper import DeviceMapping
7-
from .switch import DEVICE_ENTITY as SWITCH_DEVICE_ENTITY
88
from .light import DEVICE_ENTITY as LIGHT_DEVICE_ENTITY
9+
from .switch import DEVICE_ENTITY as SWITCH_DEVICE_ENTITY
910

1011
if TYPE_CHECKING:
1112
from matter_server.client.model import device as matter_devices

‎custom_components/matter_experimental/device_platform_helper.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from __future__ import annotations
2+
23
from dataclasses import dataclass
34
from typing import TYPE_CHECKING, Callable
45

‎custom_components/matter_experimental/light.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33

44
from typing import TYPE_CHECKING, Any
55

6-
from homeassistant.const import Platform
7-
from homeassistant.components.light import LightEntity, ColorMode, ATTR_BRIGHTNESS
6+
from homeassistant.components.light import ATTR_BRIGHTNESS, ColorMode, LightEntity
87
from homeassistant.config_entries import ConfigEntry
8+
from homeassistant.const import Platform
99
from homeassistant.core import HomeAssistant, callback
1010
from homeassistant.helpers.entity_platform import AddEntitiesCallback
1111
from homeassistant.util import percentage
1212

13-
from matter_server.vendor.chip.clusters import Objects as clusters
1413
from matter_server.client.model import device as matter_devices
14+
from matter_server.vendor.chip.clusters import Objects as clusters
1515

1616
from .const import DOMAIN
17-
from .entity import MatterEntity
1817
from .device_platform_helper import DeviceMapping
18+
from .entity import MatterEntity
1919

2020
if TYPE_CHECKING:
2121
from matter_server.client.matter import Matter

‎custom_components/matter_experimental/switch.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,22 @@
33

44
from typing import TYPE_CHECKING, Any
55

6-
from homeassistant.const import Platform
76
from homeassistant.components.switch import (
7+
SwitchDeviceClass,
88
SwitchEntity,
99
SwitchEntityDescription,
10-
SwitchDeviceClass,
1110
)
1211
from homeassistant.config_entries import ConfigEntry
12+
from homeassistant.const import Platform
1313
from homeassistant.core import HomeAssistant, callback
1414
from homeassistant.helpers.entity_platform import AddEntitiesCallback
1515

16-
from matter_server.vendor.chip.clusters import Objects as clusters
1716
from matter_server.client.model import device as matter_devices
17+
from matter_server.vendor.chip.clusters import Objects as clusters
1818

1919
from .const import DOMAIN
20-
from .entity import MatterEntity
2120
from .device_platform_helper import DeviceMapping
21+
from .entity import MatterEntity
2222

2323
if TYPE_CHECKING:
2424
from matter_server.client.matter import Matter

‎matter_server/client/adapter.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""Matter adapter."""
22
from __future__ import annotations
33

4-
import logging
54
from abc import abstractmethod
5+
import logging
66
from typing import Callable
77

88
import aiohttp

‎matter_server/client/client.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22
from __future__ import annotations
33

44
import asyncio
5-
import json
6-
import logging
7-
import pprint
8-
import uuid
95
from collections import defaultdict
106
from copy import deepcopy
117
from dataclasses import asdict, is_dataclass
128
from datetime import datetime
139
from functools import partial
10+
import json
11+
import logging
1412
from operator import itemgetter
13+
import pprint
1514
from types import TracebackType
1615
from typing import Any, DefaultDict, Dict, List, cast
16+
import uuid
1717

1818
from aiohttp import ClientSession, ClientWebSocketResponse, WSMsgType, client_exceptions
1919

@@ -124,7 +124,7 @@ async def async_send_command(
124124
self._result_futures.pop(message.messageId)
125125

126126
async def async_send_command_no_wait(
127-
self, message: CommandMessage, require_schema: int | None = None
127+
self, command: str, args: dict[str, Any], require_schema: int | None = None
128128
) -> None:
129129
"""Send a command without waiting for the response."""
130130
if require_schema is not None and require_schema > self.schema_version:

‎matter_server/client/model/device.py

+11-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
if TYPE_CHECKING:
88
from .node import MatterNode
9+
from .subscription import Subscription
910

1011
DEVICE_TYPES = {}
1112

@@ -136,18 +137,21 @@ async def subscribe_updates(
136137
self._on_update_listener = subscriber
137138

138139
reporting_timing_params = (0, 10)
139-
subscription = await self.node.matter.client.driver.device_controller.Read(
140-
self.node.node_id,
141-
attributes=[
142-
(self.endpoint_id, attribute) for attribute in subscribe_attributes
143-
],
144-
reportInterval=reporting_timing_params,
140+
subscription: Subscription = (
141+
await self.node.matter.client.driver.device_controller.Read(
142+
self.node.node_id,
143+
attributes=[
144+
(self.endpoint_id, attribute) for attribute in subscribe_attributes
145+
],
146+
reportInterval=reporting_timing_params,
147+
)
145148
)
146149
subscription.handler = self._receive_event
147150

148-
async def unsubscribe() -> None:
151+
def unsubscribe() -> None:
149152
self._on_update_listener = None
150153
subscription.handler = None
154+
151155
# TODO actually unsubscribe
152156

153157
return unsubscribe

‎matter_server/client/model/device_controller.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -247,13 +247,13 @@ async def Read(
247247
return subscription
248248

249249
def receive_event(self, event):
250-
subscriptionId = event["subscriptionId"]
251-
if subscriptionId not in self.subscriptions:
250+
subscription_id = event["subscriptionId"]
251+
if subscription_id not in self.subscriptions:
252252
_LOGGER.warning(
253-
f"No Subscription object for Subscription Id 0x{subscriptionId:X} present."
253+
f"No Subscription object for Subscription Id 0x{subscription_id:X} present."
254254
)
255255
return
256-
subscription = self.subscriptions[subscriptionId]
256+
subscription = self.subscriptions[subscription_id]
257257
if not subscription.handler:
258258
_LOGGER.debug("No Subscription handler.")
259259
return

‎matter_server/client/model/subscription.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33

44
class Subscription:
5-
subscriptionId: int
5+
subscription_id: int
66
handler: Callable[[dict], None]
77

8-
def __init__(self, subscriptionId):
9-
self.subscriptionId = subscriptionId
8+
def __init__(self, subscription_id):
9+
self.subscription_id = subscription_id

‎matter_server/common/json_utils.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import base64
22
import copy
3-
import json
4-
import sys
53
from dataclasses import asdict, fields, is_dataclass
64
from enum import Enum
5+
import json
6+
import sys
77
from types import ModuleType
88

99
import matter_server.common.model

‎matter_server/server/__main__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import asyncio
22
import logging
33
import os
4-
import sys
54
from pathlib import Path
5+
import sys
66

77
import coloredlogs
88

‎matter_server/server/active_connection.py

+27-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
from __future__ import annotations
22

33
import asyncio
4+
from concurrent import futures
45
from contextlib import suppress
6+
from functools import partial
57
import json
68
import typing
79
from typing import TYPE_CHECKING, Coroutine, Final
8-
from concurrent import futures
910

1011
from aiohttp import WSCloseCode, WSMsgType, web
1112
from chip.exceptions import ChipStackError
1213

14+
from ..backports.enum import StrEnum
1315
from ..common.json_utils import CHIPJSONDecoder, CHIPJSONEncoder
1416
from ..common.model.message import (
1517
CommandMessage,
@@ -18,12 +20,12 @@
1820
SuccessResultMessage,
1921
)
2022
from ..common.model.version import VersionInfo
21-
from ..backports.enum import StrEnum
2223

2324
if TYPE_CHECKING:
24-
from .server import MatterServer
2525
from chip.clusters import Attribute, ClusterObjects
2626

27+
from .server import MatterServer
28+
2729
MAX_PENDING_MSG = 512
2830
CANCELLATION_ERRORS: Final = (asyncio.CancelledError, futures.CancelledError)
2931

@@ -42,6 +44,9 @@ class DeviceControllerCommands(StrEnum):
4244
SET_THREAD_OPERATIONAL_DATASET = "SetThreadOperationalDataset"
4345
SET_WIFI_CREDENTIALS = "SetWiFiCredentials"
4446

47+
# Custom commands
48+
UNSUBSCRIBE = "Unsubscribe"
49+
4550

4651
PROTOCOL = {
4752
InstanceCommands.DEVICE_CONTROLLER: {
@@ -178,7 +183,12 @@ def _handle_message(self, msg: CommandMessage):
178183
self._send_message(ErrorResultMessage(msg.messageId, "Unknown error"))
179184

180185
def _handle_device_controller_message(self, msg: CommandMessage, command: str):
181-
if command == "Read" and msg.args.get("reportInterval") is not None:
186+
if command == DeviceControllerCommands.UNSUBSCRIBE:
187+
method = partial(self._handle_device_controller_unsubscribe_message, msg)
188+
elif (
189+
command == DeviceControllerCommands.READ
190+
and msg.args.get("reportInterval") is not None
191+
):
182192
method = self._handle_device_controller_subscribe_message
183193
else:
184194
method = getattr(self.server.stack.device_controller, command)
@@ -307,13 +317,25 @@ def subscription_callback(
307317
self._subscriptions[subscription_id] = subscription
308318
return subscription_id
309319

320+
def _handle_device_controller_unsubscribe_message(
321+
self, msg: CommandMessage, subscription_id: int
322+
):
323+
"""Unsubscribe."""
324+
subscription = self._subscriptions.pop(subscription_id, None)
325+
if subscription is None:
326+
self._send_message(ErrorResultMessage(msg.messageId, "not_found"))
327+
return
328+
329+
subscription.shutdown()
330+
self._send_message(SuccessResultMessage(msg.messageId, None))
331+
310332
async def _handle_coroutine_command(self, msg: CommandMessage, action: Coroutine):
311333
try:
312334
result = await action
313335
except ChipStackError as ex:
314336
self._send_message(ErrorResultMessage(msg.messageId, str(ex)))
315337
except Exception:
316338
self.logger.exception("Error handling message: %s", msg.data)
317-
self._send_message(ErrorResultMessage(msg.messageId, "Unknown error"))
339+
self._send_message(ErrorResultMessage(msg.messageId, "unknown_error"))
318340

319341
self._send_message(SuccessResultMessage(msg.messageId, result))

‎matter_server/server/matter_stack.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
import logging
33
import typing
44

5-
import chip.logging
6-
import chip.native
75
from chip.ChipDeviceCtrl import ChipDeviceController
86
from chip.ChipStack import ChipStack
9-
from chip.clusters import Attribute, ClusterObjects
107
from chip.FabricAdmin import FabricAdmin
8+
from chip.clusters import Attribute, ClusterObjects
9+
import chip.logging
10+
import chip.native
1111

1212
_LOGGER = logging.getLogger(__name__)
1313

‎matter_server/server/server.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import asyncio
44
import logging
5-
import weakref
65
from typing import TYPE_CHECKING
6+
import weakref
77

88
from aiohttp import web
99

‎pyproject.toml

+22
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,25 @@ good-names = [
2424
"Run",
2525
"ip",
2626
]
27+
28+
[tool.isort]
29+
# https://github.com/PyCQA/isort/wiki/isort-Settings
30+
profile = "black"
31+
# will group `import x` and `from x import` of the same module.
32+
force_sort_within_sections = true
33+
src_paths = [
34+
"custom_components",
35+
"matter_server/client",
36+
"matter_server/common",
37+
"matter_server/server",
38+
"matter_server/backports",
39+
]
40+
known_first_party = [
41+
"custom_components",
42+
"matter_server",
43+
"tests",
44+
]
45+
forced_separate = [
46+
"tests",
47+
]
48+
combine_as_imports = true

0 commit comments

Comments
 (0)