Add the professionel5e filter series to eheimdigital (#155550)

This commit is contained in:
Sid
2026-01-09 21:24:01 +01:00
committed by GitHub
parent ad8f14fec1
commit c97437fbf3
21 changed files with 1681 additions and 66 deletions
+17
View File
@@ -5,6 +5,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
from eheimdigital.classic_led_ctrl import EheimDigitalClassicLEDControl
from eheimdigital.classic_vario import EheimDigitalClassicVario
from eheimdigital.filter import EheimDigitalFilter
from eheimdigital.heater import EheimDigitalHeater
from eheimdigital.hub import EheimDigitalHub
from eheimdigital.types import (
@@ -13,6 +14,7 @@ from eheimdigital.types import (
ClassicVarioDataPacket,
ClockPacket,
CloudPacket,
FilterDataPacket,
MoonPacket,
UsrDtaPacket,
)
@@ -82,11 +84,25 @@ def classic_vario_mock():
return classic_vario
@pytest.fixture
def filter_mock():
"""Mock a filter device."""
eheim_filter = EheimDigitalFilter(
MagicMock(spec=EheimDigitalHub),
UsrDtaPacket(load_json_object_fixture("filter/usrdta.json", DOMAIN)),
)
eheim_filter.filter_data = FilterDataPacket(
load_json_object_fixture("filter/filter_data.json", DOMAIN)
)
return eheim_filter
@pytest.fixture
def eheimdigital_hub_mock(
classic_led_ctrl_mock: MagicMock,
heater_mock: MagicMock,
classic_vario_mock: MagicMock,
filter_mock: MagicMock,
) -> Generator[AsyncMock]:
"""Mock eheimdigital hub."""
with (
@@ -103,6 +119,7 @@ def eheimdigital_hub_mock(
"00:00:00:00:00:01": classic_led_ctrl_mock,
"00:00:00:00:00:02": heater_mock,
"00:00:00:00:00:03": classic_vario_mock,
"00:00:00:00:00:04": filter_mock,
}
eheimdigital_hub_mock.return_value.main = classic_led_ctrl_mock
yield eheimdigital_hub_mock
@@ -0,0 +1,32 @@
{
"title": "FILTER_DATA",
"from": "00:00:00:00:00:04",
"minFreq": 3500,
"maxFreq": 6700,
"maxFreqRglOff": 7200,
"freq": 7200,
"freqSoll": 7200,
"dfs": 0,
"dfsFaktor": 0,
"sollStep": 14,
"rotSpeed": 43,
"pumpMode": 16,
"sync": "",
"partnerName": "",
"filterActive": 1,
"runTime": 106435,
"actualTime": 106435,
"serviceHour": 36774,
"pm_dfs_soll_high": 10,
"pm_dfs_soll_low": 1,
"pm_time_high": 10,
"pm_time_low": 10,
"nm_dfs_soll_day": 10,
"nm_dfs_soll_night": 4,
"end_time_night_mode": 420,
"start_time_night_mode": 1140,
"version": 74,
"isEheim": 1,
"turnOffTime": 0,
"turnTimeFeeding": 0
}
@@ -0,0 +1,34 @@
{
"title": "USRDTA",
"from": "00:00:00:00:00:04",
"name": "Mock filter",
"aqName": "Mock Aquarium",
"version": 4,
"language": "DE",
"timezone": 60,
"tID": 30,
"dst": 1,
"tankconfig": "WITHOUT_THERMO",
"power": "",
"netmode": "ST",
"host": "eheimdigital",
"groupID": 0,
"meshing": 1,
"firstStart": 0,
"remote": 0,
"revision": [1026, 1030],
"build": ["1752053563000", "1752045985672"],
"latestAvailableRevision": [1026, 1030, 2038, 2038],
"firmwareAvailable": 0,
"emailAddr": "",
"stMail": 0,
"stMailMode": 0,
"fstTime": 720,
"sstTime": 0,
"liveTime": 103680,
"usrName": "",
"unit": 0,
"demoUse": 0,
"sysLED": 45,
"to": "USER"
}
@@ -236,6 +236,85 @@
'version': 18,
}),
}),
'00:00:00:00:00:04': dict({
'filter_data': dict({
'actualTime': 106435,
'dfs': 0,
'dfsFaktor': 0,
'end_time_night_mode': 420,
'filterActive': 1,
'freq': 7200,
'freqSoll': 7200,
'from': '00:00:00:00:00:04',
'isEheim': 1,
'maxFreq': 6700,
'maxFreqRglOff': 7200,
'minFreq': 3500,
'nm_dfs_soll_day': 10,
'nm_dfs_soll_night': 4,
'partnerName': '',
'pm_dfs_soll_high': 10,
'pm_dfs_soll_low': 1,
'pm_time_high': 10,
'pm_time_low': 10,
'pumpMode': 16,
'rotSpeed': 43,
'runTime': 106435,
'serviceHour': 36774,
'sollStep': 14,
'start_time_night_mode': 1140,
'sync': '',
'title': 'FILTER_DATA',
'turnOffTime': 0,
'turnTimeFeeding': 0,
'version': 74,
}),
'usrdta': dict({
'aqName': 'Mock Aquarium',
'build': list([
'1752053563000',
'1752045985672',
]),
'demoUse': 0,
'dst': 1,
'emailAddr': '',
'firmwareAvailable': 0,
'firstStart': 0,
'from': '00:00:00:00:00:04',
'fstTime': 720,
'groupID': 0,
'host': 'eheimdigital',
'language': 'DE',
'latestAvailableRevision': list([
1026,
1030,
2038,
2038,
]),
'liveTime': 103680,
'meshing': 1,
'name': 'Mock filter',
'netmode': 'ST',
'power': '',
'remote': 0,
'revision': list([
1026,
1030,
]),
'sstTime': 0,
'stMail': 0,
'stMailMode': 0,
'sysLED': 45,
'tID': 30,
'tankconfig': 'WITHOUT_THERMO',
'timezone': 60,
'title': 'USRDTA',
'to': 'USER',
'unit': 0,
'usrName': '',
'version': 4,
}),
}),
}),
'entry': dict({
'data': dict({
@@ -289,6 +289,182 @@
'state': 'unknown',
})
# ---
# name: test_setup[number.mock_filter_high_pulse_duration-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 200000,
'min': 5,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'number.mock_filter_high_pulse_duration',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.DURATION: 'duration'>,
'original_icon': None,
'original_name': 'High pulse duration',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'high_pulse_time',
'unique_id': '00:00:00:00:00:04_high_pulse_time',
'unit_of_measurement': <UnitOfTime.SECONDS: 's'>,
})
# ---
# name: test_setup[number.mock_filter_high_pulse_duration-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'duration',
'friendly_name': 'Mock filter High pulse duration',
'max': 200000,
'min': 5,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1,
'unit_of_measurement': <UnitOfTime.SECONDS: 's'>,
}),
'context': <ANY>,
'entity_id': 'number.mock_filter_high_pulse_duration',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[number.mock_filter_low_pulse_duration-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 200000,
'min': 5,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'number.mock_filter_low_pulse_duration',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.DURATION: 'duration'>,
'original_icon': None,
'original_name': 'Low pulse duration',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'low_pulse_time',
'unique_id': '00:00:00:00:00:04_low_pulse_time',
'unit_of_measurement': <UnitOfTime.SECONDS: 's'>,
})
# ---
# name: test_setup[number.mock_filter_low_pulse_duration-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'duration',
'friendly_name': 'Mock filter Low pulse duration',
'max': 200000,
'min': 5,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1,
'unit_of_measurement': <UnitOfTime.SECONDS: 's'>,
}),
'context': <ANY>,
'entity_id': 'number.mock_filter_low_pulse_duration',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[number.mock_filter_system_led_brightness-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'number.mock_filter_system_led_brightness',
'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': 'System LED brightness',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'system_led',
'unique_id': '00:00:00:00:00:04_system_led',
'unit_of_measurement': '%',
})
# ---
# name: test_setup[number.mock_filter_system_led_brightness-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter System LED brightness',
'max': 100,
'min': 0,
'mode': <NumberMode.AUTO: 'auto'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.mock_filter_system_led_brightness',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[number.mock_heater_night_temperature_offset-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
@@ -58,3 +58,568 @@
'state': 'unknown',
})
# ---
# name: test_setup[select.mock_filter_constant_flow_speed-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'select',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'select.mock_filter_constant_flow_speed',
'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': 'Constant flow speed',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'const_flow_speed',
'unique_id': '00:00:00:00:00:04_const_flow_speed',
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
})
# ---
# name: test_setup[select.mock_filter_constant_flow_speed-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter Constant flow speed',
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
}),
'context': <ANY>,
'entity_id': 'select.mock_filter_constant_flow_speed',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[select.mock_filter_day_speed-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'select',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'select.mock_filter_day_speed',
'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': 'Day speed',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'day_speed',
'unique_id': '00:00:00:00:00:04_day_speed',
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
})
# ---
# name: test_setup[select.mock_filter_day_speed-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter Day speed',
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
}),
'context': <ANY>,
'entity_id': 'select.mock_filter_day_speed',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[select.mock_filter_filter_mode-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'manual',
'constant_flow',
'pulse',
'bio',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'select',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'select.mock_filter_filter_mode',
'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': 'Filter mode',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'filter_mode',
'unique_id': '00:00:00:00:00:04_filter_mode',
'unit_of_measurement': None,
})
# ---
# name: test_setup[select.mock_filter_filter_mode-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter Filter mode',
'options': list([
'manual',
'constant_flow',
'pulse',
'bio',
]),
}),
'context': <ANY>,
'entity_id': 'select.mock_filter_filter_mode',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[select.mock_filter_high_pulse_speed-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'select',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'select.mock_filter_high_pulse_speed',
'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': 'High pulse speed',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'high_pulse_speed',
'unique_id': '00:00:00:00:00:04_high_pulse_speed',
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
})
# ---
# name: test_setup[select.mock_filter_high_pulse_speed-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter High pulse speed',
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
}),
'context': <ANY>,
'entity_id': 'select.mock_filter_high_pulse_speed',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[select.mock_filter_low_pulse_speed-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'select',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'select.mock_filter_low_pulse_speed',
'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': 'Low pulse speed',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'low_pulse_speed',
'unique_id': '00:00:00:00:00:04_low_pulse_speed',
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
})
# ---
# name: test_setup[select.mock_filter_low_pulse_speed-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter Low pulse speed',
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
}),
'context': <ANY>,
'entity_id': 'select.mock_filter_low_pulse_speed',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[select.mock_filter_manual_speed-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'35',
'37.5',
'40.5',
'43',
'45.5',
'48',
'51',
'53.5',
'56',
'59',
'61.5',
'64',
'66.5',
'69.5',
'72',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'select',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'select.mock_filter_manual_speed',
'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': 'Manual speed',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'manual_speed',
'unique_id': '00:00:00:00:00:04_manual_speed',
'unit_of_measurement': <UnitOfFrequency.HERTZ: 'Hz'>,
})
# ---
# name: test_setup[select.mock_filter_manual_speed-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter Manual speed',
'options': list([
'35',
'37.5',
'40.5',
'43',
'45.5',
'48',
'51',
'53.5',
'56',
'59',
'61.5',
'64',
'66.5',
'69.5',
'72',
]),
'unit_of_measurement': <UnitOfFrequency.HERTZ: 'Hz'>,
}),
'context': <ANY>,
'entity_id': 'select.mock_filter_manual_speed',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[select.mock_filter_night_speed-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'select',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'select.mock_filter_night_speed',
'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': 'Night speed',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'night_speed',
'unique_id': '00:00:00:00:00:04_night_speed',
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
})
# ---
# name: test_setup[select.mock_filter_night_speed-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter Night speed',
'options': list([
'400',
'440',
'480',
'515',
'550',
'585',
'620',
'650',
'680',
'710',
'740',
'770',
'800',
'830',
'860',
]),
'unit_of_measurement': <UnitOfVolumeFlowRate.LITERS_PER_HOUR: 'L/h'>,
}),
'context': <ANY>,
'entity_id': 'select.mock_filter_night_speed',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
@@ -1,5 +1,5 @@
# serializer version: 1
# name: test_setup_classic_vario[sensor.mock_classicvario_current_speed-entry]
# name: test_setup[sensor.mock_classicvario_current_speed-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -34,7 +34,7 @@
'unit_of_measurement': '%',
})
# ---
# name: test_setup_classic_vario[sensor.mock_classicvario_current_speed-state]
# name: test_setup[sensor.mock_classicvario_current_speed-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock classicVARIO Current speed',
@@ -48,7 +48,7 @@
'state': 'unknown',
})
# ---
# name: test_setup_classic_vario[sensor.mock_classicvario_error_code-entry]
# name: test_setup[sensor.mock_classicvario_error_code-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -89,7 +89,7 @@
'unit_of_measurement': None,
})
# ---
# name: test_setup_classic_vario[sensor.mock_classicvario_error_code-state]
# name: test_setup[sensor.mock_classicvario_error_code-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'enum',
@@ -108,7 +108,7 @@
'state': 'unknown',
})
# ---
# name: test_setup_classic_vario[sensor.mock_classicvario_remaining_hours_until_service-entry]
# name: test_setup[sensor.mock_classicvario_remaining_hours_until_service-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -149,7 +149,7 @@
'unit_of_measurement': <UnitOfTime.DAYS: 'd'>,
})
# ---
# name: test_setup_classic_vario[sensor.mock_classicvario_remaining_hours_until_service-state]
# name: test_setup[sensor.mock_classicvario_remaining_hours_until_service-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'duration',
@@ -164,3 +164,112 @@
'state': 'unknown',
})
# ---
# name: test_setup[sensor.mock_filter_current_speed-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': None,
'entity_id': 'sensor.mock_filter_current_speed',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 1,
}),
}),
'original_device_class': <SensorDeviceClass.FREQUENCY: 'frequency'>,
'original_icon': None,
'original_name': 'Current speed',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'current_speed',
'unique_id': '00:00:00:00:00:04_current_speed',
'unit_of_measurement': <UnitOfFrequency.HERTZ: 'Hz'>,
})
# ---
# name: test_setup[sensor.mock_filter_current_speed-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'frequency',
'friendly_name': 'Mock filter Current speed',
'unit_of_measurement': <UnitOfFrequency.HERTZ: 'Hz'>,
}),
'context': <ANY>,
'entity_id': 'sensor.mock_filter_current_speed',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[sensor.mock_filter_remaining_hours_until_service-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.mock_filter_remaining_hours_until_service',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
'suggested_display_precision': 2,
}),
'sensor.private': dict({
'suggested_unit_of_measurement': <UnitOfTime.DAYS: 'd'>,
}),
}),
'original_device_class': <SensorDeviceClass.DURATION: 'duration'>,
'original_icon': None,
'original_name': 'Remaining hours until service',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'service_hours',
'unique_id': '00:00:00:00:00:04_service_hours',
'unit_of_measurement': <UnitOfTime.DAYS: 'd'>,
})
# ---
# name: test_setup[sensor.mock_filter_remaining_hours_until_service-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'duration',
'friendly_name': 'Mock filter Remaining hours until service',
'unit_of_measurement': <UnitOfTime.DAYS: 'd'>,
}),
'context': <ANY>,
'entity_id': 'sensor.mock_filter_remaining_hours_until_service',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
@@ -1,5 +1,5 @@
# serializer version: 1
# name: test_setup_classic_vario[switch.mock_classicvario-entry]
# name: test_setup[switch.mock_classicvario-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
@@ -34,7 +34,7 @@
'unit_of_measurement': None,
})
# ---
# name: test_setup_classic_vario[switch.mock_classicvario-state]
# name: test_setup[switch.mock_classicvario-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock classicVARIO',
@@ -47,3 +47,51 @@
'state': 'on',
})
# ---
# name: test_setup[switch.mock_filter-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': 'switch',
'entity_category': None,
'entity_id': 'switch.mock_filter',
'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': None,
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'filter_active',
'unique_id': '00:00:00:00:00:04',
'unit_of_measurement': None,
})
# ---
# name: test_setup[switch.mock_filter-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter',
}),
'context': <ANY>,
'entity_id': 'switch.mock_filter',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'on',
})
# ---
@@ -95,6 +95,102 @@
'state': 'unknown',
})
# ---
# name: test_setup[time.mock_filter_day_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': 'time',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'time.mock_filter_day_start_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': 'Day start time',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'day_start_time',
'unique_id': '00:00:00:00:00:04_day_start_time',
'unit_of_measurement': None,
})
# ---
# name: test_setup[time.mock_filter_day_start_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter Day start time',
}),
'context': <ANY>,
'entity_id': 'time.mock_filter_day_start_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[time.mock_filter_night_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': 'time',
'entity_category': <EntityCategory.CONFIG: 'config'>,
'entity_id': 'time.mock_filter_night_start_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': 'Night start time',
'platform': 'eheimdigital',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'night_start_time',
'unique_id': '00:00:00:00:00:04_night_start_time',
'unit_of_measurement': None,
})
# ---
# name: test_setup[time.mock_filter_night_start_time-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'Mock filter Night start time',
}),
'context': <ANY>,
'entity_id': 'time.mock_filter_night_start_time',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'unknown',
})
# ---
# name: test_setup[time.mock_heater_day_start_time-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
+43 -3
View File
@@ -19,7 +19,6 @@ from .conftest import init_integration
from tests.common import MockConfigEntry, snapshot_platform
@pytest.mark.usefixtures("classic_vario_mock", "heater_mock")
async def test_setup(
hass: HomeAssistant,
eheimdigital_hub_mock: MagicMock,
@@ -48,7 +47,6 @@ async def test_setup(
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
@pytest.mark.usefixtures("classic_vario_mock", "heater_mock")
@pytest.mark.parametrize(
("device_name", "entity_list"),
[
@@ -104,6 +102,23 @@ async def test_setup(
),
],
),
(
"filter_mock",
[
(
"number.mock_filter_low_pulse_duration",
20,
"time_low",
20,
),
(
"number.mock_filter_high_pulse_duration",
20,
"time_high",
20,
),
],
),
],
)
async def test_set_value(
@@ -135,7 +150,6 @@ async def test_set_value(
assert calls[-1][1][0][item[2]] == item[3]
@pytest.mark.usefixtures("classic_vario_mock", "heater_mock")
@pytest.mark.parametrize(
("device_name", "entity_list"),
[
@@ -198,6 +212,32 @@ async def test_set_value(
),
],
),
(
"filter_mock",
[
(
"number.mock_filter_low_pulse_duration",
"filter_data",
"pm_time_low",
20,
20,
),
(
"number.mock_filter_high_pulse_duration",
"filter_data",
"pm_time_high",
20,
20,
),
(
"number.mock_filter_system_led_brightness",
"usrdta",
"sysLED",
20,
20,
),
],
),
],
)
async def test_state_update(
+77 -3
View File
@@ -2,7 +2,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
from eheimdigital.types import FilterMode
from eheimdigital.types import FilterMode, FilterModeProf
import pytest
from syrupy.assertion import SnapshotAssertion
@@ -20,7 +20,6 @@ from .conftest import init_integration
from tests.common import MockConfigEntry, snapshot_platform
@pytest.mark.usefixtures("classic_vario_mock")
async def test_setup(
hass: HomeAssistant,
eheimdigital_hub_mock: MagicMock,
@@ -49,7 +48,6 @@ async def test_setup(
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
@pytest.mark.usefixtures("classic_vario_mock")
@pytest.mark.parametrize(
("device_name", "entity_list"),
[
@@ -64,6 +62,28 @@ async def test_setup(
),
],
),
(
"filter_mock",
[
(
"select.mock_filter_filter_mode",
"constant_flow",
"title",
"START_FILTER_NORMAL_MODE_WITH_COMP",
),
(
"select.mock_filter_manual_speed",
"61.5",
"frequency",
int(61.5 * 100),
),
("select.mock_filter_constant_flow_speed", "440", "flow_rate", 1),
("select.mock_filter_day_speed", "480", "dfs_soll_day", 2),
("select.mock_filter_night_speed", "860", "dfs_soll_night", 14),
("select.mock_filter_high_pulse_speed", "620", "dfs_soll_high", 6),
("select.mock_filter_low_pulse_speed", "770", "dfs_soll_low", 11),
],
),
],
)
async def test_set_value(
@@ -111,6 +131,60 @@ async def test_set_value(
),
],
),
(
"filter_mock",
[
(
"select.mock_filter_filter_mode",
"filter_data",
"pumpMode",
int(FilterModeProf.CONSTANT_FLOW),
"constant_flow",
),
(
"select.mock_filter_manual_speed",
"filter_data",
"freqSoll",
int(61.5 * 100),
"61.5",
),
(
"select.mock_filter_constant_flow_speed",
"filter_data",
"sollStep",
1,
"440",
),
(
"select.mock_filter_day_speed",
"filter_data",
"nm_dfs_soll_day",
2,
"480",
),
(
"select.mock_filter_night_speed",
"filter_data",
"nm_dfs_soll_night",
14,
"860",
),
(
"select.mock_filter_high_pulse_speed",
"filter_data",
"pm_dfs_soll_high",
6,
"620",
),
(
"select.mock_filter_low_pulse_speed",
"filter_data",
"pm_dfs_soll_low",
11,
"770",
),
],
),
],
)
async def test_state_update(
+26 -8
View File
@@ -2,7 +2,7 @@
from unittest.mock import AsyncMock, MagicMock, patch
from eheimdigital.types import EheimDeviceType, FilterErrorCode
from eheimdigital.types import FilterErrorCode
import pytest
from syrupy.assertion import SnapshotAssertion
@@ -15,8 +15,7 @@ from .conftest import init_integration
from tests.common import MockConfigEntry, get_sensor_display_state, snapshot_platform
@pytest.mark.usefixtures("classic_vario_mock")
async def test_setup_classic_vario(
async def test_setup(
hass: HomeAssistant,
eheimdigital_hub_mock: MagicMock,
mock_config_entry: MockConfigEntry,
@@ -35,15 +34,15 @@ async def test_setup_classic_vario(
):
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await eheimdigital_hub_mock.call_args.kwargs["device_found_callback"](
"00:00:00:00:00:03", EheimDeviceType.VERSION_EHEIM_CLASSIC_VARIO
)
await hass.async_block_till_done()
for device in eheimdigital_hub_mock.return_value.devices:
await eheimdigital_hub_mock.call_args.kwargs["device_found_callback"](
device, eheimdigital_hub_mock.return_value.devices[device].device_type
)
await hass.async_block_till_done()
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
@pytest.mark.usefixtures("classic_vario_mock")
@pytest.mark.parametrize(
("device_name", "entity_list"),
[
@@ -73,6 +72,25 @@ async def test_setup_classic_vario(
),
],
),
(
"filter_mock",
[
(
"sensor.mock_filter_current_speed",
"filter_data",
"freq",
7200,
str(round(72.0, 1)),
),
(
"sensor.mock_filter_remaining_hours_until_service",
"filter_data",
"serviceHour",
100,
str(round(100 / 24, 2)),
),
],
),
],
)
async def test_state_update(
+42 -16
View File
@@ -2,7 +2,6 @@
from unittest.mock import AsyncMock, MagicMock, patch
from eheimdigital.types import EheimDeviceType
import pytest
from syrupy.assertion import SnapshotAssertion
@@ -21,8 +20,7 @@ from .conftest import init_integration
from tests.common import MockConfigEntry, snapshot_platform
@pytest.mark.usefixtures("classic_vario_mock")
async def test_setup_classic_vario(
async def test_setup(
hass: HomeAssistant,
eheimdigital_hub_mock: MagicMock,
mock_config_entry: MockConfigEntry,
@@ -41,10 +39,11 @@ async def test_setup_classic_vario(
):
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await eheimdigital_hub_mock.call_args.kwargs["device_found_callback"](
"00:00:00:00:00:03", EheimDeviceType.VERSION_EHEIM_CLASSIC_VARIO
)
await hass.async_block_till_done()
for device in eheimdigital_hub_mock.return_value.devices:
await eheimdigital_hub_mock.call_args.kwargs["device_found_callback"](
device, eheimdigital_hub_mock.return_value.devices[device].device_type
)
await hass.async_block_till_done()
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
@@ -52,37 +51,45 @@ async def test_setup_classic_vario(
@pytest.mark.parametrize(
("service", "active"), [(SERVICE_TURN_OFF, False), (SERVICE_TURN_ON, True)]
)
@pytest.mark.parametrize(
("device_name", "entity_id", "property_name"),
[
("classic_vario_mock", "switch.mock_classicvario", "filterActive"),
("filter_mock", "switch.mock_filter", "active"),
],
)
async def test_turn_on_off(
hass: HomeAssistant,
eheimdigital_hub_mock: MagicMock,
mock_config_entry: MockConfigEntry,
classic_vario_mock: MagicMock,
device_name: str,
entity_id: str,
property_name: str,
service: str,
active: bool,
request: pytest.FixtureRequest,
) -> None:
"""Test turning on/off the switch."""
device: MagicMock = request.getfixturevalue(device_name)
await init_integration(hass, mock_config_entry)
await eheimdigital_hub_mock.call_args.kwargs["device_found_callback"](
"00:00:00:00:00:03", EheimDeviceType.VERSION_EHEIM_CLASSIC_VARIO
device.mac_address, device.device_type
)
await hass.async_block_till_done()
await hass.services.async_call(
SWITCH_DOMAIN,
service,
{ATTR_ENTITY_ID: "switch.mock_classicvario"},
{ATTR_ENTITY_ID: entity_id},
blocking=True,
)
calls = [
call for call in classic_vario_mock.hub.mock_calls if call[0] == "send_packet"
]
assert len(calls) == 1
assert calls[0][1][0].get("filterActive") == int(active)
calls = [call for call in device.hub.mock_calls if call[0] == "send_packet"]
assert calls[-1][1][0][property_name] == int(active)
@pytest.mark.usefixtures("classic_vario_mock")
@pytest.mark.usefixtures("classic_vario_mock", "filter_mock")
@pytest.mark.parametrize(
("device_name", "entity_list"),
[
@@ -105,6 +112,25 @@ async def test_turn_on_off(
),
],
),
(
"filter_mock",
[
(
"switch.mock_filter",
"filter_data",
"filterActive",
1,
"on",
),
(
"switch.mock_filter",
"filter_data",
"filterActive",
0,
"off",
),
],
),
],
)
async def test_state_update(
+36 -3
View File
@@ -20,7 +20,6 @@ from .conftest import init_integration
from tests.common import MockConfigEntry, snapshot_platform
@pytest.mark.usefixtures("classic_vario_mock", "heater_mock")
async def test_setup(
hass: HomeAssistant,
eheimdigital_hub_mock: MagicMock,
@@ -49,7 +48,6 @@ async def test_setup(
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
@pytest.mark.usefixtures("classic_vario_mock", "heater_mock")
@pytest.mark.parametrize(
("device_name", "entity_list"),
[
@@ -87,6 +85,23 @@ async def test_setup(
),
],
),
(
"filter_mock",
[
(
"time.mock_filter_day_start_time",
time(9, 0, tzinfo=timezone(timedelta(hours=1))),
"end_time_night_mode",
9 * 60,
),
(
"time.mock_filter_night_start_time",
time(19, 0, tzinfo=timezone(timedelta(hours=1))),
"start_time_night_mode",
19 * 60,
),
],
),
],
)
async def test_set_value(
@@ -118,7 +133,6 @@ async def test_set_value(
assert calls[-1][1][0][item[2]] == item[3]
@pytest.mark.usefixtures("classic_vario_mock", "heater_mock")
@pytest.mark.parametrize(
("device_name", "entity_list"),
[
@@ -160,6 +174,25 @@ async def test_set_value(
),
],
),
(
"filter_mock",
[
(
"time.mock_filter_day_start_time",
"filter_data",
"end_time_night_mode",
540,
time(9, 0, tzinfo=timezone(timedelta(hours=1))).isoformat(),
),
(
"time.mock_filter_night_start_time",
"filter_data",
"start_time_night_mode",
1320,
time(22, 0, tzinfo=timezone(timedelta(hours=1))).isoformat(),
),
],
),
],
)
async def test_state_update(