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
build_from:
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2025.09.3
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2025.09.3
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2025.09.3
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2025.09.3
i386: ghcr.io/home-assistant/i386-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.10.0
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2025.10.0
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2025.10.0
i386: ghcr.io/home-assistant/i386-homeassistant-base:2025.10.0
codenotary:
signer: notary@home-assistant.io
base_image: notary@home-assistant.io

View File

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

View File

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

View File

@@ -2,26 +2,34 @@
import logging
from airtouch4pyapi import AirTouch
from airtouch4pyapi.airtouch import AirTouchStatus
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 .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
type AirTouch4ConfigEntry = ConfigEntry[AirtouchDataUpdateCoordinator]
class AirtouchDataUpdateCoordinator(DataUpdateCoordinator):
"""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."""
self.airtouch = airtouch
super().__init__(
hass,
_LOGGER,
config_entry=entry,
name=DOMAIN,
update_interval=SCAN_INTERVAL,
)

View File

@@ -620,6 +620,13 @@ class GoogleGenerativeAILLMBaseEntity(Entity):
def create_generate_content_config(self) -> GenerateContentConfig:
"""Create the GenerateContentConfig for the LLM."""
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(
temperature=options.get(CONF_TEMPERATURE, RECOMMENDED_TEMPERATURE),
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",
"iot_class": "local_polling",
"quality_scale": "internal",
"requirements": ["aiohasupervisor==0.3.3b0"],
"requirements": ["aiohasupervisor==0.3.3"],
"single_config_entry": true
}

View File

@@ -67,11 +67,7 @@ class ZBT2FirmwareMixin(ConfigEntryBaseFlow, FirmwareInstallFlowProtocol):
"""Mixin for Home Assistant Connect ZBT-2 firmware methods."""
context: ConfigFlowContext
# `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]
BOOTLOADER_RESET_METHODS = [ResetTarget.RTS_DTR]
async def async_step_install_zigbee_firmware(
self, user_input: dict[str, Any] | None = None

View File

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

View File

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

View File

@@ -14,6 +14,6 @@
"documentation": "https://www.home-assistant.io/integrations/homekit_controller",
"iot_class": "local_push",
"loggers": ["aiohomekit", "commentjson"],
"requirements": ["aiohomekit==3.2.18"],
"requirements": ["aiohomekit==3.2.19"],
"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.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
_LOGGER = logging.getLogger(__name__)
type IdasenDeskConfigEntry = ConfigEntry[IdasenDeskCoordinator]
UPDATE_DEBOUNCE_TIME = 0.2
class IdasenDeskCoordinator(DataUpdateCoordinator[int | None]):
"""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
)
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:
"""Connect to desk."""
@@ -60,3 +76,9 @@ class IdasenDeskCoordinator(DataUpdateCoordinator[int | None]):
"""Ensure that the desk is connected if that is the expected state."""
if self._expected_connected:
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.core import HomeAssistant, callback
from homeassistant.helpers.translation import async_get_cached_translations
from .const import MEDIA_SOURCE_DATA, URI_SCHEME, URI_SCHEME_REGEX
@@ -62,12 +63,15 @@ class MediaSourceItem:
async def async_browse(self) -> BrowseMediaSource:
"""Browse this item."""
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(
domain=None,
identifier=None,
media_class=MediaClass.APP,
media_content_type=MediaType.APPS,
title="Media Sources",
title=title,
can_play=False,
can_expand=True,
children_media_class=MediaClass.APP,

View File

@@ -9,5 +9,8 @@
"unknown_media_source": {
"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:
"""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
if isinstance(entry, bytes):
return entry.decode()

View File

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

View File

@@ -44,9 +44,10 @@ class NordPoolDataUpdateCoordinator(DataUpdateCoordinator[DeliveryPeriodsData]):
name=DOMAIN,
)
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."""
next_hour = dt_util.utcnow() + timedelta(hours=1)
next_run = datetime(
@@ -56,23 +57,45 @@ class NordPoolDataUpdateCoordinator(DataUpdateCoordinator[DeliveryPeriodsData]):
next_hour.hour,
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
async def async_shutdown(self) -> None:
"""Cancel any scheduled call, and ignore new runs."""
await super().async_shutdown()
if self.unsub:
self.unsub()
self.unsub = None
if self.data_unsub:
self.data_unsub()
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:
"""Fetch data from Nord Pool."""
self.unsub = async_track_point_in_utc_time(
self.hass, self.fetch_data, self.get_next_interval(dt_util.utcnow())
self.data_unsub = async_track_point_in_utc_time(
self.hass, self.fetch_data, self.get_next_data_interval(dt_util.utcnow())
)
if self.config_entry.pref_disable_polling and not initial:
self.async_update_listeners()
return
try:
data = await self.handle_data(initial)

View File

@@ -307,7 +307,7 @@
},
"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": {
"name": "Tags/Emojis",

View File

@@ -35,7 +35,7 @@ from .const import CONF_DELETE_PERMANENTLY, DATA_BACKUP_AGENT_LISTENERS, DOMAIN
from .coordinator import OneDriveConfigEntry
_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
METADATA_VERSION = 2
CACHE_TTL = 300
@@ -163,7 +163,10 @@ class OneDriveBackupAgent(BackupAgent):
)
try:
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:
raise BackupAgentError(

View File

@@ -7,5 +7,5 @@
"integration_type": "service",
"iot_class": "cloud_polling",
"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",
"iot_class": "local_polling",
"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(
hass,
_LOGGER,
config_entry=None,
name=f"proxmox_coordinator_{host_name}_{node_name}_{vm_id}",
update_method=async_update_data,
update_interval=timedelta(seconds=UPDATE_INTERVAL),

View File

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

View File

@@ -67,7 +67,7 @@ class PushoverNotificationService(BaseNotificationService):
# Extract params from data dict
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_title = data.get(ATTR_URL_TITLE)
priority = data.get(ATTR_PRIORITY)

View File

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

View File

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

View File

@@ -377,8 +377,10 @@
"max": "Max",
"high": "[%key:common::state::high%]",
"intense": "Intense",
"extreme": "Extreme",
"custom": "[%key:component::roborock::entity::select::mop_mode::state::custom%]",
"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%]"
}
},

View File

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

View File

@@ -5,14 +5,14 @@
"description": "Refer to the documentation on getting your Slack API key.",
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
"default_channel": "Default Channel",
"default_channel": "Default channel",
"icon": "Icon",
"username": "[%key:common::config_flow::data::username%]"
},
"data_description": {
"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.",
"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."
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,6 +2,7 @@
from __future__ import annotations
import asyncio
from collections.abc import Callable
from datetime import timedelta
import logging
@@ -149,8 +150,9 @@ class ToGrillCoordinator(DataUpdateCoordinator[dict[tuple[int, int | None], Pack
raise DeviceNotFound("Unable to connect to device") from exc
try:
packet_a0 = await client.read(PacketA0Notify)
except (BleakError, DecodeError) as exc:
async with asyncio.timeout(10):
packet_a0 = await client.read(PacketA0Notify)
except (BleakError, DecodeError, TimeoutError) as exc:
await client.disconnect()
raise DeviceFailed(f"Device failed {exc}") from exc
@@ -215,9 +217,19 @@ class ToGrillCoordinator(DataUpdateCoordinator[dict[tuple[int, int | None], Pack
@callback
def _async_request_refresh_soon(self) -> None:
self.config_entry.async_create_task(
self.hass, self.async_request_refresh(), eager_start=False
)
"""Request a refresh in the near future.
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
def _disconnected_callback(self) -> None:

View File

