- CitrineOS core extracted (CSMS OCPP 2.0.1) - OpenOCPP extracted (firmware OCPP 1.6J/2.0.1) - ShapeShifter library installed (pip install -e) - ShapeShifter specification extracted - EVerest extracted TODO updated with progress
116 lines
3.9 KiB
Python
116 lines
3.9 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import Optional
|
|
|
|
from ..enums import AcceptedRejected
|
|
|
|
|
|
@dataclass(kw_only=True)
|
|
class PayloadMessage:
|
|
"""
|
|
:ivar version: Version of the Shapeshifter specification used by the
|
|
USEF participant sending this message.
|
|
:ivar sender_domain: The Internet domain of the USEF participant
|
|
sending this message. When receiving a message, its value should
|
|
match the value specified in the SignedMessage wrapper:
|
|
otherwise, the message must be rejected as invalid. When
|
|
replying to this message, this attribute is used to look up the
|
|
USEF endpoint the reply message should be delivered to.
|
|
:ivar recipient_domain: Internet domain of the participant this
|
|
message is intended for. When sending a message, this attribute,
|
|
combined with the RecipientRole, is used to look up the USEF
|
|
endpoint the message should be delivered to.
|
|
:ivar time_stamp: Date and time this message was created, including
|
|
the time zone (ISO 8601 formatted as per
|
|
http://www.w3.org/TR/NOTE-datetime).
|
|
:ivar message_id: Unique identifier (UUID/GUID as per IETF RFC 4122)
|
|
for this message, to be generated when composing each message.
|
|
:ivar conversation_id: Unique identifier (UUID/GUID as per IETF RFC
|
|
4122) used to correlate responses with requests, to be generated
|
|
when composing the first message in a conversation and
|
|
subsequently copied from the original message to each reply
|
|
message.
|
|
"""
|
|
|
|
version: Optional[str] = field(
|
|
default="3.1.0",
|
|
metadata={
|
|
"name": "Version",
|
|
"type": "Attribute",
|
|
"required": True,
|
|
"pattern": r"(\d+\.\d+\.\d+)",
|
|
}
|
|
)
|
|
sender_domain: Optional[str] = field(
|
|
default=None,
|
|
metadata={
|
|
"name": "SenderDomain",
|
|
"type": "Attribute",
|
|
"required": True,
|
|
"pattern": r"([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}",
|
|
}
|
|
)
|
|
recipient_domain: Optional[str] = field(
|
|
default=None,
|
|
metadata={
|
|
"name": "RecipientDomain",
|
|
"type": "Attribute",
|
|
"required": True,
|
|
"pattern": r"([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}",
|
|
}
|
|
)
|
|
time_stamp: Optional[str] = field(
|
|
default=None,
|
|
metadata={
|
|
"name": "TimeStamp",
|
|
"type": "Attribute",
|
|
"required": True,
|
|
"pattern": r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{0,9})?([+-]\d{2}:\d{2}|Z)",
|
|
}
|
|
)
|
|
message_id: Optional[str] = field(
|
|
default=None,
|
|
metadata={
|
|
"name": "MessageID",
|
|
"type": "Attribute",
|
|
"required": True,
|
|
"pattern": r"[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}",
|
|
}
|
|
)
|
|
conversation_id: Optional[str] = field(
|
|
default=None,
|
|
metadata={
|
|
"name": "ConversationID",
|
|
"type": "Attribute",
|
|
"required": True,
|
|
"pattern": r"[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}",
|
|
}
|
|
)
|
|
|
|
|
|
@dataclass(kw_only=True)
|
|
class PayloadMessageResponse(PayloadMessage):
|
|
"""
|
|
:ivar reference_message_id: MessageID of the message that has just
|
|
been accepted or rejected.
|
|
:ivar result: Indication whether the query was executed successfully
|
|
or failed.
|
|
:ivar rejection_reason: In case the query failed, this attribute
|
|
must contain a human-readable description of the failure reason.
|
|
"""
|
|
|
|
result: Optional[AcceptedRejected] = field(
|
|
default=AcceptedRejected.ACCEPTED,
|
|
metadata={
|
|
"name": "Result",
|
|
"type": "Attribute",
|
|
"required": True,
|
|
}
|
|
)
|
|
rejection_reason: Optional[str] = field(
|
|
default=None,
|
|
metadata={
|
|
"name": "RejectionReason",
|
|
"type": "Attribute",
|
|
},
|
|
)
|