Move togrill entites to sub devices (#151100)

This commit is contained in:
Joakim Plate
2025-08-27 01:17:33 +02:00
committed by GitHub
parent 5db5f36554
commit c8964494a2
12 changed files with 173 additions and 146 deletions

View File

@@ -32,7 +32,7 @@ from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.device_registry import CONNECTION_BLUETOOTH, DeviceInfo
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import CONF_PROBE_COUNT
from .const import CONF_PROBE_COUNT, DOMAIN
type ToGrillConfigEntry = ConfigEntry[ToGrillCoordinator]
@@ -74,13 +74,19 @@ class ToGrillCoordinator(DataUpdateCoordinator[dict[tuple[int, int | None], Pack
name="ToGrill",
update_interval=SCAN_INTERVAL,
)
self.address = config_entry.data[CONF_ADDRESS]
self.address: str = config_entry.data[CONF_ADDRESS]
self.data = {}
self.device_info = DeviceInfo(
connections={(CONNECTION_BLUETOOTH, self.address)}
)
self._packet_listeners: list[Callable[[Packet], None]] = []
device_registry = dr.async_get(self.hass)
device_registry.async_get_or_create(
config_entry_id=config_entry.entry_id,
connections={(CONNECTION_BLUETOOTH, self.address)},
identifiers={(DOMAIN, self.address)},
name=config_entry.data[CONF_MODEL],
model_id=config_entry.data[CONF_MODEL],
)
config_entry.async_on_unload(
async_register_callback(
hass,
@@ -90,6 +96,23 @@ class ToGrillCoordinator(DataUpdateCoordinator[dict[tuple[int, int | None], Pack
)
)
def get_device_info(self, probe_number: int | None) -> DeviceInfo:
"""Return device info."""
if probe_number is None:
return DeviceInfo(
identifiers={(DOMAIN, self.address)},
)
return DeviceInfo(
translation_key="probe",
translation_placeholders={
"probe_number": str(probe_number),
},
identifiers={(DOMAIN, f"{self.address}_{probe_number}")},
via_device=(DOMAIN, self.address),
)
@callback
def async_add_packet_listener(
self, packet_callback: Callable[[Packet], None]
@@ -132,9 +155,7 @@ class ToGrillCoordinator(DataUpdateCoordinator[dict[tuple[int, int | None], Pack
device_registry = dr.async_get(self.hass)
device_registry.async_get_or_create(
config_entry_id=config_entry.entry_id,
connections={(CONNECTION_BLUETOOTH, self.address)},
name=config_entry.data[CONF_MODEL],
model_id=config_entry.data[CONF_MODEL],
identifiers={(DOMAIN, self.address)},
sw_version=get_version_string(packet_a0),
)

View File

@@ -19,10 +19,12 @@ class ToGrillEntity(CoordinatorEntity[ToGrillCoordinator]):
_attr_has_entity_name = True
def __init__(self, coordinator: ToGrillCoordinator) -> None:
def __init__(
self, coordinator: ToGrillCoordinator, probe_number: int | None = None
) -> None:
"""Initialize coordinator entity."""
super().__init__(coordinator)
self._attr_device_info = coordinator.device_info
self._attr_device_info = coordinator.get_device_info(probe_number)
def _get_client(self) -> Client:
client = self.coordinator.client

View File

@@ -34,7 +34,7 @@ class ToGrillEventEntity(ToGrillEntity, EventEntity):
def __init__(self, coordinator: ToGrillCoordinator, probe_number: int) -> None:
"""Initialize the entity."""
super().__init__(coordinator=coordinator)
super().__init__(coordinator=coordinator, probe_number=probe_number)
self._attr_translation_key = "event"
self._attr_translation_placeholders = {"probe_number": f"{probe_number}"}

View File

@@ -39,6 +39,7 @@ class ToGrillNumberEntityDescription(NumberEntityDescription):
get_value: Callable[[ToGrillCoordinator], float | None]
set_packet: Callable[[float], PacketWrite]
entity_supported: Callable[[Mapping[str, Any]], bool] = lambda _: True
probe_number: int | None = None
def _get_temperature_target_description(
@@ -58,7 +59,6 @@ def _get_temperature_target_description(
return ToGrillNumberEntityDescription(
key=f"temperature_target_{probe_number}",
translation_key="temperature_target",
translation_placeholders={"probe_number": f"{probe_number}"},
device_class=NumberDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
native_min_value=0,
@@ -67,6 +67,7 @@ def _get_temperature_target_description(
set_packet=_set_packet,
get_value=_get_value,
entity_supported=lambda x: probe_number <= x[CONF_PROBE_COUNT],
probe_number=probe_number,
)
@@ -122,7 +123,7 @@ class ToGrillNumber(ToGrillEntity, NumberEntity):
) -> None:
"""Initialize."""
super().__init__(coordinator)
super().__init__(coordinator, probe_number=entity_description.probe_number)
self.entity_description = entity_description
self._attr_unique_id = f"{coordinator.address}_{entity_description.key}"

View File

@@ -34,6 +34,7 @@ class ToGrillSensorEntityDescription(SensorEntityDescription):
packet_type: int
packet_extract: Callable[[Packet], StateType]
entity_supported: Callable[[Mapping[str, Any]], bool] = lambda _: True
probe_number: int | None = None
def _get_temperature_description(probe_number: int):
@@ -51,8 +52,6 @@ def _get_temperature_description(probe_number: int):
return ToGrillSensorEntityDescription(
key=f"temperature_{probe_number}",
translation_key="temperature",
translation_placeholders={"probe_number": f"{probe_number}"},
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
state_class=SensorStateClass.MEASUREMENT,
@@ -60,6 +59,7 @@ def _get_temperature_description(probe_number: int):
packet_type=PacketA1Notify.type,
packet_extract=_get,
entity_supported=_supported,
probe_number=probe_number,
)
@@ -109,9 +109,8 @@ class ToGrillSensor(ToGrillEntity, SensorEntity):
) -> None:
"""Initialize sensor."""
super().__init__(coordinator)
super().__init__(coordinator, entity_description.probe_number)
self.entity_description = entity_description
self._attr_device_info = coordinator.device_info
self._attr_unique_id = f"{coordinator.address}_{entity_description.key}"
@property

View File

@@ -22,6 +22,11 @@
"failed_to_read_config": "Failed to read config from device"
}
},
"device": {
"probe": {
"name": "Probe {probe_number}"
}
},
"exceptions": {
"disconnected": {
"message": "The device is disconnected"
@@ -34,14 +39,9 @@
}
},
"entity": {
"sensor": {
"temperature": {
"name": "Probe {probe_number}"
}
},
"number": {
"temperature_target": {
"name": "Target {probe_number}"
"name": "Target temperature"
},
"alarm_interval": {
"name": "Alarm interval"
@@ -49,7 +49,7 @@
},
"event": {
"event": {
"name": "Probe {probe_number}",
"name": "Event",
"state_attributes": {
"event_type": {
"state": {

View File

@@ -1,5 +1,5 @@
# serializer version: 1
# name: test_setup[no_data][event.pro_05_probe_1-entry]
# name: test_setup[no_data][event.probe_1_event-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -27,7 +27,7 @@
'disabled_by': None,
'domain': 'event',
'entity_category': None,
'entity_id': 'event.pro_05_probe_1',
'entity_id': 'event.probe_1_event',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -39,7 +39,7 @@
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Probe 1',
'original_name': 'Event',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -49,7 +49,7 @@
'unit_of_measurement': None,
})
# ---
# name: test_setup[no_data][event.pro_05_probe_1-state]
# name: test_setup[no_data][event.probe_1_event-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'event_type': None,
@@ -67,17 +67,17 @@
'ambient_cool_down',
'probe_timer_alarm',
]),
'friendly_name': 'Pro-05 Probe 1',
'friendly_name': 'Probe 1 Event',
}),
'context': <ANY>,
'entity_id': 'event.pro_05_probe_1',
'entity_id': 'event.probe_1_event',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[no_data][event.pro_05_probe_2-entry]
# name: test_setup[no_data][event.probe_2_event-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -105,7 +105,7 @@
'disabled_by': None,
'domain': 'event',
'entity_category': None,
'entity_id': 'event.pro_05_probe_2',
'entity_id': 'event.probe_2_event',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -117,7 +117,7 @@
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Probe 2',
'original_name': 'Event',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -127,7 +127,7 @@
'unit_of_measurement': None,
})
# ---
# name: test_setup[no_data][event.pro_05_probe_2-state]
# name: test_setup[no_data][event.probe_2_event-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'event_type': None,
@@ -145,17 +145,17 @@
'ambient_cool_down',
'probe_timer_alarm',
]),
'friendly_name': 'Pro-05 Probe 2',
'friendly_name': 'Probe 2 Event',
}),
'context': <ANY>,
'entity_id': 'event.pro_05_probe_2',
'entity_id': 'event.probe_2_event',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[non_event_packet][event.pro_05_probe_1-entry]
# name: test_setup[non_event_packet][event.probe_1_event-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -183,7 +183,7 @@
'disabled_by': None,
'domain': 'event',
'entity_category': None,
'entity_id': 'event.pro_05_probe_1',
'entity_id': 'event.probe_1_event',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -195,7 +195,7 @@
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Probe 1',
'original_name': 'Event',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -205,7 +205,7 @@
'unit_of_measurement': None,
})
# ---
# name: test_setup[non_event_packet][event.pro_05_probe_1-state]
# name: test_setup[non_event_packet][event.probe_1_event-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'event_type': None,
@@ -223,17 +223,17 @@
'ambient_cool_down',
'probe_timer_alarm',
]),
'friendly_name': 'Pro-05 Probe 1',
'friendly_name': 'Probe 1 Event',
}),
'context': <ANY>,
'entity_id': 'event.pro_05_probe_1',
'entity_id': 'event.probe_1_event',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[non_event_packet][event.pro_05_probe_2-entry]
# name: test_setup[non_event_packet][event.probe_2_event-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -261,7 +261,7 @@
'disabled_by': None,
'domain': 'event',
'entity_category': None,
'entity_id': 'event.pro_05_probe_2',
'entity_id': 'event.probe_2_event',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -273,7 +273,7 @@
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Probe 2',
'original_name': 'Event',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -283,7 +283,7 @@
'unit_of_measurement': None,
})
# ---
# name: test_setup[non_event_packet][event.pro_05_probe_2-state]
# name: test_setup[non_event_packet][event.probe_2_event-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'event_type': None,
@@ -301,17 +301,17 @@
'ambient_cool_down',
'probe_timer_alarm',
]),
'friendly_name': 'Pro-05 Probe 2',
'friendly_name': 'Probe 2 Event',
}),
'context': <ANY>,
'entity_id': 'event.pro_05_probe_2',
'entity_id': 'event.probe_2_event',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[non_known_message][event.pro_05_probe_1-entry]
# name: test_setup[non_known_message][event.probe_1_event-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -339,7 +339,7 @@
'disabled_by': None,
'domain': 'event',
'entity_category': None,
'entity_id': 'event.pro_05_probe_1',
'entity_id': 'event.probe_1_event',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -351,7 +351,7 @@
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Probe 1',
'original_name': 'Event',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -361,7 +361,7 @@
'unit_of_measurement': None,
})
# ---
# name: test_setup[non_known_message][event.pro_05_probe_1-state]
# name: test_setup[non_known_message][event.probe_1_event-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'event_type': None,
@@ -379,17 +379,17 @@
'ambient_cool_down',
'probe_timer_alarm',
]),
'friendly_name': 'Pro-05 Probe 1',
'friendly_name': 'Probe 1 Event',
}),
'context': <ANY>,
'entity_id': 'event.pro_05_probe_1',
'entity_id': 'event.probe_1_event',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[non_known_message][event.pro_05_probe_2-entry]
# name: test_setup[non_known_message][event.probe_2_event-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -417,7 +417,7 @@
'disabled_by': None,
'domain': 'event',
'entity_category': None,
'entity_id': 'event.pro_05_probe_2',
'entity_id': 'event.probe_2_event',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -429,7 +429,7 @@
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Probe 2',
'original_name': 'Event',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -439,7 +439,7 @@
'unit_of_measurement': None,
})
# ---
# name: test_setup[non_known_message][event.pro_05_probe_2-state]
# name: test_setup[non_known_message][event.probe_2_event-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'event_type': None,
@@ -457,10 +457,10 @@
'ambient_cool_down',
'probe_timer_alarm',
]),
'friendly_name': 'Pro-05 Probe 2',
'friendly_name': 'Probe 2 Event',
}),
'context': <ANY>,
'entity_id': 'event.pro_05_probe_2',
'entity_id': 'event.probe_2_event',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,

