diff --git a/homeassistant/components/roomba/entity.py b/homeassistant/components/roomba/entity.py index eb1b3696102..71ebab3ae43 100644 --- a/homeassistant/components/roomba/entity.py +++ b/homeassistant/components/roomba/entity.py @@ -66,6 +66,16 @@ class IRobotEntity(Entity): """Return the battery stats.""" return self.vacuum_state.get("bbchg3", {}) + @property + def tank_level(self) -> int | None: + """Return the tank level.""" + return self.vacuum_state.get("tankLvl") + + @property + def dock_tank_level(self) -> int | None: + """Return the dock tank level.""" + return self.vacuum_state.get("dock", {}).get("tankLvl") + @property def last_mission(self): """Return last mission start time.""" diff --git a/homeassistant/components/roomba/icons.json b/homeassistant/components/roomba/icons.json index 8466ecb51e3..9cf2fdc9836 100644 --- a/homeassistant/components/roomba/icons.json +++ b/homeassistant/components/roomba/icons.json @@ -35,6 +35,12 @@ }, "last_mission": { "default": "mdi:calendar-clock" + }, + "tank_level": { + "default": "mdi:water" + }, + "dock_tank_level": { + "default": "mdi:water" } } } diff --git a/homeassistant/components/roomba/sensor.py b/homeassistant/components/roomba/sensor.py index ae82424ec34..803319e0e84 100644 --- a/homeassistant/components/roomba/sensor.py +++ b/homeassistant/components/roomba/sensor.py @@ -18,7 +18,7 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.typing import StateType from .const import DOMAIN -from .entity import IRobotEntity +from .entity import IRobotEntity, roomba_reported_state from .models import RoombaData @@ -29,6 +29,16 @@ class RoombaSensorEntityDescription(SensorEntityDescription): value_fn: Callable[[IRobotEntity], StateType] +DOCK_SENSORS: list[RoombaSensorEntityDescription] = [ + RoombaSensorEntityDescription( + key="dock_tank_level", + translation_key="dock_tank_level", + native_unit_of_measurement=PERCENTAGE, + entity_category=EntityCategory.DIAGNOSTIC, + value_fn=lambda self: self.dock_tank_level, + ), +] + SENSORS: list[RoombaSensorEntityDescription] = [ RoombaSensorEntityDescription( key="battery", @@ -37,6 +47,13 @@ SENSORS: list[RoombaSensorEntityDescription] = [ entity_category=EntityCategory.DIAGNOSTIC, value_fn=lambda self: self.vacuum_state.get("batPct"), ), + RoombaSensorEntityDescription( + key="tank_level", + translation_key="tank_level", + native_unit_of_measurement=PERCENTAGE, + entity_category=EntityCategory.DIAGNOSTIC, + value_fn=lambda self: self.tank_level, + ), RoombaSensorEntityDescription( key="battery_cycles", translation_key="battery_cycles", @@ -132,8 +149,16 @@ async def async_setup_entry( roomba = domain_data.roomba blid = domain_data.blid + sensor_list: list[RoombaSensorEntityDescription] = SENSORS + + has_dock: bool = len(roomba_reported_state(roomba).get("dock", {})) > 0 + + if has_dock: + sensor_list.extend(DOCK_SENSORS) + async_add_entities( - RoombaSensor(roomba, blid, entity_description) for entity_description in SENSORS + RoombaSensor(roomba, blid, entity_description) + for entity_description in sensor_list ) diff --git a/homeassistant/components/roomba/strings.json b/homeassistant/components/roomba/strings.json index 0db70a6a141..700b2ef6395 100644 --- a/homeassistant/components/roomba/strings.json +++ b/homeassistant/components/roomba/strings.json @@ -90,6 +90,12 @@ }, "last_mission": { "name": "Last mission start time" + }, + "tank_level": { + "name": "Tank level" + }, + "dock_tank_level": { + "name": "Dock tank level" } } } diff --git a/homeassistant/components/roomba/vacuum.py b/homeassistant/components/roomba/vacuum.py index 0c24301f2af..d955c7a7ecf 100644 --- a/homeassistant/components/roomba/vacuum.py +++ b/homeassistant/components/roomba/vacuum.py @@ -403,11 +403,16 @@ class BraavaJet(IRobotVacuum): detected_pad = state.get("detectedPad") mop_ready = state.get("mopReady", {}) lid_closed = mop_ready.get("lidClosed") - tank_present = mop_ready.get("tankPresent") + tank_present = mop_ready.get("tankPresent") or state.get("tankPresent") tank_level = state.get("tankLvl") state_attrs[ATTR_DETECTED_PAD] = detected_pad state_attrs[ATTR_LID_CLOSED] = lid_closed state_attrs[ATTR_TANK_PRESENT] = tank_present state_attrs[ATTR_TANK_LEVEL] = tank_level + bin_raw_state = state.get("bin", {}) + if bin_raw_state.get("present") is not None: + state_attrs[ATTR_BIN_PRESENT] = bin_raw_state.get("present") + if bin_raw_state.get("full") is not None: + state_attrs[ATTR_BIN_FULL] = bin_raw_state.get("full") return state_attrs diff --git a/tests/components/roomba/conftest.py b/tests/components/roomba/conftest.py new file mode 100644 index 00000000000..aa89ff9f56a --- /dev/null +++ b/tests/components/roomba/conftest.py @@ -0,0 +1,62 @@ +"""Fixtures for the Roomba tests.""" + +from collections.abc import Generator +from unittest.mock import AsyncMock, patch + +import pytest +from roombapy import Roomba + +from homeassistant.components.roomba import CONF_BLID, CONF_CONTINUOUS, DOMAIN +from homeassistant.const import CONF_DELAY, CONF_HOST, CONF_PASSWORD + +from tests.common import MockConfigEntry + + +@pytest.fixture +def mock_config_entry() -> MockConfigEntry: + """Return the default mocked config entry.""" + return MockConfigEntry( + domain=DOMAIN, + data={ + CONF_HOST: "192.168.0.30", + CONF_BLID: "blid123", + CONF_PASSWORD: "pass123", + }, + options={ + CONF_CONTINUOUS: True, + CONF_DELAY: 10, + }, + unique_id="blid123", + ) + + +@pytest.fixture +def mock_roomba() -> Generator[AsyncMock]: + """Build a fixture for the 17Track API.""" + mock_roomba = AsyncMock(spec=Roomba, autospec=True) + mock_roomba.master_state = { + "state": { + "reported": { + "cap": {"pose": 1}, + "cleanMissionStatus": {"cycle": "none", "phase": "charge"}, + "pose": {"point": {"x": 1, "y": 2}, "theta": 90}, + "dock": {"tankLvl": 99}, + "hwPartsRev": { + "navSerialNo": "12345", + "wlan0HwAddr": "AA:BB:CC:DD:EE:FF", + }, + "sku": "980", + "name": "Test Roomba", + "softwareVer": "3.2.1", + "hardwareRev": "1.0", + "bin": {"present": True, "full": False}, + } + } + } + mock_roomba.roomba_connected = True + + with patch( + "homeassistant.components.roomba.RoombaFactory.create_roomba", + return_value=mock_roomba, + ): + yield mock_roomba diff --git a/tests/components/roomba/snapshots/test_sensor.ambr b/tests/components/roomba/snapshots/test_sensor.ambr new file mode 100644 index 00000000000..19a1ae58d0e --- /dev/null +++ b/tests/components/roomba/snapshots/test_sensor.ambr @@ -0,0 +1,659 @@ +# serializer version: 1 +# name: test_entities[sensor.test_roomba_average_mission_time-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_average_mission_time', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Average mission time', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'average_mission_time', + 'unique_id': 'average_mission_time_blid123', + 'unit_of_measurement': , + }) +# --- +# name: test_entities[sensor.test_roomba_average_mission_time-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Average mission time', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.test_roomba_average_mission_time', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_battery-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_battery', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Battery', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': None, + 'unique_id': 'battery_blid123', + 'unit_of_measurement': '%', + }) +# --- +# name: test_entities[sensor.test_roomba_battery-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'battery', + 'friendly_name': 'Test Roomba Battery', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.test_roomba_battery', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_battery_cycles-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_battery_cycles', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Battery cycles', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'battery_cycles', + 'unique_id': 'battery_cycles_blid123', + 'unit_of_measurement': None, + }) +# --- +# name: test_entities[sensor.test_roomba_battery_cycles-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Battery cycles', + 'state_class': , + }), + 'context': , + 'entity_id': 'sensor.test_roomba_battery_cycles', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_canceled_missions-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_canceled_missions', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Canceled missions', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'canceled_missions', + 'unique_id': 'canceled_missions_blid123', + 'unit_of_measurement': 'Missions', + }) +# --- +# name: test_entities[sensor.test_roomba_canceled_missions-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Canceled missions', + 'state_class': , + 'unit_of_measurement': 'Missions', + }), + 'context': , + 'entity_id': 'sensor.test_roomba_canceled_missions', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_dock_tank_level-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_dock_tank_level', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Dock tank level', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'dock_tank_level', + 'unique_id': 'dock_tank_level_blid123', + 'unit_of_measurement': '%', + }) +# --- +# name: test_entities[sensor.test_roomba_dock_tank_level-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Dock tank level', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.test_roomba_dock_tank_level', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '99', + }) +# --- +# name: test_entities[sensor.test_roomba_failed_missions-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_failed_missions', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Failed missions', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'failed_missions', + 'unique_id': 'failed_missions_blid123', + 'unit_of_measurement': 'Missions', + }) +# --- +# name: test_entities[sensor.test_roomba_failed_missions-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Failed missions', + 'state_class': , + 'unit_of_measurement': 'Missions', + }), + 'context': , + 'entity_id': 'sensor.test_roomba_failed_missions', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_last_mission_start_time-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_last_mission_start_time', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Last mission start time', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'last_mission', + 'unique_id': 'last_mission_blid123', + 'unit_of_measurement': None, + }) +# --- +# name: test_entities[sensor.test_roomba_last_mission_start_time-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'timestamp', + 'friendly_name': 'Test Roomba Last mission start time', + }), + 'context': , + 'entity_id': 'sensor.test_roomba_last_mission_start_time', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_scrubs-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_scrubs', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Scrubs', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'scrubs_count', + 'unique_id': 'scrubs_count_blid123', + 'unit_of_measurement': 'Scrubs', + }) +# --- +# name: test_entities[sensor.test_roomba_scrubs-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Scrubs', + 'state_class': , + 'unit_of_measurement': 'Scrubs', + }), + 'context': , + 'entity_id': 'sensor.test_roomba_scrubs', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_successful_missions-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_successful_missions', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Successful missions', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'successful_missions', + 'unique_id': 'successful_missions_blid123', + 'unit_of_measurement': 'Missions', + }) +# --- +# name: test_entities[sensor.test_roomba_successful_missions-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Successful missions', + 'state_class': , + 'unit_of_measurement': 'Missions', + }), + 'context': , + 'entity_id': 'sensor.test_roomba_successful_missions', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_tank_level-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_tank_level', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Tank level', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'tank_level', + 'unique_id': 'tank_level_blid123', + 'unit_of_measurement': '%', + }) +# --- +# name: test_entities[sensor.test_roomba_tank_level-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Tank level', + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.test_roomba_tank_level', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_total_cleaned_area-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_total_cleaned_area', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Total cleaned area', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'total_cleaned_area', + 'unique_id': 'total_cleaned_area_blid123', + 'unit_of_measurement': , + }) +# --- +# name: test_entities[sensor.test_roomba_total_cleaned_area-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Total cleaned area', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.test_roomba_total_cleaned_area', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_total_cleaning_time-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_total_cleaning_time', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Total cleaning time', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'total_cleaning_time', + 'unique_id': 'total_cleaning_time_blid123', + 'unit_of_measurement': , + }) +# --- +# name: test_entities[sensor.test_roomba_total_cleaning_time-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Total cleaning time', + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.test_roomba_total_cleaning_time', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_entities[sensor.test_roomba_total_missions-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.test_roomba_total_missions', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Total missions', + 'platform': 'roomba', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'total_missions', + 'unique_id': 'total_missions_blid123', + 'unit_of_measurement': 'Missions', + }) +# --- +# name: test_entities[sensor.test_roomba_total_missions-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Test Roomba Total missions', + 'state_class': , + 'unit_of_measurement': 'Missions', + }), + 'context': , + 'entity_id': 'sensor.test_roomba_total_missions', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- diff --git a/tests/components/roomba/test_sensor.py b/tests/components/roomba/test_sensor.py new file mode 100644 index 00000000000..fd56a6e9b3f --- /dev/null +++ b/tests/components/roomba/test_sensor.py @@ -0,0 +1,29 @@ +"""Tests for IRobotEntity usage in Roomba sensor platform.""" + +from unittest.mock import AsyncMock, patch + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homeassistant.const import Platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er + +from tests.common import MockConfigEntry, snapshot_platform + + +@pytest.mark.usefixtures("entity_registry_enabled_by_default") +async def test_entities( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_roomba: AsyncMock, + snapshot: SnapshotAssertion, + entity_registry: er.EntityRegistry, +) -> None: + """Test roomba entities.""" + with patch("homeassistant.components.roomba.PLATFORMS", [Platform.SENSOR]): + mock_config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)