Display Message Flows - CSMS Developer Guide
Based on OCPP 2.0.1 Edition 4 Specification (Part 2, Section O). This guide covers all display message flows from the CSMS (Charging Station Management System) perspective.
1. Overview
IntroductionThe DisplayMessage feature enables a CSO (via the CSMS) to display a message or a cycle of messages on a Charging Station, that is not part of the firmware of the Charging Station. The CSO gets full control over these messages: set, retrieve (get), replace, and clear.
Key Capabilities
Multi-Language Support
Messages can be configured in different languages. The Charging Station selects the correct language when displaying to a user.
Multiple Formats
Supports different formats (ASCII, HTML, URI, UTF8). See DisplayMessageSupportedFormats configuration variable.
Display Control
Each message has parameters to control when and how it is shown: priority, state, start/end time.
Full CRUD Operations
Complete lifecycle management: set (create), get (retrieve), replace (update), and clear (delete) messages on Charging Stations.
Important: It is NOT possible to retrieve/modify messages not configured via SetDisplayMessageRequest. Messages coded in the firmware of a Charging Station cannot be modified via OCPP.
OCPP Message Routing
All Display Message operations use the standard OCPP 2.0.1 JSON-RPC framing:
| Frame Type | Format |
|---|---|
CALL | [2, "<messageId>", "<action>", {<payload>}] |
CALLRESULT | [3, "<messageId>", {<payload>}] |
CALLERROR | [4, "<messageId>", "<errorCode>", "<errorDescription>", {<errorDetails>}] |
Involved Messages
| Message | Direction | Description |
|---|---|---|
SetDisplayMessageRequest | CSMS -> CS | Set/replace a display message on a Charging Station |
SetDisplayMessageResponse | CS -> CSMS | Response indicating acceptance/rejection |
GetDisplayMessagesRequest | CSMS -> CS | Request stored display messages from a Charging Station |
GetDisplayMessagesResponse | CS -> CSMS | Immediate acknowledgment (messages follow async) |
NotifyDisplayMessagesRequest | CS -> CSMS | Async delivery of requested display messages |
NotifyDisplayMessagesResponse | CSMS -> CS | Acknowledgment of received notification |
ClearDisplayMessageRequest | CSMS -> CS | Remove a specific display message |
ClearDisplayMessageResponse | CS -> CSMS | Response indicating if message was cleared |
2. Shared Data Types
Reference2.1 MessageInfoType
Central data type used in SetDisplayMessageRequest and NotifyDisplayMessagesRequest.
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Unique identifier for this message (positive integer >= 0). Assigned by the CSMS. |
priority | MessagePriorityEnumType | Yes | Display priority of the message |
state | MessageStateEnumType | No | During which Charging Station state to show. If omitted: show in any state. |
startDateTime | dateTime (RFC 3339) | No | When to start showing. If omitted: immediately. |
endDateTime | dateTime (RFC 3339) | No | When to stop showing. After this time, the CS SHALL remove the message. |
transactionId | string (max 36) | No | If set, show only during this transaction. CS removes after transaction ends. |
message | MessageContentType | Yes | The actual message content to display |
display | ComponentType | No | Target display component (for stations with multiple displays) |
2.2 MessageContentType
| Field | Type | Required | Description |
|---|---|---|---|
format | MessageFormatEnumType | Yes | Format of the message content |
language | string (max 8) | No | Language code per RFC 5646 (e.g., "en", "nl", "de") |
content | string (max 512) | Yes | The actual message text/content |
2.3 MessageFormatEnumType
| Value | Description |
|---|---|
ASCII | Plain ASCII text |
HTML | HTML formatted message |
URI | URI pointing to message content |
UTF8 | UTF-8 encoded text |
2.4 MessagePriorityEnumType
| Value | Description |
|---|---|
AlwaysFront | Message should always be shown on the front/main screen. Takes highest priority. |
InFront | Show in front when the appropriate state is active (higher priority than NormalCycle) |
NormalCycle | Show in the normal message rotation cycle |
2.5 MessageStateEnumType
| Value | Description |
|---|---|
Charging | Show only when a transaction is active (charging) |
Faulted | Show only when the Charging Station is in a faulted state |
Idle | Show only when the Charging Station is idle (no transaction) |
Unavailable | Show only when the Charging Station is unavailable |
2.6 Response Status Enums
DisplayMessageStatusEnumType (SetDisplayMessage response)
| Value | Description |
|---|---|
Accepted | Message was accepted and will be displayed |
NotSupportedMessageFormat | The message format is not supported by the CS |
Rejected | Message was rejected (generic rejection) |
NotSupportedPriority | The requested priority level is not supported |
NotSupportedState | The requested state is not supported |
UnknownTransaction | The referenced transactionId is unknown to the CS |
GetDisplayMessagesStatusEnumType (GetDisplayMessages response)
| Value | Description |
|---|---|
Accepted | Request accepted, matching messages will be sent via NotifyDisplayMessagesRequest |
Unknown | No messages matching the request criteria are known |
ClearMessageStatusEnumType (ClearDisplayMessage response)
| Value | Description |
|---|---|
Accepted | Message was successfully removed |
Unknown | The message id is not known on the Charging Station |
2.7 ComponentType & EVSEType
Used for targeting a specific display on Charging Stations with multiple displays.
ComponentType
| Field | Type | Required | Description |
|---|---|---|---|
name | string (max 50) | Yes | Component name (case-insensitive, use CamelCase) |
instance | string (max 50) | No | Instance name if component exists as multiple instances |
evse | EVSEType | No | EVSE reference if display is EVSE-specific |
EVSEType
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | EVSE identifier (> 0) |
connectorId | integer | No | Specific connector on the EVSE |
2.8 StatusInfoType
Used in all responses to provide additional information about a status.
{
"reasonCode": "string (max 20)", // REQUIRED, case-insensitive predefined code
"additionalInfo": "string (max 512)" // optional, detailed human-readable information
}3. OCPP Messages
Protocol3.1 SetDisplayMessageRequest (CSMS -> CS)
Action: "SetDisplayMessage"
| Field | Type | Required | Description |
|---|---|---|---|
message | MessageInfoType | Yes | The message to display |
{
"type": "object",
"additionalProperties": false,
"properties": {
"customData": {
"$ref": "#/definitions/CustomDataType"
},
"message": {
"$ref": "#/definitions/MessageInfoType"
}
},
"required": ["message"]
}[2, "msg-001", "SetDisplayMessage", {
"message": {
"id": 1,
"priority": "NormalCycle",
"state": "Idle",
"startDateTime": "2025-01-15T08:00:00Z",
"endDateTime": "2025-01-31T23:59:59Z",
"message": {
"format": "UTF8",
"language": "en",
"content": "Welcome! Special rate today: $0.25/kWh"
}
}
}]3.2 SetDisplayMessageResponse (CS -> CSMS)
| Field | Type | Required | Description |
|---|---|---|---|
status | DisplayMessageStatusEnumType | Yes | Whether the CS can display the message |
statusInfo | StatusInfoType | No | Additional detail about the status |
{
"type": "object",
"additionalProperties": false,
"properties": {
"customData": {
"$ref": "#/definitions/CustomDataType"
},
"status": {
"$ref": "#/definitions/DisplayMessageStatusEnumType"
},
"statusInfo": {
"$ref": "#/definitions/StatusInfoType"
}
},
"required": ["status"]
}[3, "msg-001", {
"status": "Accepted"
}]3.3 GetDisplayMessagesRequest (CSMS -> CS)
Action: "GetDisplayMessages"
| Field | Type | Required | Description |
|---|---|---|---|
requestId | integer | Yes | Unique request ID for correlating async responses |
id | array of integer | No | Filter: specific message IDs to retrieve. Must not exceed NumberOfDisplayMessages.maxLimit. |
priority | MessagePriorityEnumType | No | Filter: only return messages with this priority |
state | MessageStateEnumType | No | Filter: only return messages with this state |
{
"type": "object",
"additionalProperties": false,
"properties": {
"customData": {
"$ref": "#/definitions/CustomDataType"
},
"id": {
"type": "array",
"items": { "type": "integer" },
"minItems": 1
},
"requestId": {
"description": "The Id of this request.",
"type": "integer"
},
"priority": {
"$ref": "#/definitions/MessagePriorityEnumType"
},
"state": {
"$ref": "#/definitions/MessageStateEnumType"
}
},
"required": ["requestId"]
}[2, "msg-003", "GetDisplayMessages", {
"requestId": 42
}]3.4 GetDisplayMessagesResponse (CS -> CSMS)
| Field | Type | Required | Description |
|---|---|---|---|
status | GetDisplayMessagesStatusEnumType | Yes | Whether matching messages exist |
statusInfo | StatusInfoType | No | Additional detail |
{
"type": "object",
"additionalProperties": false,
"properties": {
"customData": {
"$ref": "#/definitions/CustomDataType"
},
"status": {
"$ref": "#/definitions/GetDisplayMessagesStatusEnumType"
},
"statusInfo": {
"$ref": "#/definitions/StatusInfoType"
}
},
"required": ["status"]
}[3, "msg-003", {
"status": "Accepted"
}]3.5 NotifyDisplayMessagesRequest (CS -> CSMS)
Action: "NotifyDisplayMessages" - Async response to a previous GetDisplayMessagesRequest.
| Field | Type | Required | Description |
|---|---|---|---|
requestId | integer | Yes | The requestId from the original GetDisplayMessagesRequest |
messageInfo | array of MessageInfoType | No | The display messages matching the request |
tbc | boolean | No | "To be continued". true = more parts follow. Default: false. |
{
"type": "object",
"additionalProperties": false,
"properties": {
"customData": {
"$ref": "#/definitions/CustomDataType"
},
"messageInfo": {
"type": "array",
"items": {
"$ref": "#/definitions/MessageInfoType"
},
"minItems": 1
},
"requestId": {
"description": "The id of the GetDisplayMessagesRequest that requested this message.",
"type": "integer"
},
"tbc": {
"description": "to be continued indicator. Default value when omitted is false.",
"type": "boolean",
"default": false
}
},
"required": ["requestId"]
}[2, "notify-001", "NotifyDisplayMessages", {
"requestId": 42,
"tbc": false,
"messageInfo": [
{
"id": 1,
"priority": "NormalCycle",
"state": "Idle",
"message": {
"format": "UTF8",
"language": "en",
"content": "Welcome! Special rate: $0.25/kWh"
}
},
{
"id": 2,
"priority": "InFront",
"state": "Charging",
"transactionId": "txn-abc-123",
"message": {
"format": "UTF8",
"language": "en",
"content": "Current cost: $3.50 | Energy: 14.2 kWh"
}
}
]
}]3.6 NotifyDisplayMessagesResponse (CSMS -> CS)
The CSMS SHALL always respond with an empty NotifyDisplayMessagesResponse. No fields are defined (besides optional customData).
{
"type": "object",
"additionalProperties": false,
"properties": {
"customData": {
"$ref": "#/definitions/CustomDataType"
}
}
}[3, "notify-001", {}]3.7 ClearDisplayMessageRequest (CSMS -> CS)
Action: "ClearDisplayMessage"
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | The ID of the message to remove |
{
"type": "object",
"additionalProperties": false,
"properties": {
"customData": {
"$ref": "#/definitions/CustomDataType"
},
"id": {
"description": "Id of the message that SHALL be removed from the Charging Station.",
"type": "integer"
}
},
"required": ["id"]
}[2, "msg-008", "ClearDisplayMessage", {
"id": 1
}]3.8 ClearDisplayMessageResponse (CS -> CSMS)
| Field | Type | Required | Description |
|---|---|---|---|
status | ClearMessageStatusEnumType | Yes | Whether the message was cleared |
statusInfo | StatusInfoType | No | Additional detail |
{
"type": "object",
"additionalProperties": false,
"properties": {
"customData": {
"$ref": "#/definitions/CustomDataType"
},
"status": {
"$ref": "#/definitions/ClearMessageStatusEnumType"
},
"statusInfo": {
"$ref": "#/definitions/StatusInfoType"
}
},
"required": ["status"]
}[3, "msg-008", {
"status": "Accepted"
}]4. Display Message Flows
Use Cases O01-O06Set DisplayMessage
The CSMS sends a message to a Charging Station to be displayed (e.g., promotional info, maintenance notice).
Prerequisite: The Charging Station supports the DisplayMessage feature.
Sequence Diagram:
CSO CSMS Charging Station
| | |
|-- set a message ---->| |
| |-- SetDisplayMessageReq --->|
| | (message) |
| |<-- SetDisplayMessageRes ---|
| | (status) |
| | |CSMS Actions:
- Receive trigger from CSO/operator to display a message on a specific Charging Station
- Build a SetDisplayMessageRequest with a MessageInfoType payload
- Send the request to the Charging Station via the WebSocket connection
- Handle the SetDisplayMessageResponse
Response handling:
| Status | Action |
|---|---|
Accepted | Store the message ID in CSMS database for future reference (get/clear/replace) |
NotSupportedMessageFormat | The format used is not supported; retry with a different format |
NotSupportedPriority | The priority is not supported; retry with a different priority |
NotSupportedState | The state filter is not supported; retry without state or different state |
UnknownTransaction | The transactionId does not exist on the CS |
Rejected | Generic rejection; log and inform operator |
Requirements:
| ID | Precondition | CSMS Requirement |
|---|---|---|
O01.FR.01 | CSMS wants to set a display message | CSMS SHALL send a SetDisplayMessageRequest with a MessageInfoType containing the message. |
O01.FR.02 | CS accepts the request | CS responds with SetDisplayMessageResponse with status Accepted. |
O01.FR.03 | CS does not support the message format | CS responds with status NotSupportedMessageFormat. |
O01.FR.04 | CS does not support the requested priority | CS responds with status NotSupportedPriority. |
O01.FR.05 | CS does not support the requested state | CS responds with status NotSupportedState. |
O01.FR.09 | Message has a startDateTime in the future | CS SHALL store the message and start showing it at the specified time. |
O01.FR.10 | Message has an endDateTime | CS SHALL stop showing and remove the message after the specified time. |
O01.FR.11 | CSMS sets a message with a display component | The message is targeted at a specific display on the CS. |
[2, "msg-001", "SetDisplayMessage", {
"message": {
"id": 1,
"priority": "NormalCycle",
"state": "Idle",
"startDateTime": "2025-01-15T08:00:00Z",
"endDateTime": "2025-01-31T23:59:59Z",
"message": {
"format": "UTF8",
"language": "en",
"content": "Welcome! Special rate today: $0.25/kWh"
}
}
}]Set DisplayMessage for Transaction
The CSMS sends a message to be displayed during a specific (ongoing) transaction. The message is automatically removed when the transaction ends.
Prerequisite: The Charging Station supports DisplayMessage and there is an ongoing transaction.
Sequence Diagram:
CSO CSMS Charging Station
| | |
|-- set a message ---->| |
| for transaction | |
| |-- SetDisplayMessageReq --->|
| | (message+transId) |
| |<-- SetDisplayMessageRes ---|
| | (status) |
| | |CSMS Actions:
- Receive trigger to display a transaction-specific message (e.g., running cost info, charging status)
- Build a SetDisplayMessageRequest with transactionId set in the MessageInfoType
- Send the request to the Charging Station
- Handle the response: Accepted = message shows during the transaction and auto-removes when it ends; UnknownTransaction = verify the transaction is still active; Other statuses = handle as in O01
Requirements:
| ID | Precondition | CSMS Requirement |
|---|---|---|
O02.FR.01 | CSMS wants to set a message for a specific transaction | CSMS SHALL send a SetDisplayMessageRequest with transactionId in the MessageInfoType. |
O02.FR.02 | CS accepts the request | CS responds with Accepted. Message is shown during the transaction. |
O02.FR.03 | The referenced transactionId is unknown to the CS | CS responds with UnknownTransaction. |
O02.FR.07 | Transaction ends | CS SHALL automatically remove the message. |
[2, "msg-002", "SetDisplayMessage", {
"message": {
"id": 2,
"priority": "InFront",
"state": "Charging",
"transactionId": "txn-abc-123",
"message": {
"format": "UTF8",
"language": "en",
"content": "Current cost: $3.50 | Energy: 14.2 kWh"
}
}
}]Get All DisplayMessages
The CSMS requests all display messages currently configured on a Charging Station. The CS responds with an immediate acknowledgment, then asynchronously sends all messages.
Prerequisite: The Charging Station supports the DisplayMessage feature.
Sequence Diagram:
CSO CSMS Charging Station
| | |
|-- get all messages ->| |
| |-- GetDisplayMessagesReq -->|
| | (requestId) |
| |<-- GetDisplayMessagesRes --|
| | (status) |
| | |
| | [If status = Accepted] |
| | |
| | loop [for each part] |
| |<- NotifyDisplayMsgsReq ----|
| | (requestId, msgs, tbc) |
| |-- NotifyDisplayMsgsRes --->|
| | |CSMS Actions:
- Generate a unique requestId (integer) to correlate the request with async responses
- Send a GetDisplayMessagesRequest with only the requestId (no filters)
- Handle the GetDisplayMessagesResponse: Accepted = messages will follow asynchronously; Unknown = no display messages are configured
- Handle incoming NotifyDisplayMessagesRequest messages: match on requestId, check tbc flag (true = more follow, false/omitted = last batch), process the messageInfo array
- Always respond with an empty NotifyDisplayMessagesResponse
Requirements:
| ID | Precondition | CSMS Requirement |
|---|---|---|
O03.FR.01 | CSMS wants to retrieve all display messages | CSMS SHALL send a GetDisplayMessagesRequest with a requestId. No filters. |
O03.FR.02 | CS has matching display messages | CS responds with Accepted, then sends NotifyDisplayMessagesRequest with the messages. |
O03.FR.03 | CS has no display messages | CS responds with Unknown. No NotifyDisplayMessagesRequest will follow. |
O03.FR.04 | CSMS receives NotifyDisplayMessagesRequest | CSMS SHALL respond with an empty NotifyDisplayMessagesResponse. |
O03.FR.05 | tbc is true in NotifyDisplayMessagesRequest | CSMS should expect more NotifyDisplayMessagesRequest messages for this requestId. |
[2, "msg-003", "GetDisplayMessages", {
"requestId": 42
}]Get Specific DisplayMessages
The CSMS requests specific display messages by ID, or filtered by priority/state. Same message flow as O03 but with filters applied.
Prerequisite: The Charging Station supports the DisplayMessage feature.
Same sequence as O03 but with filter parameters. The CSMS can filter by specific message IDs, priority level, or Charging Station state.
CSMS Actions:
- Generate a unique requestId
- Send a GetDisplayMessagesRequest with one or more filters: id (array of message IDs), priority (filter by priority level), state (filter by CS state)
- Handle the GetDisplayMessagesResponse and subsequent NotifyDisplayMessagesRequest messages (same as O03)
Requirements:
| ID | Precondition | CSMS Requirement |
|---|---|---|
O04.FR.01 | CSMS wants specific messages | CSMS SHALL send a GetDisplayMessagesRequest with requestId and filter(s): id, priority, and/or state. |
O04.FR.02 | CS has matching messages | CS responds with Accepted, then sends matching messages via NotifyDisplayMessagesRequest. |
O04.FR.03 | No messages match the filter criteria | CS responds with Unknown. |
O04.FR.04 | id array constraint | The id array SHALL NOT contain more ids than NumberOfDisplayMessages.maxLimit. |
[2, "msg-004", "GetDisplayMessages", {
"requestId": 43,
"id": [1, 3, 5]
}][2, "msg-005", "GetDisplayMessages", {
"requestId": 44,
"priority": "AlwaysFront"
}][2, "msg-006", "GetDisplayMessages", {
"requestId": 45,
"state": "Idle"
}][2, "msg-007", "GetDisplayMessages", {
"requestId": 46,
"priority": "NormalCycle",
"state": "Charging"
}]Clear a DisplayMessage
The CSMS removes a specific display message from a Charging Station by its ID.
Prerequisite: The Charging Station supports the DisplayMessage feature.
Sequence Diagram:
CSO CSMS Charging Station
| | |
|-- clear message ---->| |
| |-- ClearDisplayMsgReq ----->|
| | (id) |
| |<-- ClearDisplayMsgRes -----|
| | (status) |
| | |CSMS Actions:
- Identify the message ID to clear (from CSMS database or from a previous GetDisplayMessages result)
- Send a ClearDisplayMessageRequest with the message id
- Handle the ClearDisplayMessageResponse: Accepted = message was successfully removed, update CSMS database; Unknown = the message ID is not known on the CS (may have already been cleared or expired)
Requirements:
| ID | Precondition | CSMS Requirement |
|---|---|---|
O05.FR.01 | CSMS wants to remove a display message | CSMS SHALL send a ClearDisplayMessageRequest with the message id. |
O05.FR.02 | CS has the message with the given id | CS responds with Accepted and removes the message. |
O05.FR.03 | CS does not have a message with the given id | CS responds with Unknown. |
[2, "msg-008", "ClearDisplayMessage", {
"id": 1
}]Replace DisplayMessage
The CSMS replaces an existing display message on a Charging Station by sending a new SetDisplayMessageRequest with the same message id.
Prerequisite: The Charging Station supports DisplayMessage and a message with the given id already exists.
Sequence Diagram:
CSO CSMS Charging Station
| | |
|-- replace message -->| |
| |-- SetDisplayMessageReq --->|
| | (message with |
| | existing id) |
| |<-- SetDisplayMessageRes ---|
| | (status) |
| | |CSMS Actions:
- Identify the message to replace (using a known message id previously set)
- Build a SetDisplayMessageRequest with the same id as the existing message, but with updated content/parameters
- Send the request to the Charging Station
- Handle the response (same as O01): Accepted = the existing message was replaced with the new content
Requirements:
| ID | Precondition | CSMS Requirement |
|---|---|---|
O06.FR.01 | CSMS wants to replace an existing message | CSMS SHALL send a SetDisplayMessageRequest with the same id as the message to replace. |
O06.FR.02 | CS has the message with the given id | CS replaces the message and responds with Accepted. |
O06.FR.03 | CS does not have a message with the given id | CS treats it as a new message (same behavior as O01). |
[2, "msg-009", "SetDisplayMessage", {
"message": {
"id": 1,
"priority": "NormalCycle",
"state": "Idle",
"startDateTime": "2025-02-01T00:00:00Z",
"endDateTime": "2025-02-28T23:59:59Z",
"message": {
"format": "UTF8",
"language": "en",
"content": "February Special: Free charging on weekends!"
}
}
}]5. Configuration Variables
ConfigThe CSMS should query these configuration variables (via GetVariables) to understand the Charging Station's DisplayMessage capabilities.
DisplayMessageCtrlr Configuration
| Variable | Description |
|---|---|
DisplayMessageCtrlr.Available | Whether the DisplayMessage feature is available |
DisplayMessageCtrlr.Enabled | Whether the DisplayMessage feature is enabled |
NumberOfDisplayMessages | Maximum number of display messages the CS can store. maxLimit constrains the id array in GetDisplayMessagesRequest. |
DisplayMessageSupportedFormats | Comma-separated list of supported MessageFormatEnumType values (e.g., "ASCII,UTF8,HTML") |
DisplayMessageSupportedPriorities | Comma-separated list of supported MessagePriorityEnumType values (e.g., "NormalCycle,InFront,AlwaysFront") |
6. CSMS Implementation Checklist
ImplementationDatabase Schema Considerations
The CSMS should maintain a display_messages table to track messages sent to Charging Stations:
| Column | Description |
|---|---|
id (integer) | The message ID (unique per Charging Station) |
charge_point_id | Reference to the Charging Station |
priority | MessagePriorityEnumType value |
state | Optional MessageStateEnumType value |
start_date_time | Optional start time |
end_date_time | Optional end time |
transaction_id | Optional transaction reference |
message_format | MessageFormatEnumType value |
message_language | Optional language code |
message_content | The message text (max 512 chars) |
display_component | Optional target display |
status | Current status (active, cleared, expired, etc.) |
created_at / updated_at | Timestamps |
Message Handlers to Implement
CSMS-Initiated (Outbound) Messages
| Handler | Trigger | Action |
|---|---|---|
send_set_display_message | Operator/API request | Build and send SetDisplayMessageRequest, handle response |
send_get_display_messages | Operator/API request | Build and send GetDisplayMessagesRequest, track requestId |
send_clear_display_message | Operator/API request | Build and send ClearDisplayMessageRequest, handle response |
CS-Initiated (Inbound) Messages
| Handler | Incoming Message | CSMS Action |
|---|---|---|
handle_notify_display_messages | NotifyDisplayMessagesRequest | Match requestId, process messageInfo array, check tbc flag, respond with empty NotifyDisplayMessagesResponse |
Error Handling
Timeout
If no SetDisplayMessageResponse / ClearDisplayMessageResponse / GetDisplayMessagesResponse is received within the configured message timeout, treat the operation as failed.
Partial NotifyDisplayMessages
If tbc=true is received
but no subsequent NotifyDisplayMessagesRequest arrives, implement a reasonable timeout to consider the retrieval incomplete.
ID Management
The CSMS is responsible for assigning and tracking unique message IDs per Charging Station. IDs must be positive integers (>= 0).
Expired Messages
Messages with endDateTime in the past are automatically removed by the CS. The CSMS should also clean up its local
database accordingly.
Transaction-bound Messages
Messages with transactionId are automatically removed by the CS when the transaction ends. The CSMS should track this
and update its database.