Replace deprecated battery property on Miele vacuum with sensor (#148765)

This commit is contained in:
Åke Strandberg 2025-07-15 12:40:48 +02:00 committed by GitHub
parent c7aadcdd20
commit ee4325a927
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 404 additions and 14 deletions

View File

@ -539,6 +539,16 @@ SENSOR_TYPES: Final[tuple[MieleSensorDefinition, ...]] = (
options=sorted(StateDryingStep.keys()),
),
),
MieleSensorDefinition(
types=(MieleAppliance.ROBOT_VACUUM_CLEANER,),
description=MieleSensorDescription(
key="state_battery",
value_fn=lambda value: value.state_battery_level,
native_unit_of_measurement=PERCENTAGE,
entity_category=EntityCategory.DIAGNOSTIC,
device_class=SensorDeviceClass.BATTERY,
),
),
)

View File

@ -87,7 +87,6 @@ class MieleVacuumStateCode(MieleEnum):
SUPPORTED_FEATURES = (
VacuumEntityFeature.STATE
| VacuumEntityFeature.BATTERY
| VacuumEntityFeature.FAN_SPEED
| VacuumEntityFeature.START
| VacuumEntityFeature.STOP
@ -174,11 +173,6 @@ class MieleVacuum(MieleEntity, StateVacuumEntity):
MieleVacuumStateCode(self.device.state_program_phase).value
)
@property
def battery_level(self) -> int | None:
"""Return the battery level."""
return self.device.state_battery_level
@property
def fan_speed(self) -> str | None:
"""Return the fan speed."""

View File

@ -2920,3 +2920,378 @@
'state': '0.0',
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'autocleaning',
'failure',
'idle',
'in_use',
'not_connected',
'off',
'on',
'pause',
'program_ended',
'program_interrupted',
'programmed',
'rinse_hold',
'service',
'supercooling',
'supercooling_superfreezing',
'superfreezing',
'superheating',
'waiting_to_start',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.robot_vacuum_cleaner',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': 'mdi:robot-vacuum',
'original_name': None,
'platform': 'miele',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'status',
'unique_id': 'Dummy_Vacuum_1-state_status',
'unit_of_measurement': None,
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Robot vacuum cleaner',
'icon': 'mdi:robot-vacuum',
'options': list([
'autocleaning',
'failure',
'idle',
'in_use',
'not_connected',
'off',
'on',
'pause',
'program_ended',
'program_interrupted',
'programmed',
'rinse_hold',
'service',
'supercooling',
'supercooling_superfreezing',
'superfreezing',
'superheating',
'waiting_to_start',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.robot_vacuum_cleaner',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'on',
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_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.robot_vacuum_cleaner_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': 'miele',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'Dummy_Vacuum_1-state_battery',
'unit_of_measurement': '%',
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_battery-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'battery',
'friendly_name': 'Robot vacuum cleaner Battery',
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'sensor.robot_vacuum_cleaner_battery',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '65',
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_elapsed_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.robot_vacuum_cleaner_elapsed_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
}),
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
'original_icon': None,
'original_name': 'Elapsed time',
'platform': 'miele',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'elapsed_time',
'unique_id': 'Dummy_Vacuum_1-state_elapsed_time',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_elapsed_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'duration',
'friendly_name': 'Robot vacuum cleaner Elapsed time',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.robot_vacuum_cleaner_elapsed_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0',
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_program-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'auto',
'no_program',
'silent',
'spot',
'turbo',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.robot_vacuum_cleaner_program',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Program',
'platform': 'miele',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'program_id',
'unique_id': 'Dummy_Vacuum_1-state_program_id',
'unit_of_measurement': None,
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_program-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Robot vacuum cleaner Program',
'options': list([
'auto',
'no_program',
'silent',
'spot',
'turbo',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.robot_vacuum_cleaner_program',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'auto',
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_program_type-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'automatic_program',
'cleaning_care_program',
'maintenance_program',
'normal_operation_mode',
'own_program',
]),
}),
'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.robot_vacuum_cleaner_program_type',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
'original_icon': None,
'original_name': 'Program type',
'platform': 'miele',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'program_type',
'unique_id': 'Dummy_Vacuum_1-state_program_type',
'unit_of_measurement': None,
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_program_type-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
'friendly_name': 'Robot vacuum cleaner Program type',
'options': list([
'automatic_program',
'cleaning_care_program',
'maintenance_program',
'normal_operation_mode',
'own_program',
]),
}),
'context': <ANY>,
'entity_id': 'sensor.robot_vacuum_cleaner_program_type',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'normal_operation_mode',
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_remaining_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.robot_vacuum_cleaner_remaining_time',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
}),
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
'original_icon': None,
'original_name': 'Remaining time',
'platform': 'miele',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'remaining_time',
'unique_id': 'Dummy_Vacuum_1-state_remaining_time',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_vacuum_sensor_states[platforms0-vacuum_device.json][sensor.robot_vacuum_cleaner_remaining_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'duration',
'friendly_name': 'Robot vacuum cleaner Remaining time',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.robot_vacuum_cleaner_remaining_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0',
})
# ---

View File

@ -34,7 +34,7 @@
'platform': 'miele',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': <VacuumEntityFeature: 13420>,
'supported_features': <VacuumEntityFeature: 13356>,
'translation_key': 'vacuum',
'unique_id': 'Dummy_Vacuum_1-vacuum',
'unit_of_measurement': None,
@ -43,8 +43,6 @@
# name: test_sensor_states[platforms0-vacuum_device.json][vacuum.robot_vacuum_cleaner-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'battery_icon': 'mdi:battery-60',
'battery_level': 65,
'fan_speed': 'normal',
'fan_speed_list': list([
'normal',
@ -52,7 +50,7 @@
'silent',
]),
'friendly_name': 'Robot vacuum cleaner',
'supported_features': <VacuumEntityFeature: 13420>,
'supported_features': <VacuumEntityFeature: 13356>,
}),
'context': <ANY>,
'entity_id': 'vacuum.robot_vacuum_cleaner',
@ -97,7 +95,7 @@
'platform': 'miele',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': <VacuumEntityFeature: 13420>,
'supported_features': <VacuumEntityFeature: 13356>,
'translation_key': 'vacuum',
'unique_id': 'Dummy_Vacuum_1-vacuum',
'unit_of_measurement': None,
@ -106,8 +104,6 @@
# name: test_vacuum_states_api_push[platforms0-vacuum_device.json][vacuum.robot_vacuum_cleaner-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'battery_icon': 'mdi:battery-60',
'battery_level': 65,
'fan_speed': 'normal',
'fan_speed_list': list([
'normal',
@ -115,7 +111,7 @@
'silent',
]),
'friendly_name': 'Robot vacuum cleaner',
'supported_features': <VacuumEntityFeature: 13420>,
'supported_features': <VacuumEntityFeature: 13356>,
}),
'context': <ANY>,
'entity_id': 'vacuum.robot_vacuum_cleaner',

View File

@ -54,3 +54,18 @@ async def test_hob_sensor_states(
"""Test sensor state."""
await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id)
@pytest.mark.parametrize("load_device_file", ["vacuum_device.json"])
@pytest.mark.parametrize("platforms", [(SENSOR_DOMAIN,)])
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_vacuum_sensor_states(
hass: HomeAssistant,
mock_miele_client: MagicMock,
snapshot: SnapshotAssertion,
entity_registry: er.EntityRegistry,
setup_platform: None,
) -> None:
"""Test robot vacuum cleaner sensor state."""
await snapshot_platform(hass, entity_registry, snapshot, setup_platform.entry_id)