From 238601246d5b909b80b8042a03a6e2c808f6abf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Dom=C3=ADnguez?= Date: Tue, 16 Jun 2026 15:08:50 +0200 Subject: [PATCH 1/3] add example for non controllable devices --- website/docs/examples/nocontrol.md | 187 ++++++++++++++++++ .../img/no-control-sequence-diagram.png | Bin 0 -> 11842 bytes 2 files changed, 187 insertions(+) create mode 100644 website/docs/examples/nocontrol.md create mode 100644 website/static/img/no-control-sequence-diagram.png diff --git a/website/docs/examples/nocontrol.md b/website/docs/examples/nocontrol.md new file mode 100644 index 0000000..08bb2fb --- /dev/null +++ b/website/docs/examples/nocontrol.md @@ -0,0 +1,187 @@ +--- +title: "Example: Non controllable assets" +hide_title: true +--- + +This page serves as a guide for implementing an S2 RM for a non-flexible device, or to give a CEM developer a better understanding of what to expect when controlling the energy flexibility of a non-flexible device. It provides some example S2 messages for same (fictional) non-flexible devices. + +## Example: Non controllable assets + +In this example we will work out the communication between CEM and RM for a non-controllable asset. The RM will provide the CEM with a power forecast and real time power measurements, but the CEM will not be able to control the asset in any way. + +The following sequence diagram is an example of what a message exchange between a CEM and RM could look like, but messages could also be sent in a different order (see also [State of communication](/docs/communication-layer/discovery-pairing-authentication/#state-of-communication)). `ReceptionStatus` messages are omitted for readability. + +![XPBVhX8n4CRl-nHz0FK1l308I2Hn4xCByNhiVe66RcUTcMBmwLqW9-bXEJcty_l-TD9Pg95O6P9pcGsUpn2_-jPyy6tpsV_2xux32UO3vunWw9sRgF_uvSQ_K-xrI2UuzZQRK3ryfcoX8sV5qxvjZXOfnN_NdYfoCd6HW8Oo7I1h6CMaTNw7X60hpYQSTfVnUNx5FGMBPxA7fasxN](../../static/img/no-control-sequence-diagram.png) +
+ +Image generated using the following PlantUML code: + +``` +@startuml + +note over CEM, RM: WebSocket connected + +CEM -> RM: Handshake +RM -> CEM: Handshake +CEM -> RM: HandshakeResponse + +note over CEM, RM: Initialized + +RM -> CEM: ResourceManagerDetails +CEM -> RM: SelectControlType + +note over CEM, RM: ControlType activated + +loop in no particular order +RM -> CEM: PowerMeasurement +RM --> CEM: PowerForecast [Optional] + +end loop + +RM -> CEM: SessionRequest + +note over CEM, RM: WebSocket disconnected + +@enduml +``` + +
+ +### CEM -> RM: Handshake +The CEM informs the RM that it is a CEM and which versions of s2-ws-json it supports. +```json +{ + "message_type": "Handshake", + "message_id": "4834583e-5d8a-4fb2-a955-c99fc4583b7a", + "role": "CEM", + "supported_protocol_versions": [ + "0.0.2-beta" + ] +} +``` + +### RM -> CEM: Handshake +The RM informs the CEM that it is a RM and which versions of s2-ws-json it supports. +```json +{ + "message_type": "Handshake", + "message_id": "a377dfd9-48b3-42a4-89c3-2c99c4824458", + "role": "RM", + "supported_protocol_versions": [ + "0.0.2-beta" + ] +} +``` + +### CEM -> RM: HandshakeResponse +The CEM informs the RM which version of s2-ws-json it has selected for this session. +```json +{ + "message_type": "HandshakeResponse", + "message_id": "7b0943cb-9b8d-45dc-bd80-83c20b4371ef", + "selected_protocol_version": "0.0.2-beta" +} +``` + +### RM -> CEM: ResourceManagerDetails +The RM informs the CEM about several static properties of the asset: +* The resource_id is a unique string in the context of the CEM. +* The name is a default name or user defined name (when possible) for UI purposes. +* This asset does not define any costs related parameters, so no currency needs to be provided. +* This RM only implements the `NOT_CONTROLABLE` Control Type. +* This RM does provide power forecasts. +* For this example, a single phase electric device (when there is only one phase the phase L1 must be used) is presented, so it will only provide measurements for the single phase. For three-phase assets, all phases should be listed here (and for each phase measurements should be provided), or in the case the three-phase power is symmetric and therefore equally shared over all phases, `ELECTRIC.POWER.3_PHASE_SYMMETRIC` could be used here. +```json +{ + "message_type": "ResourceManagerDetails", + "message_id": "ab44046a-2bd2-4115-b16c-985638166afa", + "resource_id": "acme_asset", + "name": "my_asset", + "roles": [ + { + "role": "ENERGY_CONSUMER", + "commodity": "ELECTRICITY" + } + ], + "manufacturer": "ACME", + "model": "Asset-3000", + "serial_number": "123", + "firmware_version": "v1.0", + "instruction_processing_delay": 10000, + "available_control_types": [ + "NOT_CONTROLABLE" + ], + "provides_forecast": true, + "provides_power_measurement_types": [ + "ELECTRIC.POWER.L1" + ] +} +``` + +### CEM -> RM: SelectControlType +The CEM informs the RM that it wants to use `NOT_CONTROLABLE` ControlType (the RM defined in the ResourceManagerDetails that this is the only supported ControlType). +```json +{ + "message_type": "SelectControlType", + "message_id": "695b0a6c-1d0e-4ad3-803f-21288ad5f76b", + "control_type": "NOT_CONTROLABLE" +} +``` + +### RM -> CEM: PowerMeasurement +The RM sends power measurements to the CEM using the PowerMeasurement message. It can send multiple values with the same timestamp (e.g. for three-phase measurements). For our example only one phase is used. + +```json +{ + "message_type": "PowerMeasurement", + "message_id": "6652c78e-57c8-4e04-807f-685b6b3fde17", + "measurement_timestamp": "2019-08-24T14:15:22Z", + "values": [ + { + "commodity_quantity": "ELECTRIC.POWER.L1", + "value": 3450.6 + } + ] +} +``` + +### RM -> CEM: PowerForecast +It can be quite useful for a CEM to know in advance what the future energy usage of a device will be. This is true for both controllable and non-controllable devices. Such a forecast can be used by an energy management algorithm to establish the base load it will have to work with. The data for this power forecast could for example be retrieved from a weather service that can calculate this forecast based the location and orientation of the asset. A PowerForcast can also incorporate uncertainty of the forecast in the values. + +```json +{ + "message_type": "PowerForecast", + "message_id": "bde674ac-66ef-4fed-8b12-d01b8404e10d", + "start_time": "2024-08-24T14:00:00Z", + "elements": [ + { + "duration": 3600000, + "power_values": [ + { + "value_upper_limit": -3500.0, + "value_upper_95PPR": -3460.0, + "value_upper_68PPR": -3455.0, + "value_expected": -3450.1, + "value_lower_68PPR": -3445.0, + "value_lower_95PPR": -3440.0, + "value_lower_limit": -3400.0, + "commodity_quantity": "ELECTRIC.POWER.L1" + } + ] + } + ] +} +``` + + +### RM -> CEM, CEM -> RM: SessionRequest +Both the RM and the CEM can send a connection life cycle management message, i.e. a SessionRequest message in order to let the other side know to gracefully shut down and if there is a request for a reconnect. + +```json +{ + "message_type": "SessionRequest", + "message_id": "1d509406-816c-4ce3-a034-ce88a684116c", + "request": "TERMINATE", + "diagnostic_label": "string" +} +``` diff --git a/website/static/img/no-control-sequence-diagram.png b/website/static/img/no-control-sequence-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..165c2e8083ae7f075622e992a5bba8dd661123ac GIT binary patch literal 11842 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 qE|@q6$J+xy{%5NFZ!zK Date: Wed, 17 Jun 2026 13:31:13 +0200 Subject: [PATCH 2/3] add reference to non controllable assets example --- website/docs/examples/pv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/examples/pv.md b/website/docs/examples/pv.md index e7eba0b..b718ce3 100644 --- a/website/docs/examples/pv.md +++ b/website/docs/examples/pv.md @@ -20,7 +20,7 @@ S2 supports five different control types for flexibility (and one for no control | Control capability of PV installation | Control type | Remark | |--------------------|:--------------:|---------| -| No control possible | NOT_CONTROLABLE | As there is no way to control this PV installation, the `NOT_CONTROLABLE` ControlType should be selected. Although nothing can be controlled, devices can still send `PowerMeasurement`s and `PowerForecast`s | +| No control possible | NOT_CONTROLABLE | As there is no way to control this PV installation, the `NOT_CONTROLABLE` ControlType should be selected. Although nothing can be controlled, devices can still send `PowerMeasurement`s and `PowerForecast`s. For an example of communication with a non-controllable device, please refer to [Non controllable assets](nocontrol.md). | | Set maximum output power | POWER_ENVELOPE_BASED_CONTROL (PEBC) | Based on the constraints of the PV installation (e.g. the minimum and maximum power output of the inverter), the CEM can provide the Resource Manager of the PV installation a PowerEnvelope that describes the minimum (usually 0) and maximum (e.g. -2kW, negative for production) that the inverter of the PV installation should produce | The table shows two ways to interact with a PV installation: just using the power measurements such that the CEM can optimize based on the production of the PV installation and using Power Envelope Based Control, which allows the CEM to instruct the PV installation to curtail. From b00ac8e04a0ea735155fb488b511b944be3008da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Dom=C3=ADnguez?= Date: Thu, 25 Jun 2026 15:48:04 +0200 Subject: [PATCH 3/3] tweaks after review --- website/docs/examples/nocontrol.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/website/docs/examples/nocontrol.md b/website/docs/examples/nocontrol.md index 08bb2fb..d67c2fe 100644 --- a/website/docs/examples/nocontrol.md +++ b/website/docs/examples/nocontrol.md @@ -3,7 +3,7 @@ title: "Example: Non controllable assets" hide_title: true --- -This page serves as a guide for implementing an S2 RM for a non-flexible device, or to give a CEM developer a better understanding of what to expect when controlling the energy flexibility of a non-flexible device. It provides some example S2 messages for same (fictional) non-flexible devices. +This page serves as a guide for implementing an S2 RM for a non-flexible device, or to give a CEM developer a better understanding of what to expect when taking into account information from non-flexible device. It provides some example S2 messages for same (fictional) non-flexible devices. Some examples of non-flexible devices are a TV, an electric cooking appliance, lights and a non-curtailable PV system. ## Example: Non controllable assets @@ -158,10 +158,10 @@ It can be quite useful for a CEM to know in advance what the future energy usage "duration": 3600000, "power_values": [ { - "value_upper_limit": -3500.0, - "value_upper_95PPR": -3460.0, - "value_upper_68PPR": -3455.0, - "value_expected": -3450.1, + "value_upper_limit": 3500.0, + "value_upper_95PPR": 3460.0, + "value_upper_68PPR": 3455.0, + "value_expected": 3450.1, "value_lower_68PPR": -3445.0, "value_lower_95PPR": -3440.0, "value_lower_limit": -3400.0,