Add consumables for tplink tapo vacuums (#136510)
Co-authored-by: Steven B <51370195+sdb9696@users.noreply.github.com> Co-authored-by: J. Nick Koston <nick@koston.org>pull/135784/head
parent
6d91f8d86c
commit
c7176f6849
|
@ -72,6 +72,21 @@ BUTTON_DESCRIPTIONS: Final = [
|
|||
),
|
||||
TPLinkButtonEntityDescription(key="pair"),
|
||||
TPLinkButtonEntityDescription(key="unpair"),
|
||||
TPLinkButtonEntityDescription(
|
||||
key="main_brush_reset",
|
||||
),
|
||||
TPLinkButtonEntityDescription(
|
||||
key="side_brush_reset",
|
||||
),
|
||||
TPLinkButtonEntityDescription(
|
||||
key="sensor_reset",
|
||||
),
|
||||
TPLinkButtonEntityDescription(
|
||||
key="filter_reset",
|
||||
),
|
||||
TPLinkButtonEntityDescription(
|
||||
key="charging_contacts_reset",
|
||||
),
|
||||
]
|
||||
|
||||
BUTTON_DESCRIPTIONS_MAP = {desc.key: desc for desc in BUTTON_DESCRIPTIONS}
|
||||
|
|
|
@ -32,7 +32,20 @@
|
|||
},
|
||||
"tilt_down": {
|
||||
"default": "mdi:chevron-down"
|
||||
}
|
||||
},
|
||||
"main_brush_reset": {
|
||||
"default": "mdi:brush"
|
||||
},
|
||||
"side_brush_reset": {
|
||||
"default": "mdi:brush"
|
||||
},
|
||||
"sensor_reset": {
|
||||
"default": "mdi:eye-outline"
|
||||
},
|
||||
"filter_reset": {
|
||||
"default": "mdi:air-filter"
|
||||
},
|
||||
"charging_contacts_reset": {}
|
||||
},
|
||||
"select": {
|
||||
"light_preset": {
|
||||
|
@ -134,6 +147,32 @@
|
|||
"water_alert_timestamp": {
|
||||
"default": "mdi:clock-alert-outline"
|
||||
},
|
||||
"main_brush_remaining": {
|
||||
"default": "mdi:brush"
|
||||
},
|
||||
"main_brush_used": {
|
||||
"default": "mdi:brush"
|
||||
},
|
||||
"side_brush_remaining": {
|
||||
"default": "mdi:brush"
|
||||
},
|
||||
"side_brush_used": {
|
||||
"default": "mdi:brush"
|
||||
},
|
||||
"filter_remaining": {
|
||||
"default": "mdi:air-filter"
|
||||
},
|
||||
"filter_used": {
|
||||
"default": "mdi:air-filter"
|
||||
},
|
||||
"sensor_remaining": {
|
||||
"default": "mdi:eye-outline"
|
||||
},
|
||||
"sensor_used": {
|
||||
"default": "mdi:eye-outline"
|
||||
},
|
||||
"charging_contacts_remaining": {},
|
||||
"charging_contacts_used": {},
|
||||
"vacuum_error": {
|
||||
"default": "mdi:alert-circle"
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ from __future__ import annotations
|
|||
|
||||
from collections.abc import Callable
|
||||
from dataclasses import dataclass
|
||||
from operator import methodcaller
|
||||
from typing import TYPE_CHECKING, Any, cast
|
||||
|
||||
from kasa import Feature
|
||||
|
@ -16,6 +17,7 @@ from homeassistant.components.sensor import (
|
|||
SensorEntityDescription,
|
||||
SensorStateClass,
|
||||
)
|
||||
from homeassistant.const import UnitOfTime
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
|
||||
|
@ -37,6 +39,8 @@ class TPLinkSensorEntityDescription(
|
|||
# Coordinator is used to centralize the data updates
|
||||
PARALLEL_UPDATES = 0
|
||||
|
||||
_TOTAL_SECONDS_METHOD_CALLER = methodcaller("total_seconds")
|
||||
|
||||
SENSOR_DESCRIPTIONS: tuple[TPLinkSensorEntityDescription, ...] = (
|
||||
TPLinkSensorEntityDescription(
|
||||
key="current_consumption",
|
||||
|
@ -120,6 +124,76 @@ SENSOR_DESCRIPTIONS: tuple[TPLinkSensorEntityDescription, ...] = (
|
|||
TPLinkSensorEntityDescription(
|
||||
key="alarm_source",
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="main_brush_remaining",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="main_brush_used",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="side_brush_remaining",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="side_brush_used",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="filter_remaining",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="filter_used",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="sensor_remaining",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="sensor_used",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="charging_contacts_remaining",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="charging_contacts_used",
|
||||
device_class=SensorDeviceClass.DURATION,
|
||||
native_unit_of_measurement=UnitOfTime.SECONDS,
|
||||
suggested_unit_of_measurement=UnitOfTime.HOURS,
|
||||
convert_fn=_TOTAL_SECONDS_METHOD_CALLER,
|
||||
),
|
||||
TPLinkSensorEntityDescription(
|
||||
key="vacuum_error",
|
||||
device_class=SensorDeviceClass.ENUM,
|
||||
|
|
|
@ -147,6 +147,21 @@
|
|||
},
|
||||
"unpair": {
|
||||
"name": "Unpair device"
|
||||
},
|
||||
"main_brush_reset": {
|
||||
"name": "Reset main brush consumable"
|
||||
},
|
||||
"side_brush_reset": {
|
||||
"name": "Reset side brush consumable"
|
||||
},
|
||||
"sensor_reset": {
|
||||
"name": "Reset sensor consumable"
|
||||
},
|
||||
"filter_reset": {
|
||||
"name": "Reset filter consumable"
|
||||
},
|
||||
"charging_contacts_reset": {
|
||||
"name": "Reset charging contacts consumable"
|
||||
}
|
||||
},
|
||||
"camera": {
|
||||
|
@ -202,6 +217,36 @@
|
|||
"alarm_source": {
|
||||
"name": "Alarm source"
|
||||
},
|
||||
"main_brush_remaining": {
|
||||
"name": "Main brush remaining"
|
||||
},
|
||||
"main_brush_used": {
|
||||
"name": "Main brush used"
|
||||
},
|
||||
"side_brush_remaining": {
|
||||
"name": "Side brush remaining"
|
||||
},
|
||||
"side_brush_used": {
|
||||
"name": "Side brush used"
|
||||
},
|
||||
"filter_remaining": {
|
||||
"name": "Filter remaining"
|
||||
},
|
||||
"filter_used": {
|
||||
"name": "Filter used"
|
||||
},
|
||||
"sensor_remaining": {
|
||||
"name": "Sensor remaining"
|
||||
},
|
||||
"sensor_used": {
|
||||
"name": "Sensor used"
|
||||
},
|
||||
"charging_contacts_remaining": {
|
||||
"name": "Charging contacts remaining"
|
||||
},
|
||||
"charging_contacts_used": {
|
||||
"name": "Charging contacts used"
|
||||
},
|
||||
"vacuum_error": {
|
||||
"name": "Error",
|
||||
"state": {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
from collections import namedtuple
|
||||
from dataclasses import replace
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Any
|
||||
from unittest.mock import AsyncMock, MagicMock, patch
|
||||
|
||||
|
@ -279,6 +279,8 @@ def _mocked_feature(
|
|||
if enum_type := fixture.get("enum_type"):
|
||||
val = FIXTURE_ENUM_TYPES[enum_type](fixture["value"])
|
||||
fixture["value"] = val
|
||||
if timedelta_type := fixture.get("timedelta_type"):
|
||||
fixture["value"] = timedelta(**{timedelta_type: fixture["value"]})
|
||||
|
||||
else:
|
||||
assert require_fixture is False, (
|
||||
|
|
|
@ -407,5 +407,90 @@
|
|||
"value": "<Action>",
|
||||
"type": "Action",
|
||||
"category": "Debug"
|
||||
},
|
||||
"main_brush_reset": {
|
||||
"value": "<Action>",
|
||||
"type": "Action",
|
||||
"category": "Debug"
|
||||
},
|
||||
"side_brush_reset": {
|
||||
"value": "<Action>",
|
||||
"type": "Action",
|
||||
"category": "Debug"
|
||||
},
|
||||
"sensor_reset": {
|
||||
"value": "<Action>",
|
||||
"type": "Action",
|
||||
"category": "Debug"
|
||||
},
|
||||
"filter_reset": {
|
||||
"value": "<Action>",
|
||||
"type": "Action",
|
||||
"category": "Debug"
|
||||
},
|
||||
"charging_contacts_reset": {
|
||||
"value": "<Action>",
|
||||
"type": "Action",
|
||||
"category": "Debug"
|
||||
},
|
||||
"main_brush_remaining": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
},
|
||||
"main_brush_used": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
},
|
||||
"side_brush_remaining": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
},
|
||||
"side_brush_used": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
},
|
||||
"filter_remaining": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
},
|
||||
"filter_used": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
},
|
||||
"sensor_remaining": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
},
|
||||
"sensor_used": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
},
|
||||
"charging_contacts_remaining": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
},
|
||||
"charging_contacts_used": {
|
||||
"value": 360,
|
||||
"type": "Sensor",
|
||||
"category": "Debug",
|
||||
"timedelta_type": "minutes"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -137,6 +137,171 @@
|
|||
'state': 'unknown',
|
||||
})
|
||||
# ---
|
||||
# name: test_states[button.my_device_reset_charging_contacts_consumable-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'button',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'button.my_device_reset_charging_contacts_consumable',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
}),
|
||||
'original_device_class': None,
|
||||
'original_icon': None,
|
||||
'original_name': 'Reset charging contacts consumable',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'charging_contacts_reset',
|
||||
'unique_id': '123456789ABCDEFGH_charging_contacts_reset',
|
||||
'unit_of_measurement': None,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[button.my_device_reset_filter_consumable-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'button',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'button.my_device_reset_filter_consumable',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
}),
|
||||
'original_device_class': None,
|
||||
'original_icon': None,
|
||||
'original_name': 'Reset filter consumable',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'filter_reset',
|
||||
'unique_id': '123456789ABCDEFGH_filter_reset',
|
||||
'unit_of_measurement': None,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[button.my_device_reset_main_brush_consumable-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'button',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'button.my_device_reset_main_brush_consumable',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
}),
|
||||
'original_device_class': None,
|
||||
'original_icon': None,
|
||||
'original_name': 'Reset main brush consumable',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'main_brush_reset',
|
||||
'unique_id': '123456789ABCDEFGH_main_brush_reset',
|
||||
'unit_of_measurement': None,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[button.my_device_reset_sensor_consumable-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'button',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'button.my_device_reset_sensor_consumable',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
}),
|
||||
'original_device_class': None,
|
||||
'original_icon': None,
|
||||
'original_name': 'Reset sensor consumable',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'sensor_reset',
|
||||
'unique_id': '123456789ABCDEFGH_sensor_reset',
|
||||
'unit_of_measurement': None,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[button.my_device_reset_side_brush_consumable-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'button',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'button.my_device_reset_side_brush_consumable',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
}),
|
||||
'original_device_class': None,
|
||||
'original_icon': None,
|
||||
'original_name': 'Reset side brush consumable',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'side_brush_reset',
|
||||
'unique_id': '123456789ABCDEFGH_side_brush_reset',
|
||||
'unit_of_measurement': None,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[button.my_device_restart-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
|
|
|
@ -166,6 +166,78 @@
|
|||
'state': '85',
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_charging_contacts_remaining-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_charging_contacts_remaining',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Charging contacts remaining',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'charging_contacts_remaining',
|
||||
'unique_id': '123456789ABCDEFGH_charging_contacts_remaining',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_charging_contacts_used-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_charging_contacts_used',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Charging contacts used',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'charging_contacts_used',
|
||||
'unique_id': '123456789ABCDEFGH_charging_contacts_used',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_current-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
|
@ -383,6 +455,78 @@
|
|||
'state': 'ok',
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_filter_remaining-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_filter_remaining',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Filter remaining',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'filter_remaining',
|
||||
'unique_id': '123456789ABCDEFGH_filter_remaining',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_filter_used-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_filter_used',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Filter used',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'filter_used',
|
||||
'unique_id': '123456789ABCDEFGH_filter_used',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_humidity-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
|
@ -481,6 +625,78 @@
|
|||
'state': '2024-06-24T09:03:11+00:00',
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_main_brush_remaining-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_main_brush_remaining',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Main brush remaining',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'main_brush_remaining',
|
||||
'unique_id': '123456789ABCDEFGH_main_brush_remaining',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_main_brush_used-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_main_brush_used',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Main brush used',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'main_brush_used',
|
||||
'unique_id': '123456789ABCDEFGH_main_brush_used',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_on_since-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
|
@ -547,6 +763,150 @@
|
|||
'unit_of_measurement': '%',
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_sensor_remaining-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_sensor_remaining',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Sensor remaining',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'sensor_remaining',
|
||||
'unique_id': '123456789ABCDEFGH_sensor_remaining',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_sensor_used-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_sensor_used',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Sensor used',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'sensor_used',
|
||||
'unique_id': '123456789ABCDEFGH_sensor_used',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_side_brush_remaining-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_side_brush_remaining',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Side brush remaining',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'side_brush_remaining',
|
||||
'unique_id': '123456789ABCDEFGH_side_brush_remaining',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_side_brush_used-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
}),
|
||||
'area_id': None,
|
||||
'capabilities': None,
|
||||
'config_entry_id': <ANY>,
|
||||
'device_class': None,
|
||||
'device_id': <ANY>,
|
||||
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
|
||||
'domain': 'sensor',
|
||||
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
|
||||
'entity_id': 'sensor.my_device_side_brush_used',
|
||||
'has_entity_name': True,
|
||||
'hidden_by': None,
|
||||
'icon': None,
|
||||
'id': <ANY>,
|
||||
'labels': set({
|
||||
}),
|
||||
'name': None,
|
||||
'options': dict({
|
||||
'sensor.private': dict({
|
||||
'suggested_unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
}),
|
||||
}),
|
||||
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
|
||||
'original_icon': None,
|
||||
'original_name': 'Side brush used',
|
||||
'platform': 'tplink',
|
||||
'previous_unique_id': None,
|
||||
'supported_features': 0,
|
||||
'translation_key': 'side_brush_used',
|
||||
'unique_id': '123456789ABCDEFGH_side_brush_used',
|
||||
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
|
||||
})
|
||||
# ---
|
||||
# name: test_states[sensor.my_device_signal_level-entry]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
|
|
Loading…
Reference in New Issue