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:
committed by
GitHub
parent
7f63ba2087
commit
b308a882fb
@@ -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."""
|
||||
|
||||
@@ -35,6 +35,12 @@
|
||||
},
|
||||
"last_mission": {
|
||||
"default": "mdi:calendar-clock"
|
||||
},
|
||||
"tank_level": {
|
||||
"default": "mdi:water"
|
||||
},
|
||||
"dock_tank_level": {
|
||||
"default": "mdi:water"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -90,6 +90,12 @@
|
||||
},
|
||||
"last_mission": {
|
||||
"name": "Last mission start time"
|
||||
},
|
||||
"tank_level": {
|
||||
"name": "Tank level"
|
||||
},
|
||||
"dock_tank_level": {
|
||||
"name": "Dock tank level"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
62
tests/components/roomba/conftest.py
Normal file
62
tests/components/roomba/conftest.py
Normal 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
|
||||
659
tests/components/roomba/snapshots/test_sensor.ambr
Normal file
659
tests/components/roomba/snapshots/test_sensor.ambr
Normal 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',
|
||||
})
|
||||
# ---
|
||||
29
tests/components/roomba/test_sensor.py
Normal file
29
tests/components/roomba/test_sensor.py
Normal 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)
|
||||
Reference in New Issue
Block a user