Files
Eric F d398a6ced2 Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter
- 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
2026-06-08 00:38:27 -04:00

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",
},
)