Add Besen session sensors (#183806)

This commit is contained in:
Yoav Mor
2026-10-01 07:23:20 +02:00
committed by GitHub
parent 8a2706c540
commit 76b105e989
6 changed files with 617 additions and 7 deletions
+43 -2
View File
@@ -2,6 +2,7 @@
from collections.abc import Callable, Mapping
from dataclasses import dataclass
from datetime import datetime
from typing import Final, override
from besen.models import BesenData
@@ -20,6 +21,7 @@ from homeassistant.const import (
UnitOfEnergy,
UnitOfPower,
UnitOfTemperature,
UnitOfTime,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
@@ -113,7 +115,7 @@ def _enum_state(value: str | None, states: Mapping[str, str]) -> str | None:
class BesenSensorEntityDescription(SensorEntityDescription):
"""Describe a Besen sensor entity."""
value_fn: Callable[[BesenData], StateType]
value_fn: Callable[[BesenData], StateType | datetime]
three_phase_only: bool = False
@@ -196,6 +198,45 @@ SENSOR_DESCRIPTIONS: tuple[BesenSensorEntityDescription, ...] = (
suggested_display_precision=2,
value_fn=lambda data: data.charge.session_energy,
),
BesenSensorEntityDescription(
key="session_start",
translation_key="session_start",
device_class=SensorDeviceClass.TIMESTAMP,
value_fn=lambda data: data.charge.session_start,
),
BesenSensorEntityDescription(
key="session_duration",
translation_key="session_duration",
device_class=SensorDeviceClass.DURATION,
native_unit_of_measurement=UnitOfTime.SECONDS,
suggested_display_precision=0,
value_fn=lambda data: data.charge.session_duration,
),
BesenSensorEntityDescription(
key="session_current_limit",
translation_key="session_current_limit",
device_class=SensorDeviceClass.CURRENT,
entity_registry_enabled_default=False,
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
suggested_display_precision=0,
value_fn=lambda data: data.charge.session_current_limit,
),
BesenSensorEntityDescription(
key="scheduled_start",
translation_key="scheduled_start",
device_class=SensorDeviceClass.TIMESTAMP,
entity_registry_enabled_default=False,
value_fn=lambda data: data.charge.scheduled_start,
),
BesenSensorEntityDescription(
key="charging_time_limit",
translation_key="charging_time_limit",
device_class=SensorDeviceClass.DURATION,
entity_registry_enabled_default=False,
native_unit_of_measurement=UnitOfTime.MINUTES,
suggested_display_precision=0,
value_fn=lambda data: data.charge.charging_time_limit,
),
BesenSensorEntityDescription(
key="internal_temperature",
translation_key="internal_temperature",
@@ -321,7 +362,7 @@ class BesenSensor(BesenEntity, SensorEntity):
@property
@override
def native_value(self) -> StateType:
def native_value(self) -> StateType | datetime:
"""Return the sensor value."""
return self.entity_description.value_fn(self.coordinator.data)
@@ -88,6 +88,7 @@
"waiting": "Waiting"
}
},
"charging_time_limit": { "name": "Charging time limit" },
"current_state": {
"name": "Current state",
"state": {
@@ -152,7 +153,11 @@
"disconnected": "[%key:common::state::disconnected%]"
}
},
"scheduled_start": { "name": "Scheduled start" },
"session_current_limit": { "name": "Session current limit" },
"session_duration": { "name": "Session duration" },
"session_energy": { "name": "Session energy" },
"session_start": { "name": "Session start" },
"total_energy": { "name": "Total energy" }
},
"switch": {
+6
View File
@@ -1,6 +1,7 @@
"""Fixtures for the Besen integration tests."""
from collections.abc import Generator
from datetime import UTC, datetime
from unittest.mock import AsyncMock, Mock, patch
from besen.models import BesenData, ChargerConfig, ChargerInfo, ChargeStatus
@@ -91,6 +92,11 @@ def charger_state(
power=3500,
total_energy=12.3,
session_energy=1.2,
session_start=datetime(2026, 9, 30, 20, 0, tzinfo=UTC),
session_duration=1200,
session_current_limit=10,
scheduled_start=datetime(2026, 9, 30, 19, 30, tzinfo=UTC),
charging_time_limit=240,
inner_temp_c=24.5,
outer_temp=22.5,
l1_voltage=230.0,
@@ -9,7 +9,7 @@
'charger_status': True,
'charging_status': 'Start',
'charging_status_description': 'EV is connected, please press start',
'charging_time_limit': None,
'charging_time_limit': 240,
'current_state': 'Charging',
'emergency_btn_state': None,
'error_details': 'No Error',
@@ -28,11 +28,11 @@
'output_state': 'Charging',
'plug_state': 'Connected Locked',
'power': 3500,
'scheduled_start': None,
'session_current_limit': None,
'session_duration': None,
'scheduled_start': '2026-09-30T19:30:00+00:00',
'session_current_limit': 10,
'session_duration': 1200,
'session_energy': 1.2,
'session_start': None,
'session_start': '2026-09-30T20:00:00+00:00',
'total_energy': 12.3,
}),
'config': dict({
@@ -201,6 +201,61 @@
'state': 'start',
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_charging_time_limit-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_charging_time_limit',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Charging time limit',
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
'original_icon': None,
'original_name': 'Charging time limit',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'charging_time_limit',
'unique_id': 'AA:BB_charging_time_limit',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_charging_time_limit-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'duration',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Charging time limit',
<EntityStateAttribute.UNIT_OF_MEASUREMENT: 'unit_of_measurement'>: <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.garage_charging_time_limit',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '240',
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_current_state-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -729,6 +784,167 @@
'state': 'connected_locked',
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_scheduled_start-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_scheduled_start',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Scheduled start',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.TIMESTAMP: 'timestamp'>,
'original_icon': None,
'original_name': 'Scheduled start',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'scheduled_start',
'unique_id': 'AA:BB_scheduled_start',
'unit_of_measurement': None,
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_scheduled_start-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'timestamp',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Scheduled start',
}),
'context': <ANY>,
'entity_id': 'sensor.garage_scheduled_start',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '2026-09-30T19:30:00+00:00',
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_session_current_limit-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_session_current_limit',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Session current limit',
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.CURRENT: 'current'>,
'original_icon': None,
'original_name': 'Session current limit',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'session_current_limit',
'unique_id': 'AA:BB_session_current_limit',
'unit_of_measurement': <UnitOfElectricCurrent.AMPERE: 'A'>,
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_session_current_limit-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'current',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Session current limit',
<EntityStateAttribute.UNIT_OF_MEASUREMENT: 'unit_of_measurement'>: <UnitOfElectricCurrent.AMPERE: 'A'>,
}),
'context': <ANY>,
'entity_id': 'sensor.garage_session_current_limit',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '10',
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_session_duration-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_session_duration',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Session duration',
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
'original_icon': None,
'original_name': 'Session duration',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'session_duration',
'unique_id': 'AA:BB_session_duration',
'unit_of_measurement': <UnitOfTime.SECONDS: 's'>,
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_session_duration-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'duration',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Session duration',
<EntityStateAttribute.UNIT_OF_MEASUREMENT: 'unit_of_measurement'>: <UnitOfTime.SECONDS: 's'>,
}),
'context': <ANY>,
'entity_id': 'sensor.garage_session_duration',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1200',
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_session_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -787,6 +1003,57 @@
'state': '1.2',
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_session_start-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_session_start',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Session start',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.TIMESTAMP: 'timestamp'>,
'original_icon': None,
'original_name': 'Session start',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'session_start',
'unique_id': 'AA:BB_session_start',
'unit_of_measurement': None,
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_session_start-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'timestamp',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Session start',
}),
'context': <ANY>,
'entity_id': 'sensor.garage_session_start',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '2026-09-30T20:00:00+00:00',
})
# ---
# name: test_sensor_state[single_phase][sensor.garage_total_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -1047,6 +1314,61 @@
'state': 'start',
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_charging_time_limit-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_charging_time_limit',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Charging time limit',
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
'original_icon': None,
'original_name': 'Charging time limit',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'charging_time_limit',
'unique_id': 'AA:BB_charging_time_limit',
'unit_of_measurement': <UnitOfTime.MINUTES: 'min'>,
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_charging_time_limit-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'duration',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Charging time limit',
<EntityStateAttribute.UNIT_OF_MEASUREMENT: 'unit_of_measurement'>: <UnitOfTime.MINUTES: 'min'>,
}),
'context': <ANY>,
'entity_id': 'sensor.garage_charging_time_limit',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '240',
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_current_state-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -1807,6 +2129,167 @@
'state': 'connected_locked',
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_scheduled_start-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_scheduled_start',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Scheduled start',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.TIMESTAMP: 'timestamp'>,
'original_icon': None,
'original_name': 'Scheduled start',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'scheduled_start',
'unique_id': 'AA:BB_scheduled_start',
'unit_of_measurement': None,
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_scheduled_start-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'timestamp',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Scheduled start',
}),
'context': <ANY>,
'entity_id': 'sensor.garage_scheduled_start',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '2026-09-30T19:30:00+00:00',
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_session_current_limit-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_session_current_limit',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Session current limit',
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.CURRENT: 'current'>,
'original_icon': None,
'original_name': 'Session current limit',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'session_current_limit',
'unique_id': 'AA:BB_session_current_limit',
'unit_of_measurement': <UnitOfElectricCurrent.AMPERE: 'A'>,
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_session_current_limit-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'current',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Session current limit',
<EntityStateAttribute.UNIT_OF_MEASUREMENT: 'unit_of_measurement'>: <UnitOfElectricCurrent.AMPERE: 'A'>,
}),
'context': <ANY>,
'entity_id': 'sensor.garage_session_current_limit',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '10',
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_session_duration-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_session_duration',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Session duration',
'options': dict({
'sensor': dict({
'suggested_display_precision': 0,
}),
}),
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
'original_icon': None,
'original_name': 'Session duration',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'session_duration',
'unique_id': 'AA:BB_session_duration',
'unit_of_measurement': <UnitOfTime.SECONDS: 's'>,
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_session_duration-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'duration',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Session duration',
<EntityStateAttribute.UNIT_OF_MEASUREMENT: 'unit_of_measurement'>: <UnitOfTime.SECONDS: 's'>,
}),
'context': <ANY>,
'entity_id': 'sensor.garage_session_duration',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1200',
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_session_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
@@ -1865,6 +2348,57 @@
'state': '1.2',
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_session_start-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
None,
]),
'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': None,
'entity_id': 'sensor.garage_session_start',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'object_id_base': 'Session start',
'options': dict({
}),
'original_device_class': <SensorDeviceClass.TIMESTAMP: 'timestamp'>,
'original_icon': None,
'original_name': 'Session start',
'platform': 'besen',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'session_start',
'unique_id': 'AA:BB_session_start',
'unit_of_measurement': None,
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_session_start-state]
StateSnapshot({
'attributes': ReadOnlyDict({
<EntityStateAttribute.DEVICE_CLASS: 'device_class'>: 'timestamp',
<EntityStateAttribute.FRIENDLY_NAME: 'friendly_name'>: 'Garage Session start',
}),
'context': <ANY>,
'entity_id': 'sensor.garage_session_start',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '2026-09-30T20:00:00+00:00',
})
# ---
# name: test_sensor_state[three_phase][sensor.garage_total_energy-entry]
EntityRegistryEntrySnapshot({
'aliases': list([
+24
View File
@@ -246,6 +246,30 @@ async def test_diagnostic_sensors_disabled_by_default(
assert hass.states.get(entry.entity_id) is None
@pytest.mark.parametrize(
"entity_id",
[
"sensor.garage_session_current_limit",
"sensor.garage_scheduled_start",
"sensor.garage_charging_time_limit",
],
)
async def test_optional_session_sensors_disabled_by_default(
hass: HomeAssistant,
entity_registry: er.EntityRegistry,
mock_config_entry: MockConfigEntry,
mock_besen_client: Mock,
entity_id: str,
) -> None:
"""Test rarely used session sensors are disabled by default."""
await setup_integration(hass, mock_config_entry, [Platform.SENSOR])
assert (entry := entity_registry.async_get(entity_id)) is not None
assert entry.disabled_by is er.RegistryEntryDisabler.INTEGRATION
assert hass.states.get(entity_id) is None
@pytest.mark.parametrize(("phases", "expected"), [(1, False), (3, True)])
async def test_three_phase_sensor_filtering(
hass: HomeAssistant,