Compare commits

...

38 Commits

Author SHA1 Message Date
Franck Nijhof
013346cead 2025.10.1 (#153582) 2025-10-03 20:08:44 +02:00
Franck Nijhof
5abaabc9da Bump version to 2025.10.1 2025-10-03 17:26:37 +00:00
Paulus Schoutsen
32481312c3 When discovering a Z-Wave adapter, always configure add-on in config flow (#153575) 2025-10-03 17:26:16 +00:00
Paulus Schoutsen
bdc9eb37d3 Z-Wave to support migrating from USB to socket with same home ID (#153522) 2025-10-03 17:26:15 +00:00
Abílio Costa
e0afcbc02b Debounce updates in Idasen Desk (#153503) 2025-10-03 17:26:13 +00:00
puddly
cd56a6a98d Bump universal-silabs-flasher to 0.0.35 (#153500) 2025-10-03 17:26:11 +00:00
cdnninja
9d85893bbb Fix VeSync zero fan speed handling (#153493)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-10-03 17:26:10 +00:00
starkillerOG
9e8a70225f Bump reolink-aio to 0.16.1 (#153489) 2025-10-03 17:26:08 +00:00
Daniel Hjelseth Høyer
96ec795d5e Bump pyTibber to 0.32.2 (#153484) 2025-10-03 17:26:07 +00:00
Josef Zweck
65b796070d Fix missing parameter pass in onedrive (#153478) 2025-10-03 17:26:05 +00:00
Aidan Timson
32994812e5 Update OVOEnergy to 3.0.1 (#153476) 2025-10-03 17:26:04 +00:00
G Johansson
66ff9d63a3 Fix next event in workday calendar (#153465) 2025-10-03 17:26:02 +00:00
Joost Lekkerkerker
b2a63d4996 Add translation for turbo fan mode in SmartThings (#153445)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-03 17:26:00 +00:00
puddly
f9f37b7f2a Disable baudrate bootloader reset for ZBT-2 (#153443) 2025-10-03 17:25:59 +00:00
Stefan Agner
7bdd9dd38a Update Home Assistant base image to 2025.10.0 (#153441) 2025-10-03 17:25:58 +00:00
Joost Lekkerkerker
1e8aae0a89 Fix missing powerconsumptionreport in Smartthings (#153438) 2025-10-03 17:25:56 +00:00
Aidan Timson
cf668e9dc2 Add missing translation for media browser default title (#153430)
Co-authored-by: Erwin Douna <e.douna@gmail.com>
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-10-03 17:25:55 +00:00
Norbert Rittel
2e91c8700f Fix sentence-casing in user-facing strings of slack (#153427) 2025-10-03 17:25:53 +00:00
J. Nick Koston
9d14627daa Bump aiohomekit to 3.2.19 (#153423) 2025-10-03 17:25:52 +00:00
TheJulianJES
73b8283748 Fix Z-Wave RGB light turn on causing rare ZeroDivisionError (#153422) 2025-10-03 17:25:50 +00:00
Manu
edeaaa2e63 Update markdown field description in ntfy integration (#153421) 2025-10-03 17:25:49 +00:00
Tom Matheussen
d26dd8fc39 Fix Satel Integra creating new binary sensors on YAML import (#153419) 2025-10-03 17:25:47 +00:00
Denis Shulyaka
34640ea735 Disable thinking for unsupported gemini models (#153415) 2025-10-03 17:25:46 +00:00
Erwin Douna
46a2e21ef0 Bump pyportainer 1.0.3 (#153413) 2025-10-03 17:25:45 +00:00
Erwin Douna
508af53e72 Bump pyportainer 1.0.2 (#153326) 2025-10-03 17:25:43 +00:00
Josef Zweck
5f7440608c Increase onedrive upload chunk size (#153406) 2025-10-03 17:22:10 +00:00
Michael J. Kidd
0d1aa38a26 Pushover: Handle empty data section properly (#153397) 2025-10-03 17:22:08 +00:00
Luke Lashley
929f8c148a Bump python-roborock to 2.49.1 (#153396) 2025-10-03 17:22:07 +00:00
Joakim Plate
92db1f5a04 Correct blocking update in ToGrill with lack of notifications (#153387) 2025-10-03 17:22:05 +00:00
starkillerOG
e66b5ce0bf Add Roborock mop intensity translations (#153380) 2025-10-03 17:22:03 +00:00
Michael
1e17150e9f Explicit pass in the config entry to coordinator in airtouch4 (#153361)
Co-authored-by: Josef Zweck <josef@zweck.dev>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-10-03 17:22:02 +00:00
Michael
792902de3d Set config entry to None in ProxmoxVE (#153357) 2025-10-03 17:22:00 +00:00
Andre Lengwenus
04d78c3dd5 Explicitly check for None in raw value processing of modbus (#153352) 2025-10-03 17:21:59 +00:00
G Johansson
5c8d5bfb84 Fix Nord Pool 15 minute interval (#153350) 2025-10-03 17:21:57 +00:00
puddly
99bff31869 Do not reset the adapter twice during ZHA options flow migration (#153345) 2025-10-03 17:21:56 +00:00
Stefan Agner
d949119fb0 Bump aiohasupervisor to 0.3.3 (#153344) 2025-10-03 17:21:54 +00:00
Tom
e7b737ece5 Bump airOS module for alternative login url (#153317) 2025-10-03 17:21:52 +00:00
Tom
fb8ddac2e8 Bump airOS dependency (#153065) 2025-10-03 17:21:51 +00:00
77 changed files with 5984 additions and 2035 deletions

View File

@@ -1,10 +1,10 @@
image: ghcr.io/home-assistant/{arch}-homeassistant image: ghcr.io/home-assistant/{arch}-homeassistant
build_from: build_from:
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2025.09.3 aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2025.10.0
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2025.09.3 armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2025.10.0
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2025.09.3 armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2025.10.0
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2025.09.3 amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2025.10.0
i386: ghcr.io/home-assistant/i386-homeassistant-base:2025.09.3 i386: ghcr.io/home-assistant/i386-homeassistant-base:2025.10.0
codenotary: codenotary:
signer: notary@home-assistant.io signer: notary@home-assistant.io
base_image: notary@home-assistant.io base_image: notary@home-assistant.io

View File

@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/airos", "documentation": "https://www.home-assistant.io/integrations/airos",
"iot_class": "local_polling", "iot_class": "local_polling",
"quality_scale": "bronze", "quality_scale": "bronze",
"requirements": ["airos==0.5.1"] "requirements": ["airos==0.5.4"]
} }

View File

@@ -2,17 +2,14 @@
from airtouch4pyapi import AirTouch from airtouch4pyapi import AirTouch
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, Platform from homeassistant.const import CONF_HOST, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.exceptions import ConfigEntryNotReady
from .coordinator import AirtouchDataUpdateCoordinator from .coordinator import AirTouch4ConfigEntry, AirtouchDataUpdateCoordinator
PLATFORMS = [Platform.CLIMATE] PLATFORMS = [Platform.CLIMATE]
type AirTouch4ConfigEntry = ConfigEntry[AirtouchDataUpdateCoordinator]
async def async_setup_entry(hass: HomeAssistant, entry: AirTouch4ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: AirTouch4ConfigEntry) -> bool:
"""Set up AirTouch4 from a config entry.""" """Set up AirTouch4 from a config entry."""
@@ -22,7 +19,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: AirTouch4ConfigEntry) ->
info = airtouch.GetAcs() info = airtouch.GetAcs()
if not info: if not info:
raise ConfigEntryNotReady raise ConfigEntryNotReady
coordinator = AirtouchDataUpdateCoordinator(hass, airtouch) coordinator = AirtouchDataUpdateCoordinator(hass, entry, airtouch)
await coordinator.async_config_entry_first_refresh() await coordinator.async_config_entry_first_refresh()
entry.runtime_data = coordinator entry.runtime_data = coordinator

View File

@@ -2,26 +2,34 @@
import logging import logging
from airtouch4pyapi import AirTouch
from airtouch4pyapi.airtouch import AirTouchStatus from airtouch4pyapi.airtouch import AirTouchStatus
from homeassistant.components.climate import SCAN_INTERVAL from homeassistant.components.climate import SCAN_INTERVAL
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN from .const import DOMAIN
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
type AirTouch4ConfigEntry = ConfigEntry[AirtouchDataUpdateCoordinator]
class AirtouchDataUpdateCoordinator(DataUpdateCoordinator): class AirtouchDataUpdateCoordinator(DataUpdateCoordinator):
"""Class to manage fetching Airtouch data.""" """Class to manage fetching Airtouch data."""
def __init__(self, hass, airtouch): def __init__(
self, hass: HomeAssistant, entry: AirTouch4ConfigEntry, airtouch: AirTouch
) -> None:
"""Initialize global Airtouch data updater.""" """Initialize global Airtouch data updater."""
self.airtouch = airtouch self.airtouch = airtouch
super().__init__( super().__init__(
hass, hass,
_LOGGER, _LOGGER,
config_entry=entry,
name=DOMAIN, name=DOMAIN,
update_interval=SCAN_INTERVAL, update_interval=SCAN_INTERVAL,
) )

View File

@@ -620,6 +620,13 @@ class GoogleGenerativeAILLMBaseEntity(Entity):
def create_generate_content_config(self) -> GenerateContentConfig: def create_generate_content_config(self) -> GenerateContentConfig:
"""Create the GenerateContentConfig for the LLM.""" """Create the GenerateContentConfig for the LLM."""
options = self.subentry.data options = self.subentry.data
model = options.get(CONF_CHAT_MODEL, RECOMMENDED_CHAT_MODEL)
thinking_config: ThinkingConfig | None = None
if model.startswith("models/gemini-2.5") and not model.endswith(
("tts", "image", "image-preview")
):
thinking_config = ThinkingConfig(include_thoughts=True)
return GenerateContentConfig( return GenerateContentConfig(
temperature=options.get(CONF_TEMPERATURE, RECOMMENDED_TEMPERATURE), temperature=options.get(CONF_TEMPERATURE, RECOMMENDED_TEMPERATURE),
top_k=options.get(CONF_TOP_K, RECOMMENDED_TOP_K), top_k=options.get(CONF_TOP_K, RECOMMENDED_TOP_K),
@@ -652,7 +659,7 @@ class GoogleGenerativeAILLMBaseEntity(Entity):
), ),
), ),
], ],
thinking_config=ThinkingConfig(include_thoughts=True), thinking_config=thinking_config,
) )

View File

@@ -6,6 +6,6 @@
"documentation": "https://www.home-assistant.io/integrations/hassio", "documentation": "https://www.home-assistant.io/integrations/hassio",
"iot_class": "local_polling", "iot_class": "local_polling",
"quality_scale": "internal", "quality_scale": "internal",
"requirements": ["aiohasupervisor==0.3.3b0"], "requirements": ["aiohasupervisor==0.3.3"],
"single_config_entry": true "single_config_entry": true
} }

View File

@@ -67,11 +67,7 @@ class ZBT2FirmwareMixin(ConfigEntryBaseFlow, FirmwareInstallFlowProtocol):
"""Mixin for Home Assistant Connect ZBT-2 firmware methods.""" """Mixin for Home Assistant Connect ZBT-2 firmware methods."""
context: ConfigFlowContext context: ConfigFlowContext
BOOTLOADER_RESET_METHODS = [ResetTarget.RTS_DTR]
# `rts_dtr` targets older adapters, `baudrate` works for newer ones. The reason we
# try them in this order is that on older adapters `baudrate` entered the ESP32-S3
# bootloader instead of the MG24 bootloader.
BOOTLOADER_RESET_METHODS = [ResetTarget.RTS_DTR, ResetTarget.BAUDRATE]
async def async_step_install_zigbee_firmware( async def async_step_install_zigbee_firmware(
self, user_input: dict[str, Any] | None = None self, user_input: dict[str, Any] | None = None

View File

@@ -157,7 +157,7 @@ async def async_setup_entry(
class FirmwareUpdateEntity(BaseFirmwareUpdateEntity): class FirmwareUpdateEntity(BaseFirmwareUpdateEntity):
"""Connect ZBT-2 firmware update entity.""" """Connect ZBT-2 firmware update entity."""
bootloader_reset_methods = [ResetTarget.RTS_DTR, ResetTarget.BAUDRATE] bootloader_reset_methods = [ResetTarget.RTS_DTR]
def __init__( def __init__(
self, self,

View File

@@ -6,7 +6,7 @@
"documentation": "https://www.home-assistant.io/integrations/homeassistant_hardware", "documentation": "https://www.home-assistant.io/integrations/homeassistant_hardware",
"integration_type": "system", "integration_type": "system",
"requirements": [ "requirements": [
"universal-silabs-flasher==0.0.34", "universal-silabs-flasher==0.0.35",
"ha-silabs-firmware-client==0.2.0" "ha-silabs-firmware-client==0.2.0"
] ]
} }

View File

@@ -14,6 +14,6 @@
"documentation": "https://www.home-assistant.io/integrations/homekit_controller", "documentation": "https://www.home-assistant.io/integrations/homekit_controller",
"iot_class": "local_push", "iot_class": "local_push",
"loggers": ["aiohomekit", "commentjson"], "loggers": ["aiohomekit", "commentjson"],
"requirements": ["aiohomekit==3.2.18"], "requirements": ["aiohomekit==3.2.19"],
"zeroconf": ["_hap._tcp.local.", "_hap._udp.local."] "zeroconf": ["_hap._tcp.local.", "_hap._udp.local."]
} }

View File

@@ -8,13 +8,16 @@ from idasen_ha import Desk
from homeassistant.components import bluetooth from homeassistant.components import bluetooth
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.debounce import Debouncer
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
type IdasenDeskConfigEntry = ConfigEntry[IdasenDeskCoordinator] type IdasenDeskConfigEntry = ConfigEntry[IdasenDeskCoordinator]
UPDATE_DEBOUNCE_TIME = 0.2
class IdasenDeskCoordinator(DataUpdateCoordinator[int | None]): class IdasenDeskCoordinator(DataUpdateCoordinator[int | None]):
"""Class to manage updates for the Idasen Desk.""" """Class to manage updates for the Idasen Desk."""
@@ -33,9 +36,22 @@ class IdasenDeskCoordinator(DataUpdateCoordinator[int | None]):
hass, _LOGGER, config_entry=config_entry, name=config_entry.title hass, _LOGGER, config_entry=config_entry, name=config_entry.title
) )
self.address = address self.address = address
self._expected_connected = False self.desk = Desk(self._async_handle_update)
self.desk = Desk(self.async_set_updated_data) self._expected_connected = False
self._height: int | None = None
@callback
def async_update_data() -> None:
self.async_set_updated_data(self._height)
self._debouncer = Debouncer(
hass=self.hass,
logger=_LOGGER,
cooldown=UPDATE_DEBOUNCE_TIME,
immediate=True,
function=async_update_data,
)
async def async_connect(self) -> bool: async def async_connect(self) -> bool:
"""Connect to desk.""" """Connect to desk."""
@@ -60,3 +76,9 @@ class IdasenDeskCoordinator(DataUpdateCoordinator[int | None]):
"""Ensure that the desk is connected if that is the expected state.""" """Ensure that the desk is connected if that is the expected state."""
if self._expected_connected: if self._expected_connected:
await self.async_connect() await self.async_connect()
@callback
def _async_handle_update(self, height: int | None) -> None:
"""Handle an update from the desk."""
self._height = height
self._debouncer.async_schedule_call()

View File

@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Any
from homeassistant.components.media_player import BrowseMedia, MediaClass, MediaType from homeassistant.components.media_player import BrowseMedia, MediaClass, MediaType
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.translation import async_get_cached_translations
from .const import MEDIA_SOURCE_DATA, URI_SCHEME, URI_SCHEME_REGEX from .const import MEDIA_SOURCE_DATA, URI_SCHEME, URI_SCHEME_REGEX
@@ -62,12 +63,15 @@ class MediaSourceItem:
async def async_browse(self) -> BrowseMediaSource: async def async_browse(self) -> BrowseMediaSource:
"""Browse this item.""" """Browse this item."""
if self.domain is None: if self.domain is None:
title = async_get_cached_translations(
self.hass, self.hass.config.language, "common", "media_source"
).get("component.media_source.common.sources_default", "Media Sources")
base = BrowseMediaSource( base = BrowseMediaSource(
domain=None, domain=None,
identifier=None, identifier=None,
media_class=MediaClass.APP, media_class=MediaClass.APP,
media_content_type=MediaType.APPS, media_content_type=MediaType.APPS,
title="Media Sources", title=title,
can_play=False, can_play=False,
can_expand=True, can_expand=True,
children_media_class=MediaClass.APP, children_media_class=MediaClass.APP,

View File

@@ -9,5 +9,8 @@
"unknown_media_source": { "unknown_media_source": {
"message": "Unknown media source: {domain}" "message": "Unknown media source: {domain}"
} }
},
"common": {
"sources_default": "Media sources"
} }
} }

View File

@@ -208,7 +208,7 @@ class ModbusStructEntity(ModbusBaseEntity, RestoreEntity):
def __process_raw_value(self, entry: float | str | bytes) -> str | None: def __process_raw_value(self, entry: float | str | bytes) -> str | None:
"""Process value from sensor with NaN handling, scaling, offset, min/max etc.""" """Process value from sensor with NaN handling, scaling, offset, min/max etc."""
if self._nan_value and entry in (self._nan_value, -self._nan_value): if self._nan_value is not None and entry in (self._nan_value, -self._nan_value):
return None return None
if isinstance(entry, bytes): if isinstance(entry, bytes):
return entry.decode() return entry.decode()

View File

@@ -34,6 +34,7 @@ async def async_setup_entry(
coordinator = NordPoolDataUpdateCoordinator(hass, config_entry) coordinator = NordPoolDataUpdateCoordinator(hass, config_entry)
await coordinator.fetch_data(dt_util.utcnow(), True) await coordinator.fetch_data(dt_util.utcnow(), True)
await coordinator.update_listeners(dt_util.utcnow())
if not coordinator.last_update_success: if not coordinator.last_update_success:
raise ConfigEntryNotReady( raise ConfigEntryNotReady(
translation_domain=DOMAIN, translation_domain=DOMAIN,

View File

@@ -44,9 +44,10 @@ class NordPoolDataUpdateCoordinator(DataUpdateCoordinator[DeliveryPeriodsData]):
name=DOMAIN, name=DOMAIN,
) )
self.client = NordPoolClient(session=async_get_clientsession(hass)) self.client = NordPoolClient(session=async_get_clientsession(hass))
self.unsub: Callable[[], None] | None = None self.data_unsub: Callable[[], None] | None = None
self.listener_unsub: Callable[[], None] | None = None
def get_next_interval(self, now: datetime) -> datetime: def get_next_data_interval(self, now: datetime) -> datetime:
"""Compute next time an update should occur.""" """Compute next time an update should occur."""
next_hour = dt_util.utcnow() + timedelta(hours=1) next_hour = dt_util.utcnow() + timedelta(hours=1)
next_run = datetime( next_run = datetime(
@@ -56,23 +57,45 @@ class NordPoolDataUpdateCoordinator(DataUpdateCoordinator[DeliveryPeriodsData]):
next_hour.hour, next_hour.hour,
tzinfo=dt_util.UTC, tzinfo=dt_util.UTC,
) )
LOGGER.debug("Next update at %s", next_run) LOGGER.debug("Next data update at %s", next_run)
return next_run
def get_next_15_interval(self, now: datetime) -> datetime:
"""Compute next time we need to notify listeners."""
next_run = dt_util.utcnow() + timedelta(minutes=15)
next_minute = next_run.minute // 15 * 15
next_run = next_run.replace(
minute=next_minute, second=0, microsecond=0, tzinfo=dt_util.UTC
)
LOGGER.debug("Next listener update at %s", next_run)
return next_run return next_run
async def async_shutdown(self) -> None: async def async_shutdown(self) -> None:
"""Cancel any scheduled call, and ignore new runs.""" """Cancel any scheduled call, and ignore new runs."""
await super().async_shutdown() await super().async_shutdown()
if self.unsub: if self.data_unsub:
self.unsub() self.data_unsub()
self.unsub = None self.data_unsub = None
if self.listener_unsub:
self.listener_unsub()
self.listener_unsub = None
async def update_listeners(self, now: datetime) -> None:
"""Update entity listeners."""
self.listener_unsub = async_track_point_in_utc_time(
self.hass,
self.update_listeners,
self.get_next_15_interval(dt_util.utcnow()),
)
self.async_update_listeners()
async def fetch_data(self, now: datetime, initial: bool = False) -> None: async def fetch_data(self, now: datetime, initial: bool = False) -> None:
"""Fetch data from Nord Pool.""" """Fetch data from Nord Pool."""
self.unsub = async_track_point_in_utc_time( self.data_unsub = async_track_point_in_utc_time(
self.hass, self.fetch_data, self.get_next_interval(dt_util.utcnow()) self.hass, self.fetch_data, self.get_next_data_interval(dt_util.utcnow())
) )
if self.config_entry.pref_disable_polling and not initial: if self.config_entry.pref_disable_polling and not initial:
self.async_update_listeners()
return return
try: try:
data = await self.handle_data(initial) data = await self.handle_data(initial)

View File

@@ -307,7 +307,7 @@
}, },
"markdown": { "markdown": {
"name": "Format as Markdown", "name": "Format as Markdown",
"description": "Enable Markdown formatting for the message body (Web app only). See the Markdown guide for syntax details: https://www.markdownguide.org/basic-syntax/." "description": "Enable Markdown formatting for the message body. See the Markdown guide for syntax details: https://www.markdownguide.org/basic-syntax/."
}, },
"tags": { "tags": {
"name": "Tags/Emojis", "name": "Tags/Emojis",

View File

@@ -35,7 +35,7 @@ from .const import CONF_DELETE_PERMANENTLY, DATA_BACKUP_AGENT_LISTENERS, DOMAIN
from .coordinator import OneDriveConfigEntry from .coordinator import OneDriveConfigEntry
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
UPLOAD_CHUNK_SIZE = 16 * 320 * 1024 # 5.2MB UPLOAD_CHUNK_SIZE = 32 * 320 * 1024 # 10.4MB
TIMEOUT = ClientTimeout(connect=10, total=43200) # 12 hours TIMEOUT = ClientTimeout(connect=10, total=43200) # 12 hours
METADATA_VERSION = 2 METADATA_VERSION = 2
CACHE_TTL = 300 CACHE_TTL = 300
@@ -163,7 +163,10 @@ class OneDriveBackupAgent(BackupAgent):
) )
try: try:
backup_file = await LargeFileUploadClient.upload( backup_file = await LargeFileUploadClient.upload(
self._token_function, file, session=async_get_clientsession(self._hass) self._token_function,
file,
upload_chunk_size=UPLOAD_CHUNK_SIZE,
session=async_get_clientsession(self._hass),
) )
except HashMismatchError as err: except HashMismatchError as err:
raise BackupAgentError( raise BackupAgentError(

View File

@@ -7,5 +7,5 @@
"integration_type": "service", "integration_type": "service",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["ovoenergy"], "loggers": ["ovoenergy"],
"requirements": ["ovoenergy==2.0.1"] "requirements": ["ovoenergy==3.0.1"]
} }

View File

@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/portainer", "documentation": "https://www.home-assistant.io/integrations/portainer",
"iot_class": "local_polling", "iot_class": "local_polling",
"quality_scale": "bronze", "quality_scale": "bronze",
"requirements": ["pyportainer==0.1.7"] "requirements": ["pyportainer==1.0.3"]
} }

View File

@@ -215,6 +215,7 @@ def create_coordinator_container_vm(
return DataUpdateCoordinator( return DataUpdateCoordinator(
hass, hass,
_LOGGER, _LOGGER,
config_entry=None,
name=f"proxmox_coordinator_{host_name}_{node_name}_{vm_id}", name=f"proxmox_coordinator_{host_name}_{node_name}_{vm_id}",
update_method=async_update_data, update_method=async_update_data,
update_interval=timedelta(seconds=UPDATE_INTERVAL), update_interval=timedelta(seconds=UPDATE_INTERVAL),

View File

@@ -16,7 +16,6 @@ ATTR_HTML: Final = "html"
ATTR_CALLBACK_URL: Final = "callback_url" ATTR_CALLBACK_URL: Final = "callback_url"
ATTR_EXPIRE: Final = "expire" ATTR_EXPIRE: Final = "expire"
ATTR_TTL: Final = "ttl" ATTR_TTL: Final = "ttl"
ATTR_DATA: Final = "data"
ATTR_TIMESTAMP: Final = "timestamp" ATTR_TIMESTAMP: Final = "timestamp"
CONF_USER_KEY: Final = "user_key" CONF_USER_KEY: Final = "user_key"

View File

@@ -67,7 +67,7 @@ class PushoverNotificationService(BaseNotificationService):
# Extract params from data dict # Extract params from data dict
title = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT) title = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT)
data = kwargs.get(ATTR_DATA, {}) data = kwargs.get(ATTR_DATA) or {}
url = data.get(ATTR_URL) url = data.get(ATTR_URL)
url_title = data.get(ATTR_URL_TITLE) url_title = data.get(ATTR_URL_TITLE)
priority = data.get(ATTR_PRIORITY) priority = data.get(ATTR_PRIORITY)

View File

@@ -19,5 +19,5 @@
"iot_class": "local_push", "iot_class": "local_push",
"loggers": ["reolink_aio"], "loggers": ["reolink_aio"],
"quality_scale": "platinum", "quality_scale": "platinum",
"requirements": ["reolink-aio==0.16.0"] "requirements": ["reolink-aio==0.16.1"]
} }

View File

@@ -19,7 +19,7 @@
"loggers": ["roborock"], "loggers": ["roborock"],
"quality_scale": "silver", "quality_scale": "silver",
"requirements": [ "requirements": [
"python-roborock==2.47.1", "python-roborock==2.49.1",
"vacuum-map-parser-roborock==0.1.4" "vacuum-map-parser-roborock==0.1.4"
] ]
} }

View File

@@ -377,8 +377,10 @@
"max": "Max", "max": "Max",
"high": "[%key:common::state::high%]", "high": "[%key:common::state::high%]",
"intense": "Intense", "intense": "Intense",
"extreme": "Extreme",
"custom": "[%key:component::roborock::entity::select::mop_mode::state::custom%]", "custom": "[%key:component::roborock::entity::select::mop_mode::state::custom%]",
"custom_water_flow": "Custom water flow", "custom_water_flow": "Custom water flow",
"vac_followed_by_mop": "Vacuum followed by mop",
"smart_mode": "[%key:component::roborock::entity::select::mop_mode::state::smart_mode%]" "smart_mode": "[%key:component::roborock::entity::select::mop_mode::state::smart_mode%]"
} }
}, },

View File

@@ -13,8 +13,10 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .const import ( from .const import (
CONF_OUTPUT_NUMBER, CONF_OUTPUT_NUMBER,
CONF_OUTPUTS,
CONF_ZONE_NUMBER, CONF_ZONE_NUMBER,
CONF_ZONE_TYPE, CONF_ZONE_TYPE,
CONF_ZONES,
SIGNAL_OUTPUTS_UPDATED, SIGNAL_OUTPUTS_UPDATED,
SIGNAL_ZONES_UPDATED, SIGNAL_ZONES_UPDATED,
SUBENTRY_TYPE_OUTPUT, SUBENTRY_TYPE_OUTPUT,
@@ -49,7 +51,7 @@ async def async_setup_entry(
zone_num, zone_num,
zone_name, zone_name,
zone_type, zone_type,
SUBENTRY_TYPE_ZONE, CONF_ZONES,
SIGNAL_ZONES_UPDATED, SIGNAL_ZONES_UPDATED,
) )
], ],
@@ -73,7 +75,7 @@ async def async_setup_entry(
output_num, output_num,
output_name, output_name,
ouput_type, ouput_type,
SUBENTRY_TYPE_OUTPUT, CONF_OUTPUTS,
SIGNAL_OUTPUTS_UPDATED, SIGNAL_OUTPUTS_UPDATED,
) )
], ],

View File

@@ -5,14 +5,14 @@
"description": "Refer to the documentation on getting your Slack API key.", "description": "Refer to the documentation on getting your Slack API key.",
"data": { "data": {
"api_key": "[%key:common::config_flow::data::api_key%]", "api_key": "[%key:common::config_flow::data::api_key%]",
"default_channel": "Default Channel", "default_channel": "Default channel",
"icon": "Icon", "icon": "Icon",
"username": "[%key:common::config_flow::data::username%]" "username": "[%key:common::config_flow::data::username%]"
}, },
"data_description": { "data_description": {
"api_key": "The Slack API token to use for sending Slack messages.", "api_key": "The Slack API token to use for sending Slack messages.",
"default_channel": "The channel to post to if no channel is specified when sending a message.", "default_channel": "The channel to post to if no channel is specified when sending a message.",
"icon": "Use one of the Slack emojis as an Icon for the supplied username.", "icon": "Use one of the Slack emojis as an icon for the supplied username.",
"username": "Home Assistant will post to Slack using the username specified." "username": "Home Assistant will post to Slack using the username specified."
} }
} }

View File

@@ -31,6 +31,17 @@
"default": "mdi:stop" "default": "mdi:stop"
} }
}, },
"climate": {
"air_conditioner": {
"state_attributes": {
"fan_mode": {
"state": {
"turbo": "mdi:wind-power"
}
}
}
}
},
"number": { "number": {
"washer_rinse_cycles": { "washer_rinse_cycles": {
"default": "mdi:waves-arrow-up" "default": "mdi:waves-arrow-up"

View File

@@ -1151,8 +1151,11 @@ async def async_setup_entry(
) )
and ( and (
not description.exists_fn not description.exists_fn
or description.exists_fn( or (
device.status[MAIN][capability][attribute] component == MAIN
and description.exists_fn(
device.status[MAIN][capability][attribute]
)
) )
) )
and ( and (

View File

@@ -89,6 +89,11 @@
"long_wind": "Long wind", "long_wind": "Long wind",
"smart": "Smart" "smart": "Smart"
} }
},
"fan_mode": {
"state": {
"turbo": "Turbo"
}
} }
} }
} }

View File

@@ -7,5 +7,5 @@
"documentation": "https://www.home-assistant.io/integrations/tibber", "documentation": "https://www.home-assistant.io/integrations/tibber",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["tibber"], "loggers": ["tibber"],
"requirements": ["pyTibber==0.32.1"] "requirements": ["pyTibber==0.32.2"]
} }

View File