View File

@@ -16,6 +16,10 @@
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'togrill',
'00000000-0000-0000-0000-000000000001',
),
}),
'labels': set({
}),

View File

@@ -58,7 +58,7 @@
'state': '0',
})
# ---
# name: test_setup[no_data][number.pro_05_target_1-entry]
# name: test_setup[no_data][number.probe_1_target_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -76,7 +76,7 @@
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.pro_05_target_1',
'entity_id': 'number.probe_1_target_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -88,7 +88,7 @@
}),
'original_device_class': <NumberDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Target 1',
'original_name': 'Target temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -98,11 +98,11 @@
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[no_data][number.pro_05_target_1-state]
# name: test_setup[no_data][number.probe_1_target_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Target 1',
'friendly_name': 'Probe 1 Target temperature',
'max': 250,
'min': 0,
'mode': <NumberMode.BOX: 'box'>,
@@ -110,14 +110,14 @@
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'number.pro_05_target_1',
'entity_id': 'number.probe_1_target_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[no_data][number.pro_05_target_2-entry]
# name: test_setup[no_data][number.probe_2_target_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -135,7 +135,7 @@
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.pro_05_target_2',
'entity_id': 'number.probe_2_target_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -147,7 +147,7 @@
}),
'original_device_class': <NumberDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Target 2',
'original_name': 'Target temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -157,11 +157,11 @@
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[no_data][number.pro_05_target_2-state]
# name: test_setup[no_data][number.probe_2_target_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Target 2',
'friendly_name': 'Probe 2 Target temperature',
'max': 250,
'min': 0,
'mode': <NumberMode.BOX: 'box'>,
@@ -169,7 +169,7 @@
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'number.pro_05_target_2',
'entity_id': 'number.probe_2_target_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
@@ -235,7 +235,7 @@
'state': '5',
})
# ---
# name: test_setup[one_probe_with_target_alarm][number.pro_05_target_1-entry]
# name: test_setup[one_probe_with_target_alarm][number.probe_1_target_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -253,7 +253,7 @@
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.pro_05_target_1',
'entity_id': 'number.probe_1_target_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -265,7 +265,7 @@
}),
'original_device_class': <NumberDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Target 1',
'original_name': 'Target temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -275,11 +275,11 @@
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[one_probe_with_target_alarm][number.pro_05_target_1-state]
# name: test_setup[one_probe_with_target_alarm][number.probe_1_target_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Target 1',
'friendly_name': 'Probe 1 Target temperature',
'max': 250,
'min': 0,
'mode': <NumberMode.BOX: 'box'>,
@@ -287,14 +287,14 @@
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'number.pro_05_target_1',
'entity_id': 'number.probe_1_target_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '50.0',
})
# ---
# name: test_setup[one_probe_with_target_alarm][number.pro_05_target_2-entry]
# name: test_setup[one_probe_with_target_alarm][number.probe_2_target_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -312,7 +312,7 @@
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.pro_05_target_2',
'entity_id': 'number.probe_2_target_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -324,7 +324,7 @@
}),
'original_device_class': <NumberDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Target 2',
'original_name': 'Target temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
@@ -334,11 +334,11 @@
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[one_probe_with_target_alarm][number.pro_05_target_2-state]
# name: test_setup[one_probe_with_target_alarm][number.probe_2_target_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Target 2',
'friendly_name': 'Probe 2 Target temperature',
'max': 250,
'min': 0,
'mode': <NumberMode.BOX: 'box'>,
@@ -346,7 +346,7 @@
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'number.pro_05_target_2',
'entity_id': 'number.probe_2_target_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,

