diff --git a/homeassistant/components/nordpool/binary_sensor.py b/homeassistant/components/nordpool/binary_sensor.py new file mode 100644 index 00000000000000..2caf52a0db5ebc --- /dev/null +++ b/homeassistant/components/nordpool/binary_sensor.py @@ -0,0 +1,86 @@ +"""Binary sensor platform for Nord Pool integration.""" + +from collections.abc import Callable +from dataclasses import dataclass + +from homeassistant.components.binary_sensor import ( + BinarySensorEntity, + BinarySensorEntityDescription, +) +from homeassistant.components.sensor import EntityCategory +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback + +from . import NordPoolConfigEntry +from .const import CONF_AREAS +from .coordinator import NordPoolDataUpdateCoordinator +from .entity import NordpoolBaseEntity + +PARALLEL_UPDATES = 0 + + +def get_tomorrow_price_available( + entity: NordpoolPriceBinarySensor, +) -> bool: + """Return tomorrow price availability. + + Output: True or False + """ + data = entity.coordinator.get_data_tomorrow() + if data and data.entries and entity.area in data.entries[0].entry: + return True + return False + + +@dataclass(frozen=True, kw_only=True) +class NordpoolBinarySensorEntityDescription(BinarySensorEntityDescription): + """Describes Nord Pool binary sensor entity.""" + + value_fn: Callable[[NordpoolPriceBinarySensor], bool | None] + + +BINARY_SENSOR_TYPES: tuple[NordpoolBinarySensorEntityDescription, ...] = ( + NordpoolBinarySensorEntityDescription( + key="tomorrow_price_available", + translation_key="tomorrow_price_available", + value_fn=get_tomorrow_price_available, + entity_category=EntityCategory.DIAGNOSTIC, + ), +) + + +async def async_setup_entry( + hass: HomeAssistant, + entry: NordPoolConfigEntry, + async_add_entities: AddConfigEntryEntitiesCallback, +) -> None: + """Set up Nord Pool binary sensor platform.""" + + coordinator = entry.runtime_data + areas = coordinator.config_entry.data[CONF_AREAS] + + async_add_entities( + NordpoolPriceBinarySensor(coordinator, description, area) + for description in BINARY_SENSOR_TYPES + for area in areas + ) + + +class NordpoolPriceBinarySensor(NordpoolBaseEntity, BinarySensorEntity): + """Representation of a Nord Pool binary sensor.""" + + entity_description: NordpoolBinarySensorEntityDescription + + def __init__( + self, + coordinator: NordPoolDataUpdateCoordinator, + entity_description: NordpoolBinarySensorEntityDescription, + area: str, + ) -> None: + """Initiate Nord Pool binary sensor.""" + super().__init__(coordinator, entity_description, area) + + @property + def is_on(self) -> bool | None: + """Return true if the binary sensor is on.""" + return self.entity_description.value_fn(self) diff --git a/homeassistant/components/nordpool/const.py b/homeassistant/components/nordpool/const.py index 1fd3009321b827..cb0f3f30b07b18 100644 --- a/homeassistant/components/nordpool/const.py +++ b/homeassistant/components/nordpool/const.py @@ -8,7 +8,7 @@ DEFAULT_SCAN_INTERVAL = 60 DOMAIN = "nordpool" -PLATFORMS = [Platform.SENSOR] +PLATFORMS = [Platform.BINARY_SENSOR, Platform.SENSOR] DEFAULT_NAME = "Nord Pool" CONF_AREAS = "areas" diff --git a/homeassistant/components/nordpool/coordinator.py b/homeassistant/components/nordpool/coordinator.py index f85c06e8d66b10..3372e6cf1e4a79 100644 --- a/homeassistant/components/nordpool/coordinator.py +++ b/homeassistant/components/nordpool/coordinator.py @@ -164,3 +164,8 @@ def get_data_current_day(self) -> DeliveryPeriodData: """Return the current day data.""" current_day = dt_util.now().date() return self.data.entries[current_day] + + def get_data_tomorrow(self) -> DeliveryPeriodData | None: + """Return tomorrow's day data if available.""" + tomorrow = dt_util.now().date() + timedelta(days=1) + return self.data.entries.get(tomorrow) diff --git a/homeassistant/components/nordpool/strings.json b/homeassistant/components/nordpool/strings.json index 89e99c37908c04..7011b2f58dd361 100644 --- a/homeassistant/components/nordpool/strings.json +++ b/homeassistant/components/nordpool/strings.json @@ -31,6 +31,11 @@ } }, "entity": { + "binary_sensor": { + "tomorrow_price_available": { + "name": "Tomorrow price available" + } + }, "sensor": { "block_average": { "name": "{block} average" diff --git a/tests/components/nordpool/conftest.py b/tests/components/nordpool/conftest.py index 7b3187403b6e39..dd717acc7cf48a 100644 --- a/tests/components/nordpool/conftest.py +++ b/tests/components/nordpool/conftest.py @@ -7,18 +7,29 @@ from pynordpool import API, NordPoolClient import pytest -from homeassistant.components.nordpool.const import DOMAIN +from homeassistant.components.nordpool.const import DOMAIN, PLATFORMS from homeassistant.config_entries import SOURCE_USER +from homeassistant.const import Platform from homeassistant.core import HomeAssistant from . import ENTRY_CONFIG -from tests.common import MockConfigEntry, load_fixture +from tests.common import MockConfigEntry, load_fixture, patch from tests.test_util.aiohttp import AiohttpClientMocker +@pytest.fixture(name="load_platforms") +async def patch_platform_constant() -> list[Platform]: + """Return list of platforms to load.""" + return PLATFORMS + + @pytest.fixture -async def load_int(hass: HomeAssistant, get_client: NordPoolClient) -> MockConfigEntry: +async def load_int( + hass: HomeAssistant, + get_client: NordPoolClient, + load_platforms: list[Platform], +) -> MockConfigEntry: """Set up the Nord Pool integration in Home Assistant.""" config_entry = MockConfigEntry( domain=DOMAIN, @@ -28,8 +39,9 @@ async def load_int(hass: HomeAssistant, get_client: NordPoolClient) -> MockConfi config_entry.add_to_hass(hass) - await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() + with patch("homeassistant.components.nordpool.PLATFORMS", load_platforms): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() return config_entry diff --git a/tests/components/nordpool/snapshots/test_binary_sensor.ambr b/tests/components/nordpool/snapshots/test_binary_sensor.ambr new file mode 100644 index 00000000000000..db1aae7276377e --- /dev/null +++ b/tests/components/nordpool/snapshots/test_binary_sensor.ambr @@ -0,0 +1,201 @@ +# serializer version: 1 +# name: test_binary_sensor_off[load_platforms0][binary_sensor.nord_pool_se3_tomorrow_price_available-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': , + 'entity_id': 'binary_sensor.nord_pool_se3_tomorrow_price_available', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Tomorrow price available', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Tomorrow price available', + 'platform': 'nordpool', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'tomorrow_price_available', + 'unique_id': 'SE3-tomorrow_price_available', + 'unit_of_measurement': None, + }) +# --- +# name: test_binary_sensor_off[load_platforms0][binary_sensor.nord_pool_se3_tomorrow_price_available-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Nord Pool SE3 Tomorrow price available', + }), + 'context': , + 'entity_id': 'binary_sensor.nord_pool_se3_tomorrow_price_available', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'off', + }) +# --- +# name: test_binary_sensor_off[load_platforms0][binary_sensor.nord_pool_se4_tomorrow_price_available-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': , + 'entity_id': 'binary_sensor.nord_pool_se4_tomorrow_price_available', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Tomorrow price available', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Tomorrow price available', + 'platform': 'nordpool', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'tomorrow_price_available', + 'unique_id': 'SE4-tomorrow_price_available', + 'unit_of_measurement': None, + }) +# --- +# name: test_binary_sensor_off[load_platforms0][binary_sensor.nord_pool_se4_tomorrow_price_available-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Nord Pool SE4 Tomorrow price available', + }), + 'context': , + 'entity_id': 'binary_sensor.nord_pool_se4_tomorrow_price_available', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'off', + }) +# --- +# name: test_binary_sensor_on[load_platforms0][binary_sensor.nord_pool_se3_tomorrow_price_available-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': , + 'entity_id': 'binary_sensor.nord_pool_se3_tomorrow_price_available', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Tomorrow price available', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Tomorrow price available', + 'platform': 'nordpool', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'tomorrow_price_available', + 'unique_id': 'SE3-tomorrow_price_available', + 'unit_of_measurement': None, + }) +# --- +# name: test_binary_sensor_on[load_platforms0][binary_sensor.nord_pool_se3_tomorrow_price_available-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Nord Pool SE3 Tomorrow price available', + }), + 'context': , + 'entity_id': 'binary_sensor.nord_pool_se3_tomorrow_price_available', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_binary_sensor_on[load_platforms0][binary_sensor.nord_pool_se4_tomorrow_price_available-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': , + 'entity_id': 'binary_sensor.nord_pool_se4_tomorrow_price_available', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Tomorrow price available', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Tomorrow price available', + 'platform': 'nordpool', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'tomorrow_price_available', + 'unique_id': 'SE4-tomorrow_price_available', + 'unit_of_measurement': None, + }) +# --- +# name: test_binary_sensor_on[load_platforms0][binary_sensor.nord_pool_se4_tomorrow_price_available-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Nord Pool SE4 Tomorrow price available', + }), + 'context': , + 'entity_id': 'binary_sensor.nord_pool_se4_tomorrow_price_available', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'on', + }) +# --- diff --git a/tests/components/nordpool/snapshots/test_sensor.ambr b/tests/components/nordpool/snapshots/test_sensor.ambr index aead4151602175..adfc24a3f62e36 100644 --- a/tests/components/nordpool/snapshots/test_sensor.ambr +++ b/tests/components/nordpool/snapshots/test_sensor.ambr @@ -1,5 +1,5 @@ # serializer version: 1 -# name: test_sensor[sensor.nord_pool_se3_currency-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_currency-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -36,7 +36,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se3_currency-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_currency-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Currency', @@ -49,7 +49,7 @@ 'state': 'SEK', }) # --- -# name: test_sensor[sensor.nord_pool_se3_current_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_current_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -91,7 +91,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_current_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_current_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Current price', @@ -106,7 +106,7 @@ 'state': '1.99796', }) # --- -# name: test_sensor[sensor.nord_pool_se3_daily_average-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_daily_average-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -148,7 +148,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_daily_average-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_daily_average-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Daily average', @@ -163,7 +163,7 @@ 'state': '1.03398', }) # --- -# name: test_sensor[sensor.nord_pool_se3_exchange_rate-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_exchange_rate-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -202,7 +202,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se3_exchange_rate-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_exchange_rate-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Exchange rate', @@ -216,7 +216,7 @@ 'state': '11.05186', }) # --- -# name: test_sensor[sensor.nord_pool_se3_highest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_highest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -256,7 +256,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_highest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_highest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'end': '2025-10-01T17:15:00+00:00', @@ -272,7 +272,7 @@ 'state': '3.82803', }) # --- -# name: test_sensor[sensor.nord_pool_se3_last_updated-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_last_updated-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -309,7 +309,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se3_last_updated-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_last_updated-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -323,7 +323,7 @@ 'state': '2025-09-30T12:08:16+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se3_lowest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_lowest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -363,7 +363,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_lowest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_lowest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'end': '2025-10-01T02:15:00+00:00', @@ -379,7 +379,7 @@ 'state': '0.44196', }) # --- -# name: test_sensor[sensor.nord_pool_se3_next_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_next_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -419,7 +419,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_next_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_next_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Next price', @@ -433,7 +433,7 @@ 'state': '1.42403', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_average-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_average-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -475,7 +475,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_average-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_average-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Off-peak 1 average', @@ -490,7 +490,7 @@ 'state': '0.74593', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_highest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_highest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -532,7 +532,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_highest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_highest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Off-peak 1 highest price', @@ -547,7 +547,7 @@ 'state': '1.80996', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_lowest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_lowest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -589,7 +589,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_lowest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_lowest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Off-peak 1 lowest price', @@ -604,7 +604,7 @@ 'state': '0.44196', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_time_from-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_time_from-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -641,7 +641,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_time_from-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_time_from-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -655,7 +655,7 @@ 'state': '2025-09-30T22:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_time_until-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_time_until-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -692,7 +692,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_1_time_until-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_1_time_until-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -706,7 +706,7 @@ 'state': '2025-10-01T06:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_average-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_average-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -748,7 +748,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_average-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_average-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Off-peak 2 average', @@ -763,7 +763,7 @@ 'state': '1.05461', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_highest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_highest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -805,7 +805,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_highest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_highest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Off-peak 2 highest price', @@ -820,7 +820,7 @@ 'state': '1.99796', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_lowest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_lowest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -862,7 +862,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_lowest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_lowest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Off-peak 2 lowest price', @@ -877,7 +877,7 @@ 'state': '0.78568', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_time_from-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_time_from-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -914,7 +914,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_time_from-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_time_from-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -928,7 +928,7 @@ 'state': '2025-10-01T18:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_time_until-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_time_until-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -965,7 +965,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se3_off_peak_2_time_until-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_off_peak_2_time_until-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -979,7 +979,7 @@ 'state': '2025-10-01T22:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_average-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_average-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1021,7 +1021,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_average-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_average-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Peak average', @@ -1036,7 +1036,7 @@ 'state': '1.21913', }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_highest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_highest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1078,7 +1078,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_highest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_highest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Peak highest price', @@ -1093,7 +1093,7 @@ 'state': '3.82803', }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_lowest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_lowest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1135,7 +1135,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_lowest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_lowest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Peak lowest price', @@ -1150,7 +1150,7 @@ 'state': '0.60774', }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_time_from-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_time_from-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1187,7 +1187,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_time_from-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_time_from-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -1201,7 +1201,7 @@ 'state': '2025-10-01T06:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_time_until-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_time_until-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1238,7 +1238,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se3_peak_time_until-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_peak_time_until-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -1252,7 +1252,7 @@ 'state': '2025-10-01T18:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se3_previous_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_previous_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1292,7 +1292,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se3_previous_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se3_previous_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE3 Previous price', @@ -1306,7 +1306,7 @@ 'state': '2.30807', }) # --- -# name: test_sensor[sensor.nord_pool_se4_currency-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_currency-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1343,7 +1343,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se4_currency-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_currency-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Currency', @@ -1356,7 +1356,7 @@ 'state': 'SEK', }) # --- -# name: test_sensor[sensor.nord_pool_se4_current_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_current_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1398,7 +1398,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_current_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_current_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Current price', @@ -1413,7 +1413,7 @@ 'state': '0.0', }) # --- -# name: test_sensor[sensor.nord_pool_se4_daily_average-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_daily_average-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1455,7 +1455,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_daily_average-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_daily_average-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Daily average', @@ -1470,7 +1470,7 @@ 'state': '1.18078', }) # --- -# name: test_sensor[sensor.nord_pool_se4_exchange_rate-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_exchange_rate-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1509,7 +1509,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se4_exchange_rate-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_exchange_rate-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Exchange rate', @@ -1523,7 +1523,7 @@ 'state': '11.05186', }) # --- -# name: test_sensor[sensor.nord_pool_se4_highest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_highest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1563,7 +1563,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_highest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_highest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'end': '2025-10-01T17:15:00+00:00', @@ -1579,7 +1579,7 @@ 'state': '4.44274', }) # --- -# name: test_sensor[sensor.nord_pool_se4_last_updated-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_last_updated-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1616,7 +1616,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se4_last_updated-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_last_updated-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -1630,7 +1630,7 @@ 'state': '2025-09-30T12:08:16+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se4_lowest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_lowest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1670,7 +1670,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_lowest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_lowest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'end': '2025-10-01T18:15:00+00:00', @@ -1686,7 +1686,7 @@ 'state': '0.0', }) # --- -# name: test_sensor[sensor.nord_pool_se4_next_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_next_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1726,7 +1726,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_next_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_next_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Next price', @@ -1740,7 +1740,7 @@ 'state': '1.64617', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_average-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_average-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1782,7 +1782,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_average-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_average-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Off-peak 1 average', @@ -1797,7 +1797,7 @@ 'state': '0.86099', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_highest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_highest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1839,7 +1839,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_highest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_highest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Off-peak 1 highest price', @@ -1854,7 +1854,7 @@ 'state': '2.02934', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_lowest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_lowest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1896,7 +1896,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_lowest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_lowest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Off-peak 1 lowest price', @@ -1911,7 +1911,7 @@ 'state': '0.51546', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_time_from-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_time_from-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1948,7 +1948,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_time_from-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_time_from-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -1962,7 +1962,7 @@ 'state': '2025-09-30T22:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_time_until-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_time_until-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -1999,7 +1999,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_1_time_until-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_1_time_until-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -2013,7 +2013,7 @@ 'state': '2025-10-01T06:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_average-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_average-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2055,7 +2055,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_average-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_average-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Off-peak 2 average', @@ -2070,7 +2070,7 @@ 'state': '1.21907', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_highest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_highest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2112,7 +2112,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_highest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_highest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Off-peak 2 highest price', @@ -2127,7 +2127,7 @@ 'state': '2.31216', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_lowest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_lowest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2169,7 +2169,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_lowest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_lowest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Off-peak 2 lowest price', @@ -2184,7 +2184,7 @@ 'state': '0.91222', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_time_from-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_time_from-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2221,7 +2221,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_time_from-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_time_from-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -2235,7 +2235,7 @@ 'state': '2025-10-01T18:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_time_until-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_time_until-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2272,7 +2272,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se4_off_peak_2_time_until-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_off_peak_2_time_until-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -2286,7 +2286,7 @@ 'state': '2025-10-01T22:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_average-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_average-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2328,7 +2328,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_average-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_average-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Peak average', @@ -2343,7 +2343,7 @@ 'state': '1.38122', }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_highest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_highest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2385,7 +2385,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_highest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_highest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Peak highest price', @@ -2400,7 +2400,7 @@ 'state': '4.44274', }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_lowest_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_lowest_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2442,7 +2442,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_lowest_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_lowest_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Peak lowest price', @@ -2457,7 +2457,7 @@ 'state': '0.68312', }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_time_from-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_time_from-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2494,7 +2494,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_time_from-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_time_from-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -2508,7 +2508,7 @@ 'state': '2025-10-01T06:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_time_until-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_time_until-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2545,7 +2545,7 @@ 'unit_of_measurement': None, }) # --- -# name: test_sensor[sensor.nord_pool_se4_peak_time_until-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_peak_time_until-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'timestamp', @@ -2559,7 +2559,7 @@ 'state': '2025-10-01T18:00:00+00:00', }) # --- -# name: test_sensor[sensor.nord_pool_se4_previous_price-entry] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_previous_price-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -2599,7 +2599,7 @@ 'unit_of_measurement': 'SEK/kWh', }) # --- -# name: test_sensor[sensor.nord_pool_se4_previous_price-state] +# name: test_sensor[load_platforms0][sensor.nord_pool_se4_previous_price-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'friendly_name': 'Nord Pool SE4 Previous price', diff --git a/tests/components/nordpool/test_binary_sensor.py b/tests/components/nordpool/test_binary_sensor.py new file mode 100644 index 00000000000000..64ff0a9035cd89 --- /dev/null +++ b/tests/components/nordpool/test_binary_sensor.py @@ -0,0 +1,69 @@ +"""The test for the Nord Pool binary sensor platform.""" + +from datetime import timedelta +from http import HTTPStatus + +from freezegun.api import FrozenDateTimeFactory +from pynordpool import API +import pytest +from syrupy.assertion import SnapshotAssertion + +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import Platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er + +from tests.common import async_fire_time_changed, snapshot_platform +from tests.test_util.aiohttp import AiohttpClientMocker + + +@pytest.mark.freeze_time("2025-10-01T18:00:00+00:00") +@pytest.mark.usefixtures("entity_registry_enabled_by_default") +@pytest.mark.parametrize( + "load_platforms", + [[Platform.BINARY_SENSOR]], +) +async def test_binary_sensor_on( + hass: HomeAssistant, + load_int: ConfigEntry, + entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, +) -> None: + """Test the Nord Pool sensor.""" + + await snapshot_platform(hass, entity_registry, snapshot, load_int.entry_id) + + +@pytest.mark.freeze_time("2025-10-01T18:00:00+00:00") +@pytest.mark.usefixtures("entity_registry_enabled_by_default") +@pytest.mark.parametrize( + "load_platforms", + [[Platform.BINARY_SENSOR]], +) +async def test_binary_sensor_off( + hass: HomeAssistant, + load_int: ConfigEntry, + entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, + aioclient_mock: AiohttpClientMocker, + freezer: FrozenDateTimeFactory, +) -> None: + """Test the Nord Pool sensor.""" + + aioclient_mock.request( + "GET", + url=API + "/DayAheadPrices", + params={ + "date": "2025-10-03", + "market": "DayAhead", + "deliveryArea": "SE3,SE4", + "currency": "SEK", + }, + status=HTTPStatus.NO_CONTENT, + ) + + freezer.tick(timedelta(days=1)) + async_fire_time_changed(hass) + await hass.async_block_till_done(wait_background_tasks=True) + + await snapshot_platform(hass, entity_registry, snapshot, load_int.entry_id) diff --git a/tests/components/nordpool/test_sensor.py b/tests/components/nordpool/test_sensor.py index ea2446de8d35c6..ece76552f1321b 100644 --- a/tests/components/nordpool/test_sensor.py +++ b/tests/components/nordpool/test_sensor.py @@ -10,7 +10,7 @@ from syrupy.assertion import SnapshotAssertion from homeassistant.config_entries import ConfigEntry -from homeassistant.const import STATE_UNKNOWN +from homeassistant.const import STATE_UNKNOWN, Platform from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er @@ -20,6 +20,10 @@ @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00") @pytest.mark.usefixtures("entity_registry_enabled_by_default") +@pytest.mark.parametrize( + "load_platforms", + [[Platform.SENSOR]], +) async def test_sensor( hass: HomeAssistant, load_int: ConfigEntry,