@@ -100,8 +100,9 @@ class VeSyncFanHA(VeSyncBaseEntity, FanEntity):
"""Return the currently set speed."""
current_level = self.device.state.fan_level
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(
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.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.util import dt as dt_util
from . import WorkdayConfigEntry
from .const import CONF_EXCLUDES, CONF_OFFSET, CONF_WORKDAYS
@@ -87,11 +88,12 @@ class WorkdayCalendarEntity(BaseWorkdayEntity, CalendarEntity):
@property
def event(self) -> CalendarEvent | None:
"""Return the next upcoming event."""
return (
sorted(self.event_list, key=lambda e: e.start)[0]
if self.event_list
else None
sorted_list: list[CalendarEvent] | None = (
sorted(self.event_list, key=lambda e: e.start) 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(
self, hass: HomeAssistant, start_date: datetime, end_date: datetime

View File

@@ -5,6 +5,7 @@ from __future__ import annotations
from abc import abstractmethod
import collections
from contextlib import suppress
from enum import StrEnum
import json
from typing import Any
@@ -82,9 +83,6 @@ FORMATION_UPLOAD_MANUAL_BACKUP = "upload_manual_backup"
CHOOSE_AUTOMATIC_BACKUP = "choose_automatic_backup"
OVERWRITE_COORDINATOR_IEEE = "overwrite_coordinator_ieee"
OPTIONS_INTENT_MIGRATE = "intent_migrate"
OPTIONS_INTENT_RECONFIGURE = "intent_reconfigure"
UPLOADED_BACKUP_FILE = "uploaded_backup_file"
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(
backup: zigpy.backups.NetworkBackup, *, pan_ids: bool = True
) -> str:
@@ -930,6 +935,8 @@ class ZhaConfigFlowHandler(BaseZhaFlow, ConfigFlow, domain=DOMAIN):
class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow):
"""Handle an options flow."""
_migration_intent: OptionsMigrationIntent
def __init__(self, config_entry: ConfigEntry) -> None:
"""Initialize options flow."""
super().__init__()
@@ -971,8 +978,8 @@ class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow):
return self.async_show_menu(
step_id="prompt_migrate_or_reconfigure",
menu_options=[
OPTIONS_INTENT_RECONFIGURE,
OPTIONS_INTENT_MIGRATE,
OptionsMigrationIntent.RECONFIGURE,
OptionsMigrationIntent.MIGRATE,
],
)
@@ -980,30 +987,26 @@ class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow):
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Virtual step for when the user is reconfiguring the integration."""
self._migration_intent = OptionsMigrationIntent.RECONFIGURE
return await self.async_step_choose_serial_port()
async def async_step_intent_migrate(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""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:
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(
async def async_step_maybe_reset_old_radio(
self, user_input: dict[str, Any] | None = None
) -> 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:
# Now that the old radio is gone, we can scan for serial ports again
return await self.async_step_choose_serial_port()
# If we are reconfiguring, the old radio will not be available
if self._migration_intent is OptionsMigrationIntent.RECONFIGURE:
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):
"""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
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_create_entry(title=self._title, data={})
return self.async_abort(reason="reconfigure_successful")
def async_remove(self):
"""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%]",
"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": {
"title": "[%key:component::zha::config::step::choose_serial_port::title%]",
"data": {
@@ -240,7 +236,8 @@
"cannot_resolve_path": "[%key:component::zha::config::abort::cannot_resolve_path%]",
"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_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": {

View File

@@ -703,7 +703,15 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
async def async_step_on_supervisor(
self, user_input: dict[str, Any] | None = None
) -> 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:
return self.async_show_form(
step_id="on_supervisor", data_schema=ON_SUPERVISOR_SCHEMA
@@ -717,8 +725,11 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
if addon_info.state == AddonState.RUNNING:
addon_config = addon_info.options
self.usb_path = addon_config.get(CONF_ADDON_DEVICE)
self.socket_path = addon_config.get(CONF_ADDON_SOCKET)
# Use the options set by USB/ESPHome discovery
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.s2_access_control_key = addon_config.get(
CONF_ADDON_S2_ACCESS_CONTROL_KEY, ""
@@ -918,7 +929,7 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
discovery_info = await self._async_get_addon_discovery_info()
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:
try:
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
)
# 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(
updates={
CONF_URL: self.ws_address,
@@ -942,7 +968,12 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
CONF_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key,
CONF_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_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()
@@ -1490,6 +1521,8 @@ class ZWaveJSConfigFlow(ConfigFlow, domain=DOMAIN):
)
# Only update existing entries that are configured via sockets
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(
{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)
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.context["title_placeholders"] = {
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 self.color_mode == ColorMode.HS:
scale = brightness / 255
if (
self._last_on_color is not None
and None not in self._last_on_color.values()
):
if self._last_on_color is not None:
# Changed brightness from 0 to >0
old_brightness = max(self._last_on_color.values())
new_scale = brightness / old_brightness
@@ -634,8 +631,9 @@ class ZwaveColorOnOffLight(ZwaveLight):
elif current_brightness is not None:
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_brightness = None
if new_colors is None:
new_colors = self._get_new_colors(
@@ -651,8 +649,10 @@ class ZwaveColorOnOffLight(ZwaveLight):
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the light off."""
# Remember last color and brightness to restore it when turning on
self._last_brightness = self.brightness
# Remember last color and brightness to restore it when turning on,
# 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):
red = self._current_color.value.get(COLOR_SWITCH_COMBINED_RED)
green = self._current_color.value.get(COLOR_SWITCH_COMBINED_GREEN)
@@ -666,7 +666,8 @@ class ZwaveColorOnOffLight(ZwaveLight):
if blue is not None:
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
if self._target_brightness:

View File

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

View File

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

View File

@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "homeassistant"
version = "2025.10.0"
version = "2025.10.1"
license = "Apache-2.0"
license-files = ["LICENSE*", "homeassistant/backports/LICENSE*"]
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
# change behavior based on presence of supervisor. Deprecated with #127228
# Lib can be removed with 2025.11
"aiohasupervisor==0.3.3b0",
"aiohasupervisor==0.3.3",
"aiohttp==3.12.15",
"aiohttp_cors==0.8.1",
"aiohttp-fast-zlib==0.3.0",

2
requirements.txt generated
View File

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

View File

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

View File

@@ -208,7 +208,7 @@ async def test_tts_service_speak(
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,
),
],
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
assert flash_mock.call_count == 1
assert flash_mock.mock_calls[0].kwargs["bootloader_reset_methods"] == [
"rts_dtr",
"baudrate",
]
assert flash_mock.mock_calls[0].kwargs["bootloader_reset_methods"] == ["rts_dtr"]
async def test_duplicate_discovery(hass: HomeAssistant) -> None:

View File

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

View File