View File

@@ -55,7 +55,7 @@
'state': '45',
})
# ---
# name: test_setup[battery][sensor.pro_05_probe_1-entry]
# name: test_setup[battery][sensor.probe_1_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -70,7 +70,7 @@
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.pro_05_probe_1',
'entity_id': 'sensor.probe_1_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -85,33 +85,33 @@
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Probe 1',
'original_name': 'Temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'temperature',
'translation_key': None,
'unique_id': '00000000-0000-0000-0000-000000000001_temperature_1',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[battery][sensor.pro_05_probe_1-state]
# name: test_setup[battery][sensor.probe_1_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Probe 1',
'friendly_name': 'Probe 1 Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.pro_05_probe_1',
'entity_id': 'sensor.probe_1_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unavailable',
})
# ---
# name: test_setup[battery][sensor.pro_05_probe_2-entry]
# name: test_setup[battery][sensor.probe_2_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -126,7 +126,7 @@
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.pro_05_probe_2',
'entity_id': 'sensor.probe_2_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -141,26 +141,26 @@
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Probe 2',
'original_name': 'Temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'temperature',
'translation_key': None,
'unique_id': '00000000-0000-0000-0000-000000000001_temperature_2',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[battery][sensor.pro_05_probe_2-state]
# name: test_setup[battery][sensor.probe_2_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Probe 2',
'friendly_name': 'Probe 2 Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.pro_05_probe_2',
'entity_id': 'sensor.probe_2_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
@@ -223,7 +223,7 @@
'state': '0',
})
# ---
# name: test_setup[no_data][sensor.pro_05_probe_1-entry]
# name: test_setup[no_data][sensor.probe_1_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -238,7 +238,7 @@
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.pro_05_probe_1',
'entity_id': 'sensor.probe_1_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -253,33 +253,33 @@
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Probe 1',
'original_name': 'Temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'temperature',
'translation_key': None,
'unique_id': '00000000-0000-0000-0000-000000000001_temperature_1',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[no_data][sensor.pro_05_probe_1-state]
# name: test_setup[no_data][sensor.probe_1_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Probe 1',
'friendly_name': 'Probe 1 Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.pro_05_probe_1',
'entity_id': 'sensor.probe_1_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unavailable',
})
# ---
# name: test_setup[no_data][sensor.pro_05_probe_2-entry]
# name: test_setup[no_data][sensor.probe_2_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -294,7 +294,7 @@
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.pro_05_probe_2',
'entity_id': 'sensor.probe_2_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -309,26 +309,26 @@
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Probe 2',
'original_name': 'Temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'temperature',
'translation_key': None,
'unique_id': '00000000-0000-0000-0000-000000000001_temperature_2',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[no_data][sensor.pro_05_probe_2-state]
# name: test_setup[no_data][sensor.probe_2_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Probe 2',
'friendly_name': 'Probe 2 Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.pro_05_probe_2',
'entity_id': 'sensor.probe_2_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
@@ -391,7 +391,7 @@
'state': '0',
})
# ---
# name: test_setup[temp_data][sensor.pro_05_probe_1-entry]
# name: test_setup[temp_data][sensor.probe_1_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -406,7 +406,7 @@
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.pro_05_probe_1',
'entity_id': 'sensor.probe_1_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -421,33 +421,33 @@
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Probe 1',
'original_name': 'Temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'temperature',
'translation_key': None,
'unique_id': '00000000-0000-0000-0000-000000000001_temperature_1',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[temp_data][sensor.pro_05_probe_1-state]
# name: test_setup[temp_data][sensor.probe_1_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Probe 1',
'friendly_name': 'Probe 1 Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.pro_05_probe_1',
'entity_id': 'sensor.probe_1_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '10',
})
# ---
# name: test_setup[temp_data][sensor.pro_05_probe_2-entry]
# name: test_setup[temp_data][sensor.probe_2_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -462,7 +462,7 @@
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.pro_05_probe_2',
'entity_id': 'sensor.probe_2_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -477,26 +477,26 @@
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Probe 2',
'original_name': 'Temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'temperature',
'translation_key': None,
'unique_id': '00000000-0000-0000-0000-000000000001_temperature_2',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[temp_data][sensor.pro_05_probe_2-state]
# name: test_setup[temp_data][sensor.probe_2_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Probe 2',
'friendly_name': 'Probe 2 Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.pro_05_probe_2',
'entity_id': 'sensor.probe_2_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
@@ -559,7 +559,7 @@
'state': '0',
})
# ---
# name: test_setup[temp_data_missing_probe][sensor.pro_05_probe_1-entry]
# name: test_setup[temp_data_missing_probe][sensor.probe_1_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -574,7 +574,7 @@
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.pro_05_probe_1',
'entity_id': 'sensor.probe_1_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -589,33 +589,33 @@
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Probe 1',
'original_name': 'Temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'temperature',
'translation_key': None,
'unique_id': '00000000-0000-0000-0000-000000000001_temperature_1',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[temp_data_missing_probe][sensor.pro_05_probe_1-state]
# name: test_setup[temp_data_missing_probe][sensor.probe_1_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Probe 1',
'friendly_name': 'Probe 1 Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.pro_05_probe_1',
'entity_id': 'sensor.probe_1_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '10',
})
# ---
# name: test_setup[temp_data_missing_probe][sensor.pro_05_probe_2-entry]
# name: test_setup[temp_data_missing_probe][sensor.probe_2_temperature-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -630,7 +630,7 @@
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.pro_05_probe_2',
'entity_id': 'sensor.probe_2_temperature',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
@@ -645,26 +645,26 @@
}),
'original_device_class': <SensorDeviceClass.TEMPERATURE: 'temperature'>,
'original_icon': None,
'original_name': 'Probe 2',
'original_name': 'Temperature',
'platform': 'togrill',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'temperature',
'translation_key': None,
'unique_id': '00000000-0000-0000-0000-000000000001_temperature_2',
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
})
# ---
# name: test_setup[temp_data_missing_probe][sensor.pro_05_probe_2-state]
# name: test_setup[temp_data_missing_probe][sensor.probe_2_temperature-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'temperature',
'friendly_name': 'Pro-05 Probe 2',
'friendly_name': 'Probe 2 Temperature',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': <UnitOfTemperature.CELSIUS: '°C'>,
}),
'context': <ANY>,
'entity_id': 'sensor.pro_05_probe_2',
'entity_id': 'sensor.probe_2_temperature',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,

