From 4c1788e757c76eb3f8ecb034024379fb5a11231d Mon Sep 17 00:00:00 2001 From: Imeon-Energy Date: Tue, 19 Aug 2025 14:21:33 +0200 Subject: [PATCH] Add sensors to Imeon inverter integration (#146437) Co-authored-by: TheBushBoy Co-authored-by: Joost Lekkerkerker --- .../components/imeon_inverter/const.py | 23 + .../components/imeon_inverter/coordinator.py | 6 +- .../components/imeon_inverter/icons.json | 49 +- .../components/imeon_inverter/sensor.py | 77 + .../components/imeon_inverter/strings.json | 72 +- tests/components/imeon_inverter/conftest.py | 2 +- .../imeon_inverter/fixtures/entity_data.json | 79 + .../imeon_inverter/fixtures/sensor_data.json | 73 - .../imeon_inverter/snapshots/test_sensor.ambr | 1446 ++++++++++++----- .../components/imeon_inverter/test_sensor.py | 58 +- 10 files changed, 1370 insertions(+), 515 deletions(-) create mode 100644 tests/components/imeon_inverter/fixtures/entity_data.json delete mode 100644 tests/components/imeon_inverter/fixtures/sensor_data.json diff --git a/homeassistant/components/imeon_inverter/const.py b/homeassistant/components/imeon_inverter/const.py index fd08955c038..9cde40e01d7 100644 --- a/homeassistant/components/imeon_inverter/const.py +++ b/homeassistant/components/imeon_inverter/const.py @@ -7,3 +7,26 @@ TIMEOUT = 30 PLATFORMS = [ Platform.SENSOR, ] +ATTR_BATTERY_STATUS = ["charging", "discharging", "charged"] +ATTR_INVERTER_STATE = [ + "unsynchronized", + "grid_consumption", + "grid_injection", + "grid_synchronised_but_not_used", +] +ATTR_TIMELINE_STATUS = [ + "com_lost", + "warning_grid", + "warning_pv", + "warning_bat", + "error_ond", + "error_soft", + "error_pv", + "error_grid", + "error_bat", + "good_1", + "info_soft", + "info_ond", + "info_bat", + "info_smartlo", +] diff --git a/homeassistant/components/imeon_inverter/coordinator.py b/homeassistant/components/imeon_inverter/coordinator.py index f1963a45579..d41e9fd43b2 100644 --- a/homeassistant/components/imeon_inverter/coordinator.py +++ b/homeassistant/components/imeon_inverter/coordinator.py @@ -17,7 +17,7 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, Upda from .const import TIMEOUT HUBNAME = "imeon_inverter_hub" -INTERVAL = timedelta(seconds=60) +INTERVAL = 60 _LOGGER = logging.getLogger(__name__) type InverterConfigEntry = ConfigEntry[InverterCoordinator] @@ -44,7 +44,7 @@ class InverterCoordinator(DataUpdateCoordinator[dict[str, str | float | int]]): hass, _LOGGER, name=HUBNAME, - update_interval=INTERVAL, + update_interval=timedelta(seconds=INTERVAL), config_entry=entry, ) @@ -83,7 +83,7 @@ class InverterCoordinator(DataUpdateCoordinator[dict[str, str | float | int]]): # Fetch data using distant API try: await self._api.update() - except (ValueError, ClientError) as e: + except (ValueError, TimeoutError, ClientError) as e: raise UpdateFailed(e) from e # Store data diff --git a/homeassistant/components/imeon_inverter/icons.json b/homeassistant/components/imeon_inverter/icons.json index 6ede2416afa..a4a7edf21a6 100644 --- a/homeassistant/components/imeon_inverter/icons.json +++ b/homeassistant/components/imeon_inverter/icons.json @@ -7,8 +7,14 @@ "battery_soc": { "default": "mdi:battery-charging-100" }, + "battery_status": { + "default": "mdi:battery-alert" + }, "battery_stored": { - "default": "mdi:battery" + "default": "mdi:battery-arrow-up" + }, + "battery_consumed": { + "default": "mdi:battery-arrow-down" }, "grid_current_l1": { "default": "mdi:current-ac" @@ -50,7 +56,7 @@ "default": "mdi:power-socket" }, "meter_power": { - "default": "mdi:power-plug" + "default": "mdi:meter-electric" }, "output_current_l1": { "default": "mdi:current-ac" @@ -116,7 +122,7 @@ "default": "mdi:home-lightning-bolt" }, "monitoring_minute_grid_consumption": { - "default": "mdi:transmission-tower" + "default": "mdi:transmission-tower-import" }, "monitoring_minute_grid_injection": { "default": "mdi:transmission-tower-export" @@ -126,6 +132,43 @@ }, "monitoring_minute_solar_production": { "default": "mdi:solar-power" + }, + "timeline_type_msg": { + "default": "mdi:check-circle", + "state": { + "com_lost": "mdi:lan-disconnect", + "warning_grid": "mdi:alert-circle", + "warning_pv": "mdi:alert-circle", + "warning_bat": "mdi:alert-circle", + "error_ond": "mdi:close-octagon", + "error_soft": "mdi:close-octagon", + "error_pv": "mdi:close-octagon", + "error_grid": "mdi:close-octagon", + "error_bat": "mdi:close-octagon", + "good_1": "mdi:check-circle", + "info_soft": "mdi:information-slab-circle", + "info_ond": "mdi:information-slab-circle", + "info_bat": "mdi:information-slab-circle", + "info_smartlo": "mdi:information-slab-circle" + } + }, + "energy_pv": { + "default": "mdi:solar-power" + }, + "energy_grid_injected": { + "default": "mdi:transmission-tower-export" + }, + "energy_grid_consumed": { + "default": "mdi:transmission-tower-import" + }, + "energy_building_consumption": { + "default": "mdi:home-lightning-bolt-outline" + }, + "energy_battery_stored": { + "default": "mdi:battery-arrow-up-outline" + }, + "energy_battery_consumed": { + "default": "mdi:battery-arrow-down-outline" } } } diff --git a/homeassistant/components/imeon_inverter/sensor.py b/homeassistant/components/imeon_inverter/sensor.py index 119677c0a8a..21aa37a0523 100644 --- a/homeassistant/components/imeon_inverter/sensor.py +++ b/homeassistant/components/imeon_inverter/sensor.py @@ -14,6 +14,7 @@ from homeassistant.const import ( EntityCategory, UnitOfElectricCurrent, UnitOfElectricPotential, + UnitOfEnergy, UnitOfFrequency, UnitOfPower, UnitOfTemperature, @@ -22,6 +23,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.typing import StateType +from .const import ATTR_BATTERY_STATUS, ATTR_INVERTER_STATE, ATTR_TIMELINE_STATUS from .coordinator import InverterCoordinator from .entity import InverterEntity @@ -46,6 +48,12 @@ SENSOR_DESCRIPTIONS = ( device_class=SensorDeviceClass.BATTERY, state_class=SensorStateClass.MEASUREMENT, ), + SensorEntityDescription( + key="battery_status", + translation_key="battery_status", + device_class=SensorDeviceClass.ENUM, + options=ATTR_BATTERY_STATUS, + ), SensorEntityDescription( key="battery_stored", translation_key="battery_stored", @@ -53,6 +61,13 @@ SENSOR_DESCRIPTIONS = ( device_class=SensorDeviceClass.POWER, state_class=SensorStateClass.MEASUREMENT, ), + SensorEntityDescription( + key="battery_consumed", + translation_key="battery_consumed", + native_unit_of_measurement=UnitOfPower.WATT, + device_class=SensorDeviceClass.POWER, + state_class=SensorStateClass.MEASUREMENT, + ), # Grid SensorEntityDescription( key="grid_current_l1", @@ -147,6 +162,12 @@ SENSOR_DESCRIPTIONS = ( device_class=SensorDeviceClass.POWER, state_class=SensorStateClass.MEASUREMENT, ), + SensorEntityDescription( + key="manager_inverter_state", + translation_key="manager_inverter_state", + device_class=SensorDeviceClass.ENUM, + options=ATTR_INVERTER_STATE, + ), # Meter SensorEntityDescription( key="meter_power", @@ -340,6 +361,62 @@ SENSOR_DESCRIPTIONS = ( state_class=SensorStateClass.MEASUREMENT, suggested_display_precision=2, ), + # Timeline + SensorEntityDescription( + key="timeline_type_msg", + translation_key="timeline_type_msg", + device_class=SensorDeviceClass.ENUM, + options=ATTR_TIMELINE_STATUS, + ), + # Daily energy counters + SensorEntityDescription( + key="energy_pv", + translation_key="energy_pv", + native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + suggested_display_precision=2, + ), + SensorEntityDescription( + key="energy_grid_injected", + translation_key="energy_grid_injected", + native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + suggested_display_precision=2, + ), + SensorEntityDescription( + key="energy_grid_consumed", + translation_key="energy_grid_consumed", + native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + suggested_display_precision=2, + ), + SensorEntityDescription( + key="energy_building_consumption", + translation_key="energy_building_consumption", + native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + suggested_display_precision=2, + ), + SensorEntityDescription( + key="energy_battery_stored", + translation_key="energy_battery_stored", + native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + suggested_display_precision=2, + ), + SensorEntityDescription( + key="energy_battery_consumed", + translation_key="energy_battery_consumed", + native_unit_of_measurement=UnitOfEnergy.WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + suggested_display_precision=2, + ), ) diff --git a/homeassistant/components/imeon_inverter/strings.json b/homeassistant/components/imeon_inverter/strings.json index 86855361b8f..66d0472b89a 100644 --- a/homeassistant/components/imeon_inverter/strings.json +++ b/homeassistant/components/imeon_inverter/strings.json @@ -35,9 +35,20 @@ "battery_soc": { "name": "Battery state of charge" }, + "battery_status": { + "name": "Battery status", + "state": { + "charged": "Charged", + "charging": "[%key:common::state::charging%]", + "discharging": "[%key:common::state::discharging%]" + } + }, "battery_stored": { "name": "Battery stored" }, + "battery_consumed": { + "name": "Battery consumed" + }, "grid_current_l1": { "name": "Grid current L1" }, @@ -77,6 +88,15 @@ "inverter_injection_power_limit": { "name": "Injection power limit" }, + "manager_inverter_state": { + "name": "Inverter state", + "state": { + "unsynchronized": "Unsynchronized", + "grid_consumption": "Grid consumption", + "grid_injection": "Grid injection", + "grid_synchronised_but_not_used": "Grid unsynchronized but used" + } + }, "meter_power": { "name": "Meter power" }, @@ -135,25 +155,63 @@ "name": "Component temperature" }, "monitoring_self_consumption": { - "name": "Monitoring self-consumption" + "name": "Self-consumption" }, "monitoring_self_sufficiency": { - "name": "Monitoring self-sufficiency" + "name": "Self-sufficiency" }, "monitoring_minute_building_consumption": { - "name": "Monitoring building consumption (minute)" + "name": "Building consumption" }, "monitoring_minute_grid_consumption": { - "name": "Monitoring grid consumption (minute)" + "name": "Grid consumption" }, "monitoring_minute_grid_injection": { - "name": "Monitoring grid injection (minute)" + "name": "Grid injection" }, "monitoring_minute_grid_power_flow": { - "name": "Monitoring grid power flow (minute)" + "name": "Grid power flow" }, "monitoring_minute_solar_production": { - "name": "Monitoring solar production (minute)" + "name": "Solar production" + }, + "timeline_type_msg": { + "name": "Timeline status", + "state": { + "com_lost": "Communication lost.", + "warning_grid": "Power grid warning detected.", + "warning_pv": "PV system warning detected.", + "warning_bat": "Battery warning detected.", + "error_ond": "Inverter error detected.", + "error_soft": "Software error detected.", + "error_pv": "PV system error detected.", + "error_grid": "Power grid error detected.", + "error_bat": "Battery error detected.", + "good_1": "System operating normally.", + "web_account": "Web account notification.", + "info_soft": "Software information available.", + "info_ond": "Inverter information available.", + "info_bat": "Battery information available.", + "info_smartlo": "Smart load information available." + } + }, + "energy_pv": { + "name": "Today PV energy" + }, + "energy_grid_injected": { + "name": "Today grid-injected energy" + }, + "energy_grid_consumed": { + "name": "Today grid-consumed energy" + }, + "energy_building_consumption": { + "name": "Today building consumption" + }, + "energy_battery_stored": { + "name": "Today battery-stored energy" + }, + "energy_battery_consumed": { + "name": "Today battery-consumed energy" } } } diff --git a/tests/components/imeon_inverter/conftest.py b/tests/components/imeon_inverter/conftest.py index e147a6ff642..37fa47e7afb 100644 --- a/tests/components/imeon_inverter/conftest.py +++ b/tests/components/imeon_inverter/conftest.py @@ -66,7 +66,7 @@ def mock_imeon_inverter() -> Generator[MagicMock]: "serial": TEST_SERIAL, "url": f"http://{TEST_USER_INPUT[CONF_HOST]}", } - inverter.storage = load_json_object_fixture("sensor_data.json", DOMAIN) + inverter.storage = load_json_object_fixture("entity_data.json", DOMAIN) yield inverter diff --git a/tests/components/imeon_inverter/fixtures/entity_data.json b/tests/components/imeon_inverter/fixtures/entity_data.json new file mode 100644 index 00000000000..a2717f093f4 --- /dev/null +++ b/tests/components/imeon_inverter/fixtures/entity_data.json @@ -0,0 +1,79 @@ +{ + "battery": { + "battery_power": 2500.0, + "battery_soc": 78.0, + "battery_status": "charging", + "battery_stored": 10200.0, + "battery_consumed": 500.0 + }, + "grid": { + "grid_current_l1": 12.5, + "grid_current_l2": 10.8, + "grid_current_l3": 11.2, + "grid_frequency": 50.0, + "grid_voltage_l1": 230.0, + "grid_voltage_l2": 229.5, + "grid_voltage_l3": 230.1 + }, + "input": { + "input_power_l1": 1000.0, + "input_power_l2": 950.0, + "input_power_l3": 980.0, + "input_power_total": 2930.0 + }, + "inverter": { + "inverter_charging_current_limit": 50, + "inverter_injection_power_limit": 5000.0, + "manager_inverter_state": "grid_consumption" + }, + "meter": { + "meter_power": 2000.0 + }, + "output": { + "output_current_l1": 15.0, + "output_current_l2": 14.5, + "output_current_l3": 15.2, + "output_frequency": 49.9, + "output_power_l1": 1100.0, + "output_power_l2": 1080.0, + "output_power_l3": 1120.0, + "output_power_total": 3300.0, + "output_voltage_l1": 231.0, + "output_voltage_l2": 229.8, + "output_voltage_l3": 230.2 + }, + "pv": { + "pv_consumed": 1500.0, + "pv_injected": 800.0, + "pv_power_1": 1200.0, + "pv_power_2": 1300.0, + "pv_power_total": 2500.0 + }, + "temp": { + "temp_air_temperature": 25.0, + "temp_component_temperature": 45.5 + }, + "monitoring": { + "monitoring_self_produced": 2600.0, + "monitoring_self_consumption": 85.0, + "monitoring_self_sufficiency": 90.0 + }, + "monitoring_minute": { + "monitoring_minute_building_consumption": 50.0, + "monitoring_minute_grid_consumption": 8.3, + "monitoring_minute_grid_injection": 11.7, + "monitoring_minute_grid_power_flow": -3.4, + "monitoring_minute_solar_production": 43.3 + }, + "timeline": { + "timeline_type_msg": "info_bat" + }, + "energy": { + "energy_pv": 12000.0, + "energy_grid_injected": 5000.0, + "energy_grid_consumed": 6000.0, + "energy_building_consumption": 15000.0, + "energy_battery_stored": 8000.0, + "energy_battery_consumed": 2000.0 + } +} diff --git a/tests/components/imeon_inverter/fixtures/sensor_data.json b/tests/components/imeon_inverter/fixtures/sensor_data.json deleted file mode 100644 index 566716fe3fa..00000000000 --- a/tests/components/imeon_inverter/fixtures/sensor_data.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "battery": { - "autonomy": 4.5, - "charge_time": 120, - "power": 2500.0, - "soc": 78.0, - "stored": 10.2 - }, - "grid": { - "current_l1": 12.5, - "current_l2": 10.8, - "current_l3": 11.2, - "frequency": 50.0, - "voltage_l1": 230.0, - "voltage_l2": 229.5, - "voltage_l3": 230.1 - }, - "input": { - "power_l1": 1000.0, - "power_l2": 950.0, - "power_l3": 980.0, - "power_total": 2930.0 - }, - "inverter": { - "charging_current_limit": 50, - "injection_power_limit": 5000.0 - }, - "meter": { - "power": 2000.0, - "power_protocol": 2018.0 - }, - "output": { - "current_l1": 15.0, - "current_l2": 14.5, - "current_l3": 15.2, - "frequency": 49.9, - "power_l1": 1100.0, - "power_l2": 1080.0, - "power_l3": 1120.0, - "power_total": 3300.0, - "voltage_l1": 231.0, - "voltage_l2": 229.8, - "voltage_l3": 230.2 - }, - "pv": { - "consumed": 1500.0, - "injected": 800.0, - "power_1": 1200.0, - "power_2": 1300.0, - "power_total": 2500.0 - }, - "temp": { - "air_temperature": 25.0, - "component_temperature": 45.5 - }, - "monitoring": { - "building_consumption": 3000.0, - "economy_factor": 0.8, - "grid_consumption": 500.0, - "grid_injection": 700.0, - "grid_power_flow": -200.0, - "self_consumption": 85.0, - "self_sufficiency": 90.0, - "solar_production": 2600.0 - }, - "monitoring_minute": { - "building_consumption": 50.0, - "grid_consumption": 8.3, - "grid_injection": 11.7, - "grid_power_flow": -3.4, - "solar_production": 43.3 - } -} diff --git a/tests/components/imeon_inverter/snapshots/test_sensor.ambr b/tests/components/imeon_inverter/snapshots/test_sensor.ambr index 84e691bc8de..673f561d540 100644 --- a/tests/components/imeon_inverter/snapshots/test_sensor.ambr +++ b/tests/components/imeon_inverter/snapshots/test_sensor.ambr @@ -52,7 +52,63 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '25.0', + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_battery_consumed-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_battery_consumed', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 0, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Battery consumed', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'battery_consumed', + 'unique_id': '111111111111111_battery_consumed', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_battery_consumed-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'Imeon inverter Battery consumed', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_battery_consumed', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_battery_power-entry] @@ -108,7 +164,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '2500.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_battery_state_of_charge-entry] @@ -161,7 +217,67 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '78.0', + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_battery_status-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'charging', + 'discharging', + 'charged', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_battery_status', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Battery status', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'battery_status', + 'unique_id': '111111111111111_battery_status', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[sensor.imeon_inverter_battery_status-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'Imeon inverter Battery status', + 'options': list([ + 'charging', + 'discharging', + 'charged', + ]), + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_battery_status', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_battery_stored-entry] @@ -217,7 +333,63 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '10.2', + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_building_consumption-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_building_consumption', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Building consumption', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'monitoring_minute_building_consumption', + 'unique_id': '111111111111111_monitoring_minute_building_consumption', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_building_consumption-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'Imeon inverter Building consumption', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_building_consumption', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_charging_current_limit-entry] @@ -273,7 +445,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '50', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_component_temperature-entry] @@ -329,7 +501,63 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '45.5', + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_grid_consumption-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_grid_consumption', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Grid consumption', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'monitoring_minute_grid_consumption', + 'unique_id': '111111111111111_monitoring_minute_grid_consumption', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_grid_consumption-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'Imeon inverter Grid consumption', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_grid_consumption', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_grid_current_l1-entry] @@ -385,7 +613,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '12.5', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_grid_current_l2-entry] @@ -441,7 +669,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '10.8', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_grid_current_l3-entry] @@ -497,7 +725,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '11.2', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_grid_frequency-entry] @@ -553,7 +781,119 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '50.0', + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_grid_injection-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_grid_injection', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Grid injection', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'monitoring_minute_grid_injection', + 'unique_id': '111111111111111_monitoring_minute_grid_injection', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_grid_injection-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'Imeon inverter Grid injection', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_grid_injection', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_grid_power_flow-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_grid_power_flow', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Grid power flow', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'monitoring_minute_grid_power_flow', + 'unique_id': '111111111111111_monitoring_minute_grid_power_flow', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_grid_power_flow-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'Imeon inverter Grid power flow', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_grid_power_flow', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_grid_voltage_l1-entry] @@ -609,7 +949,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '230.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_grid_voltage_l2-entry] @@ -665,7 +1005,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '229.5', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_grid_voltage_l3-entry] @@ -721,7 +1061,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '230.1', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_injection_power_limit-entry] @@ -777,7 +1117,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '5000.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_input_power_l1-entry] @@ -833,7 +1173,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '1000.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_input_power_l2-entry] @@ -889,7 +1229,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '950.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_input_power_l3-entry] @@ -945,7 +1285,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '980.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_input_power_total-entry] @@ -1001,7 +1341,69 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '2930.0', + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_inverter_state-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'unsynchronized', + 'grid_consumption', + 'grid_injection', + 'grid_synchronised_but_not_used', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_inverter_state', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Inverter state', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'manager_inverter_state', + 'unique_id': '111111111111111_manager_inverter_state', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[sensor.imeon_inverter_inverter_state-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'Imeon inverter Inverter state', + 'options': list([ + 'unsynchronized', + 'grid_consumption', + 'grid_injection', + 'grid_synchronised_but_not_used', + ]), + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_inverter_state', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_meter_power-entry] @@ -1057,397 +1459,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '2000.0', - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_building_consumption_minute-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': , - 'entity_id': 'sensor.imeon_inverter_monitoring_building_consumption_minute', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - }), - 'original_device_class': , - 'original_icon': None, - 'original_name': 'Monitoring building consumption (minute)', - 'platform': 'imeon_inverter', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'monitoring_minute_building_consumption', - 'unique_id': '111111111111111_monitoring_minute_building_consumption', - 'unit_of_measurement': , - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_building_consumption_minute-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'power', - 'friendly_name': 'Imeon inverter Monitoring building consumption (minute)', - 'state_class': , - 'unit_of_measurement': , - }), - 'context': , - 'entity_id': 'sensor.imeon_inverter_monitoring_building_consumption_minute', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '50.0', - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_grid_consumption_minute-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': , - 'entity_id': 'sensor.imeon_inverter_monitoring_grid_consumption_minute', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - }), - 'original_device_class': , - 'original_icon': None, - 'original_name': 'Monitoring grid consumption (minute)', - 'platform': 'imeon_inverter', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'monitoring_minute_grid_consumption', - 'unique_id': '111111111111111_monitoring_minute_grid_consumption', - 'unit_of_measurement': , - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_grid_consumption_minute-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'power', - 'friendly_name': 'Imeon inverter Monitoring grid consumption (minute)', - 'state_class': , - 'unit_of_measurement': , - }), - 'context': , - 'entity_id': 'sensor.imeon_inverter_monitoring_grid_consumption_minute', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '8.3', - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_grid_injection_minute-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': , - 'entity_id': 'sensor.imeon_inverter_monitoring_grid_injection_minute', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - }), - 'original_device_class': , - 'original_icon': None, - 'original_name': 'Monitoring grid injection (minute)', - 'platform': 'imeon_inverter', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'monitoring_minute_grid_injection', - 'unique_id': '111111111111111_monitoring_minute_grid_injection', - 'unit_of_measurement': , - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_grid_injection_minute-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'power', - 'friendly_name': 'Imeon inverter Monitoring grid injection (minute)', - 'state_class': , - 'unit_of_measurement': , - }), - 'context': , - 'entity_id': 'sensor.imeon_inverter_monitoring_grid_injection_minute', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '11.7', - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_grid_power_flow_minute-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': , - 'entity_id': 'sensor.imeon_inverter_monitoring_grid_power_flow_minute', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - }), - 'original_device_class': , - 'original_icon': None, - 'original_name': 'Monitoring grid power flow (minute)', - 'platform': 'imeon_inverter', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'monitoring_minute_grid_power_flow', - 'unique_id': '111111111111111_monitoring_minute_grid_power_flow', - 'unit_of_measurement': , - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_grid_power_flow_minute-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'power', - 'friendly_name': 'Imeon inverter Monitoring grid power flow (minute)', - 'state_class': , - 'unit_of_measurement': , - }), - 'context': , - 'entity_id': 'sensor.imeon_inverter_monitoring_grid_power_flow_minute', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '-3.4', - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_self_consumption-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': , - 'entity_id': 'sensor.imeon_inverter_monitoring_self_consumption', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - }), - 'original_device_class': None, - 'original_icon': None, - 'original_name': 'Monitoring self-consumption', - 'platform': 'imeon_inverter', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'monitoring_self_consumption', - 'unique_id': '111111111111111_monitoring_self_consumption', - 'unit_of_measurement': '%', - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_self_consumption-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'friendly_name': 'Imeon inverter Monitoring self-consumption', - 'state_class': , - 'unit_of_measurement': '%', - }), - 'context': , - 'entity_id': 'sensor.imeon_inverter_monitoring_self_consumption', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '85.0', - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_self_sufficiency-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': , - 'entity_id': 'sensor.imeon_inverter_monitoring_self_sufficiency', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - }), - 'original_device_class': None, - 'original_icon': None, - 'original_name': 'Monitoring self-sufficiency', - 'platform': 'imeon_inverter', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'monitoring_self_sufficiency', - 'unique_id': '111111111111111_monitoring_self_sufficiency', - 'unit_of_measurement': '%', - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_self_sufficiency-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'friendly_name': 'Imeon inverter Monitoring self-sufficiency', - 'state_class': , - 'unit_of_measurement': '%', - }), - 'context': , - 'entity_id': 'sensor.imeon_inverter_monitoring_self_sufficiency', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '90.0', - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_solar_production_minute-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': , - 'entity_id': 'sensor.imeon_inverter_monitoring_solar_production_minute', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'options': dict({ - 'sensor': dict({ - 'suggested_display_precision': 2, - }), - }), - 'original_device_class': , - 'original_icon': None, - 'original_name': 'Monitoring solar production (minute)', - 'platform': 'imeon_inverter', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'monitoring_minute_solar_production', - 'unique_id': '111111111111111_monitoring_minute_solar_production', - 'unit_of_measurement': , - }) -# --- -# name: test_sensors[sensor.imeon_inverter_monitoring_solar_production_minute-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'power', - 'friendly_name': 'Imeon inverter Monitoring solar production (minute)', - 'state_class': , - 'unit_of_measurement': , - }), - 'context': , - 'entity_id': 'sensor.imeon_inverter_monitoring_solar_production_minute', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '43.3', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_current_l1-entry] @@ -1503,7 +1515,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '15.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_current_l2-entry] @@ -1559,7 +1571,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '14.5', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_current_l3-entry] @@ -1615,7 +1627,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '15.2', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_frequency-entry] @@ -1671,7 +1683,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '49.9', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_power_l1-entry] @@ -1727,7 +1739,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '1100.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_power_l2-entry] @@ -1783,7 +1795,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '1080.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_power_l3-entry] @@ -1839,7 +1851,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '1120.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_power_total-entry] @@ -1895,7 +1907,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '3300.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_voltage_l1-entry] @@ -1951,7 +1963,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '231.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_voltage_l2-entry] @@ -2007,7 +2019,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '229.8', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_output_voltage_l3-entry] @@ -2063,7 +2075,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '230.2', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_pv_consumed-entry] @@ -2119,7 +2131,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '1500.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_pv_injected-entry] @@ -2175,7 +2187,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '800.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_pv_power_1-entry] @@ -2231,7 +2243,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '1200.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_pv_power_2-entry] @@ -2287,7 +2299,7 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '1300.0', + 'state': 'unknown', }) # --- # name: test_sensors[sensor.imeon_inverter_pv_power_total-entry] @@ -2343,6 +2355,590 @@ 'last_changed': , 'last_reported': , 'last_updated': , - 'state': '2500.0', + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_self_consumption-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_self_consumption', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Self-consumption', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'monitoring_self_consumption', + 'unique_id': '111111111111111_monitoring_self_consumption', + 'unit_of_measurement': '%', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_self_consumption-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Imeon inverter Self-consumption', + 'state_class': , + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_self_consumption', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_self_sufficiency-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_self_sufficiency', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Self-sufficiency', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'monitoring_self_sufficiency', + 'unique_id': '111111111111111_monitoring_self_sufficiency', + 'unit_of_measurement': '%', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_self_sufficiency-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Imeon inverter Self-sufficiency', + 'state_class': , + 'unit_of_measurement': '%', + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_self_sufficiency', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_solar_production-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_solar_production', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Solar production', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'monitoring_minute_solar_production', + 'unique_id': '111111111111111_monitoring_minute_solar_production', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_solar_production-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'power', + 'friendly_name': 'Imeon inverter Solar production', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_solar_production', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_timeline_status-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'com_lost', + 'warning_grid', + 'warning_pv', + 'warning_bat', + 'error_ond', + 'error_soft', + 'error_pv', + 'error_grid', + 'error_bat', + 'good_1', + 'info_soft', + 'info_ond', + 'info_bat', + 'info_smartlo', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_timeline_status', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Timeline status', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'timeline_type_msg', + 'unique_id': '111111111111111_timeline_type_msg', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[sensor.imeon_inverter_timeline_status-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'Imeon inverter Timeline status', + 'options': list([ + 'com_lost', + 'warning_grid', + 'warning_pv', + 'warning_bat', + 'error_ond', + 'error_soft', + 'error_pv', + 'error_grid', + 'error_bat', + 'good_1', + 'info_soft', + 'info_ond', + 'info_bat', + 'info_smartlo', + ]), + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_timeline_status', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_battery_consumed_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_today_battery_consumed_energy', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Today battery-consumed energy', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'energy_battery_consumed', + 'unique_id': '111111111111111_energy_battery_consumed', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_battery_consumed_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'energy', + 'friendly_name': 'Imeon inverter Today battery-consumed energy', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_today_battery_consumed_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_battery_stored_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_today_battery_stored_energy', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Today battery-stored energy', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'energy_battery_stored', + 'unique_id': '111111111111111_energy_battery_stored', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_battery_stored_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'energy', + 'friendly_name': 'Imeon inverter Today battery-stored energy', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_today_battery_stored_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_building_consumption-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_today_building_consumption', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Today building consumption', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'energy_building_consumption', + 'unique_id': '111111111111111_energy_building_consumption', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_building_consumption-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'energy', + 'friendly_name': 'Imeon inverter Today building consumption', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_today_building_consumption', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_grid_consumed_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_today_grid_consumed_energy', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Today grid-consumed energy', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'energy_grid_consumed', + 'unique_id': '111111111111111_energy_grid_consumed', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_grid_consumed_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'energy', + 'friendly_name': 'Imeon inverter Today grid-consumed energy', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_today_grid_consumed_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_grid_injected_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_today_grid_injected_energy', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Today grid-injected energy', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'energy_grid_injected', + 'unique_id': '111111111111111_energy_grid_injected', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_grid_injected_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'energy', + 'friendly_name': 'Imeon inverter Today grid-injected energy', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_today_grid_injected_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_pv_energy-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.imeon_inverter_today_pv_energy', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + 'sensor': dict({ + 'suggested_display_precision': 2, + }), + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Today PV energy', + 'platform': 'imeon_inverter', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'energy_pv', + 'unique_id': '111111111111111_energy_pv', + 'unit_of_measurement': , + }) +# --- +# name: test_sensors[sensor.imeon_inverter_today_pv_energy-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'energy', + 'friendly_name': 'Imeon inverter Today PV energy', + 'state_class': , + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'sensor.imeon_inverter_today_pv_energy', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', }) # --- diff --git a/tests/components/imeon_inverter/test_sensor.py b/tests/components/imeon_inverter/test_sensor.py index 194864a67a2..ec50594f6ba 100644 --- a/tests/components/imeon_inverter/test_sensor.py +++ b/tests/components/imeon_inverter/test_sensor.py @@ -1,16 +1,20 @@ """Test the Imeon Inverter sensors.""" -from unittest.mock import patch +from unittest.mock import MagicMock, patch +from aiohttp import ClientError +from freezegun.api import FrozenDateTimeFactory +import pytest from syrupy.assertion import SnapshotAssertion -from homeassistant.const import Platform +from homeassistant.components.imeon_inverter.coordinator import INTERVAL +from homeassistant.const import STATE_UNAVAILABLE, Platform from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er from . import setup_integration -from tests.common import MockConfigEntry, snapshot_platform +from tests.common import MockConfigEntry, async_fire_time_changed, snapshot_platform async def test_sensors( @@ -24,3 +28,51 @@ async def test_sensors( await setup_integration(hass, mock_config_entry) await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id) + + +@pytest.mark.parametrize( + "exception", + [ + TimeoutError, + ClientError, + ValueError, + ], +) +@pytest.mark.asyncio +async def test_sensor_unavailable_on_update_error( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_imeon_inverter: MagicMock, + freezer: FrozenDateTimeFactory, + exception: Exception, +) -> None: + """Test that sensor becomes unavailable when update raises an error.""" + entity_id = "sensor.imeon_inverter_battery_power" + + mock_config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_config_entry.entry_id) + await hass.async_block_till_done() + + state = hass.states.get(entity_id) + assert state + assert state.state != STATE_UNAVAILABLE + + mock_imeon_inverter.update.side_effect = exception + + freezer.tick(INTERVAL) + async_fire_time_changed(hass) + await hass.async_block_till_done() + + state = hass.states.get(entity_id) + assert state + assert state.state == STATE_UNAVAILABLE + + mock_imeon_inverter.update.side_effect = None + + freezer.tick(INTERVAL) + async_fire_time_changed(hass) + await hass.async_block_till_done() + + state = hass.states.get(entity_id) + assert state + assert state.state != STATE_UNAVAILABLE