@@ -2,18 +2,23 @@
from unittest.mock import MagicMock
from freezegun.api import FrozenDateTimeFactory
import pytest
from homeassistant.const import STATE_UNAVAILABLE
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"
@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."""
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.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)
assert state
@@ -34,6 +48,7 @@ async def test_height_sensor(hass: HomeAssistant, mock_desk_api: MagicMock) -> N
async def test_sensor_available(
hass: HomeAssistant,
mock_desk_api: MagicMock,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test sensor available property."""
await init_integration(hass)
@@ -46,6 +61,9 @@ async def test_sensor_available(
mock_desk_api.is_connected = False
mock_desk_api.trigger_update_callback(None)
freezer.tick(UPDATE_DEBOUNCE_TIME)
async_fire_time_changed(hass)
state = hass.states.get(entity_id)
assert state
assert state.state == STATE_UNAVAILABLE

View File

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

View File

@@ -1,213 +1,717 @@
{
"deliveryDateCET": "2024-11-05",
"deliveryDateCET": "2025-10-01",
"version": 2,
"updatedAt": "2024-11-04T11:58:10.7711584Z",
"updatedAt": "2025-09-30T11:08:13.1885499Z",
"deliveryAreas": ["NL"],
"market": "DayAhead",
"multiAreaEntries": [
{
"deliveryStart": "2024-11-04T23:00:00Z",
"deliveryEnd": "2024-11-05T00:00:00Z",
"deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2025-09-30T22:15:00Z",
"entryPerArea": {
"NL": 83.63
"NL": 102.55
}
},
{
"deliveryStart": "2024-11-05T00:00:00Z",
"deliveryEnd": "2024-11-05T01:00:00Z",
"deliveryStart": "2025-09-30T22:15:00Z",
"deliveryEnd": "2025-09-30T22:30:00Z",
"entryPerArea": {
"NL": 94.0
"NL": 92.17
}
},
{
"deliveryStart": "2024-11-05T01:00:00Z",
"deliveryEnd": "2024-11-05T02:00:00Z",
"deliveryStart": "2025-09-30T22:30:00Z",
"deliveryEnd": "2025-09-30T22:45:00Z",
"entryPerArea": {
"NL": 90.68
"NL": 82.69
}
},
{
"deliveryStart": "2024-11-05T02:00:00Z",
"deliveryEnd": "2024-11-05T03:00:00Z",
"deliveryStart": "2025-09-30T22:45:00Z",
"deliveryEnd": "2025-09-30T23:00:00Z",
"entryPerArea": {
"NL": 91.3
"NL": 81.86
}
},
{
"deliveryStart": "2024-11-05T03:00:00Z",
"deliveryEnd": "2024-11-05T04:00:00Z",
"deliveryStart": "2025-09-30T23:00:00Z",
"deliveryEnd": "2025-09-30T23:15:00Z",
"entryPerArea": {
"NL": 94.0
"NL": 89.54
}
},
{
"deliveryStart": "2024-11-05T04:00:00Z",
"deliveryEnd": "2024-11-05T05:00:00Z",
"deliveryStart": "2025-09-30T23:15:00Z",
"deliveryEnd": "2025-09-30T23:30:00Z",
"entryPerArea": {
"NL": 96.09
"NL": 84.93
}
},
{
"deliveryStart": "2024-11-05T05:00:00Z",
"deliveryEnd": "2024-11-05T06:00:00Z",
"deliveryStart": "2025-09-30T23:30:00Z",
"deliveryEnd": "2025-09-30T23:45:00Z",
"entryPerArea": {
"NL": 106.0
"NL": 83.56
}
},
{
"deliveryStart": "2024-11-05T06:00:00Z",
"deliveryEnd": "2024-11-05T07:00:00Z",
"deliveryStart": "2025-09-30T23:45:00Z",
"deliveryEnd": "2025-10-01T00:00:00Z",
"entryPerArea": {
"NL": 135.99
"NL": 81.69
}
},
{
"deliveryStart": "2024-11-05T07:00:00Z",
"deliveryEnd": "2024-11-05T08:00:00Z",
"deliveryStart": "2025-10-01T00:00:00Z",
"deliveryEnd": "2025-10-01T00:15:00Z",
"entryPerArea": {
"NL": 136.21
"NL": 81.87
}
},
{
"deliveryStart": "2024-11-05T08:00:00Z",
"deliveryEnd": "2024-11-05T09:00:00Z",
"deliveryStart": "2025-10-01T00:15:00Z",
"deliveryEnd": "2025-10-01T00:30:00Z",
"entryPerArea": {
"NL": 118.23
"NL": 81.51
}
},
{
"deliveryStart": "2024-11-05T09:00:00Z",
"deliveryEnd": "2024-11-05T10:00:00Z",
"deliveryStart": "2025-10-01T00:30:00Z",
"deliveryEnd": "2025-10-01T00:45:00Z",
"entryPerArea": {
"NL": 105.87
"NL": 77.42
}
},
{
"deliveryStart": "2024-11-05T10:00:00Z",
"deliveryEnd": "2024-11-05T11:00:00Z",
"deliveryStart": "2025-10-01T00:45:00Z",
"deliveryEnd": "2025-10-01T01:00:00Z",
"entryPerArea": {
"NL": 95.28
"NL": 76.45
}
},
{
"deliveryStart": "2024-11-05T11:00:00Z",
"deliveryEnd": "2024-11-05T12:00:00Z",
"deliveryStart": "2025-10-01T01:00:00Z",
"deliveryEnd": "2025-10-01T01:15:00Z",
"entryPerArea": {
"NL": 94.92
"NL": 79.32
}
},
{
"deliveryStart": "2024-11-05T12:00:00Z",
"deliveryEnd": "2024-11-05T13:00:00Z",
"deliveryStart": "2025-10-01T01:15:00Z",
"deliveryEnd": "2025-10-01T01:30:00Z",
"entryPerArea": {
"NL": 99.25
"NL": 79.24
}
},
{
"deliveryStart": "2024-11-05T13:00:00Z",
"deliveryEnd": "2024-11-05T14:00:00Z",
"deliveryStart": "2025-10-01T01:30:00Z",
"deliveryEnd": "2025-10-01T01:45:00Z",
"entryPerArea": {
"NL": 107.98
"NL": 80.05
}
},
{
"deliveryStart": "2024-11-05T14:00:00Z",
"deliveryEnd": "2024-11-05T15:00:00Z",
"deliveryStart": "2025-10-01T01:45:00Z",
"deliveryEnd": "2025-10-01T02:00:00Z",
"entryPerArea": {
"NL": 149.86
"NL": 79.52
}
},
{
"deliveryStart": "2024-11-05T15:00:00Z",
"deliveryEnd": "2024-11-05T16:00:00Z",
"deliveryStart": "2025-10-01T02:00:00Z",
"deliveryEnd": "2025-10-01T02:15:00Z",
"entryPerArea": {
"NL": 303.24
"NL": 79.94
}
},
{
"deliveryStart": "2024-11-05T16:00:00Z",
"deliveryEnd": "2024-11-05T17:00:00Z",
"deliveryStart": "2025-10-01T02:15:00Z",
"deliveryEnd": "2025-10-01T02:30:00Z",
"entryPerArea": {
"NL": 472.99
"NL": 85.02
}
},
{
"deliveryStart": "2024-11-05T17:00:00Z",
"deliveryEnd": "2024-11-05T18:00:00Z",
"deliveryStart": "2025-10-01T02:30:00Z",
"deliveryEnd": "2025-10-01T02:45:00Z",
"entryPerArea": {
"NL": 431.02
"NL": 83.89
}
},
{
"deliveryStart": "2024-11-05T18:00:00Z",
"deliveryEnd": "2024-11-05T19:00:00Z",
"deliveryStart": "2025-10-01T02:45:00Z",
"deliveryEnd": "2025-10-01T03:00:00Z",
"entryPerArea": {
"NL": 320.33
"NL": 75.83
}
},
{
"deliveryStart": "2024-11-05T19:00:00Z",
"deliveryEnd": "2024-11-05T20:00:00Z",
"deliveryStart": "2025-10-01T03:00:00Z",
"deliveryEnd": "2025-10-01T03:15:00Z",
"entryPerArea": {
"NL": 169.7
"NL": 75.01
}
},
{
"deliveryStart": "2024-11-05T20:00:00Z",
"deliveryEnd": "2024-11-05T21:00:00Z",
"deliveryStart": "2025-10-01T03:15:00Z",
"deliveryEnd": "2025-10-01T03:30:00Z",
"entryPerArea": {
"NL": 129.9
"NL": 80.88
}
},
{
"deliveryStart": "2024-11-05T21:00:00Z",
"deliveryEnd": "2024-11-05T22:00:00Z",
"deliveryStart": "2025-10-01T03:30:00Z",
"deliveryEnd": "2025-10-01T03:45:00Z",
"entryPerArea": {
"NL": 117.77
"NL": 88.18
}
},
{
"deliveryStart": "2024-11-05T22:00:00Z",
"deliveryEnd": "2024-11-05T23:00:00Z",
"deliveryStart": "2025-10-01T03:45:00Z",
"deliveryEnd": "2025-10-01T04:00:00Z",
"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": [
{
"blockName": "Off-peak 1",
"deliveryStart": "2024-11-04T23:00:00Z",
"deliveryEnd": "2024-11-05T07:00:00Z",
"deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2025-10-01T06:00:00Z",
"averagePricePerArea": {
"NL": {
"average": 98.96,
"min": 83.63,
"max": 135.99
"average": 97.54,
"min": 75.01,
"max": 172.01
}
}
},
{
"blockName": "Peak",
"deliveryStart": "2024-11-05T07:00:00Z",
"deliveryEnd": "2024-11-05T19:00:00Z",
"deliveryStart": "2025-10-01T06:00:00Z",
"deliveryEnd": "2025-10-01T18:00:00Z",
"averagePricePerArea": {
"NL": {
"average": 202.93,
"min": 94.92,
"max": 472.99
"average": 120.76,
"min": 54.35,
"max": 408.5
}
}
},
{
"blockName": "Off-peak 2",
"deliveryStart": "2024-11-05T19:00:00Z",
"deliveryEnd": "2024-11-05T23:00:00Z",
"deliveryStart": "2025-10-01T18:00:00Z",
"deliveryEnd": "2025-10-01T22:00:00Z",
"averagePricePerArea": {
"NL": {
"average": 131.85,
"min": 110.03,
"max": 169.7
"average": 110.71,
"min": 82.6,
"max": 217.5
}
}
}
@@ -223,7 +727,7 @@
"areaAverages": [
{
"areaCode": "NL",
"price": 156.43
"price": 111.34
}
]
}

View File

@@ -1,258 +1,834 @@
{
"deliveryDateCET": "2024-11-05",
"deliveryDateCET": "2025-10-01",
"version": 3,
"updatedAt": "2024-11-04T12:15:03.9456464Z",
"updatedAt": "2025-09-30T12:08:16.4448023Z",
"deliveryAreas": ["SE3", "SE4"],
"market": "DayAhead",
"multiAreaEntries": [
{
"deliveryStart": "2024-11-04T23:00:00Z",
"deliveryEnd": "2024-11-05T00:00:00Z",
"deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2025-09-30T22:15:00Z",
"entryPerArea": {
"SE3": 250.73,
"SE4": 283.79
"SE3": 556.68,
"SE4": 642.22
}
},
{
"deliveryStart": "2024-11-05T00:00:00Z",
"deliveryEnd": "2024-11-05T01:00:00Z",
"deliveryStart": "2025-09-30T22:15:00Z",
"deliveryEnd": "2025-09-30T22:30:00Z",
"entryPerArea": {
"SE3": 76.36,
"SE4": 81.36
"SE3": 519.88,
"SE4": 600.12
}
},
{
"deliveryStart": "2024-11-05T01:00:00Z",
"deliveryEnd": "2024-11-05T02:00:00Z",
"deliveryStart": "2025-09-30T22:30:00Z",
"deliveryEnd": "2025-09-30T22:45:00Z",
"entryPerArea": {
"SE3": 73.92,
"SE4": 79.15
"SE3": 508.28,
"SE4": 586.3
}
},
{
"deliveryStart": "2024-11-05T02:00:00Z",
"deliveryEnd": "2024-11-05T03:00:00Z",
"deliveryStart": "2025-09-30T22:45:00Z",
"deliveryEnd": "2025-09-30T23:00:00Z",
"entryPerArea": {
"SE3": 61.69,
"SE4": 65.19
"SE3": 509.93,
"SE4": 589.62
}
},
{
"deliveryStart": "2024-11-05T03:00:00Z",
"deliveryEnd": "2024-11-05T04:00:00Z",
"deliveryStart": "2025-09-30T23:00:00Z",
"deliveryEnd": "2025-09-30T23:15:00Z",
"entryPerArea": {
"SE3": 64.6,
"SE4": 68.44
"SE3": 501.64,
"SE4": 577.24
}
},
{
"deliveryStart": "2024-11-05T04:00:00Z",
"deliveryEnd": "2024-11-05T05:00:00Z",
"deliveryStart": "2025-09-30T23:15:00Z",
"deliveryEnd": "2025-09-30T23:30:00Z",
"entryPerArea": {
"SE3": 453.27,
"SE4": 516.71
"SE3": 509.05,
"SE4": 585.42
}
},
{
"deliveryStart": "2024-11-05T05:00:00Z",
"deliveryEnd": "2024-11-05T06:00:00Z",
"deliveryStart": "2025-09-30T23:30:00Z",
"deliveryEnd": "2025-09-30T23:45:00Z",
"entryPerArea": {
"SE3": 996.28,
"SE4": 1240.85
"SE3": 491.03,
"SE4": 567.18
}
},
{
"deliveryStart": "2024-11-05T06:00:00Z",
"deliveryEnd": "2024-11-05T07:00:00Z",
"deliveryStart": "2025-09-30T23:45:00Z",
"deliveryEnd": "2025-10-01T00:00:00Z",
"entryPerArea": {
"SE3": 1406.14,
"SE4": 1648.25
"SE3": 442.07,
"SE4": 517.45
}
},
{
"deliveryStart": "2024-11-05T07:00:00Z",
"deliveryEnd": "2024-11-05T08:00:00Z",
"deliveryStart": "2025-10-01T00:00:00Z",
"deliveryEnd": "2025-10-01T00:15:00Z",
"entryPerArea": {
"SE3": 1346.54,
"SE4": 1570.5
"SE3": 504.08,
"SE4": 580.55
}
},
{
"deliveryStart": "2024-11-05T08:00:00Z",
"deliveryEnd": "2024-11-05T09:00:00Z",
"deliveryStart": "2025-10-01T00:15:00Z",
"deliveryEnd": "2025-10-01T00:30:00Z",
"entryPerArea": {
"SE3": 1150.28,
"SE4": 1345.37
"SE3": 504.85,
"SE4": 581.55
}
},
{
"deliveryStart": "2024-11-05T09:00:00Z",
"deliveryEnd": "2024-11-05T10:00:00Z",
"deliveryStart": "2025-10-01T00:30:00Z",
"deliveryEnd": "2025-10-01T00:45:00Z",
"entryPerArea": {
"SE3": 1031.32,
"SE4": 1206.51
"SE3": 504.3,
"SE4": 580.78
}
},
{
"deliveryStart": "2024-11-05T10:00:00Z",
"deliveryEnd": "2024-11-05T11:00:00Z",
"deliveryStart": "2025-10-01T00:45:00Z",
"deliveryEnd": "2025-10-01T01:00:00Z",
"entryPerArea": {
"SE3": 927.37,
"SE4": 1085.8
"SE3": 506.29,
"SE4": 583.1
}
},
{
"deliveryStart": "2024-11-05T11:00:00Z",
"deliveryEnd": "2024-11-05T12:00:00Z",
"deliveryStart": "2025-10-01T01:00:00Z",
"deliveryEnd": "2025-10-01T01:15:00Z",
"entryPerArea": {
"SE3": 925.05,
"SE4": 1081.72
"SE3": 442.07,
"SE4": 515.46
}
},
{
"deliveryStart": "2024-11-05T12:00:00Z",
"deliveryEnd": "2024-11-05T13:00:00Z",
"deliveryStart": "2025-10-01T01:15:00Z",
"deliveryEnd": "2025-10-01T01:30:00Z",
"entryPerArea": {
"SE3": 949.49,
"SE4": 1130.38
"SE3": 441.96,
"SE4": 517.23
}
},
{
"deliveryStart": "2024-11-05T13:00:00Z",
"deliveryEnd": "2024-11-05T14:00:00Z",
"deliveryStart": "2025-10-01T01:30:00Z",
"deliveryEnd": "2025-10-01T01:45:00Z",
"entryPerArea": {
"SE3": 1042.03,
"SE4": 1256.91
"SE3": 442.07,
"SE4": 516.23
}
},
{
"deliveryStart": "2024-11-05T14:00:00Z",
"deliveryEnd": "2024-11-05T15:00:00Z",
"deliveryStart": "2025-10-01T01:45:00Z",
"deliveryEnd": "2025-10-01T02:00:00Z",
"entryPerArea": {
"SE3": 1258.89,
"SE4": 1765.82
"SE3": 442.07,
"SE4": 516.23
}
},
{
"deliveryStart": "2024-11-05T15:00:00Z",
"deliveryEnd": "2024-11-05T16:00:00Z",
"deliveryStart": "2025-10-01T02:00:00Z",
"deliveryEnd": "2025-10-01T02:15:00Z",
"entryPerArea": {
"SE3": 1816.45,
"SE4": 2522.55
"SE3": 441.96,
"SE4": 517.34
}
},
{
"deliveryStart": "2024-11-05T16:00:00Z",
"deliveryEnd": "2024-11-05T17:00:00Z",
"deliveryStart": "2025-10-01T02:15:00Z",
"deliveryEnd": "2025-10-01T02:30:00Z",
"entryPerArea": {
"SE3": 2512.65,
"SE4": 3533.03
"SE3": 483.3,
"SE4": 559.11
}
},
{
"deliveryStart": "2024-11-05T17:00:00Z",
"deliveryEnd": "2024-11-05T18:00:00Z",
"deliveryStart": "2025-10-01T02:30:00Z",
"deliveryEnd": "2025-10-01T02:45:00Z",
"entryPerArea": {
"SE3": 1819.83,
"SE4": 2524.06
"SE3": 484.29,
"SE4": 559.0
}
},
{
"deliveryStart": "2024-11-05T18:00:00Z",
"deliveryEnd": "2024-11-05T19:00:00Z",
"deliveryStart": "2025-10-01T02:45:00Z",
"deliveryEnd": "2025-10-01T03:00:00Z",
"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
}
},
{
"deliveryStart": "2024-11-05T19:00:00Z",
"deliveryEnd": "2024-11-05T20:00:00Z",
"deliveryStart": "2025-10-01T18:15:00Z",
"deliveryEnd": "2025-10-01T18:30:00Z",
"entryPerArea": {
"SE3": 835.53,
"SE4": 1112.57
"SE3": 1424.03,
"SE4": 1646.17
}
},
{
"deliveryStart": "2024-11-05T20:00:00Z",
"deliveryEnd": "2024-11-05T21:00:00Z",
"deliveryStart": "2025-10-01T18:30:00Z",
"deliveryEnd": "2025-10-01T18:45:00Z",
"entryPerArea": {
"SE3": 796.19,
"SE4": 1051.69
"SE3": 1216.81,
"SE4": 1388.11
}
},
{
"deliveryStart": "2024-11-05T21:00:00Z",
"deliveryEnd": "2024-11-05T22:00:00Z",
"deliveryStart": "2025-10-01T18:45:00Z",
"deliveryEnd": "2025-10-01T19:00:00Z",
"entryPerArea": {
"SE3": 522.3,
"SE4": 662.44
"SE3": 1070.15,
"SE4": 1204.65
}
},
{
"deliveryStart": "2024-11-05T22:00:00Z",
"deliveryEnd": "2024-11-05T23:00:00Z",
"deliveryStart": "2025-10-01T19:00:00Z",
"deliveryEnd": "2025-10-01T19:15:00Z",
"entryPerArea": {
"SE3": 289.14,
"SE4": 349.21
"SE3": 1218.14,
"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": [
{
"blockName": "Off-peak 1",
"deliveryStart": "2024-11-04T23:00:00Z",
"deliveryEnd": "2024-11-05T07:00:00Z",
"deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2025-10-01T06:00:00Z",
"averagePricePerArea": {
"SE3": {
"average": 422.87,
"min": 61.69,
"max": 1406.14
"average": 745.93,
"min": 441.96,
"max": 1809.96
},
"SE4": {
"average": 497.97,
"min": 65.19,
"max": 1648.25
"average": 860.99,
"min": 515.46,
"max": 2029.34
}
}
},
{
"blockName": "Peak",
"deliveryStart": "2024-11-05T07:00:00Z",
"deliveryEnd": "2024-11-05T19:00:00Z",
"deliveryStart": "2025-10-01T06:00:00Z",
"deliveryEnd": "2025-10-01T18:00:00Z",
"averagePricePerArea": {
"SE3": {
"average": 1315.97,
"min": 925.05,
"max": 2512.65
"average": 1219.13,
"min": 607.74,
"max": 3828.03
},
"SE4": {
"average": 1735.59,
"min": 1081.72,
"max": 3533.03
"average": 1381.22,
"min": 683.12,
"max": 4442.74
}
}
},
{
"blockName": "Off-peak 2",
"deliveryStart": "2024-11-05T19:00:00Z",
"deliveryEnd": "2024-11-05T23:00:00Z",
"deliveryStart": "2025-10-01T18:00:00Z",
"deliveryEnd": "2025-10-01T22:00:00Z",
"averagePricePerArea": {
"SE3": {
"average": 610.79,
"min": 289.14,
"max": 835.53
"average": 1054.61,
"min": 785.68,
"max": 1997.96
},
"SE4": {
"average": 793.98,
"min": 349.21,
"max": 1112.57
"average": 1219.07,
"min": 912.22,
"max": 2312.16
}
}
}
],
"currency": "SEK",
"exchangeRate": 11.6402,
"exchangeRate": 11.05186,
"areaStates": [
{
"state": "Final",
@@ -262,11 +838,11 @@
"areaAverages": [
{
"areaCode": "SE3",
"price": 900.74
"price": 1033.98
},
{
"areaCode": "SE4",
"price": 1166.12
"price": 1180.78
}
]
}

View File

@@ -1,258 +1,834 @@
{
"deliveryDateCET": "2024-11-06",
"deliveryDateCET": "2025-10-02",
"version": 3,
"updatedAt": "2024-11-05T12:12:51.9853434Z",
"updatedAt": "2025-10-01T11:25:06.1484362Z",
"deliveryAreas": ["SE3", "SE4"],
"market": "DayAhead",
"multiAreaEntries": [
{
"deliveryStart": "2024-11-05T23:00:00Z",
"deliveryEnd": "2024-11-06T00:00:00Z",
"deliveryStart": "2025-10-01T22:00:00Z",
"deliveryEnd": "2025-10-01T22:15:00Z",
"entryPerArea": {
"SE3": 126.66,
"SE4": 275.6
"SE3": 933.22,
"SE4": 1062.32
}
},
{
"deliveryStart": "2024-11-06T00:00:00Z",
"deliveryEnd": "2024-11-06T01:00:00Z",
"deliveryStart": "2025-10-01T22:15:00Z",
"deliveryEnd": "2025-10-01T22:30:00Z",
"entryPerArea": {
"SE3": 74.06,
"SE4": 157.34
"SE3": 854.22,
"SE4": 971.95
}
},
{
"deliveryStart": "2024-11-06T01:00:00Z",
"deliveryEnd": "2024-11-06T02:00:00Z",
"deliveryStart": "2025-10-01T22:30:00Z",
"deliveryEnd": "2025-10-01T22:45:00Z",
"entryPerArea": {
"SE3": 78.38,
"SE4": 165.62
"SE3": 809.54,
"SE4": 919.1
}
},
{
"deliveryStart": "2024-11-06T02:00:00Z",
"deliveryEnd": "2024-11-06T03:00:00Z",
"deliveryStart": "2025-10-01T22:45:00Z",
"deliveryEnd": "2025-10-01T23:00:00Z",
"entryPerArea": {
"SE3": 92.37,
"SE4": 196.17
"SE3": 811.74,
"SE4": 922.63
}
},
{
"deliveryStart": "2024-11-06T03:00:00Z",
"deliveryEnd": "2024-11-06T04:00:00Z",
"deliveryStart": "2025-10-01T23:00:00Z",
"deliveryEnd": "2025-10-01T23:15:00Z",
"entryPerArea": {
"SE3": 99.14,
"SE4": 190.58
"SE3": 835.13,
"SE4": 950.99
}
},
{
"deliveryStart": "2024-11-06T04:00:00Z",
"deliveryEnd": "2024-11-06T05:00:00Z",
"deliveryStart": "2025-10-01T23:15:00Z",
"deliveryEnd": "2025-10-01T23:30:00Z",
"entryPerArea": {
"SE3": 447.51,
"SE4": 932.93
"SE3": 828.85,
"SE4": 942.82
}
},
{
"deliveryStart": "2024-11-06T05:00:00Z",
"deliveryEnd": "2024-11-06T06:00:00Z",
"deliveryStart": "2025-10-01T23:30:00Z",
"deliveryEnd": "2025-10-01T23:45:00Z",
"entryPerArea": {
"SE3": 641.47,
"SE4": 1284.69
"SE3": 796.63,
"SE4": 903.54
}
},
{
"deliveryStart": "2024-11-06T06:00:00Z",
"deliveryEnd": "2024-11-06T07:00:00Z",
"deliveryStart": "2025-10-01T23:45:00Z",
"deliveryEnd": "2025-10-02T00:00:00Z",
"entryPerArea": {
"SE3": 1820.5,
"SE4": 2449.96
"SE3": 706.7,
"SE4": 799.61
}
},
{
"deliveryStart": "2024-11-06T07:00:00Z",
"deliveryEnd": "2024-11-06T08:00:00Z",
"deliveryStart": "2025-10-02T00:00:00Z",
"deliveryEnd": "2025-10-02T00:15:00Z",
"entryPerArea": {
"SE3": 1723.0,
"SE4": 2244.22
"SE3": 695.23,
"SE4": 786.81
}
},
{
"deliveryStart": "2024-11-06T08:00:00Z",
"deliveryEnd": "2024-11-06T09:00:00Z",
"deliveryStart": "2025-10-02T00:15:00Z",
"deliveryEnd": "2025-10-02T00:30:00Z",
"entryPerArea": {
"SE3": 1298.57,
"SE4": 1643.45
"SE3": 695.12,
"SE4": 783.83
}
},
{
"deliveryStart": "2024-11-06T09:00:00Z",
"deliveryEnd": "2024-11-06T10:00:00Z",
"deliveryStart": "2025-10-02T00:30:00Z",
"deliveryEnd": "2025-10-02T00:45:00Z",
"entryPerArea": {
"SE3": 1099.25,
"SE4": 1507.23
"SE3": 684.86,
"SE4": 771.8
}
},
{
"deliveryStart": "2024-11-06T10:00:00Z",
"deliveryEnd": "2024-11-06T11:00:00Z",
"deliveryStart": "2025-10-02T00:45:00Z",
"deliveryEnd": "2025-10-02T01:00:00Z",
"entryPerArea": {
"SE3": 903.31,
"SE4": 1362.84
"SE3": 673.05,
"SE4": 758.78
}
},
{
"deliveryStart": "2024-11-06T11:00:00Z",
"deliveryEnd": "2024-11-06T12:00:00Z",
"deliveryStart": "2025-10-02T01:00:00Z",
"deliveryEnd": "2025-10-02T01:15:00Z",
"entryPerArea": {
"SE3": 959.99,
"SE4": 1376.13
"SE3": 695.01,
"SE4": 791.22
}
},
{
"deliveryStart": "2024-11-06T12:00:00Z",
"deliveryEnd": "2024-11-06T13:00:00Z",
"deliveryStart": "2025-10-02T01:15:00Z",
"deliveryEnd": "2025-10-02T01:30:00Z",
"entryPerArea": {
"SE3": 1186.61,
"SE4": 1449.96
"SE3": 693.35,
"SE4": 789.12
}
},
{
"deliveryStart": "2024-11-06T13:00:00Z",
"deliveryEnd": "2024-11-06T14:00:00Z",
"deliveryStart": "2025-10-02T01:30:00Z",
"deliveryEnd": "2025-10-02T01:45:00Z",
"entryPerArea": {
"SE3": 1307.67,
"SE4": 1608.35
"SE3": 702.4,
"SE4": 799.61
}
},
{
"deliveryStart": "2024-11-06T14:00:00Z",
"deliveryEnd": "2024-11-06T15:00:00Z",
"deliveryStart": "2025-10-02T01:45:00Z",
"deliveryEnd": "2025-10-02T02:00:00Z",
"entryPerArea": {
"SE3": 1385.46,
"SE4": 2110.8
"SE3": 749.4,
"SE4": 853.45
}
},
{
"deliveryStart": "2024-11-06T15:00:00Z",
"deliveryEnd": "2024-11-06T16:00:00Z",
"deliveryStart": "2025-10-02T02:00:00Z",
"deliveryEnd": "2025-10-02T02:15:00Z",
"entryPerArea": {
"SE3": 1366.8,
"SE4": 3031.25
"SE3": 796.85,
"SE4": 907.4
}
},
{
"deliveryStart": "2024-11-06T16:00:00Z",
"deliveryEnd": "2024-11-06T17:00:00Z",
"deliveryStart": "2025-10-02T02:15:00Z",
"deliveryEnd": "2025-10-02T02:30:00Z",
"entryPerArea": {
"SE3": 2366.57,
"SE4": 5511.77
"SE3": 811.19,
"SE4": 924.07
}
},
{
"deliveryStart": "2024-11-06T17:00:00Z",
"deliveryEnd": "2024-11-06T18:00:00Z",
"deliveryStart": "2025-10-02T02:30:00Z",
"deliveryEnd": "2025-10-02T02:45:00Z",
"entryPerArea": {
"SE3": 1481.92,
"SE4": 3351.64
"SE3": 803.8,
"SE4": 916.23
}
},
{
"deliveryStart": "2024-11-06T18:00:00Z",
"deliveryEnd": "2024-11-06T19:00:00Z",
"deliveryStart": "2025-10-02T02:45:00Z",
"deliveryEnd": "2025-10-02T03:00:00Z",
"entryPerArea": {
"SE3": 1082.69,
"SE4": 2484.95
"SE3": 839.11,
"SE4": 953.3
}
},
{
"deliveryStart": "2024-11-06T19:00:00Z",
"deliveryEnd": "2024-11-06T20:00:00Z",
"deliveryStart": "2025-10-02T03:00:00Z",
"deliveryEnd": "2025-10-02T03:15:00Z",
"entryPerArea": {
"SE3": 716.82,
"SE4": 1624.33
"SE3": 825.2,
"SE4": 943.15
}
},
{
"deliveryStart": "2024-11-06T20:00:00Z",
"deliveryEnd": "2024-11-06T21:00:00Z",
"deliveryStart": "2025-10-02T03:15:00Z",
"deliveryEnd": "2025-10-02T03:30:00Z",
"entryPerArea": {
"SE3": 583.16,
"SE4": 1306.27
"SE3": 838.78,
"SE4": 958.93
}
},
{
"deliveryStart": "2024-11-06T21:00:00Z",
"deliveryEnd": "2024-11-06T22:00:00Z",
"deliveryStart": "2025-10-02T03:30:00Z",
"deliveryEnd": "2025-10-02T03:45:00Z",
"entryPerArea": {
"SE3": 523.09,
"SE4": 1142.99
"SE3": 906.19,
"SE4": 1030.65
}
},
{
"deliveryStart": "2024-11-06T22:00:00Z",
"deliveryEnd": "2024-11-06T23:00:00Z",
"deliveryStart": "2025-10-02T03:45:00Z",
"deliveryEnd": "2025-10-02T04:00:00Z",
"entryPerArea": {
"SE3": 250.64,
"SE4": 539.42
"SE3": 1057.79,
"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": [
{
"blockName": "Off-peak 1",
"deliveryStart": "2024-11-05T23:00:00Z",
"deliveryEnd": "2024-11-06T07:00:00Z",
"deliveryStart": "2025-10-01T22:00:00Z",
"deliveryEnd": "2025-10-02T06:00:00Z",
"averagePricePerArea": {
"SE3": {
"average": 422.51,
"min": 74.06,
"max": 1820.5
"average": 961.76,
"min": 673.05,
"max": 1831.25
},
"SE4": {
"average": 706.61,
"min": 157.34,
"max": 2449.96
"average": 1102.25,
"min": 758.78,
"max": 2182.34
}
}
},
{
"blockName": "Peak",
"deliveryStart": "2024-11-06T07:00:00Z",
"deliveryEnd": "2024-11-06T19:00:00Z",
"deliveryStart": "2025-10-02T06:00:00Z",
"deliveryEnd": "2025-10-02T18:00:00Z",
"averagePricePerArea": {
"SE3": {
"average": 1346.82,
"min": 903.31,
"max": 2366.57
"average": 1191.34,
"min": 563.38,
"max": 3288.35
},
"SE4": {
"average": 2306.88,
"min": 1362.84,
"max": 5511.77
"average": 1155.07,
"min": 635.76,
"max": 2617.73
}
}
},
{
"blockName": "Off-peak 2",
"deliveryStart": "2024-11-06T19:00:00Z",
"deliveryEnd": "2024-11-06T23:00:00Z",
"deliveryStart": "2025-10-02T18:00:00Z",
"deliveryEnd": "2025-10-02T22:00:00Z",
"averagePricePerArea": {
"SE3": {
"average": 518.43,
"min": 250.64,
"max": 716.82
"average": 1280.38,
"min": 646.9,
"max": 1935.08
},
"SE4": {
"average": 1153.25,
"min": 539.42,
"max": 1624.33
"average": 1045.99,
"min": 591.84,
"max": 1532.57
}
}
}
],
"currency": "SEK",
"exchangeRate": 11.66314,
"exchangeRate": 11.03362,
"areaStates": [
{
"state": "Final",
@@ -262,11 +838,11 @@
"areaAverages": [
{
"areaCode": "SE3",
"price": 900.65
"price": 1129.65
},
{
"areaCode": "SE4",
"price": 1581.19
"price": 1119.28
}
]
}

View File

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

View File

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

View File

@@ -1,184 +1,184 @@
{
"deliveryDateCET": "2025-07-06",
"version": 2,
"updatedAt": "2025-07-05T10:56:44.6936838Z",
"deliveryDateCET": "2025-10-01",
"version": 3,
"updatedAt": "2025-09-30T12:08:22.6180024Z",
"market": "DayAhead",
"indexNames": ["SE3"],
"currency": "SEK",
"resolutionInMinutes": 60,
"areaStates": [
{
"state": "Preliminary",
"state": "Final",
"areas": ["SE3"]
}
],
"multiIndexEntries": [
{
"deliveryStart": "2025-07-05T22:00:00Z",
"deliveryEnd": "2025-07-05T23:00:00Z",
"deliveryStart": "2025-09-30T22:00:00Z",
"deliveryEnd": "2025-09-30T23:00:00Z",
"entryPerArea": {
"SE3": 43.57
"SE3": 523.75
}
},
{
"deliveryStart": "2025-07-05T23:00:00Z",
"deliveryEnd": "2025-07-06T00:00:00Z",
"deliveryStart": "2025-09-30T23:00:00Z",
"deliveryEnd": "2025-10-01T00:00:00Z",
"entryPerArea": {
"SE3": 36.47
"SE3": 485.95
}
},
{
"deliveryStart": "2025-07-06T00:00:00Z",
"deliveryEnd": "2025-07-06T01:00:00Z",
"deliveryStart": "2025-10-01T00:00:00Z",
"deliveryEnd": "2025-10-01T01:00:00Z",
"entryPerArea": {
"SE3": 35.57
"SE3": 504.85
}
},
{
"deliveryStart": "2025-07-06T01:00:00Z",
"deliveryEnd": "2025-07-06T02:00:00Z",
"deliveryStart": "2025-10-01T01:00:00Z",
"deliveryEnd": "2025-10-01T02:00:00Z",
"entryPerArea": {
"SE3": 30.73
"SE3": 442.07
}
},
{
"deliveryStart": "2025-07-06T02:00:00Z",
"deliveryEnd": "2025-07-06T03:00:00Z",
"deliveryStart": "2025-10-01T02:00:00Z",
"deliveryEnd": "2025-10-01T03:00:00Z",
"entryPerArea": {
"SE3": 32.42
"SE3": 496.12
}
},
{
"deliveryStart": "2025-07-06T03:00:00Z",
"deliveryEnd": "2025-07-06T04:00:00Z",
"deliveryStart": "2025-10-01T03:00:00Z",
"deliveryEnd": "2025-10-01T04:00:00Z",
"entryPerArea": {
"SE3": 38.73
"SE3": 670.85
}
},
{
"deliveryStart": "2025-07-06T04:00:00Z",
"deliveryEnd": "2025-07-06T05:00:00Z",
"deliveryStart": "2025-10-01T04:00:00Z",
"deliveryEnd": "2025-10-01T05:00:00Z",
"entryPerArea": {
"SE3": 42.78
"SE3": 1149.72
}
},
{
"deliveryStart": "2025-07-06T05:00:00Z",
"deliveryEnd": "2025-07-06T06:00:00Z",
"deliveryStart": "2025-10-01T05:00:00Z",
"deliveryEnd": "2025-10-01T06:00:00Z",
"entryPerArea": {
"SE3": 54.71
"SE3": 1694.25
}
},
{
"deliveryStart": "2025-07-06T06:00:00Z",
"deliveryEnd": "2025-07-06T07:00:00Z",
"deliveryStart": "2025-10-01T06:00:00Z",
"deliveryEnd": "2025-10-01T07:00:00Z",
"entryPerArea": {
"SE3": 83.87
"SE3": 1378.06
}
},
{
"deliveryStart": "2025-07-06T07:00:00Z",
"deliveryEnd": "2025-07-06T08:00:00Z",
"deliveryStart": "2025-10-01T07:00:00Z",
"deliveryEnd": "2025-10-01T08:00:00Z",
"entryPerArea": {
"SE3": 78.8
"SE3": 1063.41
}
},
{
"deliveryStart": "2025-07-06T08:00:00Z",
"deliveryEnd": "2025-07-06T09:00:00Z",
"deliveryStart": "2025-10-01T08:00:00Z",
"deliveryEnd": "2025-10-01T09:00:00Z",
"entryPerArea": {
"SE3": 92.09
"SE3": 874.53
}
},
{
"deliveryStart": "2025-07-06T09:00:00Z",
"deliveryEnd": "2025-07-06T10:00:00Z",
"deliveryStart": "2025-10-01T09:00:00Z",
"deliveryEnd": "2025-10-01T10:00:00Z",
"entryPerArea": {
"SE3": 104.92
"SE3": 708.2
}
},
{
"deliveryStart": "2025-07-06T10:00:00Z",
"deliveryEnd": "2025-07-06T11:00:00Z",
"deliveryStart": "2025-10-01T10:00:00Z",
"deliveryEnd": "2025-10-01T11:00:00Z",
"entryPerArea": {
"SE3": 72.5
"SE3": 646.53
}
},
{
"deliveryStart": "2025-07-06T11:00:00Z",
"deliveryEnd": "2025-07-06T12:00:00Z",
"deliveryStart": "2025-10-01T11:00:00Z",
"deliveryEnd": "2025-10-01T12:00:00Z",
"entryPerArea": {
"SE3": 63.49
"SE3": 667.97
}
},
{
"deliveryStart": "2025-07-06T12:00:00Z",
"deliveryEnd": "2025-07-06T13:00:00Z",
"deliveryStart": "2025-10-01T12:00:00Z",
"deliveryEnd": "2025-10-01T13:00:00Z",
"entryPerArea": {
"SE3": 91.64
"SE3": 710.63
}
},
{
"deliveryStart": "2025-07-06T13:00:00Z",
"deliveryEnd": "2025-07-06T14:00:00Z",
"deliveryStart": "2025-10-01T13:00:00Z",
"deliveryEnd": "2025-10-01T14:00:00Z",
"entryPerArea": {
"SE3": 111.79
"SE3": 807.23
}
},
{
"deliveryStart": "2025-07-06T14:00:00Z",
"deliveryEnd": "2025-07-06T15:00:00Z",
"deliveryStart": "2025-10-01T14:00:00Z",
"deliveryEnd": "2025-10-01T15:00:00Z",
"entryPerArea": {
"SE3": 234.04
"SE3": 909.35
}
},
{
"deliveryStart": "2025-07-06T15:00:00Z",
"deliveryEnd": "2025-07-06T16:00:00Z",
"deliveryStart": "2025-10-01T15:00:00Z",
"deliveryEnd": "2025-10-01T16:00:00Z",
"entryPerArea": {
"SE3": 435.33
"SE3": 1388.22
}
},
{
"deliveryStart": "2025-07-06T16:00:00Z",
"deliveryEnd": "2025-07-06T17:00:00Z",
"deliveryStart": "2025-10-01T16:00:00Z",
"deliveryEnd": "2025-10-01T17:00:00Z",
"entryPerArea": {
"SE3": 431.84
"SE3": 2350.51
}
},
{
"deliveryStart": "2025-07-06T17:00:00Z",
"deliveryEnd": "2025-07-06T18:00:00Z",
"deliveryStart": "2025-10-01T17:00:00Z",
"deliveryEnd": "2025-10-01T18:00:00Z",
"entryPerArea": {
"SE3": 423.73
"SE3": 3125.13
}
},
{
"deliveryStart": "2025-07-06T18:00:00Z",
"deliveryEnd": "2025-07-06T19:00:00Z",
"deliveryStart": "2025-10-01T18:00:00Z",
"deliveryEnd": "2025-10-01T19:00:00Z",
"entryPerArea": {
"SE3": 437.92
"SE3": 1427.24
}
},
{
"deliveryStart": "2025-07-06T19:00:00Z",
"deliveryEnd": "2025-07-06T20:00:00Z",
"deliveryStart": "2025-10-01T19:00:00Z",
"deliveryEnd": "2025-10-01T20:00:00Z",
"entryPerArea": {
"SE3": 416.42
"SE3": 1056.89
}
},
{
"deliveryStart": "2025-07-06T20:00:00Z",
"deliveryEnd": "2025-07-06T21:00:00Z",
"deliveryStart": "2025-10-01T20:00:00Z",
"deliveryEnd": "2025-10-01T21:00:00Z",
"entryPerArea": {
"SE3": 414.39
"SE3": 907.69
}
},
{
"deliveryStart": "2025-07-06T21:00:00Z",
"deliveryEnd": "2025-07-06T22:00:00Z",
"deliveryStart": "2025-10-01T21:00:00Z",
"deliveryEnd": "2025-10-01T22:00:00Z",
"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_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.01177',
'state': '1.99796',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_daily_average-entry]
@@ -154,7 +154,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.90074',
'state': '1.03398',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_exchange_rate-entry]
@@ -205,7 +205,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '11.6402',
'state': '11.05186',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_highest_price-entry]
@@ -249,9 +249,9 @@
# name: test_sensor[sensor.nord_pool_se3_highest_price-state]
StateSnapshot({
'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',
'start': '2024-11-05T16:00:00+00:00',
'start': '2025-10-01T17:00:00+00:00',
'unit_of_measurement': 'SEK/kWh',
}),
'context': <ANY>,
@@ -259,7 +259,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '2.51265',
'state': '3.82803',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_last_updated-entry]
@@ -308,7 +308,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -352,9 +352,9 @@
# name: test_sensor[sensor.nord_pool_se3_lowest_price-state]
StateSnapshot({
'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',
'start': '2024-11-05T02:00:00+00:00',
'start': '2025-10-01T02:00:00+00:00',
'unit_of_measurement': 'SEK/kWh',
}),
'context': <ANY>,
@@ -362,7 +362,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.06169',
'state': '0.44196',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_next_price-entry]
@@ -414,7 +414,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.83553',
'state': '1.21814',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_1_average-entry]
@@ -469,7 +469,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.42287',
'state': '0.74593',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_1_highest_price-entry]
@@ -524,7 +524,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.40614',
'state': '1.80996',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_1_lowest_price-entry]
@@ -579,7 +579,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.06169',
'state': '0.44196',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_1_time_from-entry]
@@ -628,7 +628,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -677,7 +677,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -732,7 +732,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.61079',
'state': '1.05461',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_2_highest_price-entry]
@@ -787,7 +787,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.83553',
'state': '1.99796',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_2_lowest_price-entry]
@@ -842,7 +842,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.28914',
'state': '0.78568',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_off_peak_2_time_from-entry]
@@ -891,7 +891,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -940,7 +940,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -995,7 +995,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.31597',
'state': '1.21913',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_peak_highest_price-entry]
@@ -1050,7 +1050,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '2.51265',
'state': '3.82803',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_peak_lowest_price-entry]
@@ -1105,7 +1105,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.92505',
'state': '0.60774',
})
# ---
# name: test_sensor[sensor.nord_pool_se3_peak_time_from-entry]
@@ -1154,7 +1154,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -1203,7 +1203,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -1255,7 +1255,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.81983',
'state': '3.82803',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_currency-entry]
@@ -1413,7 +1413,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.16612',
'state': '1.18078',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_exchange_rate-entry]
@@ -1464,7 +1464,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '11.6402',
'state': '11.05186',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_highest_price-entry]
@@ -1508,9 +1508,9 @@
# name: test_sensor[sensor.nord_pool_se4_highest_price-state]
StateSnapshot({
'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',
'start': '2024-11-05T16:00:00+00:00',
'start': '2025-10-01T17:00:00+00:00',
'unit_of_measurement': 'SEK/kWh',
}),
'context': <ANY>,
@@ -1518,7 +1518,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '3.53303',
'state': '4.44274',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_last_updated-entry]
@@ -1567,7 +1567,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -1611,9 +1611,9 @@
# name: test_sensor[sensor.nord_pool_se4_lowest_price-state]
StateSnapshot({
'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',
'start': '2024-11-05T18:00:00+00:00',
'start': '2025-10-01T18:00:00+00:00',
'unit_of_measurement': 'SEK/kWh',
}),
'context': <ANY>,
@@ -1673,7 +1673,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.11257',
'state': '1.40502',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_1_average-entry]
@@ -1728,7 +1728,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.49797',
'state': '0.86099',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_1_highest_price-entry]
@@ -1783,7 +1783,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.64825',
'state': '2.02934',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_1_lowest_price-entry]
@@ -1838,7 +1838,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.06519',
'state': '0.51546',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_1_time_from-entry]
@@ -1887,7 +1887,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -1936,7 +1936,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -1991,7 +1991,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.79398',
'state': '1.21907',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_2_highest_price-entry]
@@ -2046,7 +2046,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.11257',
'state': '2.31216',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_2_lowest_price-entry]
@@ -2101,7 +2101,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.34921',
'state': '0.91222',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_off_peak_2_time_from-entry]
@@ -2150,7 +2150,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -2199,7 +2199,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -2254,7 +2254,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.73559',
'state': '1.38122',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_peak_highest_price-entry]
@@ -2309,7 +2309,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '3.53303',
'state': '4.44274',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_peak_lowest_price-entry]
@@ -2364,7 +2364,7 @@
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '1.08172',
'state': '0.68312',
})
# ---
# name: test_sensor[sensor.nord_pool_se4_peak_time_from-entry]
@@ -2413,7 +2413,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -2462,7 +2462,7 @@
'last_changed': <ANY>,
'last_reported': <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]
@@ -2514,6 +2514,6 @@
'last_changed': <ANY>,
'last_reported': <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
@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:
"""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"}
@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(
hass: HomeAssistant, load_int: None, get_client: NordPoolClient
) -> None:
@@ -61,7 +61,7 @@ async def test_single_config_entry(
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(
("error_message", "p_error"),
[
@@ -107,7 +107,7 @@ async def test_cannot_connect(
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(
hass: HomeAssistant,
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(
("error_message", "p_error"),
[

View File

@@ -31,7 +31,7 @@ from . import ENTRY_CONFIG
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(
hass: HomeAssistant,
get_client: NordPoolClient,
@@ -50,7 +50,26 @@ async def test_coordinator(
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
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 (
patch(
@@ -63,7 +82,7 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1
state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "0.92505"
assert state.state == "0.66068"
with (
patch(
@@ -77,7 +96,7 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1
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
with (
@@ -93,7 +112,7 @@ async def test_coordinator(
# Empty responses does not raise
assert mock_data.call_count == 3
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
with (
@@ -108,7 +127,7 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1
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
with (
@@ -123,7 +142,7 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1
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
with (
@@ -138,14 +157,14 @@ async def test_coordinator(
await hass.async_block_till_done(wait_background_tasks=True)
assert mock_data.call_count == 1
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
freezer.tick(timedelta(hours=1))
async_fire_time_changed(hass)
await hass.async_block_till_done()
state = hass.states.get("sensor.nord_pool_se3_current_price")
assert state.state == "1.81983"
assert state.state == "3.42983"
# Test manual polling
hass.config_entries.async_update_entry(
@@ -156,14 +175,14 @@ async def test_coordinator(
async_fire_time_changed(hass)
await hass.async_block_till_done()
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)
freezer.tick(timedelta(hours=1))
async_fire_time_changed(hass)
await hass.async_block_till_done()
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
with (
@@ -184,7 +203,7 @@ async def test_coordinator(
async_fire_time_changed(hass)
await hass.async_block_till_done()
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(
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
@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(
hass: HomeAssistant,
hass_client: ClientSessionGenerator,

View File

@@ -28,7 +28,7 @@ from tests.common import MockConfigEntry, async_load_fixture
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:
"""Test load and unload an entry."""
entry = MockConfigEntry(
@@ -79,7 +79,7 @@ async def test_initial_startup_fails(
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(
hass: HomeAssistant,
aioclient_mock: AiohttpClientMocker,
@@ -115,7 +115,7 @@ async def test_reconfigure_cleans_up_device(
"GET",
url=API + "/DayAheadPrices",
params={
"date": "2024-11-04",
"date": "2025-09-30",
"market": "DayAhead",
"deliveryArea": "NL",
"currency": "EUR",
@@ -126,7 +126,7 @@ async def test_reconfigure_cleans_up_device(
"GET",
url=API + "/DayAheadPrices",
params={
"date": "2024-11-05",
"date": "2025-10-01",
"market": "DayAhead",
"deliveryArea": "NL",
"currency": "EUR",
@@ -137,7 +137,7 @@ async def test_reconfigure_cleans_up_device(
"GET",
url=API + "/DayAheadPrices",
params={
"date": "2024-11-06",
"date": "2025-10-02",
"market": "DayAhead",
"deliveryArea": "NL",
"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
@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")
async def test_sensor(
hass: HomeAssistant,
@@ -33,7 +33,7 @@ async def test_sensor(
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")
async def test_sensor_current_price_is_0(
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")
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")
async def test_sensor_no_next_price(hass: HomeAssistant, load_int: ConfigEntry) -> None:
"""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 last_price is not None
assert next_price is not None
assert current_price.state == "0.12666" # SE3 2024-11-05T23:00:00Z
assert last_price.state == "0.28914" # SE3 2024-11-05T22:00:00Z
assert next_price.state == "0.07406" # SE3 2024-11-06T00:00:00Z"
assert current_price.state == "0.78568" # SE3 2025-10-01T21:45:00Z
assert last_price.state == "0.82171" # SE3 2025-10-01T21:30: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")
async def test_sensor_no_previous_price(
hass: HomeAssistant, load_int: ConfigEntry
@@ -77,12 +77,12 @@ async def test_sensor_no_previous_price(
assert current_price is not None
assert last_price is not None
assert next_price is not None
assert current_price.state == "0.12666" # SE3 2024-11-05T23:00:00Z
assert last_price.state == "0.28914" # SE3 2024-11-05T22:00:00Z
assert next_price.state == "0.07406" # SE3 2024-11-06T00:00:00Z
assert current_price.state == "0.93322" # SE3 2025-10-01T22:00:00Z
assert last_price.state == "0.8605" # SE3 2025-10-01T21:45: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")
async def test_sensor_empty_response(
hass: HomeAssistant,
@@ -101,16 +101,16 @@ async def test_sensor_empty_response(
assert current_price is not None
assert last_price is not None
assert next_price is not None
assert current_price.state == "0.92737"
assert last_price.state == "1.03132"
assert next_price.state == "0.92505"
assert current_price.state == "0.67405"
assert last_price.state == "0.8616"
assert next_price.state == "0.63736"
aioclient_mock.clear_requests()
aioclient_mock.request(
"GET",
url=API + "/DayAheadPrices",
params={
"date": "2024-11-04",
"date": "2025-09-30",
"market": "DayAhead",
"deliveryArea": "SE3,SE4",
"currency": "SEK",
@@ -121,7 +121,7 @@ async def test_sensor_empty_response(
"GET",
url=API + "/DayAheadPrices",
params={
"date": "2024-11-05",
"date": "2025-10-01",
"market": "DayAhead",
"deliveryArea": "SE3,SE4",
"currency": "SEK",
@@ -133,7 +133,7 @@ async def test_sensor_empty_response(
"GET",
url=API + "/DayAheadPrices",
params={
"date": "2024-11-06",
"date": "2025-10-02",
"market": "DayAhead",
"deliveryArea": "SE3,SE4",
"currency": "SEK",
@@ -153,16 +153,16 @@ async def test_sensor_empty_response(
assert current_price is not None
assert last_price is not None
assert next_price is not None
assert current_price.state == "0.92505"
assert last_price.state == "0.92737"
assert next_price.state == "0.94949"
assert current_price.state == "0.63736"
assert last_price.state == "0.67405"
assert next_price.state == "0.62233"
aioclient_mock.clear_requests()
aioclient_mock.request(
"GET",
url=API + "/DayAheadPrices",
params={
"date": "2024-11-04",
"date": "2025-09-30",
"market": "DayAhead",
"deliveryArea": "SE3,SE4",
"currency": "SEK",
@@ -173,7 +173,7 @@ async def test_sensor_empty_response(
"GET",
url=API + "/DayAheadPrices",
params={
"date": "2024-11-05",
"date": "2025-10-01",
"market": "DayAhead",
"deliveryArea": "SE3,SE4",
"currency": "SEK",
@@ -185,7 +185,7 @@ async def test_sensor_empty_response(
"GET",
url=API + "/DayAheadPrices",
params={
"date": "2024-11-06",
"date": "2025-10-02",
"market": "DayAhead",
"deliveryArea": "SE3,SE4",
"currency": "SEK",
@@ -193,7 +193,7 @@ async def test_sensor_empty_response(
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)
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 last_price is not None
assert next_price is not None
assert current_price.state == "0.28914"
assert last_price.state == "0.5223"
assert current_price.state == "0.78568"
assert last_price.state == "0.82171"
assert next_price.state == STATE_UNKNOWN

View File

@@ -30,31 +30,31 @@ from tests.test_util.aiohttp import AiohttpClientMocker
TEST_SERVICE_DATA = {
ATTR_CONFIG_ENTRY: "to_replace",
ATTR_DATE: "2024-11-05",
ATTR_DATE: "2025-10-01",
ATTR_AREAS: "SE3",
ATTR_CURRENCY: "EUR",
}
TEST_SERVICE_DATA_USE_DEFAULTS = {
ATTR_CONFIG_ENTRY: "to_replace",
ATTR_DATE: "2024-11-05",
ATTR_DATE: "2025-10-01",
}
TEST_SERVICE_INDICES_DATA_60 = {
ATTR_CONFIG_ENTRY: "to_replace",
ATTR_DATE: "2025-07-06",
ATTR_DATE: "2025-10-01",
ATTR_AREAS: "SE3",
ATTR_CURRENCY: "SEK",
ATTR_RESOLUTION: 60,
}
TEST_SERVICE_INDICES_DATA_15 = {
ATTR_CONFIG_ENTRY: "to_replace",
ATTR_DATE: "2025-07-06",
ATTR_DATE: "2025-10-01",
ATTR_AREAS: "SE3",
ATTR_CURRENCY: "SEK",
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(
hass: HomeAssistant,
load_int: MockConfigEntry,
@@ -96,7 +96,7 @@ async def test_service_call(
(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(
hass: HomeAssistant,
load_int: MockConfigEntry,
@@ -124,7 +124,7 @@ async def test_service_call_failures(
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(
hass: HomeAssistant,
load_int: MockConfigEntry,
@@ -151,7 +151,7 @@ async def test_empty_response_returns_empty_list(
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(
hass: HomeAssistant,
load_int: MockConfigEntry,
@@ -184,7 +184,7 @@ async def test_service_call_config_entry_bad_state(
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(
hass: HomeAssistant,
load_int: MockConfigEntry,
@@ -200,7 +200,7 @@ async def test_service_call_for_price_indices(
"GET",
url=API + "/DayAheadPriceIndices",
params={
"date": "2025-07-06",
"date": "2025-10-01",
"market": "DayAhead",
"indexNames": "SE3",
"currency": "SEK",
@@ -213,7 +213,7 @@ async def test_service_call_for_price_indices(
"GET",
url=API + "/DayAheadPriceIndices",
params={
"date": "2025-07-06",
"date": "2025-10-01",
"market": "DayAhead",
"indexNames": "SE3",
"currency": "SEK",

View File

@@ -166,6 +166,7 @@ def mock_smartthings() -> Generator[AsyncMock]:
"hw_q80r_soundbar",
"gas_meter",
"lumi",
"tesla_powerwall",
]
)
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,
})
# ---
# 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]
DeviceRegistryEntrySnapshot({
'area_id': None,

View File

@@ -13969,6 +13969,56 @@
'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]
EntityRegistryEntrySnapshot({
'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(
aioclient_mock: AiohttpClientMocker, device_name: str, override: Any
) -> 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)
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")
assert state is not None
assert state.state == "on"
@@ -78,6 +83,10 @@ async def test_holiday_calendar_entity(
async_fire_time_changed(hass)
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")
assert state is not None
assert state.state == "off"

View File

@@ -160,7 +160,7 @@ def mock_detect_radio_type(
def com_port(device="/dev/ttyUSB1234") -> ListPortInfo:
"""Mock of a serial port."""
port = ListPortInfo("/dev/ttyUSB1234")
port = ListPortInfo(device)
port.serial_number = "1234"
port.manufacturer = "Virtual serial port"
port.device = device
@@ -2102,7 +2102,7 @@ async def test_options_flow_defaults(
assert result1["step_id"] == "prompt_migrate_or_reconfigure"
result2 = await hass.config_entries.options.async_configure(
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
@@ -2180,8 +2180,8 @@ async def test_options_flow_defaults(
)
await hass.async_block_till_done()
assert result7["type"] is FlowResultType.CREATE_ENTRY
assert result7["data"] == {}
assert result7["type"] is FlowResultType.ABORT
assert result7["reason"] == "reconfigure_successful"
# The updated entry contains correct settings
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"
result2 = await hass.config_entries.options.async_configure(
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
@@ -2320,7 +2320,7 @@ async def test_options_flow_restarts_running_zha_if_cancelled(
assert result1["step_id"] == "prompt_migrate_or_reconfigure"
result2 = await hass.config_entries.options.async_configure(
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
@@ -2336,19 +2336,18 @@ async def test_options_flow_restarts_running_zha_if_cancelled(
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))
async def test_options_flow_migration_reset_old_adapter(
hass: HomeAssistant, mock_app
hass: HomeAssistant, backup, mock_app
) -> 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(
version=config_flow.ZhaConfigFlowHandler.VERSION,
domain=DOMAIN,
data={
CONF_DEVICE: {
CONF_DEVICE_PATH: "/dev/serial/by-id/old_radio",
CONF_DEVICE_PATH: "/dev/ttyUSB_old",
CONF_BAUDRATE: 12345,
CONF_FLOW_CONTROL: None,
},
@@ -2366,39 +2365,158 @@ async def test_options_flow_migration_reset_old_adapter(
with patch(
"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={}
)
entry.mock_state(hass, ConfigEntryState.NOT_LOADED)
assert result1["step_id"] == "prompt_migrate_or_reconfigure"
result2 = await hass.config_entries.options.async_configure(
flow["flow_id"],
user_input={"next_step_id": config_flow.OPTIONS_INTENT_MIGRATE},
assert result_init["step_id"] == "prompt_migrate_or_reconfigure"
with (
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
assert result2["step_id"] == "intent_migrate"
await hass.config_entries.async_setup(entry.entry_id)
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(
flow["flow_id"],
user_input={},
)
# ZHA gets unloaded
with patch(
"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 result3["step_id"] == "instruct_unplug"
assert result_init["step_id"] == "prompt_migrate_or_reconfigure"
# And move on to choosing the new radio
result4 = await hass.config_entries.options.async_configure(
flow["flow_id"],
user_input={},
)
assert result4["step_id"] == "choose_serial_port"
with (
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_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(

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")
async def test_esphome_discovery(
async def test_esphome_discovery_intent_custom(
hass: HomeAssistant,
install_addon: AsyncMock,
set_addon_options: AsyncMock,
@@ -1290,6 +1290,82 @@ async def test_esphome_discovery(
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")
async def test_esphome_discovery_already_configured(
hass: HomeAssistant,
@@ -1303,7 +1379,11 @@ async def test_esphome_discovery_already_configured(
entry = MockConfigEntry(
entry_id="mock-entry-id",
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,
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")
async def test_discovery_addon_not_running(
hass: HomeAssistant,

View File

@@ -1073,6 +1073,16 @@ async def test_light_color_only(
)
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()
# 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()
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
event = Event(
type="value updated",