1
0
mirror of https://github.com/home-assistant/core.git synced 2026-03-03 08:10:36 +00:00

Add Roomba J9 compatibility to the roomba integration (#145913)

Co-authored-by: Joostlek <joostlek@outlook.com>
This commit is contained in:
Lucas Mindêllo de Andrade
2025-09-30 14:10:22 -03:00
committed by GitHub
parent 7f63ba2087
commit b308a882fb
8 changed files with 805 additions and 3 deletions

View File

@@ -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."""

View File

@@ -35,6 +35,12 @@
},
"last_mission": {
"default": "mdi:calendar-clock"
},
"tank_level": {
"default": "mdi:water"
},
"dock_tank_level": {
"default": "mdi:water"
}
}
}

View File

@@ -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
)

View File

@@ -90,6 +90,12 @@
},
"last_mission": {
"name": "Last mission start time"
},
"tank_level": {
"name": "Tank level"
},
"dock_tank_level": {
"name": "Dock tank level"
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_average_mission_time',
'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': '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': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_entities[sensor.test_roomba_average_mission_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Test Roomba Average mission time',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_roomba_average_mission_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_battery',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.BATTERY: 'battery'>,
'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': <ANY>,
'entity_id': 'sensor.test_roomba_battery',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_battery_cycles-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_battery_cycles',
'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': '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': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_roomba_battery_cycles',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_canceled_missions-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_canceled_missions',
'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': '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': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'Missions',
}),
'context': <ANY>,
'entity_id': 'sensor.test_roomba_canceled_missions',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_dock_tank_level-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_dock_tank_level',
'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': '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': <ANY>,
'entity_id': 'sensor.test_roomba_dock_tank_level',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '99',
})
# ---
# name: test_entities[sensor.test_roomba_failed_missions-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_failed_missions',
'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': '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': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'Missions',
}),
'context': <ANY>,
'entity_id': 'sensor.test_roomba_failed_missions',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_last_mission_start_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_last_mission_start_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.TIMESTAMP: 'timestamp'>,
'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': <ANY>,
'entity_id': 'sensor.test_roomba_last_mission_start_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_scrubs-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_scrubs',
'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': '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': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'Scrubs',
}),
'context': <ANY>,
'entity_id': 'sensor.test_roomba_scrubs',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_successful_missions-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_successful_missions',
'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': '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': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'Missions',
}),
'context': <ANY>,
'entity_id': 'sensor.test_roomba_successful_missions',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_tank_level-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_tank_level',
'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': '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': <ANY>,
'entity_id': 'sensor.test_roomba_tank_level',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_total_cleaned_area-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_total_cleaned_area',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'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': <UnitOfArea.SQUARE_METERS: 'm²'>,
})
# ---
# name: test_entities[sensor.test_roomba_total_cleaned_area-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Test Roomba Total cleaned area',
'unit_of_measurement': <UnitOfArea.SQUARE_METERS: 'm²'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_roomba_total_cleaned_area',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_total_cleaning_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_total_cleaning_time',
'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': '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': <UnitOfTime.HOURS: 'h'>,
})
# ---
# name: test_entities[sensor.test_roomba_total_cleaning_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Test Roomba Total cleaning time',
'unit_of_measurement': <UnitOfTime.HOURS: 'h'>,
}),
'context': <ANY>,
'entity_id': 'sensor.test_roomba_total_cleaning_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_entities[sensor.test_roomba_total_missions-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.test_roomba_total_missions',
'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': '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': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': 'Missions',
}),
'context': <ANY>,
'entity_id': 'sensor.test_roomba_total_missions',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---

View File

@@ -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)