@@ -2,6 +2,7 @@
from __future__ import annotations from __future__ import annotations
import asyncio
from collections.abc import Callable from collections.abc import Callable
from datetime import timedelta from datetime import timedelta
import logging import logging
@@ -149,8 +150,9 @@ class ToGrillCoordinator(DataUpdateCoordinator[dict[tuple[int, int | None], Pack
raise DeviceNotFound("Unable to connect to device") from exc raise DeviceNotFound("Unable to connect to device") from exc
try: try:
packet_a0 = await client.read(PacketA0Notify) async with asyncio.timeout(10):
except (BleakError, DecodeError) as exc: packet_a0 = await client.read(PacketA0Notify)
except (BleakError, DecodeError, TimeoutError) as exc:
await client.disconnect() await client.disconnect()
raise DeviceFailed(f"Device failed {exc}") from exc raise DeviceFailed(f"Device failed {exc}") from exc
@@ -215,9 +217,19 @@ class ToGrillCoordinator(DataUpdateCoordinator[dict[tuple[int, int | None], Pack
@callback @callback
def _async_request_refresh_soon(self) -> None: def _async_request_refresh_soon(self) -> None:
self.config_entry.async_create_task( """Request a refresh in the near future.
self.hass, self.async_request_refresh(), eager_start=False
) This way have been called during an update and
would be ignored by debounce logic, so we delay
it by a slight amount to hopefully let the current
update finish first.
"""
async def _delayed_refresh() -> None:
await asyncio.sleep(0.5)
await self.async_request_refresh()
self.config_entry.async_create_task(self.hass, _delayed_refresh())
@callback @callback
def _disconnected_callback(self) -> None: def _disconnected_callback(self) -> None:

View File

@@ -100,8 +100,9 @@ class VeSyncFanHA(VeSyncBaseEntity, FanEntity):
"""Return the currently set speed.""" """Return the currently set speed."""
current_level = self.device.state.fan_level current_level = self.device.state.fan_level
if self.device.state.mode == VS_FAN_MODE_MANUAL and current_level is not None: if self.device.state.mode == VS_FAN_MODE_MANUAL and current_level is not None:
if current_level == 0:
return 0
return ordered_list_item_to_percentage( return ordered_list_item_to_percentage(
self.device.fan_levels, current_level self.device.fan_levels, current_level
) )

View File

@@ -10,6 +10,7 @@ from homeassistant.components.calendar import CalendarEntity, CalendarEvent
from homeassistant.const import CONF_NAME from homeassistant.const import CONF_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.util import dt as dt_util
from . import WorkdayConfigEntry from . import WorkdayConfigEntry
from .const import CONF_EXCLUDES, CONF_OFFSET, CONF_WORKDAYS from .const import CONF_EXCLUDES, CONF_OFFSET, CONF_WORKDAYS
@@ -87,11 +88,12 @@ class WorkdayCalendarEntity(BaseWorkdayEntity, CalendarEntity):
@property @property
def event(self) -> CalendarEvent | None: def event(self) -> CalendarEvent | None:
"""Return the next upcoming event.""" """Return the next upcoming event."""
return ( sorted_list: list[CalendarEvent] | None = (
sorted(self.event_list, key=lambda e: e.start)[0] sorted(self.event_list, key=lambda e: e.start) if self.event_list else None
if self.event_list
else None
) )
if not sorted_list:
return None
return [d for d in sorted_list if d.start >= dt_util.utcnow().date()][0]
async def async_get_events( async def async_get_events(
self, hass: HomeAssistant, start_date: datetime, end_date: datetime self, hass: HomeAssistant, start_date: datetime, end_date: datetime

View File

@@ -5,6 +5,7 @@ from __future__ import annotations
from abc import abstractmethod from abc import abstractmethod
import collections import collections
from contextlib import suppress from contextlib import suppress
from enum import StrEnum
import json import json
from typing import Any from typing import Any
@@ -82,9 +83,6 @@ FORMATION_UPLOAD_MANUAL_BACKUP = "upload_manual_backup"
CHOOSE_AUTOMATIC_BACKUP = "choose_automatic_backup" CHOOSE_AUTOMATIC_BACKUP = "choose_automatic_backup"
OVERWRITE_COORDINATOR_IEEE = "overwrite_coordinator_ieee" OVERWRITE_COORDINATOR_IEEE = "overwrite_coordinator_ieee"
OPTIONS_INTENT_MIGRATE = "intent_migrate"
OPTIONS_INTENT_RECONFIGURE = "intent_reconfigure"
UPLOADED_BACKUP_FILE = "uploaded_backup_file" UPLOADED_BACKUP_FILE = "uploaded_backup_file"
REPAIR_MY_URL = "https://my.home-assistant.io/redirect/repairs/" REPAIR_MY_URL = "https://my.home-assistant.io/redirect/repairs/"
@@ -102,6 +100,13 @@ ZEROCONF_PROPERTIES_SCHEMA = vol.Schema(
) )
class OptionsMigrationIntent(StrEnum):
"""Zigbee options flow intents."""
MIGRATE = "intent_migrate"
RECONFIGURE = "intent_reconfigure"
def _format_backup_choice( def _format_backup_choice(
backup: zigpy.backups.NetworkBackup, *, pan_ids: bool = True backup: zigpy.backups.NetworkBackup, *, pan_ids: bool = True
) -> str: ) -> str:
@@ -930,6 +935,8 @@ class ZhaConfigFlowHandler(BaseZhaFlow, ConfigFlow, domain=DOMAIN):
class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow): class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow):
"""Handle an options flow.""" """Handle an options flow."""
_migration_intent: OptionsMigrationIntent
def __init__(self, config_entry: ConfigEntry) -> None: def __init__(self, config_entry: ConfigEntry) -> None:
"""Initialize options flow.""" """Initialize options flow."""
super().__init__() super().__init__()
@@ -971,8 +978,8 @@ class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow):
return self.async_show_menu( return self.async_show_menu(
step_id="prompt_migrate_or_reconfigure", step_id="prompt_migrate_or_reconfigure",
menu_options=[ menu_options=[
OPTIONS_INTENT_RECONFIGURE, OptionsMigrationIntent.RECONFIGURE,
OPTIONS_INTENT_MIGRATE, OptionsMigrationIntent.MIGRATE,
], ],
) )
@@ -980,30 +987,26 @@ class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow):
self, user_input: dict[str, Any] | None = None self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult: ) -> ConfigFlowResult:
"""Virtual step for when the user is reconfiguring the integration.""" """Virtual step for when the user is reconfiguring the integration."""
self._migration_intent = OptionsMigrationIntent.RECONFIGURE
return await self.async_step_choose_serial_port() return await self.async_step_choose_serial_port()
async def async_step_intent_migrate( async def async_step_intent_migrate(
self, user_input: dict[str, Any] | None = None self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult: ) -> ConfigFlowResult:
"""Confirm the user wants to reset their current radio.""" """Confirm the user wants to reset their current radio."""
self._migration_intent = OptionsMigrationIntent.MIGRATE
return await self.async_step_choose_serial_port()
if user_input is not None: async def async_step_maybe_reset_old_radio(
await self._radio_mgr.async_reset_adapter()
return await self.async_step_instruct_unplug()
return self.async_show_form(step_id="intent_migrate")
async def async_step_instruct_unplug(
self, user_input: dict[str, Any] | None = None self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult: ) -> ConfigFlowResult:
"""Instruct the user to unplug the current radio, if possible.""" """Erase the old radio's network settings before migration."""
if user_input is not None: # If we are reconfiguring, the old radio will not be available
# Now that the old radio is gone, we can scan for serial ports again if self._migration_intent is OptionsMigrationIntent.RECONFIGURE:
return await self.async_step_choose_serial_port() return await self.async_step_maybe_confirm_ezsp_restore()
return self.async_show_form(step_id="instruct_unplug") return await super().async_step_maybe_reset_old_radio(user_input)
async def _async_create_radio_entry(self): async def _async_create_radio_entry(self):
"""Re-implementation of the base flow's final step to update the config.""" """Re-implementation of the base flow's final step to update the config."""
@@ -1018,8 +1021,7 @@ class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow):
# Reload ZHA after we finish # Reload ZHA after we finish
await self.hass.config_entries.async_setup(self.config_entry.entry_id) await self.hass.config_entries.async_setup(self.config_entry.entry_id)
# Intentionally do not set `data` to avoid creating `options`, we set it above return self.async_abort(reason="reconfigure_successful")
return self.async_create_entry(title=self._title, data={})
def async_remove(self): def async_remove(self):
"""Maybe reload ZHA if the flow is aborted.""" """Maybe reload ZHA if the flow is aborted."""

View File

@@ -147,10 +147,6 @@
"title": "[%key:component::zha::options::step::prompt_migrate_or_reconfigure::menu_options::intent_migrate%]", "title": "[%key:component::zha::options::step::prompt_migrate_or_reconfigure::menu_options::intent_migrate%]",
"description": "Before plugging in your new adapter, your old adapter needs to be reset. An automatic backup will be performed. If you are using a combined Z-Wave and Zigbee adapter like the HUSBZB-1, this will only reset the Zigbee portion.\n\n*Note: if you are migrating from a **ConBee/RaspBee**, make sure it is running firmware `0x26720700` or newer! Otherwise, some devices may not be controllable after migrating until they are power cycled.*\n\nDo you wish to continue?" "description": "Before plugging in your new adapter, your old adapter needs to be reset. An automatic backup will be performed. If you are using a combined Z-Wave and Zigbee adapter like the HUSBZB-1, this will only reset the Zigbee portion.\n\n*Note: if you are migrating from a **ConBee/RaspBee**, make sure it is running firmware `0x26720700` or newer! Otherwise, some devices may not be controllable after migrating until they are power cycled.*\n\nDo you wish to continue?"
}, },
"instruct_unplug": {
"title": "Unplug your old adapter",
"description": "Your old adapter has been reset. If the hardware is no longer needed, you can now unplug it.\n\nYou can now plug in your new adapter."
},
"choose_serial_port": { "choose_serial_port": {
"title": "[%key:component::zha::config::step::choose_serial_port::title%]", "title": "[%key:component::zha::config::step::choose_serial_port::title%]",
"data": { "data": {
@@ -240,7 +236,8 @@
"cannot_resolve_path": "[%key:component::zha::config::abort::cannot_resolve_path%]", "cannot_resolve_path": "[%key:component::zha::config::abort::cannot_resolve_path%]",
"wrong_firmware_installed": "[%key:component::zha::config::abort::wrong_firmware_installed%]", "wrong_firmware_installed": "[%key:component::zha::config::abort::wrong_firmware_installed%]",
"cannot_restore_backup": "[%key:component::zha::config::abort::cannot_restore_backup%]", "cannot_restore_backup": "[%key:component::zha::config::abort::cannot_restore_backup%]",
"cannot_restore_backup_no_ieee_confirm": "[%key:component::zha::config::abort::cannot_restore_backup_no_ieee_confirm%]" "cannot_restore_backup_no_ieee_confirm": "[%key:component::zha::config::abort::cannot_restore_backup_no_ieee_confirm%]",
"reconfigure_successful": "[%key:component::zha::config::abort::reconfigure_successful%]"
} }
}, },
"config_panel": { "config_panel": {

View File

@@ -703,7 +703,15 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
async def async_step_on_supervisor( async def async_step_on_supervisor(
self, user_input: dict[str, Any] | None = None self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult: ) -> ConfigFlowResult:
"""Handle logic when on Supervisor host.""" """Handle logic when on Supervisor host.
When the add-on is running, we copy over it's settings.
We will ignore settings for USB/Socket if those were discovered.
If add-on is not running, we will configure the add-on.
When it's not installed, we install it with new config options.
"""
if user_input is None: if user_input is None:
return self.async_show_form( return self.async_show_form(
step_id="on_supervisor", data_schema=ON_SUPERVISOR_SCHEMA step_id="on_supervisor", data_schema=ON_SUPERVISOR_SCHEMA
@@ -717,8 +725,11 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
if addon_info.state == AddonState.RUNNING: if addon_info.state == AddonState.RUNNING:
addon_config = addon_info.options addon_config = addon_info.options
self.usb_path = addon_config.get(CONF_ADDON_DEVICE) # Use the options set by USB/ESPHome discovery
self.socket_path = addon_config.get(CONF_ADDON_SOCKET) if not self._adapter_discovered:
self.usb_path = addon_config.get(CONF_ADDON_DEVICE)
self.socket_path = addon_config.get(CONF_ADDON_SOCKET)
self.s0_legacy_key = addon_config.get(CONF_ADDON_S0_LEGACY_KEY, "") self.s0_legacy_key = addon_config.get(CONF_ADDON_S0_LEGACY_KEY, "")
self.s2_access_control_key = addon_config.get( self.s2_access_control_key = addon_config.get(
CONF_ADDON_S2_ACCESS_CONTROL_KEY, "" CONF_ADDON_S2_ACCESS_CONTROL_KEY, ""
@@ -918,7 +929,7 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
discovery_info = await self._async_get_addon_discovery_info() discovery_info = await self._async_get_addon_discovery_info()
self.ws_address = f"ws://{discovery_info['host']}:{discovery_info['port']}" self.ws_address = f"ws://{discovery_info['host']}:{discovery_info['port']}"
if not self.unique_id or self.source in (SOURCE_USB, SOURCE_ESPHOME): if not self.unique_id or self.source == SOURCE_USB:
if not self.version_info: if not self.version_info:
try: try:
self.version_info = await async_get_version_info( self.version_info = await async_get_version_info(
@@ -931,6 +942,21 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
str(self.version_info.home_id), raise_on_progress=False str(self.version_info.home_id), raise_on_progress=False
) )
# When we came from discovery, make sure we update the add-on
if self._adapter_discovered and self.use_addon:
await self._async_set_addon_config(
{
CONF_ADDON_DEVICE: self.usb_path,
CONF_ADDON_SOCKET: self.socket_path,
CONF_ADDON_S0_LEGACY_KEY: self.s0_legacy_key,
CONF_ADDON_S2_ACCESS_CONTROL_KEY: self.s2_access_control_key,
CONF_ADDON_S2_AUTHENTICATED_KEY: self.s2_authenticated_key,
CONF_ADDON_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key,
CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key,
CONF_ADDON_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key,
}
)
self._abort_if_unique_id_configured( self._abort_if_unique_id_configured(
updates={ updates={
CONF_URL: self.ws_address, CONF_URL: self.ws_address,
@@ -942,7 +968,12 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
CONF_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key, CONF_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key,
CONF_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key, CONF_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key,
CONF_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key, CONF_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key,
} },
error=(
"migration_successful"
if self.source in (SOURCE_USB, SOURCE_ESPHOME)
else "already_configured"
),
) )
return self._async_create_entry_from_vars() return self._async_create_entry_from_vars()
@@ -1490,6 +1521,8 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
) )
# Only update existing entries that are configured via sockets # Only update existing entries that are configured via sockets
and existing_entry.data.get(CONF_SOCKET_PATH) and existing_entry.data.get(CONF_SOCKET_PATH)
# And use the add-on
and existing_entry.data.get(CONF_USE_ADDON)
): ):
await self._async_set_addon_config( await self._async_set_addon_config(
{CONF_ADDON_SOCKET: discovery_info.socket_path} {CONF_ADDON_SOCKET: discovery_info.socket_path}
@@ -1498,6 +1531,11 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
self.hass.config_entries.async_schedule_reload(existing_entry.entry_id) self.hass.config_entries.async_schedule_reload(existing_entry.entry_id)
return self.async_abort(reason="already_configured") return self.async_abort(reason="already_configured")
# We are not aborting if home ID configured here, we just want to make sure that it's set
# We will update a USB based config entry automatically in `async_step_finish_addon_setup_user`
await self.async_set_unique_id(
str(discovery_info.zwave_home_id), raise_on_progress=False
)
self.socket_path = discovery_info.socket_path self.socket_path = discovery_info.socket_path
self.context["title_placeholders"] = { self.context["title_placeholders"] = {
CONF_NAME: f"{discovery_info.name} via ESPHome" CONF_NAME: f"{discovery_info.name} via ESPHome"

View File

@@ -612,10 +612,7 @@ class ZwaveColorOnOffLight(ZwaveLight):
# If brightness gets set, preserve the color and mix it with the new brightness # If brightness gets set, preserve the color and mix it with the new brightness
if self.color_mode == ColorMode.HS: if self.color_mode == ColorMode.HS:
scale = brightness / 255 scale = brightness / 255
if ( if self._last_on_color is not None:
self._last_on_color is not None
and None not in self._last_on_color.values()
):
# Changed brightness from 0 to >0 # Changed brightness from 0 to >0
old_brightness = max(self._last_on_color.values()) old_brightness = max(self._last_on_color.values())
new_scale = brightness / old_brightness new_scale = brightness / old_brightness
@@ -634,8 +631,9 @@ class ZwaveColorOnOffLight(ZwaveLight):
elif current_brightness is not None: elif current_brightness is not None:
scale = current_brightness / 255 scale = current_brightness / 255
# Reset last color until turning off again # Reset last color and brightness until turning off again
self._last_on_color = None self._last_on_color = None
self._last_brightness = None
if new_colors is None: if new_colors is None:
new_colors = self._get_new_colors( new_colors = self._get_new_colors(
@@ -651,8 +649,10 @@ class ZwaveColorOnOffLight(ZwaveLight):
async def async_turn_off(self, **kwargs: Any) -> None: async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the light off.""" """Turn the light off."""
# Remember last color and brightness to restore it when turning on # Remember last color and brightness to restore it when turning on,
self._last_brightness = self.brightness # only if we're sure the light is turned on to avoid overwriting good values
if self._last_brightness is None:
self._last_brightness = self.brightness
if self._current_color and isinstance(self._current_color.value, dict): if self._current_color and isinstance(self._current_color.value, dict):
red = self._current_color.value.get(COLOR_SWITCH_COMBINED_RED) red = self._current_color.value.get(COLOR_SWITCH_COMBINED_RED)
green = self._current_color.value.get(COLOR_SWITCH_COMBINED_GREEN) green = self._current_color.value.get(COLOR_SWITCH_COMBINED_GREEN)
@@ -666,7 +666,8 @@ class ZwaveColorOnOffLight(ZwaveLight):
if blue is not None: if blue is not None:
last_color[ColorComponent.BLUE] = blue last_color[ColorComponent.BLUE] = blue
if last_color: # Only store the last color if we're aware of it, i.e. ignore off light
if last_color and max(last_color.values()) > 0:
self._last_on_color = last_color self._last_on_color = last_color
if self._target_brightness: if self._target_brightness:

View File

@@ -26,7 +26,7 @@ if TYPE_CHECKING:
APPLICATION_NAME: Final = "HomeAssistant" APPLICATION_NAME: Final = "HomeAssistant"
MAJOR_VERSION: Final = 2025 MAJOR_VERSION: Final = 2025
MINOR_VERSION: Final = 10 MINOR_VERSION: Final = 10
PATCH_VERSION: Final = "0" PATCH_VERSION: Final = "1"
__short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}"
__version__: Final = f"{__short_version__}.{PATCH_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}"
REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 13, 2) REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 13, 2)

View File

@@ -3,7 +3,7 @@
aiodhcpwatcher==1.2.1 aiodhcpwatcher==1.2.1
aiodiscover==2.7.1 aiodiscover==2.7.1
aiodns==3.5.0 aiodns==3.5.0
aiohasupervisor==0.3.3b0 aiohasupervisor==0.3.3
aiohttp-asyncmdnsresolver==0.1.1 aiohttp-asyncmdnsresolver==0.1.1
aiohttp-fast-zlib==0.3.0 aiohttp-fast-zlib==0.3.0
aiohttp==3.12.15 aiohttp==3.12.15

View File

@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "homeassistant" name = "homeassistant"
version = "2025.10.0" version = "2025.10.1"
license = "Apache-2.0" license = "Apache-2.0"
license-files = ["LICENSE*", "homeassistant/backports/LICENSE*"] license-files = ["LICENSE*", "homeassistant/backports/LICENSE*"]
description = "Open-source home automation platform running on Python 3." description = "Open-source home automation platform running on Python 3."
@@ -27,7 +27,7 @@ dependencies = [
# Integrations may depend on hassio integration without listing it to # Integrations may depend on hassio integration without listing it to
# change behavior based on presence of supervisor. Deprecated with #127228 # change behavior based on presence of supervisor. Deprecated with #127228
# Lib can be removed with 2025.11 # Lib can be removed with 2025.11
"aiohasupervisor==0.3.3b0", "aiohasupervisor==0.3.3",
"aiohttp==3.12.15", "aiohttp==3.12.15",
"aiohttp_cors==0.8.1", "aiohttp_cors==0.8.1",
"aiohttp-fast-zlib==0.3.0", "aiohttp-fast-zlib==0.3.0",

2
requirements.txt generated
View File

@@ -4,7 +4,7 @@
# Home Assistant Core # Home Assistant Core
aiodns==3.5.0 aiodns==3.5.0
aiohasupervisor==0.3.3b0 aiohasupervisor==0.3.3
aiohttp==3.12.15 aiohttp==3.12.15
aiohttp_cors==0.8.1 aiohttp_cors==0.8.1
aiohttp-fast-zlib==0.3.0 aiohttp-fast-zlib==0.3.0

18
requirements_all.txt generated
View File

@@ -265,13 +265,13 @@ aioguardian==2022.07.0
aioharmony==0.5.3 aioharmony==0.5.3
# homeassistant.components.hassio # homeassistant.components.hassio
aiohasupervisor==0.3.3b0 aiohasupervisor==0.3.3
# homeassistant.components.home_connect # homeassistant.components.home_connect
aiohomeconnect==0.19.0 aiohomeconnect==0.19.0
# homeassistant.components.homekit_controller # homeassistant.components.homekit_controller
aiohomekit==3.2.18 aiohomekit==3.2.19
# homeassistant.components.mcp_server # homeassistant.components.mcp_server
aiohttp_sse==2.2.0 aiohttp_sse==2.2.0
@@ -453,7 +453,7 @@ airgradient==0.9.2
airly==1.1.0 airly==1.1.0
# homeassistant.components.airos # homeassistant.components.airos
airos==0.5.1 airos==0.5.4
# homeassistant.components.airthings_ble # homeassistant.components.airthings_ble
airthings-ble==0.9.2 airthings-ble==0.9.2
@@ -1664,7 +1664,7 @@ orvibo==1.1.2
ourgroceries==1.5.4 ourgroceries==1.5.4
# homeassistant.components.ovo_energy # homeassistant.components.ovo_energy
ovoenergy==2.0.1 ovoenergy==3.0.1
# homeassistant.components.p1_monitor # homeassistant.components.p1_monitor
p1monitor==3.2.0 p1monitor==3.2.0
@@ -1839,7 +1839,7 @@ pyRFXtrx==0.31.1
pySDCP==1 pySDCP==1
# homeassistant.components.tibber # homeassistant.components.tibber
pyTibber==0.32.1 pyTibber==0.32.2
# homeassistant.components.dlink # homeassistant.components.dlink
pyW215==0.8.0 pyW215==0.8.0
@@ -2287,7 +2287,7 @@ pyplaato==0.0.19
pypoint==3.0.0 pypoint==3.0.0
# homeassistant.components.portainer # homeassistant.components.portainer
pyportainer==0.1.7 pyportainer==1.0.3
# homeassistant.components.probe_plus # homeassistant.components.probe_plus
pyprobeplus==1.0.1 pyprobeplus==1.0.1
@@ -2541,7 +2541,7 @@ python-rabbitair==0.0.8
python-ripple-api==0.0.3 python-ripple-api==0.0.3
# homeassistant.components.roborock # homeassistant.components.roborock
python-roborock==2.47.1 python-roborock==2.49.1
# homeassistant.components.smarttub # homeassistant.components.smarttub
python-smarttub==0.0.44 python-smarttub==0.0.44
@@ -2701,7 +2701,7 @@ renault-api==0.4.1
renson-endura-delta==1.7.2 renson-endura-delta==1.7.2
# homeassistant.components.reolink # homeassistant.components.reolink
reolink-aio==0.16.0 reolink-aio==0.16.1
# homeassistant.components.idteck_prox # homeassistant.components.idteck_prox
rfk101py==0.0.1 rfk101py==0.0.1
@@ -3054,7 +3054,7 @@ unifi_ap==0.0.2
unifiled==0.11 unifiled==0.11
# homeassistant.components.homeassistant_hardware # homeassistant.components.homeassistant_hardware
universal-silabs-flasher==0.0.34 universal-silabs-flasher==0.0.35
# homeassistant.components.upb # homeassistant.components.upb
upb-lib==0.6.1 upb-lib==0.6.1

View File

@@ -250,13 +250,13 @@ aioguardian==2022.07.0
aioharmony==0.5.3 aioharmony==0.5.3
# homeassistant.components.hassio # homeassistant.components.hassio
aiohasupervisor==0.3.3b0 aiohasupervisor==0.3.3
# homeassistant.components.home_connect # homeassistant.components.home_connect
aiohomeconnect==0.19.0 aiohomeconnect==0.19.0
# homeassistant.components.homekit_controller # homeassistant.components.homekit_controller
aiohomekit==3.2.18 aiohomekit==3.2.19
# homeassistant.components.mcp_server # homeassistant.components.mcp_server
aiohttp_sse==2.2.0 aiohttp_sse==2.2.0
@@ -435,7 +435,7 @@ airgradient==0.9.2
airly==1.1.0 airly==1.1.0
# homeassistant.components.airos # homeassistant.components.airos
airos==0.5.1 airos==0.5.4
# homeassistant.components.airthings_ble # homeassistant.components.airthings_ble
airthings-ble==0.9.2 airthings-ble==0.9.2
@@ -1414,7 +1414,7 @@ oralb-ble==0.17.6
ourgroceries==1.5.4 ourgroceries==1.5.4
# homeassistant.components.ovo_energy # homeassistant.components.ovo_energy
ovoenergy==2.0.1 ovoenergy==3.0.1
# homeassistant.components.p1_monitor # homeassistant.components.p1_monitor
p1monitor==3.2.0 p1monitor==3.2.0
@@ -1550,7 +1550,7 @@ pyHomee==1.3.8
pyRFXtrx==0.31.1 pyRFXtrx==0.31.1
# homeassistant.components.tibber # homeassistant.components.tibber
pyTibber==0.32.1 pyTibber==0.32.2
# homeassistant.components.dlink # homeassistant.components.dlink
pyW215==0.8.0 pyW215==0.8.0
@@ -1911,7 +1911,7 @@ pyplaato==0.0.19
pypoint==3.0.0 pypoint==3.0.0
# homeassistant.components.portainer # homeassistant.components.portainer
pyportainer==0.1.7 pyportainer==1.0.3
# homeassistant.components.probe_plus # homeassistant.components.probe_plus
pyprobeplus==1.0.1 pyprobeplus==1.0.1
@@ -2111,7 +2111,7 @@ python-pooldose==0.5.0
python-rabbitair==0.0.8 python-rabbitair==0.0.8
# homeassistant.components.roborock # homeassistant.components.roborock
python-roborock==2.47.1 python-roborock==2.49.1
# homeassistant.components.smarttub # homeassistant.components.smarttub
python-smarttub==0.0.44 python-smarttub==0.0.44
@@ -2247,7 +2247,7 @@ renault-api==0.4.1
renson-endura-delta==1.7.2 renson-endura-delta==1.7.2
# homeassistant.components.reolink # homeassistant.components.reolink
reolink-aio==0.16.0 reolink-aio==0.16.1
# homeassistant.components.rflink # homeassistant.components.rflink
rflink==0.0.67 rflink==0.0.67
@@ -2525,7 +2525,7 @@ ultraheat-api==0.5.7
unifi-discovery==1.2.0 unifi-discovery==1.2.0
# homeassistant.components.homeassistant_hardware # homeassistant.components.homeassistant_hardware
universal-silabs-flasher==0.0.34 universal-silabs-flasher==0.0.35
# homeassistant.components.upb # homeassistant.components.upb
upb-lib==0.6.1 upb-lib==0.6.1

View File

@@ -208,7 +208,7 @@ async def test_tts_service_speak(
threshold=RECOMMENDED_HARM_BLOCK_THRESHOLD, threshold=RECOMMENDED_HARM_BLOCK_THRESHOLD,
), ),
], ],
thinking_config=types.ThinkingConfig(include_thoughts=True), thinking_config=None,
), ),
) )
@@ -277,6 +277,6 @@ async def test_tts_service_speak_error(
threshold=RECOMMENDED_HARM_BLOCK_THRESHOLD, threshold=RECOMMENDED_HARM_BLOCK_THRESHOLD,
), ),
], ],
thinking_config=types.ThinkingConfig(include_thoughts=True), thinking_config=None,
), ),
) )

View File

@@ -328,10 +328,7 @@ async def test_options_flow(
# Verify async_flash_silabs_firmware was called with ZBT-2's reset methods # Verify async_flash_silabs_firmware was called with ZBT-2's reset methods
assert flash_mock.call_count == 1 assert flash_mock.call_count == 1
assert flash_mock.mock_calls[0].kwargs["bootloader_reset_methods"] == [ assert flash_mock.mock_calls[0].kwargs["bootloader_reset_methods"] == ["rts_dtr"]
"rts_dtr",
"baudrate",
]
async def test_duplicate_discovery(hass: HomeAssistant) -> None: async def test_duplicate_discovery(hass: HomeAssistant) -> None:

View File

@@ -38,6 +38,8 @@ NOT_IDASEN_DISCOVERY_INFO = BluetoothServiceInfoBleak(
tx_power=-127, tx_power=-127,
) )
UPDATE_DEBOUNCE_TIME = 0.2
async def init_integration(hass: HomeAssistant) -> MockConfigEntry: async def init_integration(hass: HomeAssistant) -> MockConfigEntry:
"""Set up the IKEA Idasen Desk integration in Home Assistant.""" """Set up the IKEA Idasen Desk integration in Home Assistant."""

View File

@@ -4,6 +4,7 @@ from typing import Any
from unittest.mock import AsyncMock, MagicMock from unittest.mock import AsyncMock, MagicMock
from bleak.exc import BleakError from bleak.exc import BleakError
from freezegun.api import FrozenDateTimeFactory
import pytest import pytest
from homeassistant.components.cover import ( from homeassistant.components.cover import (
@@ -22,12 +23,13 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from . import init_integration from . import UPDATE_DEBOUNCE_TIME, init_integration
from tests.common import async_fire_time_changed
async def test_cover_available( async def test_cover_available(
hass: HomeAssistant, hass: HomeAssistant, mock_desk_api: MagicMock, freezer: FrozenDateTimeFactory
mock_desk_api: MagicMock,
) -> None: ) -> None:
"""Test cover available property.""" """Test cover available property."""
entity_id = "cover.test" entity_id = "cover.test"
@@ -42,6 +44,9 @@ async def test_cover_available(
mock_desk_api.is_connected = False mock_desk_api.is_connected = False
mock_desk_api.trigger_update_callback(None) mock_desk_api.trigger_update_callback(None)
freezer.tick(UPDATE_DEBOUNCE_TIME)
async_fire_time_changed(hass)
state = hass.states.get(entity_id) state = hass.states.get(entity_id)
assert state assert state
assert state.state == STATE_UNAVAILABLE assert state.state == STATE_UNAVAILABLE
@@ -64,6 +69,7 @@ async def test_cover_services(
service_data: dict[str, Any], service_data: dict[str, Any],
expected_state: str, expected_state: str,
expected_position: int, expected_position: int,
freezer: FrozenDateTimeFactory,
) -> None: ) -> None:
"""Test cover services.""" """Test cover services."""
entity_id = "cover.test" entity_id = "cover.test"
@@ -78,7 +84,9 @@ async def test_cover_services(
{"entity_id": entity_id, **service_data}, {"entity_id": entity_id, **service_data},
blocking=True, blocking=True,
) )
await hass.async_block_till_done() freezer.tick(UPDATE_DEBOUNCE_TIME)
async_fire_time_changed(hass)
state = hass.states.get(entity_id) state = hass.states.get(entity_id)
assert state assert state
assert state.state == expected_state assert state.state == expected_state
@@ -113,4 +121,3 @@ async def test_cover_services_exception(
{"entity_id": entity_id, **service_data}, {"entity_id": entity_id, **service_data},
blocking=True, blocking=True,
) )
await hass.async_block_till_done()

View File

@@ -2,18 +2,23 @@
from unittest.mock import MagicMock from unittest.mock import MagicMock
from freezegun.api import FrozenDateTimeFactory
import pytest import pytest
from homeassistant.const import STATE_UNAVAILABLE from homeassistant.const import STATE_UNAVAILABLE
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from . import init_integration from . import UPDATE_DEBOUNCE_TIME, init_integration
from tests.common import async_fire_time_changed
EXPECTED_INITIAL_HEIGHT = "1" EXPECTED_INITIAL_HEIGHT = "1"
@pytest.mark.usefixtures("entity_registry_enabled_by_default") @pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_height_sensor(hass: HomeAssistant, mock_desk_api: MagicMock) -> None: async def test_height_sensor(
hass: HomeAssistant, mock_desk_api: MagicMock, freezer: FrozenDateTimeFactory
) -> None:
"""Test height sensor.""" """Test height sensor."""
await init_integration(hass) await init_integration(hass)
@@ -24,6 +29,15 @@ async def test_height_sensor(hass: HomeAssistant, mock_desk_api: MagicMock) -> N
mock_desk_api.height = 1.2 mock_desk_api.height = 1.2
mock_desk_api.trigger_update_callback(None) mock_desk_api.trigger_update_callback(None)
await hass.async_block_till_done()
# State should still be the same due to the debouncer
state = hass.states.get(entity_id)
assert state
assert state.state == EXPECTED_INITIAL_HEIGHT
freezer.tick(UPDATE_DEBOUNCE_TIME)
async_fire_time_changed(hass)
state = hass.states.get(entity_id) state = hass.states.get(entity_id)
assert state assert state
@@ -34,6 +48,7 @@ async def test_height_sensor(hass: HomeAssistant, mock_desk_api: MagicMock) -> N
async def test_sensor_available( async def test_sensor_available(
hass: HomeAssistant, hass: HomeAssistant,
mock_desk_api: MagicMock, mock_desk_api: MagicMock,
freezer: FrozenDateTimeFactory,
) -> None: ) -> None:
"""Test sensor available property.""" """Test sensor available property."""
await init_integration(hass) await init_integration(hass)
@@ -46,6 +61,9 @@ async def test_sensor_available(
mock_desk_api.is_connected = False mock_desk_api.is_connected = False
mock_desk_api.trigger_update_callback(None) mock_desk_api.trigger_update_callback(None)
freezer.tick(UPDATE_DEBOUNCE_TIME)
async_fire_time_changed(hass)
state = hass.states.get(entity_id) state = hass.states.get(entity_id)
assert state assert state
assert state.state == STATE_UNAVAILABLE assert state.state == STATE_UNAVAILABLE

View File

@@ -47,7 +47,7 @@ async def get_data_from_library(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-05", "date": "2025-10-01",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3,SE4", "deliveryArea": "SE3,SE4",
"currency": "SEK", "currency": "SEK",
@@ -58,7 +58,7 @@ async def get_data_from_library(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-05", "date": "2025-10-01",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3", "deliveryArea": "SE3",
"currency": "EUR", "currency": "EUR",
@@ -69,7 +69,7 @@ async def get_data_from_library(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-04", "date": "2025-09-30",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3,SE4", "deliveryArea": "SE3,SE4",
"currency": "SEK", "currency": "SEK",
@@ -80,7 +80,7 @@ async def get_data_from_library(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-06", "date": "2025-10-02",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3,SE4", "deliveryArea": "SE3,SE4",
"currency": "SEK", "currency": "SEK",

View File

@@ -1,213 +1,717 @@
{ {
"deliveryDateCET": "2024-11-05", "deliveryDateCET": "2025-10-01",
"version": 2, "version": 2,
"updatedAt": "2024-11-04T11:58:10.7711584Z", "updatedAt": "2025-09-30T11:08:13.1885499Z",
"deliveryAreas": ["NL"], "deliveryAreas": ["NL"],
"market": "DayAhead", "market": "DayAhead",
"multiAreaEntries": [ "multiAreaEntries": [
{ {
"deliveryStart": "2024-11-04T23:00:00Z", "deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2024-11-05T00:00:00Z", "deliveryEnd": "2025-09-30T22:15:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 83.63 "NL": 102.55
} }
}, },
{ {
"deliveryStart": "2024-11-05T00:00:00Z", "deliveryStart": "2025-09-30T22:15:00Z",
"deliveryEnd": "2024-11-05T01:00:00Z", "deliveryEnd": "2025-09-30T22:30:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 94.0 "NL": 92.17
} }
}, },
{ {
"deliveryStart": "2024-11-05T01:00:00Z", "deliveryStart": "2025-09-30T22:30:00Z",
"deliveryEnd": "2024-11-05T02:00:00Z", "deliveryEnd": "2025-09-30T22:45:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 90.68 "NL": 82.69
} }
}, },
{ {
"deliveryStart": "2024-11-05T02:00:00Z", "deliveryStart": "2025-09-30T22:45:00Z",
"deliveryEnd": "2024-11-05T03:00:00Z", "deliveryEnd": "2025-09-30T23:00:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 91.3 "NL": 81.86
} }
}, },
{ {
"deliveryStart": "2024-11-05T03:00:00Z", "deliveryStart": "2025-09-30T23:00:00Z",
"deliveryEnd": "2024-11-05T04:00:00Z", "deliveryEnd": "2025-09-30T23:15:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 94.0 "NL": 89.54
} }
}, },
{ {
"deliveryStart": "2024-11-05T04:00:00Z", "deliveryStart": "2025-09-30T23:15:00Z",
"deliveryEnd": "2024-11-05T05:00:00Z", "deliveryEnd": "2025-09-30T23:30:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 96.09 "NL": 84.93
} }
}, },
{ {
"deliveryStart": "2024-11-05T05:00:00Z", "deliveryStart": "2025-09-30T23:30:00Z",
"deliveryEnd": "2024-11-05T06:00:00Z", "deliveryEnd": "2025-09-30T23:45:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 106.0 "NL": 83.56
} }
}, },
{ {
"deliveryStart": "2024-11-05T06:00:00Z", "deliveryStart": "2025-09-30T23:45:00Z",
"deliveryEnd": "2024-11-05T07:00:00Z", "deliveryEnd": "2025-10-01T00:00:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 135.99 "NL": 81.69
} }
}, },
{ {
"deliveryStart": "2024-11-05T07:00:00Z", "deliveryStart": "2025-10-01T00:00:00Z",
"deliveryEnd": "2024-11-05T08:00:00Z", "deliveryEnd": "2025-10-01T00:15:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 136.21 "NL": 81.87
} }
}, },
{ {
"deliveryStart": "2024-11-05T08:00:00Z", "deliveryStart": "2025-10-01T00:15:00Z",
"deliveryEnd": "2024-11-05T09:00:00Z", "deliveryEnd": "2025-10-01T00:30:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 118.23 "NL": 81.51
} }
}, },
{ {
"deliveryStart": "2024-11-05T09:00:00Z", "deliveryStart": "2025-10-01T00:30:00Z",
"deliveryEnd": "2024-11-05T10:00:00Z", "deliveryEnd": "2025-10-01T00:45:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 105.87 "NL": 77.42
} }
}, },
{ {
"deliveryStart": "2024-11-05T10:00:00Z", "deliveryStart": "2025-10-01T00:45:00Z",
"deliveryEnd": "2024-11-05T11:00:00Z", "deliveryEnd": "2025-10-01T01:00:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 95.28 "NL": 76.45
} }
}, },
{ {
"deliveryStart": "2024-11-05T11:00:00Z", "deliveryStart": "2025-10-01T01:00:00Z",
"deliveryEnd": "2024-11-05T12:00:00Z", "deliveryEnd": "2025-10-01T01:15:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 94.92 "NL": 79.32
} }
}, },
{ {
"deliveryStart": "2024-11-05T12:00:00Z", "deliveryStart": "2025-10-01T01:15:00Z",
"deliveryEnd": "2024-11-05T13:00:00Z", "deliveryEnd": "2025-10-01T01:30:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 99.25 "NL": 79.24
} }
}, },
{ {
"deliveryStart": "2024-11-05T13:00:00Z", "deliveryStart": "2025-10-01T01:30:00Z",
"deliveryEnd": "2024-11-05T14:00:00Z", "deliveryEnd": "2025-10-01T01:45:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 107.98 "NL": 80.05
} }
}, },
{ {
"deliveryStart": "2024-11-05T14:00:00Z", "deliveryStart": "2025-10-01T01:45:00Z",
"deliveryEnd": "2024-11-05T15:00:00Z", "deliveryEnd": "2025-10-01T02:00:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 149.86 "NL": 79.52
} }
}, },
{ {
"deliveryStart": "2024-11-05T15:00:00Z", "deliveryStart": "2025-10-01T02:00:00Z",
"deliveryEnd": "2024-11-05T16:00:00Z", "deliveryEnd": "2025-10-01T02:15:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 303.24 "NL": 79.94
} }
}, },
{ {
"deliveryStart": "2024-11-05T16:00:00Z", "deliveryStart": "2025-10-01T02:15:00Z",
"deliveryEnd": "2024-11-05T17:00:00Z", "deliveryEnd": "2025-10-01T02:30:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 472.99 "NL": 85.02
} }
}, },
{ {
"deliveryStart": "2024-11-05T17:00:00Z", "deliveryStart": "2025-10-01T02:30:00Z",
"deliveryEnd": "2024-11-05T18:00:00Z", "deliveryEnd": "2025-10-01T02:45:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 431.02 "NL": 83.89
} }
}, },
{ {
"deliveryStart": "2024-11-05T18:00:00Z", "deliveryStart": "2025-10-01T02:45:00Z",
"deliveryEnd": "2024-11-05T19:00:00Z", "deliveryEnd": "2025-10-01T03:00:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 320.33 "NL": 75.83
} }
}, },
{ {
"deliveryStart": "2024-11-05T19:00:00Z", "deliveryStart": "2025-10-01T03:00:00Z",
"deliveryEnd": "2024-11-05T20:00:00Z", "deliveryEnd": "2025-10-01T03:15:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 169.7 "NL": 75.01
} }
}, },
{ {
"deliveryStart": "2024-11-05T20:00:00Z", "deliveryStart": "2025-10-01T03:15:00Z",
"deliveryEnd": "2024-11-05T21:00:00Z", "deliveryEnd": "2025-10-01T03:30:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 129.9 "NL": 80.88
} }
}, },
{ {
"deliveryStart": "2024-11-05T21:00:00Z", "deliveryStart": "2025-10-01T03:30:00Z",
"deliveryEnd": "2024-11-05T22:00:00Z", "deliveryEnd": "2025-10-01T03:45:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 117.77 "NL": 88.18
} }
}, },
{ {
"deliveryStart": "2024-11-05T22:00:00Z", "deliveryStart": "2025-10-01T03:45:00Z",
"deliveryEnd": "2024-11-05T23:00:00Z", "deliveryEnd": "2025-10-01T04:00:00Z",
"entryPerArea": { "entryPerArea": {
"NL": 110.03 "NL": 97.34
}
},
{
"deliveryStart": "2025-10-01T04:00:00Z",
"deliveryEnd": "2025-10-01T04:15:00Z",
"entryPerArea": {
"NL": 87.65
}
},
{
"deliveryStart": "2025-10-01T04:15:00Z",
"deliveryEnd": "2025-10-01T04:30:00Z",
"entryPerArea": {
"NL": 107.93
}
},
{
"deliveryStart": "2025-10-01T04:30:00Z",
"deliveryEnd": "2025-10-01T04:45:00Z",
"entryPerArea": {
"NL": 123.95
}
},
{
"deliveryStart": "2025-10-01T04:45:00Z",
"deliveryEnd": "2025-10-01T05:00:00Z",
"entryPerArea": {
"NL": 143.66
}
},
{
"deliveryStart": "2025-10-01T05:00:00Z",
"deliveryEnd": "2025-10-01T05:15:00Z",
"entryPerArea": {
"NL": 150.66
}
},
{
"deliveryStart": "2025-10-01T05:15:00Z",
"deliveryEnd": "2025-10-01T05:30:00Z",
"entryPerArea": {
"NL": 171.48
}
},
{
"deliveryStart": "2025-10-01T05:30:00Z",
"deliveryEnd": "2025-10-01T05:45:00Z",
"entryPerArea": {
"NL": 172.01
}
},
{
"deliveryStart": "2025-10-01T05:45:00Z",
"deliveryEnd": "2025-10-01T06:00:00Z",
"entryPerArea": {
"NL": 163.35
}
},
{
"deliveryStart": "2025-10-01T06:00:00Z",
"deliveryEnd": "2025-10-01T06:15:00Z",
"entryPerArea": {
"NL": 198.33
}
},
{
"deliveryStart": "2025-10-01T06:15:00Z",
"deliveryEnd": "2025-10-01T06:30:00Z",
"entryPerArea": {
"NL": 142.86
}
},
{
"deliveryStart": "2025-10-01T06:30:00Z",
"deliveryEnd": "2025-10-01T06:45:00Z",
"entryPerArea": {
"NL": 117.23
}
},
{
"deliveryStart": "2025-10-01T06:45:00Z",
"deliveryEnd": "2025-10-01T07:00:00Z",
"entryPerArea": {
"NL": 95.25
}
},
{
"deliveryStart": "2025-10-01T07:00:00Z",
"deliveryEnd": "2025-10-01T07:15:00Z",
"entryPerArea": {
"NL": 139.01
}
},
{
"deliveryStart": "2025-10-01T07:15:00Z",
"deliveryEnd": "2025-10-01T07:30:00Z",
"entryPerArea": {
"NL": 105.01
}
},
{
"deliveryStart": "2025-10-01T07:30:00Z",
"deliveryEnd": "2025-10-01T07:45:00Z",
"entryPerArea": {
"NL": 93.48
}
},
{
"deliveryStart": "2025-10-01T07:45:00Z",
"deliveryEnd": "2025-10-01T08:00:00Z",
"entryPerArea": {
"NL": 79.96
}
},
{
"deliveryStart": "2025-10-01T08:00:00Z",
"deliveryEnd": "2025-10-01T08:15:00Z",
"entryPerArea": {
"NL": 102.82
}
},
{
"deliveryStart": "2025-10-01T08:15:00Z",
"deliveryEnd": "2025-10-01T08:30:00Z",
"entryPerArea": {
"NL": 89.23
}
},
{
"deliveryStart": "2025-10-01T08:30:00Z",
"deliveryEnd": "2025-10-01T08:45:00Z",
"entryPerArea": {
"NL": 78.16
}
},
{
"deliveryStart": "2025-10-01T08:45:00Z",
"deliveryEnd": "2025-10-01T09:00:00Z",
"entryPerArea": {
"NL": 63.7
}
},
{
"deliveryStart": "2025-10-01T09:00:00Z",
"deliveryEnd": "2025-10-01T09:15:00Z",
"entryPerArea": {
"NL": 79.97
}
},
{
"deliveryStart": "2025-10-01T09:15:00Z",
"deliveryEnd": "2025-10-01T09:30:00Z",
"entryPerArea": {
"NL": 68.06
}
},
{
"deliveryStart": "2025-10-01T09:30:00Z",
"deliveryEnd": "2025-10-01T09:45:00Z",
"entryPerArea": {
"NL": 61.13
}
},
{
"deliveryStart": "2025-10-01T09:45:00Z",
"deliveryEnd": "2025-10-01T10:00:00Z",
"entryPerArea": {
"NL": 56.19
}
},
{
"deliveryStart": "2025-10-01T10:00:00Z",
"deliveryEnd": "2025-10-01T10:15:00Z",
"entryPerArea": {
"NL": 61.69
}
},
{
"deliveryStart": "2025-10-01T10:15:00Z",
"deliveryEnd": "2025-10-01T10:30:00Z",
"entryPerArea": {
"NL": 57.42
}
},
{
"deliveryStart": "2025-10-01T10:30:00Z",
"deliveryEnd": "2025-10-01T10:45:00Z",
"entryPerArea": {
"NL": 57.86
}
},
{
"deliveryStart": "2025-10-01T10:45:00Z",
"deliveryEnd": "2025-10-01T11:00:00Z",
"entryPerArea": {
"NL": 57.42
}
},
{
"deliveryStart": "2025-10-01T11:00:00Z",
"deliveryEnd": "2025-10-01T11:15:00Z",
"entryPerArea": {
"NL": 57.09
}
},
{
"deliveryStart": "2025-10-01T11:15:00Z",
"deliveryEnd": "2025-10-01T11:30:00Z",
"entryPerArea": {
"NL": 58.78
}
},
{
"deliveryStart": "2025-10-01T11:30:00Z",
"deliveryEnd": "2025-10-01T11:45:00Z",
"entryPerArea": {
"NL": 60.07
}
},
{
"deliveryStart": "2025-10-01T11:45:00Z",
"deliveryEnd": "2025-10-01T12:00:00Z",
"entryPerArea": {
"NL": 61.14
}
},
{
"deliveryStart": "2025-10-01T12:00:00Z",
"deliveryEnd": "2025-10-01T12:15:00Z",
"entryPerArea": {
"NL": 54.35
}
},
{
"deliveryStart": "2025-10-01T12:15:00Z",
"deliveryEnd": "2025-10-01T12:30:00Z",
"entryPerArea": {
"NL": 60.62
}
},
{
"deliveryStart": "2025-10-01T12:30:00Z",
"deliveryEnd": "2025-10-01T12:45:00Z",
"entryPerArea": {
"NL": 64.4
}
},
{
"deliveryStart": "2025-10-01T12:45:00Z",
"deliveryEnd": "2025-10-01T13:00:00Z",
"entryPerArea": {
"NL": 71.9
}
},
{
"deliveryStart": "2025-10-01T13:00:00Z",
"deliveryEnd": "2025-10-01T13:15:00Z",
"entryPerArea": {
"NL": 57.55
}
},
{
"deliveryStart": "2025-10-01T13:15:00Z",
"deliveryEnd": "2025-10-01T13:30:00Z",
"entryPerArea": {
"NL": 66.28
}
},
{
"deliveryStart": "2025-10-01T13:30:00Z",
"deliveryEnd": "2025-10-01T13:45:00Z",
"entryPerArea": {
"NL": 77.91
}
},
{
"deliveryStart": "2025-10-01T13:45:00Z",
"deliveryEnd": "2025-10-01T14:00:00Z",
"entryPerArea": {
"NL": 88.62
}
},
{
"deliveryStart": "2025-10-01T14:00:00Z",
"deliveryEnd": "2025-10-01T14:15:00Z",
"entryPerArea": {
"NL": 55.07
}
},
{
"deliveryStart": "2025-10-01T14:15:00Z",
"deliveryEnd": "2025-10-01T14:30:00Z",
"entryPerArea": {
"NL": 80.77
}
},
{
"deliveryStart": "2025-10-01T14:30:00Z",
"deliveryEnd": "2025-10-01T14:45:00Z",
"entryPerArea": {
"NL": 95.16
}
},
{
"deliveryStart": "2025-10-01T14:45:00Z",
"deliveryEnd": "2025-10-01T15:00:00Z",
"entryPerArea": {
"NL": 109.0
}
},
{
"deliveryStart": "2025-10-01T15:00:00Z",
"deliveryEnd": "2025-10-01T15:15:00Z",
"entryPerArea": {
"NL": 76.45
}
},
{
"deliveryStart": "2025-10-01T15:15:00Z",
"deliveryEnd": "2025-10-01T15:30:00Z",
"entryPerArea": {
"NL": 106.42
}
},
{
"deliveryStart": "2025-10-01T15:30:00Z",
"deliveryEnd": "2025-10-01T15:45:00Z",
"entryPerArea": {
"NL": 139.35
}
},
{
"deliveryStart": "2025-10-01T15:45:00Z",
"deliveryEnd": "2025-10-01T16:00:00Z",
"entryPerArea": {
"NL": 190.18
}
},
{
"deliveryStart": "2025-10-01T16:00:00Z",
"deliveryEnd": "2025-10-01T16:15:00Z",
"entryPerArea": {
"NL": 141.68
}
},
{
"deliveryStart": "2025-10-01T16:15:00Z",
"deliveryEnd": "2025-10-01T16:30:00Z",
"entryPerArea": {
"NL": 192.84
}
},
{
"deliveryStart": "2025-10-01T16:30:00Z",
"deliveryEnd": "2025-10-01T16:45:00Z",
"entryPerArea": {
"NL": 285.0
}
},
{
"deliveryStart": "2025-10-01T16:45:00Z",
"deliveryEnd": "2025-10-01T17:00:00Z",
"entryPerArea": {
"NL": 381.0
}
},
{
"deliveryStart": "2025-10-01T17:00:00Z",
"deliveryEnd": "2025-10-01T17:15:00Z",
"entryPerArea": {
"NL": 408.5
}
},
{
"deliveryStart": "2025-10-01T17:15:00Z",
"deliveryEnd": "2025-10-01T17:30:00Z",
"entryPerArea": {
"NL": 376.39
}
},
{
"deliveryStart": "2025-10-01T17:30:00Z",
"deliveryEnd": "2025-10-01T17:45:00Z",
"entryPerArea": {
"NL": 321.94
}
},
{
"deliveryStart": "2025-10-01T17:45:00Z",
"deliveryEnd": "2025-10-01T18:00:00Z",
"entryPerArea": {
"NL": 253.14
}
},
{
"deliveryStart": "2025-10-01T18:00:00Z",
"deliveryEnd": "2025-10-01T18:15:00Z",
"entryPerArea": {
"NL": 217.5
}
},
{
"deliveryStart": "2025-10-01T18:15:00Z",
"deliveryEnd": "2025-10-01T18:30:00Z",
"entryPerArea": {
"NL": 154.56
}
},
{
"deliveryStart": "2025-10-01T18:30:00Z",
"deliveryEnd": "2025-10-01T18:45:00Z",
"entryPerArea": {
"NL": 123.11
}
},
{
"deliveryStart": "2025-10-01T18:45:00Z",
"deliveryEnd": "2025-10-01T19:00:00Z",
"entryPerArea": {
"NL": 104.83
}
},
{
"deliveryStart": "2025-10-01T19:00:00Z",
"deliveryEnd": "2025-10-01T19:15:00Z",
"entryPerArea": {
"NL": 125.76
}
},
{
"deliveryStart": "2025-10-01T19:15:00Z",
"deliveryEnd": "2025-10-01T19:30:00Z",
"entryPerArea": {
"NL": 115.82
}
},
{
"deliveryStart": "2025-10-01T19:30:00Z",
"deliveryEnd": "2025-10-01T19:45:00Z",
"entryPerArea": {
"NL": 97.54
}
},
{
"deliveryStart": "2025-10-01T19:45:00Z",
"deliveryEnd": "2025-10-01T20:00:00Z",
"entryPerArea": {
"NL": 87.96
}
},
{
"deliveryStart": "2025-10-01T20:00:00Z",
"deliveryEnd": "2025-10-01T20:15:00Z",
"entryPerArea": {
"NL": 106.69
}
},
{
"deliveryStart": "2025-10-01T20:15:00Z",
"deliveryEnd": "2025-10-01T20:30:00Z",
"entryPerArea": {
"NL": 98.76
}
},
{
"deliveryStart": "2025-10-01T20:30:00Z",
"deliveryEnd": "2025-10-01T20:45:00Z",
"entryPerArea": {
"NL": 95.32
}
},
{
"deliveryStart": "2025-10-01T20:45:00Z",
"deliveryEnd": "2025-10-01T21:00:00Z",
"entryPerArea": {
"NL": 88.02
}
},
{
"deliveryStart": "2025-10-01T21:00:00Z",
"deliveryEnd": "2025-10-01T21:15:00Z",
"entryPerArea": {
"NL": 93.53
}
},
{
"deliveryStart": "2025-10-01T21:15:00Z",
"deliveryEnd": "2025-10-01T21:30:00Z",
"entryPerArea": {
"NL": 88.75
}
},
{
"deliveryStart": "2025-10-01T21:30:00Z",
"deliveryEnd": "2025-10-01T21:45:00Z",
"entryPerArea": {
"NL": 90.62
}
},
{
"deliveryStart": "2025-10-01T21:45:00Z",
"deliveryEnd": "2025-10-01T22:00:00Z",
"entryPerArea": {
"NL": 82.6
} }
} }
], ],
"blockPriceAggregates": [ "blockPriceAggregates": [
{ {
"blockName": "Off-peak 1", "blockName": "Off-peak 1",
"deliveryStart": "2024-11-04T23:00:00Z", "deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2024-11-05T07:00:00Z", "deliveryEnd": "2025-10-01T06:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"NL": { "NL": {
"average": 98.96, "average": 97.54,
"min": 83.63, "min": 75.01,
"max": 135.99 "max": 172.01
} }
} }
}, },
{ {
"blockName": "Peak", "blockName": "Peak",
"deliveryStart": "2024-11-05T07:00:00Z", "deliveryStart": "2025-10-01T06:00:00Z",
"deliveryEnd": "2024-11-05T19:00:00Z", "deliveryEnd": "2025-10-01T18:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"NL": { "NL": {
"average": 202.93, "average": 120.76,
"min": 94.92, "min": 54.35,
"max": 472.99 "max": 408.5
} }
} }
}, },
{ {
"blockName": "Off-peak 2", "blockName": "Off-peak 2",
"deliveryStart": "2024-11-05T19:00:00Z", "deliveryStart": "2025-10-01T18:00:00Z",
"deliveryEnd": "2024-11-05T23:00:00Z", "deliveryEnd": "2025-10-01T22:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"NL": { "NL": {
"average": 131.85, "average": 110.71,
"min": 110.03, "min": 82.6,
"max": 169.7 "max": 217.5
} }
} }
} }
@@ -223,7 +727,7 @@
"areaAverages": [ "areaAverages": [
{ {
"areaCode": "NL", "areaCode": "NL",
"price": 156.43 "price": 111.34
} }
] ]
} }

View File

@@ -1,258 +1,834 @@
{ {
"deliveryDateCET": "2024-11-05", "deliveryDateCET": "2025-10-01",
"version": 3, "version": 3,
"updatedAt": "2024-11-04T12:15:03.9456464Z", "updatedAt": "2025-09-30T12:08:16.4448023Z",
"deliveryAreas": ["SE3", "SE4"], "deliveryAreas": ["SE3", "SE4"],
"market": "DayAhead", "market": "DayAhead",
"multiAreaEntries": [ "multiAreaEntries": [
{ {
"deliveryStart": "2024-11-04T23:00:00Z", "deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2024-11-05T00:00:00Z", "deliveryEnd": "2025-09-30T22:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 250.73, "SE3": 556.68,
"SE4": 283.79 "SE4": 642.22
} }
}, },
{ {
"deliveryStart": "2024-11-05T00:00:00Z", "deliveryStart": "2025-09-30T22:15:00Z",
"deliveryEnd": "2024-11-05T01:00:00Z", "deliveryEnd": "2025-09-30T22:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 76.36, "SE3": 519.88,
"SE4": 81.36 "SE4": 600.12
} }
}, },
{ {
"deliveryStart": "2024-11-05T01:00:00Z", "deliveryStart": "2025-09-30T22:30:00Z",
"deliveryEnd": "2024-11-05T02:00:00Z", "deliveryEnd": "2025-09-30T22:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 73.92, "SE3": 508.28,
"SE4": 79.15 "SE4": 586.3
} }
}, },
{ {
"deliveryStart": "2024-11-05T02:00:00Z", "deliveryStart": "2025-09-30T22:45:00Z",
"deliveryEnd": "2024-11-05T03:00:00Z", "deliveryEnd": "2025-09-30T23:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 61.69, "SE3": 509.93,
"SE4": 65.19 "SE4": 589.62
} }
}, },
{ {
"deliveryStart": "2024-11-05T03:00:00Z", "deliveryStart": "2025-09-30T23:00:00Z",
"deliveryEnd": "2024-11-05T04:00:00Z", "deliveryEnd": "2025-09-30T23:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 64.6, "SE3": 501.64,
"SE4": 68.44 "SE4": 577.24
} }
}, },
{ {
"deliveryStart": "2024-11-05T04:00:00Z", "deliveryStart": "2025-09-30T23:15:00Z",
"deliveryEnd": "2024-11-05T05:00:00Z", "deliveryEnd": "2025-09-30T23:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 453.27, "SE3": 509.05,
"SE4": 516.71 "SE4": 585.42
} }
}, },
{ {
"deliveryStart": "2024-11-05T05:00:00Z", "deliveryStart": "2025-09-30T23:30:00Z",
"deliveryEnd": "2024-11-05T06:00:00Z", "deliveryEnd": "2025-09-30T23:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 996.28, "SE3": 491.03,
"SE4": 1240.85 "SE4": 567.18
} }
}, },
{ {
"deliveryStart": "2024-11-05T06:00:00Z", "deliveryStart": "2025-09-30T23:45:00Z",
"deliveryEnd": "2024-11-05T07:00:00Z", "deliveryEnd": "2025-10-01T00:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1406.14, "SE3": 442.07,
"SE4": 1648.25 "SE4": 517.45
} }
}, },
{ {
"deliveryStart": "2024-11-05T07:00:00Z", "deliveryStart": "2025-10-01T00:00:00Z",
"deliveryEnd": "2024-11-05T08:00:00Z", "deliveryEnd": "2025-10-01T00:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1346.54, "SE3": 504.08,
"SE4": 1570.5 "SE4": 580.55
} }
}, },
{ {
"deliveryStart": "2024-11-05T08:00:00Z", "deliveryStart": "2025-10-01T00:15:00Z",
"deliveryEnd": "2024-11-05T09:00:00Z", "deliveryEnd": "2025-10-01T00:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1150.28, "SE3": 504.85,
"SE4": 1345.37 "SE4": 581.55
} }
}, },
{ {
"deliveryStart": "2024-11-05T09:00:00Z", "deliveryStart": "2025-10-01T00:30:00Z",
"deliveryEnd": "2024-11-05T10:00:00Z", "deliveryEnd": "2025-10-01T00:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1031.32, "SE3": 504.3,
"SE4": 1206.51 "SE4": 580.78
} }
}, },
{ {
"deliveryStart": "2024-11-05T10:00:00Z", "deliveryStart": "2025-10-01T00:45:00Z",
"deliveryEnd": "2024-11-05T11:00:00Z", "deliveryEnd": "2025-10-01T01:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 927.37, "SE3": 506.29,
"SE4": 1085.8 "SE4": 583.1
} }
}, },
{ {
"deliveryStart": "2024-11-05T11:00:00Z", "deliveryStart": "2025-10-01T01:00:00Z",
"deliveryEnd": "2024-11-05T12:00:00Z", "deliveryEnd": "2025-10-01T01:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 925.05, "SE3": 442.07,
"SE4": 1081.72 "SE4": 515.46
} }
}, },
{ {
"deliveryStart": "2024-11-05T12:00:00Z", "deliveryStart": "2025-10-01T01:15:00Z",
"deliveryEnd": "2024-11-05T13:00:00Z", "deliveryEnd": "2025-10-01T01:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 949.49, "SE3": 441.96,
"SE4": 1130.38 "SE4": 517.23
} }
}, },
{ {
"deliveryStart": "2024-11-05T13:00:00Z", "deliveryStart": "2025-10-01T01:30:00Z",
"deliveryEnd": "2024-11-05T14:00:00Z", "deliveryEnd": "2025-10-01T01:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1042.03, "SE3": 442.07,
"SE4": 1256.91 "SE4": 516.23
} }
}, },
{ {
"deliveryStart": "2024-11-05T14:00:00Z", "deliveryStart": "2025-10-01T01:45:00Z",
"deliveryEnd": "2024-11-05T15:00:00Z", "deliveryEnd": "2025-10-01T02:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1258.89, "SE3": 442.07,
"SE4": 1765.82 "SE4": 516.23
} }
}, },
{ {
"deliveryStart": "2024-11-05T15:00:00Z", "deliveryStart": "2025-10-01T02:00:00Z",
"deliveryEnd": "2024-11-05T16:00:00Z", "deliveryEnd": "2025-10-01T02:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1816.45, "SE3": 441.96,
"SE4": 2522.55 "SE4": 517.34
} }
}, },
{ {
"deliveryStart": "2024-11-05T16:00:00Z", "deliveryStart": "2025-10-01T02:15:00Z",
"deliveryEnd": "2024-11-05T17:00:00Z", "deliveryEnd": "2025-10-01T02:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 2512.65, "SE3": 483.3,
"SE4": 3533.03 "SE4": 559.11
} }
}, },
{ {
"deliveryStart": "2024-11-05T17:00:00Z", "deliveryStart": "2025-10-01T02:30:00Z",
"deliveryEnd": "2024-11-05T18:00:00Z", "deliveryEnd": "2025-10-01T02:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1819.83, "SE3": 484.29,
"SE4": 2524.06 "SE4": 559.0
} }
}, },
{ {
"deliveryStart": "2024-11-05T18:00:00Z", "deliveryStart": "2025-10-01T02:45:00Z",
"deliveryEnd": "2024-11-05T19:00:00Z", "deliveryEnd": "2025-10-01T03:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1011.77, "SE3": 574.7,
"SE4": 659.35
}
},
{
"deliveryStart": "2025-10-01T03:00:00Z",
"deliveryEnd": "2025-10-01T03:15:00Z",
"entryPerArea": {
"SE3": 543.31,
"SE4": 631.95
}
},
{
"deliveryStart": "2025-10-01T03:15:00Z",
"deliveryEnd": "2025-10-01T03:30:00Z",
"entryPerArea": {
"SE3": 578.01,
"SE4": 671.18
}
},
{
"deliveryStart": "2025-10-01T03:30:00Z",
"deliveryEnd": "2025-10-01T03:45:00Z",
"entryPerArea": {
"SE3": 774.96,
"SE4": 893.1
}
},
{
"deliveryStart": "2025-10-01T03:45:00Z",
"deliveryEnd": "2025-10-01T04:00:00Z",
"entryPerArea": {
"SE3": 787.0,
"SE4": 909.79
}
},
{
"deliveryStart": "2025-10-01T04:00:00Z",
"deliveryEnd": "2025-10-01T04:15:00Z",
"entryPerArea": {
"SE3": 902.38,
"SE4": 1041.86
}
},
{
"deliveryStart": "2025-10-01T04:15:00Z",
"deliveryEnd": "2025-10-01T04:30:00Z",
"entryPerArea": {
"SE3": 1079.32,
"SE4": 1254.17
}
},
{
"deliveryStart": "2025-10-01T04:30:00Z",
"deliveryEnd": "2025-10-01T04:45:00Z",
"entryPerArea": {
"SE3": 1222.67,
"SE4": 1421.93
}
},
{
"deliveryStart": "2025-10-01T04:45:00Z",
"deliveryEnd": "2025-10-01T05:00:00Z",
"entryPerArea": {
"SE3": 1394.63,
"SE4": 1623.08
}
},
{
"deliveryStart": "2025-10-01T05:00:00Z",
"deliveryEnd": "2025-10-01T05:15:00Z",
"entryPerArea": {
"SE3": 1529.36,
"SE4": 1787.86
}
},
{
"deliveryStart": "2025-10-01T05:15:00Z",
"deliveryEnd": "2025-10-01T05:30:00Z",
"entryPerArea": {
"SE3": 1724.53,
"SE4": 2015.75
}
},
{
"deliveryStart": "2025-10-01T05:30:00Z",
"deliveryEnd": "2025-10-01T05:45:00Z",
"entryPerArea": {
"SE3": 1809.96,
"SE4": 2029.34
}
},
{
"deliveryStart": "2025-10-01T05:45:00Z",
"deliveryEnd": "2025-10-01T06:00:00Z",
"entryPerArea": {
"SE3": 1713.04,
"SE4": 1920.15
}
},
{
"deliveryStart": "2025-10-01T06:00:00Z",
"deliveryEnd": "2025-10-01T06:15:00Z",
"entryPerArea": {
"SE3": 1925.9,
"SE4": 2162.63
}
},
{
"deliveryStart": "2025-10-01T06:15:00Z",
"deliveryEnd": "2025-10-01T06:30:00Z",
"entryPerArea": {
"SE3": 1440.06,
"SE4": 1614.01
}
},
{
"deliveryStart": "2025-10-01T06:30:00Z",
"deliveryEnd": "2025-10-01T06:45:00Z",
"entryPerArea": {
"SE3": 1183.32,
"SE4": 1319.37
}
},
{
"deliveryStart": "2025-10-01T06:45:00Z",
"deliveryEnd": "2025-10-01T07:00:00Z",
"entryPerArea": {
"SE3": 962.95,
"SE4": 1068.71
}
},
{
"deliveryStart": "2025-10-01T07:00:00Z",
"deliveryEnd": "2025-10-01T07:15:00Z",
"entryPerArea": {
"SE3": 1402.04,
"SE4": 1569.92
}
},
{
"deliveryStart": "2025-10-01T07:15:00Z",
"deliveryEnd": "2025-10-01T07:30:00Z",
"entryPerArea": {
"SE3": 1060.65,
"SE4": 1178.46
}
},
{
"deliveryStart": "2025-10-01T07:30:00Z",
"deliveryEnd": "2025-10-01T07:45:00Z",
"entryPerArea": {
"SE3": 949.13,
"SE4": 1050.59
}
},
{
"deliveryStart": "2025-10-01T07:45:00Z",
"deliveryEnd": "2025-10-01T08:00:00Z",
"entryPerArea": {
"SE3": 841.82,
"SE4": 938.3
}
},
{
"deliveryStart": "2025-10-01T08:00:00Z",
"deliveryEnd": "2025-10-01T08:15:00Z",
"entryPerArea": {
"SE3": 1037.44,
"SE4": 1141.44
}
},
{
"deliveryStart": "2025-10-01T08:15:00Z",
"deliveryEnd": "2025-10-01T08:30:00Z",
"entryPerArea": {
"SE3": 950.13,
"SE4": 1041.64
}
},
{
"deliveryStart": "2025-10-01T08:30:00Z",
"deliveryEnd": "2025-10-01T08:45:00Z",
"entryPerArea": {
"SE3": 826.13,
"SE4": 905.04
}
},
{
"deliveryStart": "2025-10-01T08:45:00Z",
"deliveryEnd": "2025-10-01T09:00:00Z",
"entryPerArea": {
"SE3": 684.55,
"SE4": 754.62
}
},
{
"deliveryStart": "2025-10-01T09:00:00Z",
"deliveryEnd": "2025-10-01T09:15:00Z",
"entryPerArea": {
"SE3": 861.6,
"SE4": 936.09
}
},
{
"deliveryStart": "2025-10-01T09:15:00Z",
"deliveryEnd": "2025-10-01T09:30:00Z",
"entryPerArea": {
"SE3": 722.79,
"SE4": 799.6
}
},
{
"deliveryStart": "2025-10-01T09:30:00Z",
"deliveryEnd": "2025-10-01T09:45:00Z",
"entryPerArea": {
"SE3": 640.57,
"SE4": 718.59
}
},
{
"deliveryStart": "2025-10-01T09:45:00Z",
"deliveryEnd": "2025-10-01T10:00:00Z",
"entryPerArea": {
"SE3": 607.74,
"SE4": 683.12
}
},
{
"deliveryStart": "2025-10-01T10:00:00Z",
"deliveryEnd": "2025-10-01T10:15:00Z",
"entryPerArea": {
"SE3": 674.05,
"SE4": 752.41
}
},
{
"deliveryStart": "2025-10-01T10:15:00Z",
"deliveryEnd": "2025-10-01T10:30:00Z",
"entryPerArea": {
"SE3": 638.58,
"SE4": 717.49
}
},
{
"deliveryStart": "2025-10-01T10:30:00Z",
"deliveryEnd": "2025-10-01T10:45:00Z",
"entryPerArea": {
"SE3": 638.47,
"SE4": 719.81
}
},
{
"deliveryStart": "2025-10-01T10:45:00Z",
"deliveryEnd": "2025-10-01T11:00:00Z",
"entryPerArea": {
"SE3": 634.82,
"SE4": 717.16
}
},
{
"deliveryStart": "2025-10-01T11:00:00Z",
"deliveryEnd": "2025-10-01T11:15:00Z",
"entryPerArea": {
"SE3": 637.36,
"SE4": 721.58
}
},
{
"deliveryStart": "2025-10-01T11:15:00Z",
"deliveryEnd": "2025-10-01T11:30:00Z",
"entryPerArea": {
"SE3": 660.68,
"SE4": 746.33
}
},
{
"deliveryStart": "2025-10-01T11:30:00Z",
"deliveryEnd": "2025-10-01T11:45:00Z",
"entryPerArea": {
"SE3": 679.14,
"SE4": 766.45
}
},
{
"deliveryStart": "2025-10-01T11:45:00Z",
"deliveryEnd": "2025-10-01T12:00:00Z",
"entryPerArea": {
"SE3": 694.61,
"SE4": 782.91
}
},
{
"deliveryStart": "2025-10-01T12:00:00Z",
"deliveryEnd": "2025-10-01T12:15:00Z",
"entryPerArea": {
"SE3": 622.33,
"SE4": 708.87
}
},
{
"deliveryStart": "2025-10-01T12:15:00Z",
"deliveryEnd": "2025-10-01T12:30:00Z",
"entryPerArea": {
"SE3": 685.44,
"SE4": 775.84
}
},
{
"deliveryStart": "2025-10-01T12:30:00Z",
"deliveryEnd": "2025-10-01T12:45:00Z",
"entryPerArea": {
"SE3": 732.85,
"SE4": 826.57
}
},
{
"deliveryStart": "2025-10-01T12:45:00Z",
"deliveryEnd": "2025-10-01T13:00:00Z",
"entryPerArea": {
"SE3": 801.92,
"SE4": 901.28
}
},
{
"deliveryStart": "2025-10-01T13:00:00Z",
"deliveryEnd": "2025-10-01T13:15:00Z",
"entryPerArea": {
"SE3": 629.4,
"SE4": 717.93
}
},
{
"deliveryStart": "2025-10-01T13:15:00Z",
"deliveryEnd": "2025-10-01T13:30:00Z",
"entryPerArea": {
"SE3": 729.53,
"SE4": 825.46
}
},
{
"deliveryStart": "2025-10-01T13:30:00Z",
"deliveryEnd": "2025-10-01T13:45:00Z",
"entryPerArea": {
"SE3": 884.81,
"SE4": 983.95
}
},
{
"deliveryStart": "2025-10-01T13:45:00Z",
"deliveryEnd": "2025-10-01T14:00:00Z",
"entryPerArea": {
"SE3": 984.94,
"SE4": 1089.71
}
},
{
"deliveryStart": "2025-10-01T14:00:00Z",
"deliveryEnd": "2025-10-01T14:15:00Z",
"entryPerArea": {
"SE3": 615.26,
"SE4": 703.12
}
},
{
"deliveryStart": "2025-10-01T14:15:00Z",
"deliveryEnd": "2025-10-01T14:30:00Z",
"entryPerArea": {
"SE3": 902.94,
"SE4": 1002.74
}
},
{
"deliveryStart": "2025-10-01T14:30:00Z",
"deliveryEnd": "2025-10-01T14:45:00Z",
"entryPerArea": {
"SE3": 1043.85,
"SE4": 1158.35
}
},
{
"deliveryStart": "2025-10-01T14:45:00Z",
"deliveryEnd": "2025-10-01T15:00:00Z",
"entryPerArea": {
"SE3": 1075.12,
"SE4": 1194.15
}
},
{
"deliveryStart": "2025-10-01T15:00:00Z",
"deliveryEnd": "2025-10-01T15:15:00Z",
"entryPerArea": {
"SE3": 980.52,
"SE4": 1089.38
}
},
{
"deliveryStart": "2025-10-01T15:15:00Z",
"deliveryEnd": "2025-10-01T15:30:00Z",
"entryPerArea": {
"SE3": 1162.66,
"SE4": 1300.14
}
},
{
"deliveryStart": "2025-10-01T15:30:00Z",
"deliveryEnd": "2025-10-01T15:45:00Z",
"entryPerArea": {
"SE3": 1453.87,
"SE4": 1628.6
}
},
{
"deliveryStart": "2025-10-01T15:45:00Z",
"deliveryEnd": "2025-10-01T16:00:00Z",
"entryPerArea": {
"SE3": 1955.96,
"SE4": 2193.35
}
},
{
"deliveryStart": "2025-10-01T16:00:00Z",
"deliveryEnd": "2025-10-01T16:15:00Z",
"entryPerArea": {
"SE3": 1423.48,
"SE4": 1623.74
}
},
{
"deliveryStart": "2025-10-01T16:15:00Z",
"deliveryEnd": "2025-10-01T16:30:00Z",
"entryPerArea": {
"SE3": 1900.04,
"SE4": 2199.98
}
},
{
"deliveryStart": "2025-10-01T16:30:00Z",
"deliveryEnd": "2025-10-01T16:45:00Z",
"entryPerArea": {
"SE3": 2611.11,
"SE4": 3031.08
}
},
{
"deliveryStart": "2025-10-01T16:45:00Z",
"deliveryEnd": "2025-10-01T17:00:00Z",
"entryPerArea": {
"SE3": 3467.41,
"SE4": 4029.51
}
},
{
"deliveryStart": "2025-10-01T17:00:00Z",
"deliveryEnd": "2025-10-01T17:15:00Z",
"entryPerArea": {
"SE3": 3828.03,
"SE4": 4442.74
}
},
{
"deliveryStart": "2025-10-01T17:15:00Z",
"deliveryEnd": "2025-10-01T17:30:00Z",
"entryPerArea": {
"SE3": 3429.83,
"SE4": 3982.21
}
},
{
"deliveryStart": "2025-10-01T17:30:00Z",
"deliveryEnd": "2025-10-01T17:45:00Z",
"entryPerArea": {
"SE3": 2934.38,
"SE4": 3405.74
}
},
{
"deliveryStart": "2025-10-01T17:45:00Z",
"deliveryEnd": "2025-10-01T18:00:00Z",
"entryPerArea": {
"SE3": 2308.07,
"SE4": 2677.64
}
},
{
"deliveryStart": "2025-10-01T18:00:00Z",
"deliveryEnd": "2025-10-01T18:15:00Z",
"entryPerArea": {
"SE3": 1997.96,
"SE4": 0.0 "SE4": 0.0
} }
}, },
{ {
"deliveryStart": "2024-11-05T19:00:00Z", "deliveryStart": "2025-10-01T18:15:00Z",
"deliveryEnd": "2024-11-05T20:00:00Z", "deliveryEnd": "2025-10-01T18:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 835.53, "SE3": 1424.03,
"SE4": 1112.57 "SE4": 1646.17
} }
}, },
{ {
"deliveryStart": "2024-11-05T20:00:00Z", "deliveryStart": "2025-10-01T18:30:00Z",
"deliveryEnd": "2024-11-05T21:00:00Z", "deliveryEnd": "2025-10-01T18:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 796.19, "SE3": 1216.81,
"SE4": 1051.69 "SE4": 1388.11
} }
}, },
{ {
"deliveryStart": "2024-11-05T21:00:00Z", "deliveryStart": "2025-10-01T18:45:00Z",
"deliveryEnd": "2024-11-05T22:00:00Z", "deliveryEnd": "2025-10-01T19:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 522.3, "SE3": 1070.15,
"SE4": 662.44 "SE4": 1204.65
} }
}, },
{ {
"deliveryStart": "2024-11-05T22:00:00Z", "deliveryStart": "2025-10-01T19:00:00Z",
"deliveryEnd": "2024-11-05T23:00:00Z", "deliveryEnd": "2025-10-01T19:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 289.14, "SE3": 1218.14,
"SE4": 349.21 "SE4": 1405.02
}
},
{
"deliveryStart": "2025-10-01T19:15:00Z",
"deliveryEnd": "2025-10-01T19:30:00Z",
"entryPerArea": {
"SE3": 1135.8,
"SE4": 1309.42
}
},
{
"deliveryStart": "2025-10-01T19:30:00Z",
"deliveryEnd": "2025-10-01T19:45:00Z",
"entryPerArea": {
"SE3": 959.96,
"SE4": 1115.69
}
},
{
"deliveryStart": "2025-10-01T19:45:00Z",
"deliveryEnd": "2025-10-01T20:00:00Z",
"entryPerArea": {
"SE3": 913.66,
"SE4": 1064.52
}
},
{
"deliveryStart": "2025-10-01T20:00:00Z",
"deliveryEnd": "2025-10-01T20:15:00Z",
"entryPerArea": {
"SE3": 1001.63,
"SE4": 1161.22
}
},
{
"deliveryStart": "2025-10-01T20:15:00Z",
"deliveryEnd": "2025-10-01T20:30:00Z",
"entryPerArea": {
"SE3": 933.0,
"SE4": 1083.08
}
},
{
"deliveryStart": "2025-10-01T20:30:00Z",
"deliveryEnd": "2025-10-01T20:45:00Z",
"entryPerArea": {
"SE3": 874.53,
"SE4": 1017.66
}
},
{
"deliveryStart": "2025-10-01T20:45:00Z",
"deliveryEnd": "2025-10-01T21:00:00Z",
"entryPerArea": {
"SE3": 821.71,
"SE4": 955.32
}
},
{
"deliveryStart": "2025-10-01T21:00:00Z",
"deliveryEnd": "2025-10-01T21:15:00Z",
"entryPerArea": {
"SE3": 860.5,
"SE4": 997.32
}
},
{
"deliveryStart": "2025-10-01T21:15:00Z",
"deliveryEnd": "2025-10-01T21:30:00Z",
"entryPerArea": {
"SE3": 840.16,
"SE4": 977.87
}
},
{
"deliveryStart": "2025-10-01T21:30:00Z",
"deliveryEnd": "2025-10-01T21:45:00Z",
"entryPerArea": {
"SE3": 820.05,
"SE4": 954.66
}
},
{
"deliveryStart": "2025-10-01T21:45:00Z",
"deliveryEnd": "2025-10-01T22:00:00Z",
"entryPerArea": {
"SE3": 785.68,
"SE4": 912.22
} }
} }
], ],
"blockPriceAggregates": [ "blockPriceAggregates": [
{ {
"blockName": "Off-peak 1", "blockName": "Off-peak 1",
"deliveryStart": "2024-11-04T23:00:00Z", "deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2024-11-05T07:00:00Z", "deliveryEnd": "2025-10-01T06:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"SE3": { "SE3": {
"average": 422.87, "average": 745.93,
"min": 61.69, "min": 441.96,
"max": 1406.14 "max": 1809.96
}, },
"SE4": { "SE4": {
"average": 497.97, "average": 860.99,
"min": 65.19, "min": 515.46,
"max": 1648.25 "max": 2029.34
} }
} }
}, },
{ {
"blockName": "Peak", "blockName": "Peak",
"deliveryStart": "2024-11-05T07:00:00Z", "deliveryStart": "2025-10-01T06:00:00Z",
"deliveryEnd": "2024-11-05T19:00:00Z", "deliveryEnd": "2025-10-01T18:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"SE3": { "SE3": {
"average": 1315.97, "average": 1219.13,
"min": 925.05, "min": 607.74,
"max": 2512.65 "max": 3828.03
}, },
"SE4": { "SE4": {
"average": 1735.59, "average": 1381.22,
"min": 1081.72, "min": 683.12,
"max": 3533.03 "max": 4442.74
} }
} }
}, },
{ {
"blockName": "Off-peak 2", "blockName": "Off-peak 2",
"deliveryStart": "2024-11-05T19:00:00Z", "deliveryStart": "2025-10-01T18:00:00Z",
"deliveryEnd": "2024-11-05T23:00:00Z", "deliveryEnd": "2025-10-01T22:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"SE3": { "SE3": {
"average": 610.79, "average": 1054.61,
"min": 289.14, "min": 785.68,
"max": 835.53 "max": 1997.96
}, },
"SE4": { "SE4": {
"average": 793.98, "average": 1219.07,
"min": 349.21, "min": 912.22,
"max": 1112.57 "max": 2312.16
} }
} }
} }
], ],
"currency": "SEK", "currency": "SEK",
"exchangeRate": 11.6402, "exchangeRate": 11.05186,
"areaStates": [ "areaStates": [
{ {
"state": "Final", "state": "Final",
@@ -262,11 +838,11 @@
"areaAverages": [ "areaAverages": [
{ {
"areaCode": "SE3", "areaCode": "SE3",
"price": 900.74 "price": 1033.98
}, },
{ {
"areaCode": "SE4", "areaCode": "SE4",
"price": 1166.12 "price": 1180.78
} }
] ]
} }

View File

@@ -1,258 +1,834 @@
{ {
"deliveryDateCET": "2024-11-06", "deliveryDateCET": "2025-10-02",
"version": 3, "version": 3,
"updatedAt": "2024-11-05T12:12:51.9853434Z", "updatedAt": "2025-10-01T11:25:06.1484362Z",
"deliveryAreas": ["SE3", "SE4"], "deliveryAreas": ["SE3", "SE4"],
"market": "DayAhead", "market": "DayAhead",
"multiAreaEntries": [ "multiAreaEntries": [
{ {
"deliveryStart": "2024-11-05T23:00:00Z", "deliveryStart": "2025-10-01T22:00:00Z",
"deliveryEnd": "2024-11-06T00:00:00Z", "deliveryEnd": "2025-10-01T22:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 126.66, "SE3": 933.22,
"SE4": 275.6 "SE4": 1062.32
} }
}, },
{ {
"deliveryStart": "2024-11-06T00:00:00Z", "deliveryStart": "2025-10-01T22:15:00Z",
"deliveryEnd": "2024-11-06T01:00:00Z", "deliveryEnd": "2025-10-01T22:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 74.06, "SE3": 854.22,
"SE4": 157.34 "SE4": 971.95
} }
}, },
{ {
"deliveryStart": "2024-11-06T01:00:00Z", "deliveryStart": "2025-10-01T22:30:00Z",
"deliveryEnd": "2024-11-06T02:00:00Z", "deliveryEnd": "2025-10-01T22:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 78.38, "SE3": 809.54,
"SE4": 165.62 "SE4": 919.1
} }
}, },
{ {
"deliveryStart": "2024-11-06T02:00:00Z", "deliveryStart": "2025-10-01T22:45:00Z",
"deliveryEnd": "2024-11-06T03:00:00Z", "deliveryEnd": "2025-10-01T23:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 92.37, "SE3": 811.74,
"SE4": 196.17 "SE4": 922.63
} }
}, },
{ {
"deliveryStart": "2024-11-06T03:00:00Z", "deliveryStart": "2025-10-01T23:00:00Z",
"deliveryEnd": "2024-11-06T04:00:00Z", "deliveryEnd": "2025-10-01T23:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 99.14, "SE3": 835.13,
"SE4": 190.58 "SE4": 950.99
} }
}, },
{ {
"deliveryStart": "2024-11-06T04:00:00Z", "deliveryStart": "2025-10-01T23:15:00Z",
"deliveryEnd": "2024-11-06T05:00:00Z", "deliveryEnd": "2025-10-01T23:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 447.51, "SE3": 828.85,
"SE4": 932.93 "SE4": 942.82
} }
}, },
{ {
"deliveryStart": "2024-11-06T05:00:00Z", "deliveryStart": "2025-10-01T23:30:00Z",
"deliveryEnd": "2024-11-06T06:00:00Z", "deliveryEnd": "2025-10-01T23:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 641.47, "SE3": 796.63,
"SE4": 1284.69 "SE4": 903.54
} }
}, },
{ {
"deliveryStart": "2024-11-06T06:00:00Z", "deliveryStart": "2025-10-01T23:45:00Z",
"deliveryEnd": "2024-11-06T07:00:00Z", "deliveryEnd": "2025-10-02T00:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1820.5, "SE3": 706.7,
"SE4": 2449.96 "SE4": 799.61
} }
}, },
{ {
"deliveryStart": "2024-11-06T07:00:00Z", "deliveryStart": "2025-10-02T00:00:00Z",
"deliveryEnd": "2024-11-06T08:00:00Z", "deliveryEnd": "2025-10-02T00:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1723.0, "SE3": 695.23,
"SE4": 2244.22 "SE4": 786.81
} }
}, },
{ {
"deliveryStart": "2024-11-06T08:00:00Z", "deliveryStart": "2025-10-02T00:15:00Z",
"deliveryEnd": "2024-11-06T09:00:00Z", "deliveryEnd": "2025-10-02T00:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1298.57, "SE3": 695.12,
"SE4": 1643.45 "SE4": 783.83
} }
}, },
{ {
"deliveryStart": "2024-11-06T09:00:00Z", "deliveryStart": "2025-10-02T00:30:00Z",
"deliveryEnd": "2024-11-06T10:00:00Z", "deliveryEnd": "2025-10-02T00:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1099.25, "SE3": 684.86,
"SE4": 1507.23 "SE4": 771.8
} }
}, },
{ {
"deliveryStart": "2024-11-06T10:00:00Z", "deliveryStart": "2025-10-02T00:45:00Z",
"deliveryEnd": "2024-11-06T11:00:00Z", "deliveryEnd": "2025-10-02T01:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 903.31, "SE3": 673.05,
"SE4": 1362.84 "SE4": 758.78
} }
}, },
{ {
"deliveryStart": "2024-11-06T11:00:00Z", "deliveryStart": "2025-10-02T01:00:00Z",
"deliveryEnd": "2024-11-06T12:00:00Z", "deliveryEnd": "2025-10-02T01:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 959.99, "SE3": 695.01,
"SE4": 1376.13 "SE4": 791.22
} }
}, },
{ {
"deliveryStart": "2024-11-06T12:00:00Z", "deliveryStart": "2025-10-02T01:15:00Z",
"deliveryEnd": "2024-11-06T13:00:00Z", "deliveryEnd": "2025-10-02T01:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1186.61, "SE3": 693.35,
"SE4": 1449.96 "SE4": 789.12
} }
}, },
{ {
"deliveryStart": "2024-11-06T13:00:00Z", "deliveryStart": "2025-10-02T01:30:00Z",
"deliveryEnd": "2024-11-06T14:00:00Z", "deliveryEnd": "2025-10-02T01:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1307.67, "SE3": 702.4,
"SE4": 1608.35 "SE4": 799.61
} }
}, },
{ {
"deliveryStart": "2024-11-06T14:00:00Z", "deliveryStart": "2025-10-02T01:45:00Z",
"deliveryEnd": "2024-11-06T15:00:00Z", "deliveryEnd": "2025-10-02T02:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1385.46, "SE3": 749.4,
"SE4": 2110.8 "SE4": 853.45
} }
}, },
{ {
"deliveryStart": "2024-11-06T15:00:00Z", "deliveryStart": "2025-10-02T02:00:00Z",
"deliveryEnd": "2024-11-06T16:00:00Z", "deliveryEnd": "2025-10-02T02:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1366.8, "SE3": 796.85,
"SE4": 3031.25 "SE4": 907.4
} }
}, },
{ {
"deliveryStart": "2024-11-06T16:00:00Z", "deliveryStart": "2025-10-02T02:15:00Z",
"deliveryEnd": "2024-11-06T17:00:00Z", "deliveryEnd": "2025-10-02T02:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 2366.57, "SE3": 811.19,
"SE4": 5511.77 "SE4": 924.07
} }
}, },
{ {
"deliveryStart": "2024-11-06T17:00:00Z", "deliveryStart": "2025-10-02T02:30:00Z",
"deliveryEnd": "2024-11-06T18:00:00Z", "deliveryEnd": "2025-10-02T02:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1481.92, "SE3": 803.8,
"SE4": 3351.64 "SE4": 916.23
} }
}, },
{ {
"deliveryStart": "2024-11-06T18:00:00Z", "deliveryStart": "2025-10-02T02:45:00Z",
"deliveryEnd": "2024-11-06T19:00:00Z", "deliveryEnd": "2025-10-02T03:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1082.69, "SE3": 839.11,
"SE4": 2484.95 "SE4": 953.3
} }
}, },
{ {
"deliveryStart": "2024-11-06T19:00:00Z", "deliveryStart": "2025-10-02T03:00:00Z",
"deliveryEnd": "2024-11-06T20:00:00Z", "deliveryEnd": "2025-10-02T03:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 716.82, "SE3": 825.2,
"SE4": 1624.33 "SE4": 943.15
} }
}, },
{ {
"deliveryStart": "2024-11-06T20:00:00Z", "deliveryStart": "2025-10-02T03:15:00Z",
"deliveryEnd": "2024-11-06T21:00:00Z", "deliveryEnd": "2025-10-02T03:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 583.16, "SE3": 838.78,
"SE4": 1306.27 "SE4": 958.93
} }
}, },
{ {
"deliveryStart": "2024-11-06T21:00:00Z", "deliveryStart": "2025-10-02T03:30:00Z",
"deliveryEnd": "2024-11-06T22:00:00Z", "deliveryEnd": "2025-10-02T03:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 523.09, "SE3": 906.19,
"SE4": 1142.99 "SE4": 1030.65
} }
}, },
{ {
"deliveryStart": "2024-11-06T22:00:00Z", "deliveryStart": "2025-10-02T03:45:00Z",
"deliveryEnd": "2024-11-06T23:00:00Z", "deliveryEnd": "2025-10-02T04:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 250.64, "SE3": 1057.79,
"SE4": 539.42 "SE4": 1195.82
}
},
{
"deliveryStart": "2025-10-02T04:00:00Z",
"deliveryEnd": "2025-10-02T04:15:00Z",
"entryPerArea": {
"SE3": 912.15,
"SE4": 1040.8
}
},
{
"deliveryStart": "2025-10-02T04:15:00Z",
"deliveryEnd": "2025-10-02T04:30:00Z",
"entryPerArea": {
"SE3": 1131.28,
"SE4": 1283.43
}
},
{
"deliveryStart": "2025-10-02T04:30:00Z",
"deliveryEnd": "2025-10-02T04:45:00Z",
"entryPerArea": {
"SE3": 1294.68,
"SE4": 1468.91
}
},
{
"deliveryStart": "2025-10-02T04:45:00Z",
"deliveryEnd": "2025-10-02T05:00:00Z",
"entryPerArea": {
"SE3": 1625.8,
"SE4": 1845.81
}
},
{
"deliveryStart": "2025-10-02T05:00:00Z",
"deliveryEnd": "2025-10-02T05:15:00Z",
"entryPerArea": {
"SE3": 1649.31,
"SE4": 1946.77
}
},
{
"deliveryStart": "2025-10-02T05:15:00Z",
"deliveryEnd": "2025-10-02T05:30:00Z",
"entryPerArea": {
"SE3": 1831.25,
"SE4": 2182.34
}
},
{
"deliveryStart": "2025-10-02T05:30:00Z",
"deliveryEnd": "2025-10-02T05:45:00Z",
"entryPerArea": {
"SE3": 1743.31,
"SE4": 2063.4
}
},
{
"deliveryStart": "2025-10-02T05:45:00Z",
"deliveryEnd": "2025-10-02T06:00:00Z",
"entryPerArea": {
"SE3": 1545.04,
"SE4": 1803.33
}
},
{
"deliveryStart": "2025-10-02T06:00:00Z",
"deliveryEnd": "2025-10-02T06:15:00Z",
"entryPerArea": {
"SE3": 1783.47,
"SE4": 2080.72
}
},
{
"deliveryStart": "2025-10-02T06:15:00Z",
"deliveryEnd": "2025-10-02T06:30:00Z",
"entryPerArea": {
"SE3": 1470.89,
"SE4": 1675.23
}
},
{
"deliveryStart": "2025-10-02T06:30:00Z",
"deliveryEnd": "2025-10-02T06:45:00Z",
"entryPerArea": {
"SE3": 1191.08,
"SE4": 1288.06
}
},
{
"deliveryStart": "2025-10-02T06:45:00Z",
"deliveryEnd": "2025-10-02T07:00:00Z",
"entryPerArea": {
"SE3": 1012.22,
"SE4": 1112.19
}
},
{
"deliveryStart": "2025-10-02T07:00:00Z",
"deliveryEnd": "2025-10-02T07:15:00Z",
"entryPerArea": {
"SE3": 1278.69,
"SE4": 1375.67
}
},
{
"deliveryStart": "2025-10-02T07:15:00Z",
"deliveryEnd": "2025-10-02T07:30:00Z",
"entryPerArea": {
"SE3": 1170.12,
"SE4": 1258.61
}
},
{
"deliveryStart": "2025-10-02T07:30:00Z",
"deliveryEnd": "2025-10-02T07:45:00Z",
"entryPerArea": {
"SE3": 937.09,
"SE4": 1021.93
}
},
{
"deliveryStart": "2025-10-02T07:45:00Z",
"deliveryEnd": "2025-10-02T08:00:00Z",
"entryPerArea": {
"SE3": 815.94,
"SE4": 900.67
}
},
{
"deliveryStart": "2025-10-02T08:00:00Z",
"deliveryEnd": "2025-10-02T08:15:00Z",
"entryPerArea": {
"SE3": 1044.66,
"SE4": 1135.25
}
},
{
"deliveryStart": "2025-10-02T08:15:00Z",
"deliveryEnd": "2025-10-02T08:30:00Z",
"entryPerArea": {
"SE3": 1020.61,
"SE4": 1112.74
}
},
{
"deliveryStart": "2025-10-02T08:30:00Z",
"deliveryEnd": "2025-10-02T08:45:00Z",
"entryPerArea": {
"SE3": 866.14,
"SE4": 953.53
}
},
{
"deliveryStart": "2025-10-02T08:45:00Z",
"deliveryEnd": "2025-10-02T09:00:00Z",
"entryPerArea": {
"SE3": 774.34,
"SE4": 860.18
}
},
{
"deliveryStart": "2025-10-02T09:00:00Z",
"deliveryEnd": "2025-10-02T09:15:00Z",
"entryPerArea": {
"SE3": 928.26,
"SE4": 1020.39
}
},
{
"deliveryStart": "2025-10-02T09:15:00Z",
"deliveryEnd": "2025-10-02T09:30:00Z",
"entryPerArea": {
"SE3": 834.47,
"SE4": 922.96
}
},
{
"deliveryStart": "2025-10-02T09:30:00Z",
"deliveryEnd": "2025-10-02T09:45:00Z",
"entryPerArea": {
"SE3": 712.33,
"SE4": 794.64
}
},
{
"deliveryStart": "2025-10-02T09:45:00Z",
"deliveryEnd": "2025-10-02T10:00:00Z",
"entryPerArea": {
"SE3": 646.46,
"SE4": 725.9
}
},
{
"deliveryStart": "2025-10-02T10:00:00Z",
"deliveryEnd": "2025-10-02T10:15:00Z",
"entryPerArea": {
"SE3": 692.91,
"SE4": 773.9
}
},
{
"deliveryStart": "2025-10-02T10:15:00Z",
"deliveryEnd": "2025-10-02T10:30:00Z",
"entryPerArea": {
"SE3": 627.59,
"SE4": 706.59
}
},
{
"deliveryStart": "2025-10-02T10:30:00Z",
"deliveryEnd": "2025-10-02T10:45:00Z",
"entryPerArea": {
"SE3": 630.02,
"SE4": 708.14
}
},
{
"deliveryStart": "2025-10-02T10:45:00Z",
"deliveryEnd": "2025-10-02T11:00:00Z",
"entryPerArea": {
"SE3": 625.94,
"SE4": 703.61
}
},
{
"deliveryStart": "2025-10-02T11:00:00Z",
"deliveryEnd": "2025-10-02T11:15:00Z",
"entryPerArea": {
"SE3": 563.38,
"SE4": 635.76
}
},
{
"deliveryStart": "2025-10-02T11:15:00Z",
"deliveryEnd": "2025-10-02T11:30:00Z",
"entryPerArea": {
"SE3": 588.42,
"SE4": 663.12
}
},
{
"deliveryStart": "2025-10-02T11:30:00Z",
"deliveryEnd": "2025-10-02T11:45:00Z",
"entryPerArea": {
"SE3": 597.03,
"SE4": 672.83
}
},
{
"deliveryStart": "2025-10-02T11:45:00Z",
"deliveryEnd": "2025-10-02T12:00:00Z",
"entryPerArea": {
"SE3": 608.61,
"SE4": 685.19
}
},
{
"deliveryStart": "2025-10-02T12:00:00Z",
"deliveryEnd": "2025-10-02T12:15:00Z",
"entryPerArea": {
"SE3": 599.24,
"SE4": 676.91
}
},
{
"deliveryStart": "2025-10-02T12:15:00Z",
"deliveryEnd": "2025-10-02T12:30:00Z",
"entryPerArea": {
"SE3": 649.77,
"SE4": 729.54
}
},
{
"deliveryStart": "2025-10-02T12:30:00Z",
"deliveryEnd": "2025-10-02T12:45:00Z",
"entryPerArea": {
"SE3": 728.22,
"SE4": 821.23
}
},
{
"deliveryStart": "2025-10-02T12:45:00Z",
"deliveryEnd": "2025-10-02T13:00:00Z",
"entryPerArea": {
"SE3": 803.91,
"SE4": 909.06
}
},
{
"deliveryStart": "2025-10-02T13:00:00Z",
"deliveryEnd": "2025-10-02T13:15:00Z",
"entryPerArea": {
"SE3": 594.38,
"SE4": 679.23
}
},
{
"deliveryStart": "2025-10-02T13:15:00Z",
"deliveryEnd": "2025-10-02T13:30:00Z",
"entryPerArea": {
"SE3": 738.48,
"SE4": 825.09
}
},
{
"deliveryStart": "2025-10-02T13:30:00Z",
"deliveryEnd": "2025-10-02T13:45:00Z",
"entryPerArea": {
"SE3": 873.53,
"SE4": 962.02
}
},
{
"deliveryStart": "2025-10-02T13:45:00Z",
"deliveryEnd": "2025-10-02T14:00:00Z",
"entryPerArea": {
"SE3": 994.57,
"SE4": 1083.5
}
},
{
"deliveryStart": "2025-10-02T14:00:00Z",
"deliveryEnd": "2025-10-02T14:15:00Z",
"entryPerArea": {
"SE3": 733.52,
"SE4": 813.18
}
},
{
"deliveryStart": "2025-10-02T14:15:00Z",
"deliveryEnd": "2025-10-02T14:30:00Z",
"entryPerArea": {
"SE3": 864.59,
"SE4": 944.04
}
},
{
"deliveryStart": "2025-10-02T14:30:00Z",
"deliveryEnd": "2025-10-02T14:45:00Z",
"entryPerArea": {
"SE3": 1032.08,
"SE4": 1113.18
}
},
{
"deliveryStart": "2025-10-02T14:45:00Z",
"deliveryEnd": "2025-10-02T15:00:00Z",
"entryPerArea": {
"SE3": 1153.01,
"SE4": 1241.61
}
},
{
"deliveryStart": "2025-10-02T15:00:00Z",
"deliveryEnd": "2025-10-02T15:15:00Z",
"entryPerArea": {
"SE3": 1271.18,
"SE4": 1017.41
}
},
{
"deliveryStart": "2025-10-02T15:15:00Z",
"deliveryEnd": "2025-10-02T15:30:00Z",
"entryPerArea": {
"SE3": 1375.23,
"SE4": 1093.1
}
},
{
"deliveryStart": "2025-10-02T15:30:00Z",
"deliveryEnd": "2025-10-02T15:45:00Z",
"entryPerArea": {
"SE3": 1544.82,
"SE4": 1244.81
}
},
{
"deliveryStart": "2025-10-02T15:45:00Z",
"deliveryEnd": "2025-10-02T16:00:00Z",
"entryPerArea": {
"SE3": 2412.17,
"SE4": 1960.12
}
},
{
"deliveryStart": "2025-10-02T16:00:00Z",
"deliveryEnd": "2025-10-02T16:15:00Z",
"entryPerArea": {
"SE3": 1677.66,
"SE4": 1334.3
}
},
{
"deliveryStart": "2025-10-02T16:15:00Z",
"deliveryEnd": "2025-10-02T16:30:00Z",
"entryPerArea": {
"SE3": 2010.55,
"SE4": 1606.61
}
},
{
"deliveryStart": "2025-10-02T16:30:00Z",
"deliveryEnd": "2025-10-02T16:45:00Z",
"entryPerArea": {
"SE3": 2524.38,
"SE4": 2013.53
}
},
{
"deliveryStart": "2025-10-02T16:45:00Z",
"deliveryEnd": "2025-10-02T17:00:00Z",
"entryPerArea": {
"SE3": 3288.35,
"SE4": 2617.73
}
},
{
"deliveryStart": "2025-10-02T17:00:00Z",
"deliveryEnd": "2025-10-02T17:15:00Z",
"entryPerArea": {
"SE3": 3065.69,
"SE4": 2472.19
}
},
{
"deliveryStart": "2025-10-02T17:15:00Z",
"deliveryEnd": "2025-10-02T17:30:00Z",
"entryPerArea": {
"SE3": 2824.72,
"SE4": 2276.46
}
},
{
"deliveryStart": "2025-10-02T17:30:00Z",
"deliveryEnd": "2025-10-02T17:45:00Z",
"entryPerArea": {
"SE3": 2279.66,
"SE4": 1835.44
}
},
{
"deliveryStart": "2025-10-02T17:45:00Z",
"deliveryEnd": "2025-10-02T18:00:00Z",
"entryPerArea": {
"SE3": 1723.78,
"SE4": 1385.38
}
},
{
"deliveryStart": "2025-10-02T18:00:00Z",
"deliveryEnd": "2025-10-02T18:15:00Z",
"entryPerArea": {
"SE3": 1935.08,
"SE4": 1532.57
}
},
{
"deliveryStart": "2025-10-02T18:15:00Z",
"deliveryEnd": "2025-10-02T18:30:00Z",
"entryPerArea": {
"SE3": 1568.54,
"SE4": 1240.18
}
},
{
"deliveryStart": "2025-10-02T18:30:00Z",
"deliveryEnd": "2025-10-02T18:45:00Z",
"entryPerArea": {
"SE3": 1430.51,
"SE4": 1115.61
}
},
{
"deliveryStart": "2025-10-02T18:45:00Z",
"deliveryEnd": "2025-10-02T19:00:00Z",
"entryPerArea": {
"SE3": 1377.66,
"SE4": 1075.12
}
},
{
"deliveryStart": "2025-10-02T19:00:00Z",
"deliveryEnd": "2025-10-02T19:15:00Z",
"entryPerArea": {
"SE3": 1408.44,
"SE4": 1108.66
}
},
{
"deliveryStart": "2025-10-02T19:15:00Z",
"deliveryEnd": "2025-10-02T19:30:00Z",
"entryPerArea": {
"SE3": 1326.79,
"SE4": 1049.74
}
},
{
"deliveryStart": "2025-10-02T19:30:00Z",
"deliveryEnd": "2025-10-02T19:45:00Z",
"entryPerArea": {
"SE3": 1210.94,
"SE4": 951.1
}
},
{
"deliveryStart": "2025-10-02T19:45:00Z",
"deliveryEnd": "2025-10-02T20:00:00Z",
"entryPerArea": {
"SE3": 1293.58,
"SE4": 1026.79
}
},
{
"deliveryStart": "2025-10-02T20:00:00Z",
"deliveryEnd": "2025-10-02T20:15:00Z",
"entryPerArea": {
"SE3": 1385.71,
"SE4": 1091.0
}
},
{
"deliveryStart": "2025-10-02T20:15:00Z",
"deliveryEnd": "2025-10-02T20:30:00Z",
"entryPerArea": {
"SE3": 1341.47,
"SE4": 1104.13
}
},
{
"deliveryStart": "2025-10-02T20:30:00Z",
"deliveryEnd": "2025-10-02T20:45:00Z",
"entryPerArea": {
"SE3": 1284.98,
"SE4": 1024.36
}
},
{
"deliveryStart": "2025-10-02T20:45:00Z",
"deliveryEnd": "2025-10-02T21:00:00Z",
"entryPerArea": {
"SE3": 1071.47,
"SE4": 892.51
}
},
{
"deliveryStart": "2025-10-02T21:00:00Z",
"deliveryEnd": "2025-10-02T21:15:00Z",
"entryPerArea": {
"SE3": 1218.0,
"SE4": 1123.99
}
},
{
"deliveryStart": "2025-10-02T21:15:00Z",
"deliveryEnd": "2025-10-02T21:30:00Z",
"entryPerArea": {
"SE3": 1112.3,
"SE4": 1001.63
}
},
{
"deliveryStart": "2025-10-02T21:30:00Z",
"deliveryEnd": "2025-10-02T21:45:00Z",
"entryPerArea": {
"SE3": 873.64,
"SE4": 806.67
}
},
{
"deliveryStart": "2025-10-02T21:45:00Z",
"deliveryEnd": "2025-10-02T22:00:00Z",
"entryPerArea": {
"SE3": 646.9,
"SE4": 591.84
} }
} }
], ],
"blockPriceAggregates": [ "blockPriceAggregates": [
{ {
"blockName": "Off-peak 1", "blockName": "Off-peak 1",
"deliveryStart": "2024-11-05T23:00:00Z", "deliveryStart": "2025-10-01T22:00:00Z",
"deliveryEnd": "2024-11-06T07:00:00Z", "deliveryEnd": "2025-10-02T06:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"SE3": { "SE3": {
"average": 422.51, "average": 961.76,
"min": 74.06, "min": 673.05,
"max": 1820.5 "max": 1831.25
}, },
"SE4": { "SE4": {
"average": 706.61, "average": 1102.25,
"min": 157.34, "min": 758.78,
"max": 2449.96 "max": 2182.34
} }
} }
}, },
{ {
"blockName": "Peak", "blockName": "Peak",
"deliveryStart": "2024-11-06T07:00:00Z", "deliveryStart": "2025-10-02T06:00:00Z",
"deliveryEnd": "2024-11-06T19:00:00Z", "deliveryEnd": "2025-10-02T18:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"SE3": { "SE3": {
"average": 1346.82, "average": 1191.34,
"min": 903.31, "min": 563.38,
"max": 2366.57 "max": 3288.35
}, },
"SE4": { "SE4": {
"average": 2306.88, "average": 1155.07,
"min": 1362.84, "min": 635.76,
"max": 5511.77 "max": 2617.73
} }
} }
}, },
{ {
"blockName": "Off-peak 2", "blockName": "Off-peak 2",
"deliveryStart": "2024-11-06T19:00:00Z", "deliveryStart": "2025-10-02T18:00:00Z",
"deliveryEnd": "2024-11-06T23:00:00Z", "deliveryEnd": "2025-10-02T22:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"SE3": { "SE3": {
"average": 518.43, "average": 1280.38,
"min": 250.64, "min": 646.9,
"max": 716.82 "max": 1935.08
}, },
"SE4": { "SE4": {
"average": 1153.25, "average": 1045.99,
"min": 539.42, "min": 591.84,
"max": 1624.33 "max": 1532.57
} }
} }
} }
], ],
"currency": "SEK", "currency": "SEK",
"exchangeRate": 11.66314, "exchangeRate": 11.03362,
"areaStates": [ "areaStates": [
{ {
"state": "Final", "state": "Final",
@@ -262,11 +838,11 @@
"areaAverages": [ "areaAverages": [
{ {
"areaCode": "SE3", "areaCode": "SE3",
"price": 900.65 "price": 1129.65
}, },
{ {
"areaCode": "SE4", "areaCode": "SE4",
"price": 1581.19 "price": 1119.28
} }
] ]
} }

View File

@@ -1,258 +1,258 @@
{ {
"deliveryDateCET": "2024-11-04", "deliveryDateCET": "2025-09-30",
"version": 3, "version": 3,
"updatedAt": "2024-11-04T08:09:11.1931991Z", "updatedAt": "2025-09-29T11:17:12.3019385Z",
"deliveryAreas": ["SE3", "SE4"], "deliveryAreas": ["SE3", "SE4"],
"market": "DayAhead", "market": "DayAhead",
"multiAreaEntries": [ "multiAreaEntries": [
{ {
"deliveryStart": "2024-11-03T23:00:00Z", "deliveryStart": "2025-09-29T22:00:00Z",
"deliveryEnd": "2024-11-04T00:00:00Z", "deliveryEnd": "2025-09-29T23:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 66.13, "SE3": 278.63,
"SE4": 78.59 "SE4": 354.65
} }
}, },
{ {
"deliveryStart": "2024-11-04T00:00:00Z", "deliveryStart": "2025-09-29T23:00:00Z",
"deliveryEnd": "2024-11-04T01:00:00Z", "deliveryEnd": "2025-09-30T00:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 72.54, "SE3": 261.85,
"SE4": 86.51 "SE4": 336.89
} }
}, },
{ {
"deliveryStart": "2024-11-04T01:00:00Z", "deliveryStart": "2025-09-30T00:00:00Z",
"deliveryEnd": "2024-11-04T02:00:00Z", "deliveryEnd": "2025-09-30T01:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 73.12, "SE3": 242.43,
"SE4": 84.88 "SE4": 313.16
} }
}, },
{ {
"deliveryStart": "2024-11-04T02:00:00Z", "deliveryStart": "2025-09-30T01:00:00Z",
"deliveryEnd": "2024-11-04T03:00:00Z", "deliveryEnd": "2025-09-30T02:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 171.97, "SE3": 322.65,
"SE4": 217.26 "SE4": 401.0
} }
}, },
{ {
"deliveryStart": "2024-11-04T03:00:00Z", "deliveryStart": "2025-09-30T02:00:00Z",
"deliveryEnd": "2024-11-04T04:00:00Z", "deliveryEnd": "2025-09-30T03:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 181.05, "SE3": 243.2,
"SE4": 227.74 "SE4": 311.51
} }
}, },
{ {
"deliveryStart": "2024-11-04T04:00:00Z", "deliveryStart": "2025-09-30T03:00:00Z",
"deliveryEnd": "2024-11-04T05:00:00Z", "deliveryEnd": "2025-09-30T04:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 360.71, "SE3": 596.53,
"SE4": 414.61 "SE4": 695.52
} }
}, },
{ {
"deliveryStart": "2024-11-04T05:00:00Z", "deliveryStart": "2025-09-30T04:00:00Z",
"deliveryEnd": "2024-11-04T06:00:00Z", "deliveryEnd": "2025-09-30T05:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 917.83, "SE3": 899.77,
"SE4": 1439.33 "SE4": 1047.52
} }
}, },
{ {
"deliveryStart": "2024-11-04T06:00:00Z", "deliveryStart": "2025-09-30T05:00:00Z",
"deliveryEnd": "2024-11-04T07:00:00Z", "deliveryEnd": "2025-09-30T06:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1426.17, "SE3": 1909.0,
"SE4": 1695.95 "SE4": 2247.98
} }
}, },
{ {
"deliveryStart": "2024-11-04T07:00:00Z", "deliveryStart": "2025-09-30T06:00:00Z",
"deliveryEnd": "2024-11-04T08:00:00Z", "deliveryEnd": "2025-09-30T07:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1350.96, "SE3": 1432.52,
"SE4": 1605.13 "SE4": 1681.24
} }
}, },
{ {
"deliveryStart": "2024-11-04T08:00:00Z", "deliveryStart": "2025-09-30T07:00:00Z",
"deliveryEnd": "2024-11-04T09:00:00Z", "deliveryEnd": "2025-09-30T08:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1195.06, "SE3": 1127.52,
"SE4": 1393.46 "SE4": 1304.96
} }
}, },
{ {
"deliveryStart": "2024-11-04T09:00:00Z", "deliveryStart": "2025-09-30T08:00:00Z",
"deliveryEnd": "2024-11-04T10:00:00Z", "deliveryEnd": "2025-09-30T09:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 992.35, "SE3": 966.75,
"SE4": 1126.71 "SE4": 1073.34
} }
}, },
{ {
"deliveryStart": "2024-11-04T10:00:00Z", "deliveryStart": "2025-09-30T09:00:00Z",
"deliveryEnd": "2024-11-04T11:00:00Z", "deliveryEnd": "2025-09-30T10:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 976.63, "SE3": 882.55,
"SE4": 1107.97 "SE4": 1003.93
} }
}, },
{ {
"deliveryStart": "2024-11-04T11:00:00Z", "deliveryStart": "2025-09-30T10:00:00Z",
"deliveryEnd": "2024-11-04T12:00:00Z", "deliveryEnd": "2025-09-30T11:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 952.76, "SE3": 841.72,
"SE4": 1085.73 "SE4": 947.44
} }
}, },
{ {
"deliveryStart": "2024-11-04T12:00:00Z", "deliveryStart": "2025-09-30T11:00:00Z",
"deliveryEnd": "2024-11-04T13:00:00Z", "deliveryEnd": "2025-09-30T12:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1029.37, "SE3": 821.53,
"SE4": 1177.71 "SE4": 927.24
} }
}, },
{ {
"deliveryStart": "2024-11-04T13:00:00Z", "deliveryStart": "2025-09-30T12:00:00Z",
"deliveryEnd": "2024-11-04T14:00:00Z", "deliveryEnd": "2025-09-30T13:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1043.35, "SE3": 864.35,
"SE4": 1194.59 "SE4": 970.5
} }
}, },
{ {
"deliveryStart": "2024-11-04T14:00:00Z", "deliveryStart": "2025-09-30T13:00:00Z",
"deliveryEnd": "2024-11-04T15:00:00Z", "deliveryEnd": "2025-09-30T14:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1359.57, "SE3": 931.88,
"SE4": 1561.12 "SE4": 1046.64
} }
}, },
{ {
"deliveryStart": "2024-11-04T15:00:00Z", "deliveryStart": "2025-09-30T14:00:00Z",
"deliveryEnd": "2024-11-04T16:00:00Z", "deliveryEnd": "2025-09-30T15:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1848.35, "SE3": 1039.13,
"SE4": 2145.84 "SE4": 1165.04
} }
}, },
{ {
"deliveryStart": "2024-11-04T16:00:00Z", "deliveryStart": "2025-09-30T15:00:00Z",
"deliveryEnd": "2024-11-04T17:00:00Z", "deliveryEnd": "2025-09-30T16:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 2812.53, "SE3": 1296.57,
"SE4": 3313.53 "SE4": 1520.91
} }
}, },
{ {
"deliveryStart": "2024-11-04T17:00:00Z", "deliveryStart": "2025-09-30T16:00:00Z",
"deliveryEnd": "2024-11-04T18:00:00Z", "deliveryEnd": "2025-09-30T17:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 2351.69, "SE3": 2652.18,
"SE4": 2751.87 "SE4": 3083.2
} }
}, },
{ {
"deliveryStart": "2024-11-04T18:00:00Z", "deliveryStart": "2025-09-30T17:00:00Z",
"deliveryEnd": "2024-11-04T19:00:00Z", "deliveryEnd": "2025-09-30T18:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1553.08, "SE3": 2135.98,
"SE4": 1842.77 "SE4": 2552.32
} }
}, },
{ {
"deliveryStart": "2024-11-04T19:00:00Z", "deliveryStart": "2025-09-30T18:00:00Z",
"deliveryEnd": "2024-11-04T20:00:00Z", "deliveryEnd": "2025-09-30T19:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1165.02, "SE3": 1109.76,
"SE4": 1398.35 "SE4": 1305.73
} }
}, },
{ {
"deliveryStart": "2024-11-04T20:00:00Z", "deliveryStart": "2025-09-30T19:00:00Z",
"deliveryEnd": "2024-11-04T21:00:00Z", "deliveryEnd": "2025-09-30T20:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 1007.48, "SE3": 973.81,
"SE4": 1172.35 "SE4": 1130.83
} }
}, },
{ {
"deliveryStart": "2024-11-04T21:00:00Z", "deliveryStart": "2025-09-30T20:00:00Z",
"deliveryEnd": "2024-11-04T22:00:00Z", "deliveryEnd": "2025-09-30T21:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 792.09, "SE3": 872.18,
"SE4": 920.28 "SE4": 1019.05
} }
}, },
{ {
"deliveryStart": "2024-11-04T22:00:00Z", "deliveryStart": "2025-09-30T21:00:00Z",
"deliveryEnd": "2024-11-04T23:00:00Z", "deliveryEnd": "2025-09-30T22:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 465.38, "SE3": 697.17,
"SE4": 528.83 "SE4": 812.37
} }
} }
], ],
"blockPriceAggregates": [ "blockPriceAggregates": [
{ {
"blockName": "Off-peak 1", "blockName": "Off-peak 1",
"deliveryStart": "2024-11-03T23:00:00Z", "deliveryStart": "2025-09-29T22:00:00Z",
"deliveryEnd": "2024-11-04T07:00:00Z", "deliveryEnd": "2025-09-30T06:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"SE3": { "SE3": {
"average": 408.69, "average": 594.26,
"min": 66.13, "min": 242.43,
"max": 1426.17 "max": 1909.0
}, },
"SE4": { "SE4": {
"average": 530.61, "average": 713.53,
"min": 78.59, "min": 311.51,
"max": 1695.95 "max": 2247.98
} }
} }
}, },
{ {
"blockName": "Peak", "blockName": "Peak",
"deliveryStart": "2024-11-04T07:00:00Z", "deliveryStart": "2025-09-30T06:00:00Z",
"deliveryEnd": "2024-11-04T19:00:00Z", "deliveryEnd": "2025-09-30T18:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"SE3": { "SE3": {
"average": 1455.48, "average": 1249.39,
"min": 952.76, "min": 821.53,
"max": 2812.53 "max": 2652.18
}, },
"SE4": { "SE4": {
"average": 1692.2, "average": 1439.73,
"min": 1085.73, "min": 927.24,
"max": 3313.53 "max": 3083.2
} }
} }
}, },
{ {
"blockName": "Off-peak 2", "blockName": "Off-peak 2",
"deliveryStart": "2024-11-04T19:00:00Z", "deliveryStart": "2025-09-30T18:00:00Z",
"deliveryEnd": "2024-11-04T23:00:00Z", "deliveryEnd": "2025-09-30T22:00:00Z",
"averagePricePerArea": { "averagePricePerArea": {
"SE3": { "SE3": {
"average": 857.49, "average": 913.23,
"min": 465.38, "min": 697.17,
"max": 1165.02 "max": 1109.76
}, },
"SE4": { "SE4": {
"average": 1004.95, "average": 1067.0,
"min": 528.83, "min": 812.37,
"max": 1398.35 "max": 1305.73
} }
} }
} }
], ],
"currency": "SEK", "currency": "SEK",
"exchangeRate": 11.64318, "exchangeRate": 11.03467,
"areaStates": [ "areaStates": [
{ {
"state": "Final", "state": "Final",
@@ -262,11 +262,11 @@
"areaAverages": [ "areaAverages": [
{ {
"areaCode": "SE3", "areaCode": "SE3",
"price": 1006.88 "price": 974.99
}, },
{ {
"areaCode": "SE4", "areaCode": "SE4",
"price": 1190.46 "price": 1135.54
} }
] ]
} }

View File

@@ -1,688 +1,688 @@
{ {
"deliveryDateCET": "2025-07-06", "deliveryDateCET": "2025-10-01",
"version": 2, "version": 3,
"updatedAt": "2025-07-05T10:56:42.3755929Z", "updatedAt": "2025-09-30T12:08:18.4894194Z",
"market": "DayAhead", "market": "DayAhead",
"indexNames": ["SE3"], "indexNames": ["SE3"],
"currency": "SEK", "currency": "SEK",
"resolutionInMinutes": 15, "resolutionInMinutes": 15,
"areaStates": [ "areaStates": [
{ {
"state": "Preliminary", "state": "Final",
"areas": ["SE3"] "areas": ["SE3"]
} }
], ],
"multiIndexEntries": [ "multiIndexEntries": [
{ {
"deliveryStart": "2025-07-05T22:00:00Z", "deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2025-07-05T22:15:00Z", "deliveryEnd": "2025-09-30T22:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 43.57 "SE3": 556.68
} }
}, },
{ {
"deliveryStart": "2025-07-05T22:15:00Z", "deliveryStart": "2025-09-30T22:15:00Z",
"deliveryEnd": "2025-07-05T22:30:00Z", "deliveryEnd": "2025-09-30T22:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 43.57 "SE3": 519.88
} }
}, },
{ {
"deliveryStart": "2025-07-05T22:30:00Z", "deliveryStart": "2025-09-30T22:30:00Z",
"deliveryEnd": "2025-07-05T22:45:00Z", "deliveryEnd": "2025-09-30T22:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 43.57 "SE3": 508.28
} }
}, },
{ {
"deliveryStart": "2025-07-05T22:45:00Z", "deliveryStart": "2025-09-30T22:45:00Z",
"deliveryEnd": "2025-07-05T23:00:00Z", "deliveryEnd": "2025-09-30T23:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 43.57 "SE3": 509.93
} }
}, },
{ {
"deliveryStart": "2025-07-05T23:00:00Z", "deliveryStart": "2025-09-30T23:00:00Z",
"deliveryEnd": "2025-07-05T23:15:00Z", "deliveryEnd": "2025-09-30T23:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 36.47 "SE3": 501.64
} }
}, },
{ {
"deliveryStart": "2025-07-05T23:15:00Z", "deliveryStart": "2025-09-30T23:15:00Z",
"deliveryEnd": "2025-07-05T23:30:00Z", "deliveryEnd": "2025-09-30T23:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 36.47 "SE3": 509.05
} }
}, },
{ {
"deliveryStart": "2025-07-05T23:30:00Z", "deliveryStart": "2025-09-30T23:30:00Z",
"deliveryEnd": "2025-07-05T23:45:00Z", "deliveryEnd": "2025-09-30T23:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 36.47 "SE3": 491.03
} }
}, },
{ {
"deliveryStart": "2025-07-05T23:45:00Z", "deliveryStart": "2025-09-30T23:45:00Z",
"deliveryEnd": "2025-07-06T00:00:00Z", "deliveryEnd": "2025-10-01T00:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 36.47 "SE3": 442.07
} }
}, },
{ {
"deliveryStart": "2025-07-06T00:00:00Z", "deliveryStart": "2025-10-01T00:00:00Z",
"deliveryEnd": "2025-07-06T00:15:00Z", "deliveryEnd": "2025-10-01T00:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 35.57 "SE3": 504.08
} }
}, },
{ {
"deliveryStart": "2025-07-06T00:15:00Z", "deliveryStart": "2025-10-01T00:15:00Z",
"deliveryEnd": "2025-07-06T00:30:00Z", "deliveryEnd": "2025-10-01T00:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 35.57 "SE3": 504.85
} }
}, },
{ {
"deliveryStart": "2025-07-06T00:30:00Z", "deliveryStart": "2025-10-01T00:30:00Z",
"deliveryEnd": "2025-07-06T00:45:00Z", "deliveryEnd": "2025-10-01T00:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 35.57 "SE3": 504.3
} }
}, },
{ {
"deliveryStart": "2025-07-06T00:45:00Z", "deliveryStart": "2025-10-01T00:45:00Z",
"deliveryEnd": "2025-07-06T01:00:00Z", "deliveryEnd": "2025-10-01T01:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 35.57 "SE3": 506.29
} }
}, },
{ {
"deliveryStart": "2025-07-06T01:00:00Z", "deliveryStart": "2025-10-01T01:00:00Z",
"deliveryEnd": "2025-07-06T01:15:00Z", "deliveryEnd": "2025-10-01T01:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 30.73 "SE3": 442.07
} }
}, },
{ {
"deliveryStart": "2025-07-06T01:15:00Z", "deliveryStart": "2025-10-01T01:15:00Z",
"deliveryEnd": "2025-07-06T01:30:00Z", "deliveryEnd": "2025-10-01T01:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 30.73 "SE3": 441.96
} }
}, },
{ {
"deliveryStart": "2025-07-06T01:30:00Z", "deliveryStart": "2025-10-01T01:30:00Z",
"deliveryEnd": "2025-07-06T01:45:00Z", "deliveryEnd": "2025-10-01T01:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 30.73 "SE3": 442.07
} }
}, },
{ {
"deliveryStart": "2025-07-06T01:45:00Z", "deliveryStart": "2025-10-01T01:45:00Z",
"deliveryEnd": "2025-07-06T02:00:00Z", "deliveryEnd": "2025-10-01T02:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 30.73 "SE3": 442.07
} }
}, },
{ {
"deliveryStart": "2025-07-06T02:00:00Z", "deliveryStart": "2025-10-01T02:00:00Z",
"deliveryEnd": "2025-07-06T02:15:00Z", "deliveryEnd": "2025-10-01T02:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 32.42 "SE3": 441.96
} }
}, },
{ {
"deliveryStart": "2025-07-06T02:15:00Z", "deliveryStart": "2025-10-01T02:15:00Z",
"deliveryEnd": "2025-07-06T02:30:00Z", "deliveryEnd": "2025-10-01T02:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 32.42 "SE3": 483.3
} }
}, },
{ {
"deliveryStart": "2025-07-06T02:30:00Z", "deliveryStart": "2025-10-01T02:30:00Z",
"deliveryEnd": "2025-07-06T02:45:00Z", "deliveryEnd": "2025-10-01T02:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 32.42 "SE3": 484.29
} }
}, },
{ {
"deliveryStart": "2025-07-06T02:45:00Z", "deliveryStart": "2025-10-01T02:45:00Z",
"deliveryEnd": "2025-07-06T03:00:00Z", "deliveryEnd": "2025-10-01T03:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 32.42 "SE3": 574.7
} }
}, },
{ {
"deliveryStart": "2025-07-06T03:00:00Z", "deliveryStart": "2025-10-01T03:00:00Z",
"deliveryEnd": "2025-07-06T03:15:00Z", "deliveryEnd": "2025-10-01T03:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 38.73 "SE3": 543.31
} }
}, },
{ {
"deliveryStart": "2025-07-06T03:15:00Z", "deliveryStart": "2025-10-01T03:15:00Z",
"deliveryEnd": "2025-07-06T03:30:00Z", "deliveryEnd": "2025-10-01T03:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 38.73 "SE3": 578.01
} }
}, },
{ {
"deliveryStart": "2025-07-06T03:30:00Z", "deliveryStart": "2025-10-01T03:30:00Z",
"deliveryEnd": "2025-07-06T03:45:00Z", "deliveryEnd": "2025-10-01T03:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 38.73 "SE3": 774.96
} }
}, },
{ {
"deliveryStart": "2025-07-06T03:45:00Z", "deliveryStart": "2025-10-01T03:45:00Z",
"deliveryEnd": "2025-07-06T04:00:00Z", "deliveryEnd": "2025-10-01T04:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 38.73 "SE3": 787.0
} }
}, },
{ {
"deliveryStart": "2025-07-06T04:00:00Z", "deliveryStart": "2025-10-01T04:00:00Z",
"deliveryEnd": "2025-07-06T04:15:00Z", "deliveryEnd": "2025-10-01T04:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 42.78 "SE3": 902.38
} }
}, },
{ {
"deliveryStart": "2025-07-06T04:15:00Z", "deliveryStart": "2025-10-01T04:15:00Z",
"deliveryEnd": "2025-07-06T04:30:00Z", "deliveryEnd": "2025-10-01T04:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 42.78 "SE3": 1079.32
} }
}, },
{ {
"deliveryStart": "2025-07-06T04:30:00Z", "deliveryStart": "2025-10-01T04:30:00Z",
"deliveryEnd": "2025-07-06T04:45:00Z", "deliveryEnd": "2025-10-01T04:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 42.78 "SE3": 1222.67
} }
}, },
{ {
"deliveryStart": "2025-07-06T04:45:00Z", "deliveryStart": "2025-10-01T04:45:00Z",
"deliveryEnd": "2025-07-06T05:00:00Z", "deliveryEnd": "2025-10-01T05:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 42.78 "SE3": 1394.63
} }
}, },
{ {
"deliveryStart": "2025-07-06T05:00:00Z", "deliveryStart": "2025-10-01T05:00:00Z",
"deliveryEnd": "2025-07-06T05:15:00Z", "deliveryEnd": "2025-10-01T05:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 54.71 "SE3": 1529.36
} }
}, },
{ {
"deliveryStart": "2025-07-06T05:15:00Z", "deliveryStart": "2025-10-01T05:15:00Z",
"deliveryEnd": "2025-07-06T05:30:00Z", "deliveryEnd": "2025-10-01T05:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 54.71 "SE3": 1724.53
} }
}, },
{ {
"deliveryStart": "2025-07-06T05:30:00Z", "deliveryStart": "2025-10-01T05:30:00Z",
"deliveryEnd": "2025-07-06T05:45:00Z", "deliveryEnd": "2025-10-01T05:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 54.71 "SE3": 1809.96
} }
}, },
{ {
"deliveryStart": "2025-07-06T05:45:00Z", "deliveryStart": "2025-10-01T05:45:00Z",
"deliveryEnd": "2025-07-06T06:00:00Z", "deliveryEnd": "2025-10-01T06:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 54.71 "SE3": 1713.04
} }
}, },
{ {
"deliveryStart": "2025-07-06T06:00:00Z", "deliveryStart": "2025-10-01T06:00:00Z",
"deliveryEnd": "2025-07-06T06:15:00Z", "deliveryEnd": "2025-10-01T06:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 83.87 "SE3": 1925.9
} }
}, },
{ {
"deliveryStart": "2025-07-06T06:15:00Z", "deliveryStart": "2025-10-01T06:15:00Z",
"deliveryEnd": "2025-07-06T06:30:00Z", "deliveryEnd": "2025-10-01T06:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 83.87 "SE3": 1440.06
} }
}, },
{ {
"deliveryStart": "2025-07-06T06:30:00Z", "deliveryStart": "2025-10-01T06:30:00Z",
"deliveryEnd": "2025-07-06T06:45:00Z", "deliveryEnd": "2025-10-01T06:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 83.87 "SE3": 1183.32
} }
}, },
{ {
"deliveryStart": "2025-07-06T06:45:00Z", "deliveryStart": "2025-10-01T06:45:00Z",
"deliveryEnd": "2025-07-06T07:00:00Z", "deliveryEnd": "2025-10-01T07:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 83.87 "SE3": 962.95
} }
}, },
{ {
"deliveryStart": "2025-07-06T07:00:00Z", "deliveryStart": "2025-10-01T07:00:00Z",
"deliveryEnd": "2025-07-06T07:15:00Z", "deliveryEnd": "2025-10-01T07:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 78.8 "SE3": 1402.04
} }
}, },
{ {
"deliveryStart": "2025-07-06T07:15:00Z", "deliveryStart": "2025-10-01T07:15:00Z",
"deliveryEnd": "2025-07-06T07:30:00Z", "deliveryEnd": "2025-10-01T07:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 78.8 "SE3": 1060.65
} }
}, },
{ {
"deliveryStart": "2025-07-06T07:30:00Z", "deliveryStart": "2025-10-01T07:30:00Z",
"deliveryEnd": "2025-07-06T07:45:00Z", "deliveryEnd": "2025-10-01T07:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 78.8 "SE3": 949.13
} }
}, },
{ {
"deliveryStart": "2025-07-06T07:45:00Z", "deliveryStart": "2025-10-01T07:45:00Z",
"deliveryEnd": "2025-07-06T08:00:00Z", "deliveryEnd": "2025-10-01T08:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 78.8 "SE3": 841.82
} }
}, },
{ {
"deliveryStart": "2025-07-06T08:00:00Z", "deliveryStart": "2025-10-01T08:00:00Z",
"deliveryEnd": "2025-07-06T08:15:00Z", "deliveryEnd": "2025-10-01T08:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 92.09 "SE3": 1037.44
} }
}, },
{ {
"deliveryStart": "2025-07-06T08:15:00Z", "deliveryStart": "2025-10-01T08:15:00Z",
"deliveryEnd": "2025-07-06T08:30:00Z", "deliveryEnd": "2025-10-01T08:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 92.09 "SE3": 950.13
} }
}, },
{ {
"deliveryStart": "2025-07-06T08:30:00Z", "deliveryStart": "2025-10-01T08:30:00Z",
"deliveryEnd": "2025-07-06T08:45:00Z", "deliveryEnd": "2025-10-01T08:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 92.09 "SE3": 826.13
} }
}, },
{ {
"deliveryStart": "2025-07-06T08:45:00Z", "deliveryStart": "2025-10-01T08:45:00Z",
"deliveryEnd": "2025-07-06T09:00:00Z", "deliveryEnd": "2025-10-01T09:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 92.09 "SE3": 684.55
} }
}, },
{ {
"deliveryStart": "2025-07-06T09:00:00Z", "deliveryStart": "2025-10-01T09:00:00Z",
"deliveryEnd": "2025-07-06T09:15:00Z", "deliveryEnd": "2025-10-01T09:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 104.92 "SE3": 861.6
} }
}, },
{ {
"deliveryStart": "2025-07-06T09:15:00Z", "deliveryStart": "2025-10-01T09:15:00Z",
"deliveryEnd": "2025-07-06T09:30:00Z", "deliveryEnd": "2025-10-01T09:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 104.92 "SE3": 722.79
} }
}, },
{ {
"deliveryStart": "2025-07-06T09:30:00Z", "deliveryStart": "2025-10-01T09:30:00Z",
"deliveryEnd": "2025-07-06T09:45:00Z", "deliveryEnd": "2025-10-01T09:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 104.92 "SE3": 640.57
} }
}, },
{ {
"deliveryStart": "2025-07-06T09:45:00Z", "deliveryStart": "2025-10-01T09:45:00Z",
"deliveryEnd": "2025-07-06T10:00:00Z", "deliveryEnd": "2025-10-01T10:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 104.92 "SE3": 607.74
} }
}, },
{ {
"deliveryStart": "2025-07-06T10:00:00Z", "deliveryStart": "2025-10-01T10:00:00Z",
"deliveryEnd": "2025-07-06T10:15:00Z", "deliveryEnd": "2025-10-01T10:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 72.5 "SE3": 674.05
} }
}, },
{ {
"deliveryStart": "2025-07-06T10:15:00Z", "deliveryStart": "2025-10-01T10:15:00Z",
"deliveryEnd": "2025-07-06T10:30:00Z", "deliveryEnd": "2025-10-01T10:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 72.5 "SE3": 638.58
} }
}, },
{ {
"deliveryStart": "2025-07-06T10:30:00Z", "deliveryStart": "2025-10-01T10:30:00Z",
"deliveryEnd": "2025-07-06T10:45:00Z", "deliveryEnd": "2025-10-01T10:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 72.5 "SE3": 638.47
} }
}, },
{ {
"deliveryStart": "2025-07-06T10:45:00Z", "deliveryStart": "2025-10-01T10:45:00Z",
"deliveryEnd": "2025-07-06T11:00:00Z", "deliveryEnd": "2025-10-01T11:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 72.5 "SE3": 634.82
} }
}, },
{ {
"deliveryStart": "2025-07-06T11:00:00Z", "deliveryStart": "2025-10-01T11:00:00Z",
"deliveryEnd": "2025-07-06T11:15:00Z", "deliveryEnd": "2025-10-01T11:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 63.49 "SE3": 637.36
} }
}, },
{ {
"deliveryStart": "2025-07-06T11:15:00Z", "deliveryStart": "2025-10-01T11:15:00Z",
"deliveryEnd": "2025-07-06T11:30:00Z", "deliveryEnd": "2025-10-01T11:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 63.49 "SE3": 660.68
} }
}, },
{ {
"deliveryStart": "2025-07-06T11:30:00Z", "deliveryStart": "2025-10-01T11:30:00Z",
"deliveryEnd": "2025-07-06T11:45:00Z", "deliveryEnd": "2025-10-01T11:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 63.49 "SE3": 679.14
} }
}, },
{ {
"deliveryStart": "2025-07-06T11:45:00Z", "deliveryStart": "2025-10-01T11:45:00Z",
"deliveryEnd": "2025-07-06T12:00:00Z", "deliveryEnd": "2025-10-01T12:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 63.49 "SE3": 694.61
} }
}, },
{ {
"deliveryStart": "2025-07-06T12:00:00Z", "deliveryStart": "2025-10-01T12:00:00Z",
"deliveryEnd": "2025-07-06T12:15:00Z", "deliveryEnd": "2025-10-01T12:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 91.64 "SE3": 622.33
} }
}, },
{ {
"deliveryStart": "2025-07-06T12:15:00Z", "deliveryStart": "2025-10-01T12:15:00Z",
"deliveryEnd": "2025-07-06T12:30:00Z", "deliveryEnd": "2025-10-01T12:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 91.64 "SE3": 685.44
} }
}, },
{ {
"deliveryStart": "2025-07-06T12:30:00Z", "deliveryStart": "2025-10-01T12:30:00Z",
"deliveryEnd": "2025-07-06T12:45:00Z", "deliveryEnd": "2025-10-01T12:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 91.64 "SE3": 732.85
} }
}, },
{ {
"deliveryStart": "2025-07-06T12:45:00Z", "deliveryStart": "2025-10-01T12:45:00Z",
"deliveryEnd": "2025-07-06T13:00:00Z", "deliveryEnd": "2025-10-01T13:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 91.64 "SE3": 801.92
} }
}, },
{ {
"deliveryStart": "2025-07-06T13:00:00Z", "deliveryStart": "2025-10-01T13:00:00Z",
"deliveryEnd": "2025-07-06T13:15:00Z", "deliveryEnd": "2025-10-01T13:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 111.79 "SE3": 629.4
} }
}, },
{ {
"deliveryStart": "2025-07-06T13:15:00Z", "deliveryStart": "2025-10-01T13:15:00Z",
"deliveryEnd": "2025-07-06T13:30:00Z", "deliveryEnd": "2025-10-01T13:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 111.79 "SE3": 729.53
} }
}, },
{ {
"deliveryStart": "2025-07-06T13:30:00Z", "deliveryStart": "2025-10-01T13:30:00Z",
"deliveryEnd": "2025-07-06T13:45:00Z", "deliveryEnd": "2025-10-01T13:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 111.79 "SE3": 884.81
} }
}, },
{ {
"deliveryStart": "2025-07-06T13:45:00Z", "deliveryStart": "2025-10-01T13:45:00Z",
"deliveryEnd": "2025-07-06T14:00:00Z", "deliveryEnd": "2025-10-01T14:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 111.79 "SE3": 984.94
} }
}, },
{ {
"deliveryStart": "2025-07-06T14:00:00Z", "deliveryStart": "2025-10-01T14:00:00Z",
"deliveryEnd": "2025-07-06T14:15:00Z", "deliveryEnd": "2025-10-01T14:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 234.04 "SE3": 615.26
} }
}, },
{ {
"deliveryStart": "2025-07-06T14:15:00Z", "deliveryStart": "2025-10-01T14:15:00Z",
"deliveryEnd": "2025-07-06T14:30:00Z", "deliveryEnd": "2025-10-01T14:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 234.04 "SE3": 902.94
} }
}, },
{ {
"deliveryStart": "2025-07-06T14:30:00Z", "deliveryStart": "2025-10-01T14:30:00Z",
"deliveryEnd": "2025-07-06T14:45:00Z", "deliveryEnd": "2025-10-01T14:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 234.04 "SE3": 1043.85
} }
}, },
{ {
"deliveryStart": "2025-07-06T14:45:00Z", "deliveryStart": "2025-10-01T14:45:00Z",
"deliveryEnd": "2025-07-06T15:00:00Z", "deliveryEnd": "2025-10-01T15:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 234.04 "SE3": 1075.12
} }
}, },
{ {
"deliveryStart": "2025-07-06T15:00:00Z", "deliveryStart": "2025-10-01T15:00:00Z",
"deliveryEnd": "2025-07-06T15:15:00Z", "deliveryEnd": "2025-10-01T15:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 435.33 "SE3": 980.52
} }
}, },
{ {
"deliveryStart": "2025-07-06T15:15:00Z", "deliveryStart": "2025-10-01T15:15:00Z",
"deliveryEnd": "2025-07-06T15:30:00Z", "deliveryEnd": "2025-10-01T15:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 435.33 "SE3": 1162.66
} }
}, },
{ {
"deliveryStart": "2025-07-06T15:30:00Z", "deliveryStart": "2025-10-01T15:30:00Z",
"deliveryEnd": "2025-07-06T15:45:00Z", "deliveryEnd": "2025-10-01T15:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 435.33 "SE3": 1453.87
} }
}, },
{ {
"deliveryStart": "2025-07-06T15:45:00Z", "deliveryStart": "2025-10-01T15:45:00Z",
"deliveryEnd": "2025-07-06T16:00:00Z", "deliveryEnd": "2025-10-01T16:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 435.33 "SE3": 1955.96
} }
}, },
{ {
"deliveryStart": "2025-07-06T16:00:00Z", "deliveryStart": "2025-10-01T16:00:00Z",
"deliveryEnd": "2025-07-06T16:15:00Z", "deliveryEnd": "2025-10-01T16:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 431.84 "SE3": 1423.48
} }
}, },
{ {
"deliveryStart": "2025-07-06T16:15:00Z", "deliveryStart": "2025-10-01T16:15:00Z",
"deliveryEnd": "2025-07-06T16:30:00Z", "deliveryEnd": "2025-10-01T16:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 431.84 "SE3": 1900.04
} }
}, },
{ {
"deliveryStart": "2025-07-06T16:30:00Z", "deliveryStart": "2025-10-01T16:30:00Z",
"deliveryEnd": "2025-07-06T16:45:00Z", "deliveryEnd": "2025-10-01T16:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 431.84 "SE3": 2611.11
} }
}, },
{ {
"deliveryStart": "2025-07-06T16:45:00Z", "deliveryStart": "2025-10-01T16:45:00Z",
"deliveryEnd": "2025-07-06T17:00:00Z", "deliveryEnd": "2025-10-01T17:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 431.84 "SE3": 3467.41
} }
}, },
{ {
"deliveryStart": "2025-07-06T17:00:00Z", "deliveryStart": "2025-10-01T17:00:00Z",
"deliveryEnd": "2025-07-06T17:15:00Z", "deliveryEnd": "2025-10-01T17:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 423.73 "SE3": 3828.03
} }
}, },
{ {
"deliveryStart": "2025-07-06T17:15:00Z", "deliveryStart": "2025-10-01T17:15:00Z",
"deliveryEnd": "2025-07-06T17:30:00Z", "deliveryEnd": "2025-10-01T17:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 423.73 "SE3": 3429.83
} }
}, },
{ {
"deliveryStart": "2025-07-06T17:30:00Z", "deliveryStart": "2025-10-01T17:30:00Z",
"deliveryEnd": "2025-07-06T17:45:00Z", "deliveryEnd": "2025-10-01T17:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 423.73 "SE3": 2934.38
} }
}, },
{ {
"deliveryStart": "2025-07-06T17:45:00Z", "deliveryStart": "2025-10-01T17:45:00Z",
"deliveryEnd": "2025-07-06T18:00:00Z", "deliveryEnd": "2025-10-01T18:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 423.73 "SE3": 2308.07
} }
}, },
{ {
"deliveryStart": "2025-07-06T18:00:00Z", "deliveryStart": "2025-10-01T18:00:00Z",
"deliveryEnd": "2025-07-06T18:15:00Z", "deliveryEnd": "2025-10-01T18:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 437.92 "SE3": 1997.96
} }
}, },
{ {
"deliveryStart": "2025-07-06T18:15:00Z", "deliveryStart": "2025-10-01T18:15:00Z",
"deliveryEnd": "2025-07-06T18:30:00Z", "deliveryEnd": "2025-10-01T18:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 437.92 "SE3": 1424.03
} }
}, },
{ {
"deliveryStart": "2025-07-06T18:30:00Z", "deliveryStart": "2025-10-01T18:30:00Z",
"deliveryEnd": "2025-07-06T18:45:00Z", "deliveryEnd": "2025-10-01T18:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 437.92 "SE3": 1216.81
} }
}, },
{ {
"deliveryStart": "2025-07-06T18:45:00Z", "deliveryStart": "2025-10-01T18:45:00Z",
"deliveryEnd": "2025-07-06T19:00:00Z", "deliveryEnd": "2025-10-01T19:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 437.92 "SE3": 1070.15
} }
}, },
{ {
"deliveryStart": "2025-07-06T19:00:00Z", "deliveryStart": "2025-10-01T19:00:00Z",
"deliveryEnd": "2025-07-06T19:15:00Z", "deliveryEnd": "2025-10-01T19:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 416.42 "SE3": 1218.14
} }
}, },
{ {
"deliveryStart": "2025-07-06T19:15:00Z", "deliveryStart": "2025-10-01T19:15:00Z",
"deliveryEnd": "2025-07-06T19:30:00Z", "deliveryEnd": "2025-10-01T19:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 416.42 "SE3": 1135.8
} }
}, },
{ {
"deliveryStart": "2025-07-06T19:30:00Z", "deliveryStart": "2025-10-01T19:30:00Z",
"deliveryEnd": "2025-07-06T19:45:00Z", "deliveryEnd": "2025-10-01T19:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 416.42 "SE3": 959.96
} }
}, },
{ {
"deliveryStart": "2025-07-06T19:45:00Z", "deliveryStart": "2025-10-01T19:45:00Z",
"deliveryEnd": "2025-07-06T20:00:00Z", "deliveryEnd": "2025-10-01T20:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 416.42 "SE3": 913.66
} }
}, },
{ {
"deliveryStart": "2025-07-06T20:00:00Z", "deliveryStart": "2025-10-01T20:00:00Z",
"deliveryEnd": "2025-07-06T20:15:00Z", "deliveryEnd": "2025-10-01T20:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 414.39 "SE3": 1001.63
} }
}, },
{ {
"deliveryStart": "2025-07-06T20:15:00Z", "deliveryStart": "2025-10-01T20:15:00Z",
"deliveryEnd": "2025-07-06T20:30:00Z", "deliveryEnd": "2025-10-01T20:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 414.39 "SE3": 933.0
} }
}, },
{ {
"deliveryStart": "2025-07-06T20:30:00Z", "deliveryStart": "2025-10-01T20:30:00Z",
"deliveryEnd": "2025-07-06T20:45:00Z", "deliveryEnd": "2025-10-01T20:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 414.39 "SE3": 874.53
} }
}, },
{ {
"deliveryStart": "2025-07-06T20:45:00Z", "deliveryStart": "2025-10-01T20:45:00Z",
"deliveryEnd": "2025-07-06T21:00:00Z", "deliveryEnd": "2025-10-01T21:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 414.39 "SE3": 821.71
} }
}, },
{ {
"deliveryStart": "2025-07-06T21:00:00Z", "deliveryStart": "2025-10-01T21:00:00Z",
"deliveryEnd": "2025-07-06T21:15:00Z", "deliveryEnd": "2025-10-01T21:15:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 396.38 "SE3": 860.5
} }
}, },
{ {
"deliveryStart": "2025-07-06T21:15:00Z", "deliveryStart": "2025-10-01T21:15:00Z",
"deliveryEnd": "2025-07-06T21:30:00Z", "deliveryEnd": "2025-10-01T21:30:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 396.38 "SE3": 840.16
} }
}, },
{ {
"deliveryStart": "2025-07-06T21:30:00Z", "deliveryStart": "2025-10-01T21:30:00Z",
"deliveryEnd": "2025-07-06T21:45:00Z", "deliveryEnd": "2025-10-01T21:45:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 396.38 "SE3": 820.05
} }
}, },
{ {
"deliveryStart": "2025-07-06T21:45:00Z", "deliveryStart": "2025-10-01T21:45:00Z",
"deliveryEnd": "2025-07-06T22:00:00Z", "deliveryEnd": "2025-10-01T22:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 396.38 "SE3": 785.68
} }
} }
] ]

View File

@@ -1,184 +1,184 @@
{ {
"deliveryDateCET": "2025-07-06", "deliveryDateCET": "2025-10-01",
"version": 2, "version": 3,
"updatedAt": "2025-07-05T10:56:44.6936838Z", "updatedAt": "2025-09-30T12:08:22.6180024Z",
"market": "DayAhead", "market": "DayAhead",
"indexNames": ["SE3"], "indexNames": ["SE3"],
"currency": "SEK", "currency": "SEK",
"resolutionInMinutes": 60, "resolutionInMinutes": 60,
"areaStates": [ "areaStates": [
{ {
"state": "Preliminary", "state": "Final",
"areas": ["SE3"] "areas": ["SE3"]
} }
], ],
"multiIndexEntries": [ "multiIndexEntries": [
{ {
"deliveryStart": "2025-07-05T22:00:00Z", "deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2025-07-05T23:00:00Z", "deliveryEnd": "2025-09-30T23:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 43.57 "SE3": 523.75
} }
}, },
{ {
"deliveryStart": "2025-07-05T23:00:00Z", "deliveryStart": "2025-09-30T23:00:00Z",
"deliveryEnd": "2025-07-06T00:00:00Z", "deliveryEnd": "2025-10-01T00:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 36.47 "SE3": 485.95
} }
}, },
{ {
"deliveryStart": "2025-07-06T00:00:00Z", "deliveryStart": "2025-10-01T00:00:00Z",
"deliveryEnd": "2025-07-06T01:00:00Z", "deliveryEnd": "2025-10-01T01:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 35.57 "SE3": 504.85
} }
}, },
{ {
"deliveryStart": "2025-07-06T01:00:00Z", "deliveryStart": "2025-10-01T01:00:00Z",
"deliveryEnd": "2025-07-06T02:00:00Z", "deliveryEnd": "2025-10-01T02:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 30.73 "SE3": 442.07
} }
}, },
{ {
"deliveryStart": "2025-07-06T02:00:00Z", "deliveryStart": "2025-10-01T02:00:00Z",
"deliveryEnd": "2025-07-06T03:00:00Z", "deliveryEnd": "2025-10-01T03:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 32.42 "SE3": 496.12
} }
}, },
{ {
"deliveryStart": "2025-07-06T03:00:00Z", "deliveryStart": "2025-10-01T03:00:00Z",
"deliveryEnd": "2025-07-06T04:00:00Z", "deliveryEnd": "2025-10-01T04:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 38.73 "SE3": 670.85
} }
}, },
{ {
"deliveryStart": "2025-07-06T04:00:00Z", "deliveryStart": "2025-10-01T04:00:00Z",
"deliveryEnd": "2025-07-06T05:00:00Z", "deliveryEnd": "2025-10-01T05:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 42.78 "SE3": 1149.72
} }
}, },
{ {
"deliveryStart": "2025-07-06T05:00:00Z", "deliveryStart": "2025-10-01T05:00:00Z",
"deliveryEnd": "2025-07-06T06:00:00Z", "deliveryEnd": "2025-10-01T06:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 54.71 "SE3": 1694.25
} }
}, },
{ {
"deliveryStart": "2025-07-06T06:00:00Z", "deliveryStart": "2025-10-01T06:00:00Z",
"deliveryEnd": "2025-07-06T07:00:00Z", "deliveryEnd": "2025-10-01T07:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 83.87 "SE3": 1378.06
} }
}, },
{ {
"deliveryStart": "2025-07-06T07:00:00Z", "deliveryStart": "2025-10-01T07:00:00Z",
"deliveryEnd": "2025-07-06T08:00:00Z", "deliveryEnd": "2025-10-01T08:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 78.8 "SE3": 1063.41
} }
}, },
{ {
"deliveryStart": "2025-07-06T08:00:00Z", "deliveryStart": "2025-10-01T08:00:00Z",
"deliveryEnd": "2025-07-06T09:00:00Z", "deliveryEnd": "2025-10-01T09:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 92.09 "SE3": 874.53
} }
}, },
{ {
"deliveryStart": "2025-07-06T09:00:00Z", "deliveryStart": "2025-10-01T09:00:00Z",
"deliveryEnd": "2025-07-06T10:00:00Z", "deliveryEnd": "2025-10-01T10:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 104.92 "SE3": 708.2
} }
}, },
{ {
"deliveryStart": "2025-07-06T10:00:00Z", "deliveryStart": "2025-10-01T10:00:00Z",
"deliveryEnd": "2025-07-06T11:00:00Z", "deliveryEnd": "2025-10-01T11:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 72.5 "SE3": 646.53
} }
}, },
{ {
"deliveryStart": "2025-07-06T11:00:00Z", "deliveryStart": "2025-10-01T11:00:00Z",
"deliveryEnd": "2025-07-06T12:00:00Z", "deliveryEnd": "2025-10-01T12:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 63.49 "SE3": 667.97
} }
}, },
{ {
"deliveryStart": "2025-07-06T12:00:00Z", "deliveryStart": "2025-10-01T12:00:00Z",
"deliveryEnd": "2025-07-06T13:00:00Z", "deliveryEnd": "2025-10-01T13:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 91.64 "SE3": 710.63
} }
}, },
{ {
"deliveryStart": "2025-07-06T13:00:00Z", "deliveryStart": "2025-10-01T13:00:00Z",
"deliveryEnd": "2025-07-06T14:00:00Z", "deliveryEnd": "2025-10-01T14:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 111.79 "SE3": 807.23
} }
}, },
{ {
"deliveryStart": "2025-07-06T14:00:00Z", "deliveryStart": "2025-10-01T14:00:00Z",
"deliveryEnd": "2025-07-06T15:00:00Z", "deliveryEnd": "2025-10-01T15:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 234.04 "SE3": 909.35
} }
}, },
{ {
"deliveryStart": "2025-07-06T15:00:00Z", "deliveryStart": "2025-10-01T15:00:00Z",
"deliveryEnd": "2025-07-06T16:00:00Z", "deliveryEnd": "2025-10-01T16:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 435.33 "SE3": 1388.22
} }
}, },
{ {
"deliveryStart": "2025-07-06T16:00:00Z", "deliveryStart": "2025-10-01T16:00:00Z",
"deliveryEnd": "2025-07-06T17:00:00Z", "deliveryEnd": "2025-10-01T17:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 431.84 "SE3": 2350.51
} }
}, },
{ {
"deliveryStart": "2025-07-06T17:00:00Z", "deliveryStart": "2025-10-01T17:00:00Z",
"deliveryEnd": "2025-07-06T18:00:00Z", "deliveryEnd": "2025-10-01T18:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 423.73 "SE3": 3125.13
} }
}, },
{ {
"deliveryStart": "2025-07-06T18:00:00Z", "deliveryStart": "2025-10-01T18:00:00Z",
"deliveryEnd": "2025-07-06T19:00:00Z", "deliveryEnd": "2025-10-01T19:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 437.92 "SE3": 1427.24
} }
}, },
{ {
"deliveryStart": "2025-07-06T19:00:00Z", "deliveryStart": "2025-10-01T19:00:00Z",
"deliveryEnd": "2025-07-06T20:00:00Z", "deliveryEnd": "2025-10-01T20:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 416.42 "SE3": 1056.89
} }
}, },
{ {
"deliveryStart": "2025-07-06T20:00:00Z", "deliveryStart": "2025-10-01T20:00:00Z",
"deliveryEnd": "2025-07-06T21:00:00Z", "deliveryEnd": "2025-10-01T21:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 414.39 "SE3": 907.69
} }
}, },
{ {
"deliveryStart": "2025-07-06T21:00:00Z", "deliveryStart": "2025-10-01T21:00:00Z",
"deliveryEnd": "2025-07-06T22:00:00Z", "deliveryEnd": "2025-10-01T22:00:00Z",
"entryPerArea": { "entryPerArea": {
"SE3": 396.38 "SE3": 826.57
} }
} }
] ]

File diff suppressed because it is too large Load Diff

View File

@@ -99,7 +99,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.01177', 'state': '1.99796',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_daily_average-entry] # name: test_sensor[sensor.nord_pool_se3_daily_average-entry]
@@ -154,7 +154,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.90074', 'state': '1.03398',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_exchange_rate-entry] # name: test_sensor[sensor.nord_pool_se3_exchange_rate-entry]
@@ -205,7 +205,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '11.6402', 'state': '11.05186',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_highest_price-entry] # name: test_sensor[sensor.nord_pool_se3_highest_price-entry]
@@ -249,9 +249,9 @@
# name: test_sensor[sensor.nord_pool_se3_highest_price-state] # name: test_sensor[sensor.nord_pool_se3_highest_price-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'end': '2024-11-05T17:00:00+00:00', 'end': '2025-10-01T17:15:00+00:00',
'friendly_name': 'Nord Pool SE3 Highest price', 'friendly_name': 'Nord Pool SE3 Highest price',
'start': '2024-11-05T16:00:00+00:00', 'start': '2025-10-01T17:00:00+00:00',
'unit_of_measurement': 'SEK/kWh', 'unit_of_measurement': 'SEK/kWh',
}), }),
'context': <ANY>, 'context': <ANY>,
@@ -259,7 +259,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2.51265', 'state': '3.82803',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_last_updated-entry] # name: test_sensor[sensor.nord_pool_se3_last_updated-entry]
@@ -308,7 +308,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-04T12:15:03+00:00', 'state': '2025-09-30T12:08:16+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_lowest_price-entry] # name: test_sensor[sensor.nord_pool_se3_lowest_price-entry]
@@ -352,9 +352,9 @@
# name: test_sensor[sensor.nord_pool_se3_lowest_price-state] # name: test_sensor[sensor.nord_pool_se3_lowest_price-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'end': '2024-11-05T03:00:00+00:00', 'end': '2025-10-01T02:15:00+00:00',
'friendly_name': 'Nord Pool SE3 Lowest price', 'friendly_name': 'Nord Pool SE3 Lowest price',
'start': '2024-11-05T02:00:00+00:00', 'start': '2025-10-01T02:00:00+00:00',
'unit_of_measurement': 'SEK/kWh', 'unit_of_measurement': 'SEK/kWh',
}), }),
'context': <ANY>, 'context': <ANY>,
@@ -362,7 +362,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.06169', 'state': '0.44196',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_next_price-entry] # name: test_sensor[sensor.nord_pool_se3_next_price-entry]
@@ -414,7 +414,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.83553', 'state': '1.21814',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_1_average-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_1_average-entry]
@@ -469,7 +469,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.42287', 'state': '0.74593',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_1_highest_price-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_1_highest_price-entry]
@@ -524,7 +524,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.40614', 'state': '1.80996',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_1_lowest_price-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_1_lowest_price-entry]
@@ -579,7 +579,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.06169', 'state': '0.44196',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_1_time_from-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_1_time_from-entry]
@@ -628,7 +628,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-04T23:00:00+00:00', 'state': '2025-09-30T22:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_1_time_until-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_1_time_until-entry]
@@ -677,7 +677,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T07:00:00+00:00', 'state': '2025-10-01T06:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_2_average-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_2_average-entry]
@@ -732,7 +732,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.61079', 'state': '1.05461',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_2_highest_price-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_2_highest_price-entry]
@@ -787,7 +787,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.83553', 'state': '1.99796',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_2_lowest_price-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_2_lowest_price-entry]
@@ -842,7 +842,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.28914', 'state': '0.78568',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_2_time_from-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_2_time_from-entry]
@@ -891,7 +891,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T19:00:00+00:00', 'state': '2025-10-01T18:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_2_time_until-entry] # name: test_sensor[sensor.nord_pool_se3_off_peak_2_time_until-entry]
@@ -940,7 +940,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T23:00:00+00:00', 'state': '2025-10-01T22:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_peak_average-entry] # name: test_sensor[sensor.nord_pool_se3_peak_average-entry]
@@ -995,7 +995,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.31597', 'state': '1.21913',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_peak_highest_price-entry] # name: test_sensor[sensor.nord_pool_se3_peak_highest_price-entry]
@@ -1050,7 +1050,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2.51265', 'state': '3.82803',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_peak_lowest_price-entry] # name: test_sensor[sensor.nord_pool_se3_peak_lowest_price-entry]
@@ -1105,7 +1105,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.92505', 'state': '0.60774',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_peak_time_from-entry] # name: test_sensor[sensor.nord_pool_se3_peak_time_from-entry]
@@ -1154,7 +1154,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T07:00:00+00:00', 'state': '2025-10-01T06:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_peak_time_until-entry] # name: test_sensor[sensor.nord_pool_se3_peak_time_until-entry]
@@ -1203,7 +1203,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T19:00:00+00:00', 'state': '2025-10-01T18:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se3_previous_price-entry] # name: test_sensor[sensor.nord_pool_se3_previous_price-entry]
@@ -1255,7 +1255,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.81983', 'state': '3.82803',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_currency-entry] # name: test_sensor[sensor.nord_pool_se4_currency-entry]
@@ -1413,7 +1413,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.16612', 'state': '1.18078',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_exchange_rate-entry] # name: test_sensor[sensor.nord_pool_se4_exchange_rate-entry]
@@ -1464,7 +1464,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '11.6402', 'state': '11.05186',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_highest_price-entry] # name: test_sensor[sensor.nord_pool_se4_highest_price-entry]
@@ -1508,9 +1508,9 @@
# name: test_sensor[sensor.nord_pool_se4_highest_price-state] # name: test_sensor[sensor.nord_pool_se4_highest_price-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'end': '2024-11-05T17:00:00+00:00', 'end': '2025-10-01T17:15:00+00:00',
'friendly_name': 'Nord Pool SE4 Highest price', 'friendly_name': 'Nord Pool SE4 Highest price',
'start': '2024-11-05T16:00:00+00:00', 'start': '2025-10-01T17:00:00+00:00',
'unit_of_measurement': 'SEK/kWh', 'unit_of_measurement': 'SEK/kWh',
}), }),
'context': <ANY>, 'context': <ANY>,
@@ -1518,7 +1518,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '3.53303', 'state': '4.44274',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_last_updated-entry] # name: test_sensor[sensor.nord_pool_se4_last_updated-entry]
@@ -1567,7 +1567,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-04T12:15:03+00:00', 'state': '2025-09-30T12:08:16+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_lowest_price-entry] # name: test_sensor[sensor.nord_pool_se4_lowest_price-entry]
@@ -1611,9 +1611,9 @@
# name: test_sensor[sensor.nord_pool_se4_lowest_price-state] # name: test_sensor[sensor.nord_pool_se4_lowest_price-state]
StateSnapshot({ StateSnapshot({
'attributes': ReadOnlyDict({ 'attributes': ReadOnlyDict({
'end': '2024-11-05T19:00:00+00:00', 'end': '2025-10-01T18:15:00+00:00',
'friendly_name': 'Nord Pool SE4 Lowest price', 'friendly_name': 'Nord Pool SE4 Lowest price',
'start': '2024-11-05T18:00:00+00:00', 'start': '2025-10-01T18:00:00+00:00',
'unit_of_measurement': 'SEK/kWh', 'unit_of_measurement': 'SEK/kWh',
}), }),
'context': <ANY>, 'context': <ANY>,
@@ -1673,7 +1673,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.11257', 'state': '1.40502',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_1_average-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_1_average-entry]
@@ -1728,7 +1728,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.49797', 'state': '0.86099',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_1_highest_price-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_1_highest_price-entry]
@@ -1783,7 +1783,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.64825', 'state': '2.02934',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_1_lowest_price-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_1_lowest_price-entry]
@@ -1838,7 +1838,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.06519', 'state': '0.51546',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_1_time_from-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_1_time_from-entry]
@@ -1887,7 +1887,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-04T23:00:00+00:00', 'state': '2025-09-30T22:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_1_time_until-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_1_time_until-entry]
@@ -1936,7 +1936,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T07:00:00+00:00', 'state': '2025-10-01T06:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_2_average-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_2_average-entry]
@@ -1991,7 +1991,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.79398', 'state': '1.21907',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_2_highest_price-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_2_highest_price-entry]
@@ -2046,7 +2046,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.11257', 'state': '2.31216',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_2_lowest_price-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_2_lowest_price-entry]
@@ -2101,7 +2101,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '0.34921', 'state': '0.91222',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_2_time_from-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_2_time_from-entry]
@@ -2150,7 +2150,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T19:00:00+00:00', 'state': '2025-10-01T18:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_2_time_until-entry] # name: test_sensor[sensor.nord_pool_se4_off_peak_2_time_until-entry]
@@ -2199,7 +2199,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T23:00:00+00:00', 'state': '2025-10-01T22:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_peak_average-entry] # name: test_sensor[sensor.nord_pool_se4_peak_average-entry]
@@ -2254,7 +2254,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.73559', 'state': '1.38122',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_peak_highest_price-entry] # name: test_sensor[sensor.nord_pool_se4_peak_highest_price-entry]
@@ -2309,7 +2309,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '3.53303', 'state': '4.44274',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_peak_lowest_price-entry] # name: test_sensor[sensor.nord_pool_se4_peak_lowest_price-entry]
@@ -2364,7 +2364,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '1.08172', 'state': '0.68312',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_peak_time_from-entry] # name: test_sensor[sensor.nord_pool_se4_peak_time_from-entry]
@@ -2413,7 +2413,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T07:00:00+00:00', 'state': '2025-10-01T06:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_peak_time_until-entry] # name: test_sensor[sensor.nord_pool_se4_peak_time_until-entry]
@@ -2462,7 +2462,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2024-11-05T19:00:00+00:00', 'state': '2025-10-01T18:00:00+00:00',
}) })
# --- # ---
# name: test_sensor[sensor.nord_pool_se4_previous_price-entry] # name: test_sensor[sensor.nord_pool_se4_previous_price-entry]
@@ -2514,6 +2514,6 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '2.52406', 'state': '4.44274',
}) })
# --- # ---

File diff suppressed because it is too large Load Diff

View File

@@ -26,7 +26,7 @@ from tests.common import MockConfigEntry
from tests.test_util.aiohttp import AiohttpClientMocker from tests.test_util.aiohttp import AiohttpClientMocker
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
async def test_form(hass: HomeAssistant, get_client: NordPoolClient) -> None: async def test_form(hass: HomeAssistant, get_client: NordPoolClient) -> None:
"""Test we get the form.""" """Test we get the form."""
@@ -48,7 +48,7 @@ async def test_form(hass: HomeAssistant, get_client: NordPoolClient) -> None:
assert result["data"] == {"areas": ["SE3", "SE4"], "currency": "SEK"} assert result["data"] == {"areas": ["SE3", "SE4"], "currency": "SEK"}
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
async def test_single_config_entry( async def test_single_config_entry(
hass: HomeAssistant, load_int: None, get_client: NordPoolClient hass: HomeAssistant, load_int: None, get_client: NordPoolClient
) -> None: ) -> None:
@@ -61,7 +61,7 @@ async def test_single_config_entry(
assert result["reason"] == "single_instance_allowed" assert result["reason"] == "single_instance_allowed"
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
@pytest.mark.parametrize( @pytest.mark.parametrize(
("error_message", "p_error"), ("error_message", "p_error"),
[ [
@@ -107,7 +107,7 @@ async def test_cannot_connect(
assert result["data"] == {"areas": ["SE3", "SE4"], "currency": "SEK"} assert result["data"] == {"areas": ["SE3", "SE4"], "currency": "SEK"}
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
async def test_reconfigure( async def test_reconfigure(
hass: HomeAssistant, hass: HomeAssistant,
load_int: MockConfigEntry, load_int: MockConfigEntry,
@@ -134,7 +134,7 @@ async def test_reconfigure(
} }
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
@pytest.mark.parametrize( @pytest.mark.parametrize(
("error_message", "p_error"), ("error_message", "p_error"),
[ [

View File

@@ -31,7 +31,7 @@ from . import ENTRY_CONFIG
from tests.common import MockConfigEntry, async_fire_time_changed from tests.common import MockConfigEntry, async_fire_time_changed
@pytest.mark.freeze_time("2024-11-05T10:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T10:00:00+00:00")
async def test_coordinator( async def test_coordinator(
hass: HomeAssistant, hass: HomeAssistant,
get_client: NordPoolClient, get_client: NordPoolClient,
@@ -50,7 +50,26 @@ async def test_coordinator(
await hass.config_entries.async_setup(config_entry.entry_id) await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "0.92737" assert state.state == "0.67405"
assert "Next data update at 2025-10-01 11:00:00+00:00" in caplog.text
assert "Next listener update at 2025-10-01 10:15:00+00:00" in caplog.text
with (
patch(
"homeassistant.components.nordpool.coordinator.NordPoolClient.async_get_delivery_period",
wraps=get_client.async_get_delivery_period,
) as mock_data,
):
freezer.tick(timedelta(minutes=17))
async_fire_time_changed(hass)
await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 0
state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "0.63858"
assert "Next data update at 2025-10-01 11:00:00+00:00" in caplog.text
assert "Next listener update at 2025-10-01 10:30:00+00:00" in caplog.text
with ( with (
patch( patch(
@@ -63,7 +82,7 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True) await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1 assert mock_data.call_count == 1
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "0.92505" assert state.state == "0.66068"
with ( with (
patch( patch(
@@ -77,7 +96,7 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True) await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1 assert mock_data.call_count == 1
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "0.94949" assert state.state == "0.68544"
assert "Authentication error" in caplog.text assert "Authentication error" in caplog.text
with ( with (
@@ -93,7 +112,7 @@ async def test_coordinator(
# Empty responses does not raise # Empty responses does not raise
assert mock_data.call_count == 3 assert mock_data.call_count == 3
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "1.04203" assert state.state == "0.72953"
assert "Empty response" in caplog.text assert "Empty response" in caplog.text
with ( with (
@@ -108,7 +127,7 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True) await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1 assert mock_data.call_count == 1
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "1.25889" assert state.state == "0.90294"
assert "error" in caplog.text assert "error" in caplog.text
with ( with (
@@ -123,7 +142,7 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True) await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1 assert mock_data.call_count == 1
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "1.81645" assert state.state == "1.16266"
assert "error" in caplog.text assert "error" in caplog.text
with ( with (
@@ -138,14 +157,14 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True) await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1 assert mock_data.call_count == 1
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "2.51265" assert state.state == "1.90004"
assert "Response error" in caplog.text assert "Response error" in caplog.text
freezer.tick(timedelta(hours=1)) freezer.tick(timedelta(hours=1))
async_fire_time_changed(hass) async_fire_time_changed(hass)
await hass.async_block_till_done() await hass.async_block_till_done()
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "1.81983" assert state.state == "3.42983"
# Test manual polling # Test manual polling
hass.config_entries.async_update_entry( hass.config_entries.async_update_entry(
@@ -156,14 +175,14 @@ async def test_coordinator(
async_fire_time_changed(hass) async_fire_time_changed(hass)
await hass.async_block_till_done() await hass.async_block_till_done()
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "1.01177" assert state.state == "1.42403"
# Prices should update without any polling made (read from cache) # Prices should update without any polling made (read from cache)
freezer.tick(timedelta(hours=1)) freezer.tick(timedelta(hours=1))
async_fire_time_changed(hass) async_fire_time_changed(hass)
await hass.async_block_till_done() await hass.async_block_till_done()
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "0.83553" assert state.state == "1.1358"
# Test manually updating the data # Test manually updating the data
with ( with (
@@ -184,7 +203,7 @@ async def test_coordinator(
async_fire_time_changed(hass) async_fire_time_changed(hass)
await hass.async_block_till_done() await hass.async_block_till_done()
state = hass.states.get("sensor.nord_pool_se3_current_price") state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "0.79619" assert state.state == "0.933"
hass.config_entries.async_update_entry( hass.config_entries.async_update_entry(
entry=config_entry, pref_disable_polling=False entry=config_entry, pref_disable_polling=False

View File

@@ -12,7 +12,7 @@ from tests.components.diagnostics import get_diagnostics_for_config_entry
from tests.typing import ClientSessionGenerator from tests.typing import ClientSessionGenerator
@pytest.mark.freeze_time("2024-11-05T10:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T10:00:00+00:00")
async def test_diagnostics( async def test_diagnostics(
hass: HomeAssistant, hass: HomeAssistant,
hass_client: ClientSessionGenerator, hass_client: ClientSessionGenerator,

View File

@@ -28,7 +28,7 @@ from tests.common import MockConfigEntry, async_load_fixture
from tests.test_util.aiohttp import AiohttpClientMocker from tests.test_util.aiohttp import AiohttpClientMocker
@pytest.mark.freeze_time("2024-11-05T10:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T10:00:00+00:00")
async def test_unload_entry(hass: HomeAssistant, get_client: NordPoolClient) -> None: async def test_unload_entry(hass: HomeAssistant, get_client: NordPoolClient) -> None:
"""Test load and unload an entry.""" """Test load and unload an entry."""
entry = MockConfigEntry( entry = MockConfigEntry(
@@ -79,7 +79,7 @@ async def test_initial_startup_fails(
assert entry.state is ConfigEntryState.SETUP_RETRY assert entry.state is ConfigEntryState.SETUP_RETRY
@pytest.mark.freeze_time("2024-11-05T10:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T10:00:00+00:00")
async def test_reconfigure_cleans_up_device( async def test_reconfigure_cleans_up_device(
hass: HomeAssistant, hass: HomeAssistant,
aioclient_mock: AiohttpClientMocker, aioclient_mock: AiohttpClientMocker,
@@ -115,7 +115,7 @@ async def test_reconfigure_cleans_up_device(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-04", "date": "2025-09-30",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "NL", "deliveryArea": "NL",
"currency": "EUR", "currency": "EUR",
@@ -126,7 +126,7 @@ async def test_reconfigure_cleans_up_device(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-05", "date": "2025-10-01",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "NL", "deliveryArea": "NL",
"currency": "EUR", "currency": "EUR",
@@ -137,7 +137,7 @@ async def test_reconfigure_cleans_up_device(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-06", "date": "2025-10-02",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "NL", "deliveryArea": "NL",
"currency": "EUR", "currency": "EUR",

View File

@@ -20,7 +20,7 @@ from tests.common import async_fire_time_changed, snapshot_platform
from tests.test_util.aiohttp import AiohttpClientMocker from tests.test_util.aiohttp import AiohttpClientMocker
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
@pytest.mark.usefixtures("entity_registry_enabled_by_default") @pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_sensor( async def test_sensor(
hass: HomeAssistant, hass: HomeAssistant,
@@ -33,7 +33,7 @@ async def test_sensor(
await snapshot_platform(hass, entity_registry, snapshot, load_int.entry_id) await snapshot_platform(hass, entity_registry, snapshot, load_int.entry_id)
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
@pytest.mark.usefixtures("entity_registry_enabled_by_default") @pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_sensor_current_price_is_0( async def test_sensor_current_price_is_0(
hass: HomeAssistant, load_int: ConfigEntry hass: HomeAssistant, load_int: ConfigEntry
@@ -43,10 +43,10 @@ async def test_sensor_current_price_is_0(
current_price = hass.states.get("sensor.nord_pool_se4_current_price") current_price = hass.states.get("sensor.nord_pool_se4_current_price")
assert current_price is not None assert current_price is not None
assert current_price.state == "0.0" # SE4 2024-11-05T18:00:00Z assert current_price.state == "0.0" # SE4 2025-10-01T18:00:00Z
@pytest.mark.freeze_time("2024-11-05T23:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T21:45:00+00:00")
@pytest.mark.usefixtures("entity_registry_enabled_by_default") @pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_sensor_no_next_price(hass: HomeAssistant, load_int: ConfigEntry) -> None: async def test_sensor_no_next_price(hass: HomeAssistant, load_int: ConfigEntry) -> None:
"""Test the Nord Pool sensor.""" """Test the Nord Pool sensor."""
@@ -58,12 +58,12 @@ async def test_sensor_no_next_price(hass: HomeAssistant, load_int: ConfigEntry)
assert current_price is not None assert current_price is not None
assert last_price is not None assert last_price is not None
assert next_price is not None assert next_price is not None
assert current_price.state == "0.12666" # SE3 2024-11-05T23:00:00Z assert current_price.state == "0.78568" # SE3 2025-10-01T21:45:00Z
assert last_price.state == "0.28914" # SE3 2024-11-05T22:00:00Z assert last_price.state == "0.82171" # SE3 2025-10-01T21:30:00Z
assert next_price.state == "0.07406" # SE3 2024-11-06T00:00:00Z" assert next_price.state == "0.81174" # SE3 2025-10-01T22:00:00Z
@pytest.mark.freeze_time("2024-11-06T00:00:00+01:00") @pytest.mark.freeze_time("2025-10-02T00:00:00+02:00")
@pytest.mark.usefixtures("entity_registry_enabled_by_default") @pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_sensor_no_previous_price( async def test_sensor_no_previous_price(
hass: HomeAssistant, load_int: ConfigEntry hass: HomeAssistant, load_int: ConfigEntry
@@ -77,12 +77,12 @@ async def test_sensor_no_previous_price(
assert current_price is not None assert current_price is not None
assert last_price is not None assert last_price is not None
assert next_price is not None assert next_price is not None
assert current_price.state == "0.12666" # SE3 2024-11-05T23:00:00Z assert current_price.state == "0.93322" # SE3 2025-10-01T22:00:00Z
assert last_price.state == "0.28914" # SE3 2024-11-05T22:00:00Z assert last_price.state == "0.8605" # SE3 2025-10-01T21:45:00Z
assert next_price.state == "0.07406" # SE3 2024-11-06T00:00:00Z assert next_price.state == "0.83513" # SE3 2025-10-01T22:15:00Z
@pytest.mark.freeze_time("2024-11-05T11:00:01+01:00") @pytest.mark.freeze_time("2025-10-01T11:00:01+01:00")
@pytest.mark.usefixtures("entity_registry_enabled_by_default") @pytest.mark.usefixtures("entity_registry_enabled_by_default")
async def test_sensor_empty_response( async def test_sensor_empty_response(
hass: HomeAssistant, hass: HomeAssistant,
@@ -101,16 +101,16 @@ async def test_sensor_empty_response(
assert current_price is not None assert current_price is not None
assert last_price is not None assert last_price is not None
assert next_price is not None assert next_price is not None
assert current_price.state == "0.92737" assert current_price.state == "0.67405"
assert last_price.state == "1.03132" assert last_price.state == "0.8616"
assert next_price.state == "0.92505" assert next_price.state == "0.63736"
aioclient_mock.clear_requests() aioclient_mock.clear_requests()
aioclient_mock.request( aioclient_mock.request(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-04", "date": "2025-09-30",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3,SE4", "deliveryArea": "SE3,SE4",
"currency": "SEK", "currency": "SEK",
@@ -121,7 +121,7 @@ async def test_sensor_empty_response(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-05", "date": "2025-10-01",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3,SE4", "deliveryArea": "SE3,SE4",
"currency": "SEK", "currency": "SEK",
@@ -133,7 +133,7 @@ async def test_sensor_empty_response(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-06", "date": "2025-10-02",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3,SE4", "deliveryArea": "SE3,SE4",
"currency": "SEK", "currency": "SEK",
@@ -153,16 +153,16 @@ async def test_sensor_empty_response(
assert current_price is not None assert current_price is not None
assert last_price is not None assert last_price is not None
assert next_price is not None assert next_price is not None
assert current_price.state == "0.92505" assert current_price.state == "0.63736"
assert last_price.state == "0.92737" assert last_price.state == "0.67405"
assert next_price.state == "0.94949" assert next_price.state == "0.62233"
aioclient_mock.clear_requests() aioclient_mock.clear_requests()
aioclient_mock.request( aioclient_mock.request(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-04", "date": "2025-09-30",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3,SE4", "deliveryArea": "SE3,SE4",
"currency": "SEK", "currency": "SEK",
@@ -173,7 +173,7 @@ async def test_sensor_empty_response(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-05", "date": "2025-10-01",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3,SE4", "deliveryArea": "SE3,SE4",
"currency": "SEK", "currency": "SEK",
@@ -185,7 +185,7 @@ async def test_sensor_empty_response(
"GET", "GET",
url=API + "/DayAheadPrices", url=API + "/DayAheadPrices",
params={ params={
"date": "2024-11-06", "date": "2025-10-02",
"market": "DayAhead", "market": "DayAhead",
"deliveryArea": "SE3,SE4", "deliveryArea": "SE3,SE4",
"currency": "SEK", "currency": "SEK",
@@ -193,7 +193,7 @@ async def test_sensor_empty_response(
status=HTTPStatus.NO_CONTENT, status=HTTPStatus.NO_CONTENT,
) )
freezer.move_to("2024-11-05T22:00:01+00:00") freezer.move_to("2025-10-01T21:45:01+00:00")
async_fire_time_changed(hass) async_fire_time_changed(hass)
await hass.async_block_till_done(wait_background_tasks=True) await hass.async_block_till_done(wait_background_tasks=True)
@@ -206,6 +206,6 @@ async def test_sensor_empty_response(
assert current_price is not None assert current_price is not None
assert last_price is not None assert last_price is not None
assert next_price is not None assert next_price is not None
assert current_price.state == "0.28914" assert current_price.state == "0.78568"
assert last_price.state == "0.5223" assert last_price.state == "0.82171"
assert next_price.state == STATE_UNKNOWN assert next_price.state == STATE_UNKNOWN

View File

@@ -30,31 +30,31 @@ from tests.test_util.aiohttp import AiohttpClientMocker
TEST_SERVICE_DATA = { TEST_SERVICE_DATA = {
ATTR_CONFIG_ENTRY: "to_replace", ATTR_CONFIG_ENTRY: "to_replace",
ATTR_DATE: "2024-11-05", ATTR_DATE: "2025-10-01",
ATTR_AREAS: "SE3", ATTR_AREAS: "SE3",
ATTR_CURRENCY: "EUR", ATTR_CURRENCY: "EUR",
} }
TEST_SERVICE_DATA_USE_DEFAULTS = { TEST_SERVICE_DATA_USE_DEFAULTS = {
ATTR_CONFIG_ENTRY: "to_replace", ATTR_CONFIG_ENTRY: "to_replace",
ATTR_DATE: "2024-11-05", ATTR_DATE: "2025-10-01",
} }
TEST_SERVICE_INDICES_DATA_60 = { TEST_SERVICE_INDICES_DATA_60 = {
ATTR_CONFIG_ENTRY: "to_replace", ATTR_CONFIG_ENTRY: "to_replace",
ATTR_DATE: "2025-07-06", ATTR_DATE: "2025-10-01",
ATTR_AREAS: "SE3", ATTR_AREAS: "SE3",
ATTR_CURRENCY: "SEK", ATTR_CURRENCY: "SEK",
ATTR_RESOLUTION: 60, ATTR_RESOLUTION: 60,
} }
TEST_SERVICE_INDICES_DATA_15 = { TEST_SERVICE_INDICES_DATA_15 = {
ATTR_CONFIG_ENTRY: "to_replace", ATTR_CONFIG_ENTRY: "to_replace",
ATTR_DATE: "2025-07-06", ATTR_DATE: "2025-10-01",
ATTR_AREAS: "SE3", ATTR_AREAS: "SE3",
ATTR_CURRENCY: "SEK", ATTR_CURRENCY: "SEK",
ATTR_RESOLUTION: 15, ATTR_RESOLUTION: 15,
} }
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
async def test_service_call( async def test_service_call(
hass: HomeAssistant, hass: HomeAssistant,
load_int: MockConfigEntry, load_int: MockConfigEntry,
@@ -96,7 +96,7 @@ async def test_service_call(
(NordPoolError, "connection_error"), (NordPoolError, "connection_error"),
], ],
) )
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
async def test_service_call_failures( async def test_service_call_failures(
hass: HomeAssistant, hass: HomeAssistant,
load_int: MockConfigEntry, load_int: MockConfigEntry,
@@ -124,7 +124,7 @@ async def test_service_call_failures(
assert err.value.translation_key == key assert err.value.translation_key == key
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
async def test_empty_response_returns_empty_list( async def test_empty_response_returns_empty_list(
hass: HomeAssistant, hass: HomeAssistant,
load_int: MockConfigEntry, load_int: MockConfigEntry,
@@ -151,7 +151,7 @@ async def test_empty_response_returns_empty_list(
assert response == snapshot assert response == snapshot
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
async def test_service_call_config_entry_bad_state( async def test_service_call_config_entry_bad_state(
hass: HomeAssistant, hass: HomeAssistant,
load_int: MockConfigEntry, load_int: MockConfigEntry,
@@ -184,7 +184,7 @@ async def test_service_call_config_entry_bad_state(
assert err.value.translation_key == "entry_not_loaded" assert err.value.translation_key == "entry_not_loaded"
@pytest.mark.freeze_time("2024-11-05T18:00:00+00:00") @pytest.mark.freeze_time("2025-10-01T18:00:00+00:00")
async def test_service_call_for_price_indices( async def test_service_call_for_price_indices(
hass: HomeAssistant, hass: HomeAssistant,
load_int: MockConfigEntry, load_int: MockConfigEntry,
@@ -200,7 +200,7 @@ async def test_service_call_for_price_indices(
"GET", "GET",
url=API + "/DayAheadPriceIndices", url=API + "/DayAheadPriceIndices",
params={ params={
"date": "2025-07-06", "date": "2025-10-01",
"market": "DayAhead", "market": "DayAhead",
"indexNames": "SE3", "indexNames": "SE3",
"currency": "SEK", "currency": "SEK",
@@ -213,7 +213,7 @@ async def test_service_call_for_price_indices(
"GET", "GET",
url=API + "/DayAheadPriceIndices", url=API + "/DayAheadPriceIndices",
params={ params={
"date": "2025-07-06", "date": "2025-10-01",
"market": "DayAhead", "market": "DayAhead",
"indexNames": "SE3", "indexNames": "SE3",
"currency": "SEK", "currency": "SEK",

View File

@@ -166,6 +166,7 @@ def mock_smartthings() -> Generator[AsyncMock]:
"hw_q80r_soundbar", "hw_q80r_soundbar",
"gas_meter", "gas_meter",
"lumi", "lumi",
"tesla_powerwall",
] ]
) )
def device_fixture( def device_fixture(

View File

@@ -0,0 +1,107 @@
{
"components": {
"charge": {
"powerMeter": {
"power": {
"value": 0,
"unit": "W",
"timestamp": "2025-10-02T12:21:29.196Z"
}
},
"powerConsumptionReport": {
"powerConsumption": {
"value": {
"start": "2025-10-02T12:20:00Z",
"end": "2025-10-02T12:25:00Z",
"energy": 29765947,
"deltaEnergy": 0
},
"timestamp": "2025-10-02T12:26:24.729Z"
}
}
},
"discharge": {
"powerMeter": {
"power": {
"value": 0,
"unit": "W",
"timestamp": "2025-10-02T11:41:20.556Z"
}
},
"powerConsumptionReport": {
"powerConsumption": {
"value": {
"start": "2025-10-02T12:20:00Z",
"end": "2025-10-02T12:25:00Z",
"energy": 27827062,
"deltaEnergy": 0
},
"timestamp": "2025-10-02T12:26:24.729Z"
}
}
},
"main": {
"healthCheck": {
"checkInterval": {
"value": 60,
"unit": "s",
"data": {
"deviceScheme": "UNTRACKED",
"protocol": "cloud"
},
"timestamp": "2025-10-02T11:56:25.223Z"
},
"healthStatus": {
"value": null
},
"DeviceWatch-Enroll": {
"value": null
},
"DeviceWatch-DeviceStatus": {
"value": "online",
"data": {},
"timestamp": "2025-10-02T11:56:25.223Z"
}
},
"rivertalent14263.adaptiveEnergyUsageState": {
"stormWatchEnabled": {
"value": true,
"timestamp": "2024-07-16T12:40:19.190Z"
},
"stormWatchActive": {
"value": false,
"timestamp": "2024-07-16T12:40:19.190Z"
},
"gridStatusSupport": {
"value": true,
"timestamp": "2024-07-16T12:40:19.190Z"
},
"stormWatchSupport": {
"value": true,
"timestamp": "2025-09-17T18:31:31.669Z"
},
"energyUsageState": {
"value": null
},
"gridStatusStatus": {
"value": "on-grid",
"timestamp": "2025-09-17T18:31:31.669Z"
}
},
"refresh": {},
"battery": {
"quantity": {
"value": null
},
"battery": {
"value": 35,
"unit": "%",
"timestamp": "2025-10-02T11:41:20.556Z"
},
"type": {
"value": null
}
}
}
}
}

View File

@@ -0,0 +1,103 @@
{
"items": [
{
"deviceId": "d2595c45-df6e-41ac-a7af-8e275071c19b",
"name": "UDHN-TESLA-ENERGY-BATTERY",
"label": "Powerwall",
"manufacturerName": "0AHI",
"presentationId": "STES-1-PV-TESLA-ENERGY-BATTERY",
"locationId": "d22d6401-6070-4928-8e7b-b724e2dbf425",
"ownerId": "35445a41-3ae2-4bc0-6f51-31705de6b96f",
"components": [
{
"id": "main",
"label": "main",
"capabilities": [
{
"id": "healthCheck",
"version": 1
},
{
"id": "refresh",
"version": 1
},
{
"id": "rivertalent14263.adaptiveEnergyUsageState",
"version": 1
},
{
"id": "battery",
"version": 1
}
],
"categories": [
{
"name": "Battery",
"categoryType": "manufacturer"
}
],
"optional": false
},
{
"id": "discharge",
"label": "discharge",
"capabilities": [
{
"id": "powerConsumptionReport",
"version": 1
},
{
"id": "powerMeter",
"version": 1
}
],
"categories": [
{
"name": "Other",
"categoryType": "manufacturer"
}
],
"optional": false
},
{
"id": "charge",
"label": "charge",
"capabilities": [
{
"id": "powerConsumptionReport",
"version": 1
},
{
"id": "powerMeter",
"version": 1
}
],
"categories": [
{
"name": "Other",
"categoryType": "manufacturer"
}
],
"optional": false
}
],
"createTime": "2024-07-16T12:40:18.632Z",
"profile": {
"id": "4f9998dc-e672-4baf-8521-5e9b853fc978"
},
"app": {
"installedAppId": "e798c0a6-3e3b-4299-8463-438fc3f1e6b3",
"externalId": "TESLABATTERY_1689188152863574",
"profile": {
"id": "4f9998dc-e672-4baf-8521-5e9b853fc978"
}
},
"type": "ENDPOINT_APP",
"restrictionTier": 0,
"allowed": null,
"executionContext": "CLOUD",
"relationships": []
}
],
"_links": {}
}

View File

@@ -1893,6 +1893,37 @@
'via_device_id': None, 'via_device_id': None,
}) })
# --- # ---
# name: test_devices[tesla_powerwall]
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': 'https://account.smartthings.com',
'connections': set({
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'smartthings',
'd2595c45-df6e-41ac-a7af-8e275071c19b',
),
}),
'labels': set({
}),
'manufacturer': None,
'model': None,
'model_id': None,
'name': 'Powerwall',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'sw_version': None,
'via_device_id': None,
})
# ---
# name: test_devices[tplink_p110] # name: test_devices[tplink_p110]
DeviceRegistryEntrySnapshot({ DeviceRegistryEntrySnapshot({
'area_id': None, 'area_id': None,

View File

@@ -13969,6 +13969,56 @@
'state': '20', 'state': '20',
}) })
# --- # ---
# name: test_all_entities[tesla_powerwall][sensor.powerwall_battery-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.powerwall_battery',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.BATTERY: 'battery'>,
'original_icon': None,
'original_name': 'Battery',
'platform': 'smartthings',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': None,
'unique_id': 'd2595c45-df6e-41ac-a7af-8e275071c19b_main_battery_battery_battery',
'unit_of_measurement': '%',
})
# ---
# name: test_all_entities[tesla_powerwall][sensor.powerwall_battery-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'battery',
'friendly_name': 'Powerwall Battery',
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'sensor.powerwall_battery',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '35',
})
# ---
# name: test_all_entities[tplink_p110][sensor.spulmaschine_energy-entry] # name: test_all_entities[tplink_p110][sensor.spulmaschine_energy-entry]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ 'aliases': set({

View File

@@ -147,17 +147,6 @@ def mock_multiple_device_responses(
) )
def mock_air_purifier_400s_update_response(aioclient_mock: AiohttpClientMocker) -> None:
"""Build a response for the Helpers.call_api method for air_purifier_400s with updated data."""
device_name = "Air Purifier 400s"
for fixture in DEVICE_FIXTURES[device_name]:
getattr(aioclient_mock, fixture[0])(
f"https://smartapi.vesync.com{fixture[1]}",
json=load_json_object_fixture("air-purifier-detail-updated.json", DOMAIN),
)
def mock_device_response( def mock_device_response(
aioclient_mock: AiohttpClientMocker, device_name: str, override: Any aioclient_mock: AiohttpClientMocker, device_name: str, override: Any
) -> None: ) -> None:

View File

@@ -1,97 +0,0 @@
"""Tests for the coordinator."""
from datetime import timedelta
from freezegun.api import FrozenDateTimeFactory
from homeassistant.components.vesync.const import DOMAIN, UPDATE_INTERVAL
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, STATE_UNAVAILABLE
from homeassistant.core import HomeAssistant
from .common import (
mock_air_purifier_400s_update_response,
mock_device_response,
mock_multiple_device_responses,
mock_outlet_energy_response,
)
from tests.common import MockConfigEntry, async_fire_time_changed
from tests.test_util.aiohttp import AiohttpClientMocker
async def test_entity_update(
hass: HomeAssistant,
freezer: FrozenDateTimeFactory,
aioclient_mock: AiohttpClientMocker,
) -> None:
"""Test Vesync coordinator data update.
This test sets up a single device `Air Purifier 400s` and then updates it via the coordinator.
"""
config_data = {CONF_PASSWORD: "username", CONF_USERNAME: "password"}
config_entry = MockConfigEntry(
data=config_data,
domain=DOMAIN,
unique_id="vesync_unique_id_1",
entry_id="1",
)
mock_multiple_device_responses(aioclient_mock, ["Air Purifier 400s", "Outlet"])
mock_outlet_energy_response(aioclient_mock, "Outlet")
expected_entities = [
# From "Air Purifier 400s"
"fan.air_purifier_400s",
"sensor.air_purifier_400s_filter_lifetime",
"sensor.air_purifier_400s_air_quality",
"sensor.air_purifier_400s_pm2_5",
# From Outlet
"switch.outlet",
"sensor.outlet_current_power",
"sensor.outlet_energy_use_today",
"sensor.outlet_energy_use_weekly",
"sensor.outlet_energy_use_monthly",
"sensor.outlet_energy_use_yearly",
"sensor.outlet_current_voltage",
]
config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
assert config_entry.state is ConfigEntryState.LOADED
for entity_id in expected_entities:
assert hass.states.get(entity_id).state != STATE_UNAVAILABLE
assert hass.states.get("sensor.air_purifier_400s_pm2_5").state == "5"
assert hass.states.get("sensor.air_purifier_400s_air_quality").state == "excellent"
assert hass.states.get("sensor.outlet_current_voltage").state == "120.0"
assert hass.states.get("sensor.outlet_energy_use_weekly").state == "0.0"
# Update the mock responses
aioclient_mock.clear_requests()
mock_air_purifier_400s_update_response(aioclient_mock)
mock_device_response(aioclient_mock, "Outlet", {"voltage": 129})
mock_outlet_energy_response(aioclient_mock, "Outlet", {"totalEnergy": 2.2})
freezer.tick(timedelta(seconds=UPDATE_INTERVAL))
async_fire_time_changed(hass)
await hass.async_block_till_done(True)
assert hass.states.get("sensor.air_purifier_400s_pm2_5").state == "15"
assert hass.states.get("sensor.air_purifier_400s_air_quality").state == "good"
assert hass.states.get("sensor.outlet_current_voltage").state == "129.0"
assert hass.states.get("sensor.outlet_energy_use_weekly").state == "0.0"
# energy history only updates once every 6 hours.
freezer.tick(timedelta(hours=6))
async_fire_time_changed(hass)
await hass.async_block_till_done(True)
assert hass.states.get("sensor.air_purifier_400s_pm2_5").state == "15"
assert hass.states.get("sensor.air_purifier_400s_air_quality").state == "good"
assert hass.states.get("sensor.outlet_current_voltage").state == "129.0"
assert hass.states.get("sensor.outlet_energy_use_weekly").state == "2.2"

View File

@@ -70,6 +70,11 @@ async def test_holiday_calendar_entity(
async_fire_time_changed(hass) async_fire_time_changed(hass)
await hass.async_block_till_done() await hass.async_block_till_done()
# Binary sensor added to ensure same state for both entities
state = hass.states.get("binary_sensor.workday_sensor")
assert state is not None
assert state.state == "on"
state = hass.states.get("calendar.workday_sensor_calendar") state = hass.states.get("calendar.workday_sensor_calendar")
assert state is not None assert state is not None
assert state.state == "on" assert state.state == "on"
@@ -78,6 +83,10 @@ async def test_holiday_calendar_entity(
async_fire_time_changed(hass) async_fire_time_changed(hass)
await hass.async_block_till_done() await hass.async_block_till_done()
state = hass.states.get("binary_sensor.workday_sensor")
assert state is not None
assert state.state == "off"
state = hass.states.get("calendar.workday_sensor_calendar") state = hass.states.get("calendar.workday_sensor_calendar")
assert state is not None assert state is not None
assert state.state == "off" assert state.state == "off"

View File

@@ -160,7 +160,7 @@ def mock_detect_radio_type(
def com_port(device="/dev/ttyUSB1234") -> ListPortInfo: def com_port(device="/dev/ttyUSB1234") -> ListPortInfo:
"""Mock of a serial port.""" """Mock of a serial port."""
port = ListPortInfo("/dev/ttyUSB1234") port = ListPortInfo(device)
port.serial_number = "1234" port.serial_number = "1234"
port.manufacturer = "Virtual serial port" port.manufacturer = "Virtual serial port"
port.device = device port.device = device
@@ -2102,7 +2102,7 @@ async def test_options_flow_defaults(
assert result1["step_id"] == "prompt_migrate_or_reconfigure" assert result1["step_id"] == "prompt_migrate_or_reconfigure"
result2 = await hass.config_entries.options.async_configure( result2 = await hass.config_entries.options.async_configure(
flow["flow_id"], flow["flow_id"],
user_input={"next_step_id": config_flow.OPTIONS_INTENT_RECONFIGURE}, user_input={"next_step_id": config_flow.OptionsMigrationIntent.RECONFIGURE},
) )
# Current path is the default # Current path is the default
@@ -2180,8 +2180,8 @@ async def test_options_flow_defaults(
) )
await hass.async_block_till_done() await hass.async_block_till_done()
assert result7["type"] is FlowResultType.CREATE_ENTRY assert result7["type"] is FlowResultType.ABORT
assert result7["data"] == {} assert result7["reason"] == "reconfigure_successful"
# The updated entry contains correct settings # The updated entry contains correct settings
assert entry.data == { assert entry.data == {
@@ -2240,7 +2240,7 @@ async def test_options_flow_defaults_socket(hass: HomeAssistant) -> None:
assert result1["step_id"] == "prompt_migrate_or_reconfigure" assert result1["step_id"] == "prompt_migrate_or_reconfigure"
result2 = await hass.config_entries.options.async_configure( result2 = await hass.config_entries.options.async_configure(
flow["flow_id"], flow["flow_id"],
user_input={"next_step_id": config_flow.OPTIONS_INTENT_RECONFIGURE}, user_input={"next_step_id": config_flow.OptionsMigrationIntent.RECONFIGURE},
) )
# Radio path must be manually entered # Radio path must be manually entered
@@ -2320,7 +2320,7 @@ async def test_options_flow_restarts_running_zha_if_cancelled(
assert result1["step_id"] == "prompt_migrate_or_reconfigure" assert result1["step_id"] == "prompt_migrate_or_reconfigure"
result2 = await hass.config_entries.options.async_configure( result2 = await hass.config_entries.options.async_configure(
flow["flow_id"], flow["flow_id"],
user_input={"next_step_id": config_flow.OPTIONS_INTENT_RECONFIGURE}, user_input={"next_step_id": config_flow.OptionsMigrationIntent.RECONFIGURE},
) )
# Radio path must be manually entered # Radio path must be manually entered
@@ -2336,19 +2336,18 @@ async def test_options_flow_restarts_running_zha_if_cancelled(
async_setup_entry.assert_called_once_with(hass, entry) async_setup_entry.assert_called_once_with(hass, entry)
@patch("serial.tools.list_ports.comports", MagicMock(return_value=[com_port()]))
@patch("homeassistant.components.zha.async_setup_entry", AsyncMock(return_value=True)) @patch("homeassistant.components.zha.async_setup_entry", AsyncMock(return_value=True))
async def test_options_flow_migration_reset_old_adapter( async def test_options_flow_migration_reset_old_adapter(
hass: HomeAssistant, mock_app hass: HomeAssistant, backup, mock_app
) -> None: ) -> None:
"""Test options flow for migrating from an old radio.""" """Test options flow for migrating resets the old radio, not the new one."""
entry = MockConfigEntry( entry = MockConfigEntry(
version=config_flow.ZhaConfigFlowHandler.VERSION, version=config_flow.ZhaConfigFlowHandler.VERSION,
domain=DOMAIN, domain=DOMAIN,
data={ data={
CONF_DEVICE: { CONF_DEVICE: {
CONF_DEVICE_PATH: "/dev/serial/by-id/old_radio", CONF_DEVICE_PATH: "/dev/ttyUSB_old",
CONF_BAUDRATE: 12345, CONF_BAUDRATE: 12345,
CONF_FLOW_CONTROL: None, CONF_FLOW_CONTROL: None,
}, },
@@ -2366,39 +2365,158 @@ async def test_options_flow_migration_reset_old_adapter(
with patch( with patch(
"homeassistant.config_entries.ConfigEntries.async_unload", return_value=True "homeassistant.config_entries.ConfigEntries.async_unload", return_value=True
): ):
result1 = await hass.config_entries.options.async_configure( result_init = await hass.config_entries.options.async_configure(
flow["flow_id"], user_input={} flow["flow_id"], user_input={}
) )
entry.mock_state(hass, ConfigEntryState.NOT_LOADED) entry.mock_state(hass, ConfigEntryState.NOT_LOADED)
assert result1["step_id"] == "prompt_migrate_or_reconfigure" assert result_init["step_id"] == "prompt_migrate_or_reconfigure"
result2 = await hass.config_entries.options.async_configure(
flow["flow_id"], with (
user_input={"next_step_id": config_flow.OPTIONS_INTENT_MIGRATE}, patch(
"homeassistant.components.zha.radio_manager.ZhaRadioManager.detect_radio_type",
return_value=ProbeResult.RADIO_TYPE_DETECTED,
),
patch(
"serial.tools.list_ports.comports",
MagicMock(return_value=[com_port("/dev/ttyUSB_new")]),
),
patch(
"homeassistant.components.zha.radio_manager.ZhaRadioManager._async_read_backups_from_database",
return_value=[backup],
),
):
result_migrate = await hass.config_entries.options.async_configure(
flow["flow_id"],
user_input={"next_step_id": config_flow.OptionsMigrationIntent.MIGRATE},
)
# Now we choose the new radio
assert result_migrate["step_id"] == "choose_serial_port"
result_port = await hass.config_entries.options.async_configure(
flow["flow_id"],
user_input={
CONF_DEVICE_PATH: "/dev/ttyUSB_new - Some serial port, s/n: 1234 - Virtual serial port"
},
)
assert result_port["step_id"] == "choose_migration_strategy"
# A temporary radio manager is created to reset the old adapter
mock_radio_manager = AsyncMock()
with patch(
"homeassistant.components.zha.config_flow.ZhaRadioManager",
spec=ZhaRadioManager,
side_effect=[mock_radio_manager],
):
result_strategy = await hass.config_entries.options.async_configure(
flow["flow_id"],
user_input={
"next_step_id": config_flow.MIGRATION_STRATEGY_RECOMMENDED,
},
)
# The old adapter is reset, not the new one
assert mock_radio_manager.device_path == "/dev/ttyUSB_old"
assert mock_radio_manager.async_reset_adapter.call_count == 1
assert result_strategy["type"] is FlowResultType.ABORT
assert result_strategy["reason"] == "reconfigure_successful"
# The entry is updated
assert entry.data["device"]["path"] == "/dev/ttyUSB_new"
@patch("serial.tools.list_ports.comports", MagicMock(return_value=[com_port()]))
@patch("homeassistant.components.zha.async_setup_entry", AsyncMock(return_value=True))
async def test_options_flow_reconfigure_no_reset(
hass: HomeAssistant, backup, mock_app
) -> None:
"""Test options flow for reconfiguring does not require the old adapter."""
entry = MockConfigEntry(
version=config_flow.ZhaConfigFlowHandler.VERSION,
domain=DOMAIN,
data={
CONF_DEVICE: {
CONF_DEVICE_PATH: "/dev/ttyUSB_old",
CONF_BAUDRATE: 12345,
CONF_FLOW_CONTROL: None,
},
CONF_RADIO_TYPE: "znp",
},
) )
entry.add_to_hass(hass)
# User must explicitly approve radio reset await hass.config_entries.async_setup(entry.entry_id)
assert result2["step_id"] == "intent_migrate" await hass.async_block_till_done()
mock_app.reset_network_info = AsyncMock() flow = await hass.config_entries.options.async_init(entry.entry_id)
result3 = await hass.config_entries.options.async_configure( # ZHA gets unloaded
flow["flow_id"], with patch(
user_input={}, "homeassistant.config_entries.ConfigEntries.async_unload", return_value=True
) ):
result_init = await hass.config_entries.options.async_configure(
flow["flow_id"], user_input={}
)
mock_app.reset_network_info.assert_awaited_once() entry.mock_state(hass, ConfigEntryState.NOT_LOADED)
# Now we can unplug the old radio assert result_init["step_id"] == "prompt_migrate_or_reconfigure"
assert result3["step_id"] == "instruct_unplug"
# And move on to choosing the new radio with (
result4 = await hass.config_entries.options.async_configure( patch(
flow["flow_id"], "homeassistant.components.zha.radio_manager.ZhaRadioManager.detect_radio_type",
user_input={}, return_value=ProbeResult.RADIO_TYPE_DETECTED,
) ),
assert result4["step_id"] == "choose_serial_port" patch(
"serial.tools.list_ports.comports",
MagicMock(return_value=[com_port("/dev/ttyUSB_new")]),
),
patch(
"homeassistant.components.zha.radio_manager.ZhaRadioManager._async_read_backups_from_database",
return_value=[backup],
),
):
result_reconfigure = await hass.config_entries.options.async_configure(
flow["flow_id"],
user_input={"next_step_id": config_flow.OptionsMigrationIntent.RECONFIGURE},
)
# Now we choose the new radio
assert result_reconfigure["step_id"] == "choose_serial_port"
result_port = await hass.config_entries.options.async_configure(
flow["flow_id"],
user_input={
CONF_DEVICE_PATH: "/dev/ttyUSB_new - Some serial port, s/n: 1234 - Virtual serial port"
},
)
assert result_port["step_id"] == "choose_migration_strategy"
with patch(
"homeassistant.components.zha.config_flow.ZhaRadioManager"
) as mock_radio_manager:
result_strategy = await hass.config_entries.options.async_configure(
flow["flow_id"],
user_input={
"next_step_id": config_flow.MIGRATION_STRATEGY_RECOMMENDED,
},
)
# A temp radio manager is never created
assert mock_radio_manager.call_count == 0
assert result_strategy["type"] is FlowResultType.ABORT
assert result_strategy["reason"] == "reconfigure_successful"
# The entry is updated
assert entry.data["device"]["path"] == "/dev/ttyUSB_new"
@pytest.mark.parametrize( @pytest.mark.parametrize(

View File

@@ -1168,7 +1168,7 @@ async def test_usb_discovery_migration_restore_driver_ready_timeout(
@pytest.mark.usefixtures("supervisor", "addon_not_installed", "addon_info") @pytest.mark.usefixtures("supervisor", "addon_not_installed", "addon_info")
async def test_esphome_discovery( async def test_esphome_discovery_intent_custom(
hass: HomeAssistant, hass: HomeAssistant,
install_addon: AsyncMock, install_addon: AsyncMock,
set_addon_options: AsyncMock, set_addon_options: AsyncMock,
@@ -1290,6 +1290,82 @@ async def test_esphome_discovery(
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
@pytest.mark.usefixtures("supervisor", "addon_installed", "addon_running", "addon_info")
async def test_esphome_discovery_intent_recommended(
hass: HomeAssistant,
set_addon_options: AsyncMock,
addon_options: dict,
) -> None:
"""Test ESPHome discovery success path."""
addon_options.update(
{
CONF_ADDON_DEVICE: "/dev/ttyUSB0",
CONF_ADDON_SOCKET: None,
"s0_legacy_key": "new123",
"s2_access_control_key": "new456",
"s2_authenticated_key": "new789",
"s2_unauthenticated_key": "new987",
"lr_s2_access_control_key": "new654",
"lr_s2_authenticated_key": "new321",
}
)
result = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": config_entries.SOURCE_ESPHOME},
data=ESPHOME_DISCOVERY_INFO,
)
assert result["type"] is FlowResultType.MENU
assert result["step_id"] == "installation_type"
assert result["menu_options"] == ["intent_recommended", "intent_custom"]
with (
patch(
"homeassistant.components.zwave_js.async_setup", return_value=True
) as mock_setup,
patch(
"homeassistant.components.zwave_js.async_setup_entry",
return_value=True,
) as mock_setup_entry,
):
result = await hass.config_entries.flow.async_configure(
result["flow_id"], {"next_step_id": "intent_recommended"}
)
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["title"] == TITLE
assert result["result"].unique_id == str(ESPHOME_DISCOVERY_INFO.zwave_home_id)
assert result["data"] == {
"url": "ws://host1:3001",
"usb_path": None,
"socket_path": "esphome://192.168.1.100:6053",
"s0_legacy_key": "new123",
"s2_access_control_key": "new456",
"s2_authenticated_key": "new789",
"s2_unauthenticated_key": "new987",
"lr_s2_access_control_key": "new654",
"lr_s2_authenticated_key": "new321",
"use_addon": True,
"integration_created_addon": False,
}
assert set_addon_options.call_args == call(
"core_zwave_js",
AddonsOptions(
config={
"socket": "esphome://192.168.1.100:6053",
"s0_legacy_key": "new123",
"s2_access_control_key": "new456",
"s2_authenticated_key": "new789",
"s2_unauthenticated_key": "new987",
"lr_s2_access_control_key": "new654",
"lr_s2_authenticated_key": "new321",
}
),
)
assert len(mock_setup.mock_calls) == 1
assert len(mock_setup_entry.mock_calls) == 1
@pytest.mark.usefixtures("supervisor", "addon_installed", "addon_info") @pytest.mark.usefixtures("supervisor", "addon_installed", "addon_info")
async def test_esphome_discovery_already_configured( async def test_esphome_discovery_already_configured(
hass: HomeAssistant, hass: HomeAssistant,
@@ -1303,7 +1379,11 @@ async def test_esphome_discovery_already_configured(
entry = MockConfigEntry( entry = MockConfigEntry(
entry_id="mock-entry-id", entry_id="mock-entry-id",
domain=DOMAIN, domain=DOMAIN,
data={CONF_SOCKET_PATH: "esphome://existing-device:6053"}, data={
CONF_SOCKET_PATH: "esphome://existing-device:6053",
"use_addon": True,
"integration_created_addon": True,
},
title=TITLE, title=TITLE,
unique_id="1234", unique_id="1234",
) )
@@ -1333,6 +1413,117 @@ async def test_esphome_discovery_already_configured(
) )
@pytest.mark.usefixtures("supervisor", "addon_not_installed", "addon_info")
async def test_esphome_discovery_usb_same_home_id(
hass: HomeAssistant,
install_addon: AsyncMock,
set_addon_options: AsyncMock,
start_addon: AsyncMock,
) -> None:
"""Test ESPHome discovery works if USB stick with same home ID is configured."""
entry = MockConfigEntry(
entry_id="mock-entry-id",
domain=DOMAIN,
data={
CONF_USB_PATH: "/dev/ttyUSB0",
"use_addon": True,
"integration_created_addon": True,
},
title=TITLE,
unique_id="1234",
)
entry.add_to_hass(hass)
result = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": config_entries.SOURCE_ESPHOME},
data=ESPHOME_DISCOVERY_INFO,
)
assert result["type"] is FlowResultType.MENU
assert result["step_id"] == "installation_type"
assert result["menu_options"] == ["intent_recommended", "intent_custom"]
result = await hass.config_entries.flow.async_configure(
result["flow_id"], {"next_step_id": "intent_custom"}
)
assert result["step_id"] == "install_addon"
assert result["type"] is FlowResultType.SHOW_PROGRESS
# Make sure the flow continues when the progress task is done.
await hass.async_block_till_done()
result = await hass.config_entries.flow.async_configure(result["flow_id"])
assert install_addon.call_args == call("core_zwave_js")
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "network_type"
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
"network_type": "existing",
},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "configure_security_keys"
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
"s0_legacy_key": "new123",
"s2_access_control_key": "new456",
"s2_authenticated_key": "new789",
"s2_unauthenticated_key": "new987",
"lr_s2_access_control_key": "new654",
"lr_s2_authenticated_key": "new321",
},
)
assert set_addon_options.call_args == call(
"core_zwave_js",
AddonsOptions(
config={
"socket": "esphome://192.168.1.100:6053",
"s0_legacy_key": "new123",
"s2_access_control_key": "new456",
"s2_authenticated_key": "new789",
"s2_unauthenticated_key": "new987",
"lr_s2_access_control_key": "new654",
"lr_s2_authenticated_key": "new321",
}
),
)
assert result["type"] is FlowResultType.SHOW_PROGRESS
assert result["step_id"] == "start_addon"
await hass.async_block_till_done()
result = await hass.config_entries.flow.async_configure(result["flow_id"])
await hass.async_block_till_done()
assert start_addon.call_args == call("core_zwave_js")
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "migration_successful"
assert entry.data == {
"url": "ws://host1:3001",
"usb_path": None,
"socket_path": "esphome://192.168.1.100:6053",
"s0_legacy_key": "new123",
"s2_access_control_key": "new456",
"s2_authenticated_key": "new789",
"s2_unauthenticated_key": "new987",
"lr_s2_access_control_key": "new654",
"lr_s2_authenticated_key": "new321",
"use_addon": True,
"integration_created_addon": True,
}
@pytest.mark.usefixtures("supervisor", "addon_installed") @pytest.mark.usefixtures("supervisor", "addon_installed")
async def test_discovery_addon_not_running( async def test_discovery_addon_not_running(
hass: HomeAssistant, hass: HomeAssistant,

View File

@@ -1073,6 +1073,16 @@ async def test_light_color_only(
) )
await update_color(0, 0, 0) await update_color(0, 0, 0)
# Turn off again and make sure last color/brightness is still preserved
# when turning on light again in the next step
await hass.services.async_call(
LIGHT_DOMAIN,
SERVICE_TURN_OFF,
{ATTR_ENTITY_ID: HSM200_V1_ENTITY},
blocking=True,
)
await update_color(0, 0, 0)
client.async_send_command.reset_mock() client.async_send_command.reset_mock()
# Assert that the brightness is preserved when turning on with color # Assert that the brightness is preserved when turning on with color
@@ -1095,6 +1105,92 @@ async def test_light_color_only(
client.async_send_command.reset_mock() client.async_send_command.reset_mock()
await update_color(0, 0, 123)
# Turn off twice
await hass.services.async_call(
LIGHT_DOMAIN,
SERVICE_TURN_OFF,
{ATTR_ENTITY_ID: HSM200_V1_ENTITY},
blocking=True,
)
await update_color(0, 0, 0)
await hass.services.async_call(
LIGHT_DOMAIN,
SERVICE_TURN_OFF,
{ATTR_ENTITY_ID: HSM200_V1_ENTITY},
blocking=True,
)
await update_color(0, 0, 0)
state = hass.states.get(HSM200_V1_ENTITY)
assert state.state == STATE_OFF
client.async_send_command.reset_mock()
# Assert that turning on after successive off calls works and keeps the last color
await hass.services.async_call(
LIGHT_DOMAIN,
SERVICE_TURN_ON,
{ATTR_ENTITY_ID: HSM200_V1_ENTITY, ATTR_BRIGHTNESS: 150},
blocking=True,
)
assert len(client.async_send_command.call_args_list) == 1
args = client.async_send_command.call_args_list[0][0][0]
assert args["command"] == "node.set_value"
assert args["nodeId"] == node.node_id
assert args["valueId"] == {
"commandClass": 51,
"endpoint": 0,
"property": "targetColor",
}
assert args["value"] == {"red": 0, "green": 0, "blue": 150}
client.async_send_command.reset_mock()
await update_color(0, 0, 150)
# Force the light to turn off
await update_color(0, 0, 0)
# Turn off already off light, we won't be aware of last color and brightness
await hass.services.async_call(
LIGHT_DOMAIN,
SERVICE_TURN_OFF,
{ATTR_ENTITY_ID: HSM200_V1_ENTITY},
blocking=True,
)
await update_color(0, 0, 0)
state = hass.states.get(HSM200_V1_ENTITY)
assert state.state == STATE_OFF
client.async_send_command.reset_mock()
# Assert that turning on light after off call with unknown off color/brightness state
# works and that light turns on to white with specified brightness
await hass.services.async_call(
LIGHT_DOMAIN,
SERVICE_TURN_ON,
{ATTR_ENTITY_ID: HSM200_V1_ENTITY, ATTR_BRIGHTNESS: 160},
blocking=True,
)
assert len(client.async_send_command.call_args_list) == 1
args = client.async_send_command.call_args_list[0][0][0]
assert args["command"] == "node.set_value"
assert args["nodeId"] == node.node_id
assert args["valueId"] == {
"commandClass": 51,
"endpoint": 0,
"property": "targetColor",
}
assert args["value"] == {"red": 160, "green": 160, "blue": 160}
client.async_send_command.reset_mock()
await update_color(160, 160, 160)
# Clear the color value to trigger an unknown state # Clear the color value to trigger an unknown state
event = Event( event = Event(
type="value updated", type="value updated",