|
|
2026.10
✨ Features
- Pairings as their own surface — a device's gateway pairings are read with
ListDevicePairingsQuery, paged from either end, and counted for many devices at once with ListDevicePairingCountsQuery. A roaming device may be carried by thousands of gateways, so pairings are no longer returned inline on a device entry.
- Find what a gateway is still carrying —
ListDevicePairingsQuery takes releaseOwed to list pairings this register has finished with that the gateway has not been seen to let go of, including those whose device has since been deleted. This is how to find devices a hub still holds that nobody wants, typically because it was offline when the removal was decided.
- Pairings report when the gateway let go —
DevicePairingEntry.releasedAt distinguishes "removed" from "removed everywhere". It is set only by the gateway's own account of what it holds, never by the removal being sent.
- Cloud-mastered device configuration — from revision 2 onward the cloud is the master of a device's configuration, and a configuration a device reports that the cloud never gave it is corrected. A device's manufacturer declares whether it takes configuration at all, and what its defaults are.
- Clearer configuration recovery —
ClearConfigurationCommand returns a device to its manufacturer's defaults and resumes cloud mastering. ResetConfigurationRevisionCommand gives up cloud configuration of a device, leaving it with whatever it holds. The two were previously easy to confuse.
- Filtered device reads —
GetDeviceRegisterEntryQuery takes gatewayIds to keep only named gateways' reports, and gatewayReportStateNames to keep only named state values, so a signal-strength view across a device's gateways is one read rather than a full entry.
- Gateway reconnection is owed what it missed — a gateway coming back online is told the pairings and configurations it did not receive while away, and work waits for its session to report ready instead of failing.
- Vendor-declared devices — a vendor declares the devices it manufactures rather than being asked to recognise them, and a vendor's products are claimed by name instead of inferring the radio from a label.
- Spot prices without signing in — the REST spot-price endpoint answers without an access token, takes an optional market area (Finland when omitted), and takes a timestamp to return only prices newer than the last one a caller holds. A token that has expired no longer turns a price read into an error. The hub price endpoint takes the same area and timestamp. (2026.10.1)
🛠️ Fixes
- Configuration convergence no longer holds the register while it runs, and concurrent configuration writes no longer overtake each other.
- A configuration reset restarts from the baseline rather than from a partially applied state.
- Configuration status listings page over a stable ordering, so entries are not skipped or repeated while statuses change during paging.
- A staged configuration now reaches a roaming device.
- Pairing refusals fail visibly, a repeated pairing request does not pair twice, and an ended pairing stays ended.
- A gateway that has been removed leaves no dependent device records behind, and a cold device-register index no longer refuses reads while it warms.
- A gateway that repeatedly drops when asked to do work is left alone rather than retried into the ground.
- Event egress no longer sends an empty batch when the target suppressed every message in it.
- Cancelling an operation is restricted to whoever started it. Previously anyone who could read an operation could cancel it; the attempt is now refused with
E_ACCESS_DENIED. Reading is unchanged.
- Site events keep flowing after a brief service disruption. Previously a site could silently stop publishing device events until it was restarted. (2026.10.1)
- Spot price series are complete. A slot whose price was the same as the slot before it used to be missing from every price endpoint, leaving gaps of up to several hours; each slot is now present, and the gaps in recent days are filled in. (2026.10.2)
- Spot prices for Denmark:
DK1 and DK2 are accepted wherever a market area is named, and an area code is read the same with or without underscores (DK_1 is DK1). (2026.10.3)
- Spot prices for Denmark are collected. Each day's prices for
DK1 and DK2 were read twice from the market data, so a collection for either area stored nothing; Denmark's prices are now collected and published like every other area. A collection that fails is reported as failed, rather than looking like a day without prices. (2026.10.4)
- Event egress keeps delivering when a site's processing is reassigned during a delivery. Previously the processing could stop receiving the site's events while its target still read as Idle, until the target was edited. It now reads the event stream only as fast as it delivers, is restarted on its own when it has events waiting and makes no progress for 5 minutes, and a target whose batches keep failing reads as Failing even while HeartBeat events get through. A restarted target resumes from its last delivered event and a new target records where it started, so a restart never skips waiting events; events the platform no longer holds are reported in the target's status as expired, instead of being skipped silently. (2026.10.5)
⚠️ Deprecations
- A device-register cursor is now bound to the register and ordering it was issued for, and is refused elsewhere. Cursors from
releaseOwed come from a separate sequence and are not interchangeable with ordinary pairing cursors.
2026.9
✨ Features
- Operations API — start or cancel durable operations, list and filter them, page through their ordered steps, and inspect partial outcomes reported as degraded.
- Expanded Graph and OpenAPI coverage — new public contracts cover device state, raw device commands, gateway registration, pairing, routing, configuration convergence, and real-time device updates.
- Device and gateway management — pair or unpair devices with named gateways, synchronize pairings, reconcile gateway inventories, and track configuration ownership and revision status.
- Configuration delivery — desired device configurations are delivered to reachable gateways and tracked through desired, applied, and reported revisions; an offline gateway can converge after reconnecting.
- Site management — create and delete entities in bulk, link devices explicitly, find devices not yet linked to an entity, remove attributes, and preview site schema updates with dry-run validation.
- Safer concurrent editing — site schemas, templates, and tenant properties now expose revision checks so conflicting updates can be detected instead of silently overwriting changes.
- Consistent pagination — device-register entries and operation steps support cursor paging, while list queries provide deterministic ordering and result counts.
- Hub administration — hub user assignments and restart or reboot operations are available through the public Graph API, with richer hub metadata for management views.
- More resilient live updates — per-session push subscriptions recover after reconnects and support both site and device-register views.
🛠️ Fixes
- Authentication and validation responses now use stable error codes and consistent field names; expired sessions are distinguished from invalid tokens.
- Device pairing, routing, and configuration delivery are more reliable across multiple gateways and roaming devices.
- Roaming devices retain their identity and report full state across gateways, including when they last reported.
- Existing identifiers that use legacy casing or underscores remain readable after the stricter naming rules.
- Site and device-register reads tolerate legacy identifiers and malformed stored paths without making an entire view unavailable.
- Paged queries now use stable ordering and reject invalid offsets consistently.
⚠️ Deprecations
- Inline device routing is deprecated in favor of dedicated routing operations.
2026.7
✨ Features
- Currency exchange rates — new service providing EUR-based currency conversion rates.
- Spot prices — new public
ListSpotPricesQuery to fetch prices by area over a start/stop time range.
- Device configuration revisions — configuration changes are now versioned, with revision tracking and monitoring.
- Site egress health & latency — new schemas exposing egress health status and latency statistics.
- Leaf entity types in site schemas — site schemas now support leaf entity types.
- Key vault key limits — per-target cap on the number of keys, returning
E_RESOURCE_LIMIT_REACHED when exceeded; list filters aligned with the standard conventions.
- Device register columns —
GetDeviceRegisterEntryColumnsQuery is now served directly by the grain.
- More consistent validation & identity handling across graph commands and queries.
🛠️ Fixes
- Event egress consumer: added fault handling and a configurable message-size limit.
- Improved egress consumer maintenance and heartbeat handling.
- More robust Kafka producer error handling and a cleaner shutdown process.
⚠️ Deprecations
- OneAPI 1.0 is deprecated and scheduled for sunset on 31 December 2026. It remains available until then; migrate integrations to the Graph query and command endpoints in OneAPI 3.0.
- The five legacy OneAPI 3.0 hub and device-register command/query operations are deprecated with the same sunset date. Use
/graph/query and /graph/command instead.
- The legacy column-params device register query is deprecated — use
GetDeviceRegisterEntryColumnsQuery.
2026.4
✨ Features
- KeyVault for storing secrets with rolling updates, supporting Tenant and Device Register.
- Add DeleteTenantCommand for tenant deletion functionality.
- Add GetCurrentTenant and SetCurrentTenant commands with corresponding query and result schemas.
- Egress: Optional lock for HttpClient per domain to avoid concurrent calls to the same domain.
🛠️ Fixes
- Reduce site entity device mapping update frequency to avoid excessive updates, plausible duplicates, and improve performance.
- Unwrap ROAMING device events to avoid unnecessary nesting and improve event handling.
- Reduce query context on GetCurrentTenantCommand to avoid unnecessary data fetching and improve performance.
🚀 Performance
- Remove OpenAPI generated code for deprecated methods.
- Updated internal methods to accept CancellationToken for improved cancellation support.
- Optimize database query indexes for large dataset retrieval.
2026.1
|
|
|
|
|
|