Skip to content

Commit 0dd0ad1

Browse files
authored
Create default better entity names (#8)
1 parent c2ef71f commit 0dd0ad1

File tree

7 files changed

+37
-34
lines changed

7 files changed

+37
-34
lines changed

custom_components/matter_experimental/binary_sensor.py

-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from homeassistant.core import HomeAssistant, callback
1414
from homeassistant.helpers.entity_platform import AddEntitiesCallback
1515

16-
from matter_server.client.model.device import MatterDevice
1716
from matter_server.vendor import device_types
1817
from matter_server.vendor.chip.clusters import Objects as clusters
1918

@@ -38,11 +37,6 @@ async def async_setup_entry(
3837
class MatterBinarySensor(MatterEntity, BinarySensorEntity):
3938
"""Representation of a Matter binary sensor."""
4039

41-
def __init__(self, device: MatterDevice, mapping: DeviceMapping) -> None:
42-
"""Initialize the sensor."""
43-
super().__init__(device, mapping)
44-
self._attr_name = device.node.name or f"Matter Sensor {device.node.node_id}"
45-
4640
@callback
4741
def _update_from_device(self) -> None:
4842
"""Update from device."""

custom_components/matter_experimental/entity.py

+16
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,22 @@ def __init__(self, device: MatterDevice, mapping: DeviceMapping) -> None:
2222
self._device_mapping = mapping
2323
self._attr_unique_id = f"{device.node.unique_id}-{device.endpoint_id}-{device.device_type.device_type}"
2424

25+
device_type_name = device.device_type.__doc__[:-1]
26+
name = device.node.name
27+
if name:
28+
name += f" {device_type_name}"
29+
else:
30+
name = f"{device_type_name} {device.node.node_id}"
31+
32+
# If this device has multiple of this device type, add their endpoint.
33+
if (
34+
sum(dev.device_type is device.device_type for dev in device.node.devices)
35+
> 1
36+
):
37+
name += f" ({device.endpoint_id})"
38+
39+
self._attr_name = name
40+
2541
@property
2642
def device_info(self) -> entity.DeviceInfo | None:
2743
"""Return device info for device registry."""

custom_components/matter_experimental/light.py

-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ class MatterLight(MatterEntity, LightEntity):
3838
def __init__(self, device: MatterDevice, mapping: DeviceMapping) -> None:
3939
"""Initialize the light."""
4040
super().__init__(device, mapping)
41-
self._attr_name = device.node.name or f"Matter Light {device.node.node_id}"
4241
if self._supports_brightness():
4342
self._attr_supported_color_modes = [ColorMode.BRIGHTNESS]
4443

custom_components/matter_experimental/sensor.py

-6
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from homeassistant.core import HomeAssistant, callback
2424
from homeassistant.helpers.entity_platform import AddEntitiesCallback
2525

26-
from matter_server.client.model.device import MatterDevice
2726
from matter_server.vendor import device_types
2827
from matter_server.vendor.chip.clusters import Objects as clusters
2928
from matter_server.vendor.chip.clusters.Types import NullValue
@@ -52,11 +51,6 @@ class MatterSensor(MatterEntity, SensorEntity):
5251
_attr_state_class = SensorStateClass.MEASUREMENT
5352
_device_mapping: SensorDeviceMapping
5453

55-
def __init__(self, device: MatterDevice, mapping: SensorDeviceMapping) -> None:
56-
"""Initialize the sensor."""
57-
super().__init__(device, mapping)
58-
self._attr_name = device.node.name or f"Matter Sensor {device.node.node_id}"
59-
6054
@callback
6155
def _update_from_device(self) -> None:
6256
"""Update from device."""

custom_components/matter_experimental/switch.py

-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from homeassistant.core import HomeAssistant, callback
1414
from homeassistant.helpers.entity_platform import AddEntitiesCallback
1515

16-
from matter_server.client.model.device import MatterDevice
1716
from matter_server.vendor import device_types
1817
from matter_server.vendor.chip.clusters import Objects as clusters
1918

@@ -38,11 +37,6 @@ async def async_setup_entry(
3837
class MatterSwitch(MatterEntity, SwitchEntity):
3938
"""Representation of a Matter switch."""
4039

41-
def __init__(self, device: MatterDevice, mapping: DeviceMapping) -> None:
42-
"""Initialize the switch."""
43-
super().__init__(device, mapping)
44-
self._attr_name = device.node.name or f"Matter Switch {device.node.node_id}"
45-
4640
async def async_turn_on(self, **kwargs: Any) -> None:
4741
"""Turn switch on."""
4842
await self._device.send_command(

matter_server/client/matter.py

+21-5
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ async def connect(self):
5757
!= self.client.server_info.compressedFabricId
5858
):
5959
self.adapter.logger.warning(
60-
"Connected to a server with a new fabric ID. Resetting data"
60+
"Connected to a server with a new fabric ID (current: %s, server: %s). Resetting data",
61+
data.get("compressed_fabric_id"),
62+
self.client.server_info.compressedFabricId,
6163
)
6264
data = None
6365
# TODO can we detect all known nodes to the server and interview them?
@@ -123,7 +125,12 @@ async def _interview_node(self, node_id: int) -> None:
123125

124126
self.adapter.delay_save_data(self._data_to_save)
125127

126-
await self.adapter.setup_node(self._nodes[node_id])
128+
try:
129+
await self.adapter.setup_node(self._nodes[node_id])
130+
except Exception: # pylint: disable=broad-except
131+
self.adapter.logger.exception(
132+
"Unexptected error setting up node %s", node_id
133+
)
127134

128135
def _schedule_interview_retry(self, nodes: set[int], timeout=INTERVIEW_RETRY_TIME):
129136
"""Schedule a retry of failed nodes."""
@@ -184,10 +191,19 @@ async def _client_listen(self) -> None:
184191
async def _handle_driver_ready(self) -> None:
185192
"""Handle driver ready."""
186193
await self.driver_ready.wait()
187-
tasks = [self.adapter.setup_node(node) for node in self.get_nodes()]
194+
nodes = self.get_nodes()
195+
tasks = [self.adapter.setup_node(node) for node in nodes]
188196

189197
if tasks:
190-
await asyncio.gather(*tasks)
198+
results = await asyncio.gather(*tasks, return_exceptions=True)
199+
200+
for node, result in zip(nodes, results):
201+
if isinstance(result, Exception):
202+
self.adapter.logger.error(
203+
"Unexpected error setting up node %s",
204+
node.node_id,
205+
exc_info=result,
206+
)
191207

192208
to_interview = {
193209
node_id for node_id, info in self._nodes.items() if info is None
@@ -200,7 +216,7 @@ async def _handle_driver_ready(self) -> None:
200216

201217
def _data_to_save(self) -> dict:
202218
return {
203-
"compressed_fabric_id": self.client.driver.compressed_fabric_id,
219+
"compressed_fabric_id": self.client.server_info.compressedFabricId,
204220
"next_node_id": self.next_node_id,
205221
"nodes": {
206222
node_id: node.raw_data if node else None

matter_server/client/model/driver.py

-10
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,3 @@ def __init__(self, client: client.Client, server_info: ServerInformation):
1717
self._client = client
1818
self.device_controller = DeviceController(client)
1919
self.read_subscriptions = ReadSubscriptions(client)
20-
21-
@property
22-
def fabric_id(self) -> int:
23-
"""Fabric ID."""
24-
return self.server_info.fabricId
25-
26-
@property
27-
def compressed_fabric_id(self) -> int:
28-
"""Compressed fabric ID."""
29-
return self.server_info.compressedFabricId

0 commit comments

Comments
 (0)