View File

@@ -68,11 +68,11 @@ async def test_events(
mock_client.mocked_notify(PacketA5Notify(probe=1, message=message))
state = hass.states.get("event.pro_05_probe_2")
state = hass.states.get("event.probe_2_event")
assert state
assert state.state == STATE_UNKNOWN
state = hass.states.get("event.pro_05_probe_1")
state = hass.states.get("event.probe_1_event")
assert state
assert state.state == "2023-10-21T00:00:00.000+00:00"
assert state.attributes.get(ATTR_EVENT_TYPE) == slugify(message.name)

View File

@@ -87,7 +87,7 @@ async def test_setup(
temperature_1=50.0,
),
],
"number.pro_05_target_1",
"number.probe_1_target_temperature",
100.0,
PacketA301Write(probe=1, target=100),
id="probe",
@@ -100,7 +100,7 @@ async def test_setup(
temperature_1=50.0,
),
],
"number.pro_05_target_1",
"number.probe_1_target_temperature",
0.0,
PacketA301Write(probe=1, target=None),
id="probe_clear",
@@ -203,7 +203,7 @@ async def test_set_number_write_error(
ATTR_VALUE: 100,
},
target={
ATTR_ENTITY_ID: "number.pro_05_target_1",
ATTR_ENTITY_ID: "number.probe_1_target_temperature",
},
blocking=True,
)
@@ -237,7 +237,7 @@ async def test_set_number_disconnected(
ATTR_VALUE: 100,
},
target={
ATTR_ENTITY_ID: "number.pro_05_target_1",
ATTR_ENTITY_ID: "number.probe_1_target_temperature",
},
blocking=True,
)