From f8ff78c4c34510dde3e7175e52fa93c5140845a0 Mon Sep 17 00:00:00 2001 From: Auke Oosterhoff Date: Thu, 20 Jul 2023 16:23:16 +0200 Subject: [PATCH 1/2] Add support for OCPP 2.1 --- ocpp/v21/call.py | 622 ++++++++++++++++++++++++++++ ocpp/v21/call_result.py | 536 ++++++++++++++++++++++++ ocpp/v21/datatypes.py | 884 ++++++++++++++++++++++++++++++++++++++++ ocpp/v21/enums.py | 790 +++++++++++++++++++++++++++++++++++ 4 files changed, 2832 insertions(+) create mode 100644 ocpp/v21/call.py create mode 100644 ocpp/v21/call_result.py create mode 100644 ocpp/v21/datatypes.py create mode 100644 ocpp/v21/enums.py diff --git a/ocpp/v21/call.py b/ocpp/v21/call.py new file mode 100644 index 000000000..5b761f362 --- /dev/null +++ b/ocpp/v21/call.py @@ -0,0 +1,622 @@ +from dataclasses import dataclass +from typing import Any, List, Optional + +import enums +from datatypes import ( + EVSE, + AuthorizationData, + CertificateHashData, + ChargingLimit, + ChargingNeeds, + ChargingProfile, + ChargingProfileCriteria, + ChargingSchedule, + ChargingStation, + ComponentVariable, + ConnectionData, + CustomData, + CustomerCertificate, + EventData, + Firmware, + GetVariableData, + GroupIdToken, + IdToken, + Log, + Message, + MessageInfo, + MeterValue, + MonitoringData, + OCSPRequestData, + ReportData, + SetMonitoringData, + SetVariableData, + TransactionInfo, +) +from enums import ( + BootReason, + CertificateAction, + CertificateSigningUse, + ChargingLimitSource, + ChargingRateUnit, + ComponentCriterion, + Connector, + ConnectorStatus, + EnergyTransferMode, + FirmwareStatus, + GetCertificateIdUse, + InstallCertificateUse, + Log, + MessagePriority, + MessageState, + MessageTrigger, + MonitoringBase, + MonitoringCriterion, + NotifyCRLStatus, + OperationalStatus, + PreconditioningStatus, + PublishFirmwareStatus, + ReportBase, + ReservationUpdateStatus, + TriggerReason, + Update, + UploadLogStatus, +) + + +@dataclass +class AFRRSignal: + signal: int + timestamp: str + custom_data: Optional[CustomData] = None + + +@dataclass +class Authorize: + id_token: IdToken + certificate: Optional[str] = None + custom_data: Optional[CustomData] = None + iso_15118_certificate_hash_data: Optional[List[OCSPRequestData]] = None + + +@dataclass +class BootNotification: + charging_station: ChargingStation + reason: BootReason + custom_data: Optional[CustomData] = None + + +@dataclass +class CancelReservation: + reservation_id: int + custom_data: Optional[CustomData] = None + + +@dataclass +class CertificateSigned: + certificate_chain: str + certificate_type: Optional[CertificateSigningUse] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class ChangeAvailability: + operational_status: OperationalStatus + custom_data: Optional[CustomData] = None + evse: Optional[EVSE] = None + + +@dataclass +class ClearCache: + custom_data: Optional[CustomData] = None + + +@dataclass +class ClearChargingProfile: + charging_profile_criteria: Optional[ChargingProfileCriteria] = None + charging_profile_id: Optional[int] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class ClearDisplayMessage: + id: int + custom_data: Optional[CustomData] = None + + +@dataclass +class ClearVariableMonitoring: + id: List[int] + custom_data: Optional[CustomData] = None + + +@dataclass +class ClearedChargingLimit: + charging_limit_source: ChargingLimitSource + custom_data: Optional[CustomData] = None + evse_id: Optional[int] = None + + +@dataclass +class CostUpdated: + total_cost: float + transaction_id: str + custom_data: Optional[CustomData] = None + + +@dataclass +class CustomerInformation: + clear: bool + report: bool + request_id: int + custom_data: Optional[CustomData] = None + customer_certificate: Optional[CustomerCertificate] = None + customer_identifier: Optional[str] = None + id_token: Optional[IdToken] = None + + +@dataclass +class DataTransfer: + vendor_id: str + custom_data: Optional[CustomData] = None + data: Any = None + message_id: Optional[str] = None + + +@dataclass +class DeleteCertificate: + certificate_hash_data: CertificateHashData + custom_data: Optional[CustomData] = None + + +@dataclass +class FirmwareStatusNotification: + status: FirmwareStatus + custom_data: Optional[CustomData] = None + request_id: Optional[int] = None + + +@dataclass +class Get15118EVCertificate: + action: CertificateAction + exi_request: str + iso_15118_schema_version: str + custom_data: Optional[CustomData] = None + maximum_contract_certificate_chains: Optional[int] = None + prioritized_emaids: Optional[List[str]] = None + + +@dataclass +class GetBaseReport: + report_base: ReportBase + request_id: int + custom_data: Optional[CustomData] = None + + +@dataclass +class GetCRL: + certificate_hash_data: CertificateHashData + request_id: int + custom_data: Optional[CustomData] = None + + +@dataclass +class GetCertificateStatus: + ocsp_request_data: OCSPRequestData + custom_data: Optional[CustomData] = None + + +@dataclass +class GetChargingProfiles: + charging_profile: ChargingProfile + request_id: int + custom_data: Optional[CustomData] = None + evse_id: Optional[int] = None + + +@dataclass +class GetCompositeSchedule: + duration: int + evse_id: int + charging_rate_unit: Optional[ChargingRateUnit] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class GetDisplayMessages: + request_id: int + custom_data: Optional[CustomData] = None + id: Optional[List[int]] = None + priority: Optional[MessagePriority] = None + state: Optional[MessageState] = None + + +@dataclass +class GetInstalledCertificateIds: + certificate_type: Optional[List[GetCertificateIdUse]] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class GetLocalListVersion: + custom_data: Optional[CustomData] = None + + +@dataclass +class GetLog: + log: Log + log_type: Log + request_id: int + custom_data: Optional[CustomData] = None + retries: Optional[int] = None + retry_interval: Optional[int] = None + + +@dataclass +class GetMonitoringReport: + request_id: int + component_variable: Optional[List[ComponentVariable]] = None + custom_data: Optional[CustomData] = None + monitoring_criteria: Optional[List[MonitoringCriterion]] = None + + +@dataclass +class GetReport: + request_id: int + component_criteria: Optional[List[ComponentCriterion]] = None + component_variable: Optional[List[ComponentVariable]] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class GetTransactionStatus: + custom_data: Optional[CustomData] = None + transaction_id: Optional[str] = None + + +@dataclass +class GetVariables: + get_variable_data: List[GetVariableData] + custom_data: Optional[CustomData] = None + + +@dataclass +class Heartbeat: + custom_data: Optional[CustomData] = None + + +@dataclass +class InstallCertificate: + certificate: str + certificate_type: InstallCertificateUse + custom_data: Optional[CustomData] = None + + +@dataclass +class LogStatusNotification: + status: UploadLogStatus + custom_data: Optional[CustomData] = None + request_id: Optional[int] = None + + +@dataclass +class MeterValues: + evse_id: int + meter_value: List[MeterValue] + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyAllowedEnergyTransfer: + allowed_energy_transfer: List[EnergyTransferMode] + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyCRL: + request_id: int + status: NotifyCRLStatus + custom_data: Optional[CustomData] = None + location: Optional[str] = None + + +@dataclass +class NotifyChargingLimit: + charging_limit: ChargingLimit + charging_schedule: Optional[List[ChargingSchedule]] = None + custom_data: Optional[CustomData] = None + evse_id: Optional[int] = None + + +@dataclass +class NotifyCustomerInformation: + data: str + generated_at: str + request_id: int + seq_no: int + custom_data: Optional[CustomData] = None + tbc: bool = False + + +@dataclass +class NotifyDisplayMessages: + request_id: int + custom_data: Optional[CustomData] = None + message_info: Optional[List[MessageInfo]] = None + tbc: bool = False + + +@dataclass +class NotifyEVChargingNeeds: + charging_needs: ChargingNeeds + evse_id: int + custom_data: Optional[CustomData] = None + max_schedule_tuples: Optional[int] = None + + +@dataclass +class NotifyEVChargingSchedule: + charging_schedule: ChargingSchedule + evse_id: int + time_base: str + custom_data: Optional[CustomData] = None + power_tolerance_acceptance: Optional[bool] = None + selected_schedule_tuple_id: Optional[int] = None + + +@dataclass +class NotifyEvent: + event_data: List[EventData] + generated_at: str + seq_no: int + custom_data: Optional[CustomData] = None + tbc: bool = False + + +@dataclass +class NotifyMonitoringReport: + generated_at: str + request_id: int + seq_no: int + custom_data: Optional[CustomData] = None + monitor: Optional[List[MonitoringData]] = None + tbc: bool = False + + +@dataclass +class NotifyPriorityCharging: + activated: bool + transaction_id: str + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyReport: + generated_at: str + request_id: int + seq_no: int + custom_data: Optional[CustomData] = None + report_data: Optional[List[ReportData]] = None + tbc: bool = False + + +@dataclass +class PublishFirmware: + checksum: str + location: str + request_id: int + custom_data: Optional[CustomData] = None + retries: Optional[int] = None + retry_interval: Optional[int] = None + + +@dataclass +class PublishFirmwareStatusNotification: + status: PublishFirmwareStatus + custom_data: Optional[CustomData] = None + location: Optional[List[str]] = None + request_id: Optional[int] = None + + +@dataclass +class PullDynamicScheduleUpdate: + charging_profile_id: int + custom_data: Optional[CustomData] = None + + +@dataclass +class ReportChargingProfiles: + charging_limit_source: ChargingLimitSource + charging_profile: List[ChargingProfile] + evse_id: int + request_id: int + custom_data: Optional[CustomData] = None + tbc: bool = False + + +@dataclass +class RequestStartTransaction: + id_token: IdToken + remote_start_id: int + charging_profile: Optional[ChargingProfile] = None + custom_data: Optional[CustomData] = None + evse_id: Optional[int] = None + group_id_token: Optional[GroupIdToken] = None + + +@dataclass +class RequestStopTransaction: + transaction_id: str + custom_data: Optional[CustomData] = None + + +@dataclass +class ReservationStatusUpdate: + reservation_id: int + reservation_update_status: ReservationUpdateStatus + custom_data: Optional[CustomData] = None + + +@dataclass +class ReserveNow: + expiry_date_time: str + id: int + id_token: IdToken + connector_type: Optional[Connector] = None + custom_data: Optional[CustomData] = None + evse_id: Optional[int] = None + group_id_token: Optional[GroupIdToken] = None + + +@dataclass +class Reset: + type: enums.Reset + custom_data: Optional[CustomData] = None + evse_id: Optional[int] = None + + +@dataclass +class SecurityEventNotification: + timestamp: str + type: str + custom_data: Optional[CustomData] = None + tech_info: Optional[str] = None + + +@dataclass +class SendLocalList: + update_type: Update + version_number: int + custom_data: Optional[CustomData] = None + local_authorization_list: Optional[List[AuthorizationData]] = None + + +@dataclass +class SetChargingProfile: + charging_profile: ChargingProfile + evse_id: int + custom_data: Optional[CustomData] = None + + +@dataclass +class SetDisplayMessage: + message: Message + custom_data: Optional[CustomData] = None + + +@dataclass +class SetMonitoringBase: + monitoring_base: MonitoringBase + custom_data: Optional[CustomData] = None + + +@dataclass +class SetMonitoringLevel: + severity: int + custom_data: Optional[CustomData] = None + + +@dataclass +class SetNetworkProfile: + configuration_slot: int + connection_data: ConnectionData + custom_data: Optional[CustomData] = None + + +@dataclass +class SetVariableMonitoring: + set_monitoring_data: List[SetMonitoringData] + custom_data: Optional[CustomData] = None + + +@dataclass +class SetVariables: + set_variable_data: List[SetVariableData] + custom_data: Optional[CustomData] = None + + +@dataclass +class SignCertificate: + csr: str + certificate_type: Optional[CertificateSigningUse] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class StatusNotification: + connector_id: int + connector_status: ConnectorStatus + evse_id: int + timestamp: str + custom_data: Optional[CustomData] = None + + +@dataclass +class TransactionEvent: + event_type: enums.TransactionEvent + seq_no: int + timestamp: str + transaction_info: TransactionInfo + trigger_reason: TriggerReason + cable_max_current: Optional[float] = None + custom_data: Optional[CustomData] = None + evse: Optional[EVSE] = None + id_token: Optional[IdToken] = None + meter_value: Optional[List[MeterValue]] = None + number_of_phases_used: Optional[int] = None + offline: bool = False + preconditioning_status: Optional[PreconditioningStatus] = None + reservation_id: Optional[int] = None + + +@dataclass +class TriggerMessage: + requested_message: MessageTrigger + custom_data: Optional[CustomData] = None + evse: Optional[EVSE] = None + + +@dataclass +class UnlockConnector: + connector_id: int + evse_id: int + custom_data: Optional[CustomData] = None + + +@dataclass +class UnpublishFirmware: + checksum: str + custom_data: Optional[CustomData] = None + + +@dataclass +class UpdateDynamicSchedule: + charging_profile_id: int + custom_data: Optional[CustomData] = None + discharge_limit: Optional[float] = None + discharge_limit_l2: Optional[float] = None + discharge_limit_l3: Optional[float] = None + limit: Optional[float] = None + limit_l2: Optional[float] = None + limit_l3: Optional[float] = None + setpoint: Optional[float] = None + setpoint_l2: Optional[float] = None + setpoint_l3: Optional[float] = None + setpoint_reactive: Optional[float] = None + setpoint_reactive_l2: Optional[float] = None + setpoint_reactive_l3: Optional[float] = None + + +@dataclass +class UpdateFirmware: + firmware: Firmware + request_id: int + custom_data: Optional[CustomData] = None + retries: Optional[int] = None + retry_interval: Optional[int] = None + + +@dataclass +class UsePriorityCharging: + activate: bool + transaction_id: str + custom_data: Optional[CustomData] = None diff --git a/ocpp/v21/call_result.py b/ocpp/v21/call_result.py new file mode 100644 index 000000000..570ffc43c --- /dev/null +++ b/ocpp/v21/call_result.py @@ -0,0 +1,536 @@ +from dataclasses import dataclass +from typing import Any, List, Optional + +import enums +from datatypes import ( + CertificateHashDataChain, + CustomData, + GetVariableResult, + IdTokenInfo, + ResponseClearMonitoringResult, + Schedule, + SetMonitoringResult, + SetVariableResult, + StatusInfo, + UpdatedPersonalMessage, +) +from enums import ( + AuthorizeCertificateStatus, + CancelReservationStatus, + CertificateSignedStatus, + ChangeAvailabilityStatus, + ChargingProfileStatus, + ClearCacheStatus, + ClearChargingProfileStatus, + ClearMessageStatus, + CustomerInformationStatus, + DataTransferStatus, + DeleteCertificateStatus, + DisplayMessageStatus, + EnergyTransferMode, + GenericDeviceModelStatus, + GenericStatus, + GetChargingProfileStatus, + GetDisplayMessagesStatus, + GetInstalledCertificateStatus, + InstallCertificateStatus, + Iso15118EVCertificateStatus, + LogStatus, + NotifyAllowedEnergyTransferStatus, + NotifyEVChargingNeedsStatus, + PriorityChargingStatus, + RegistrationStatus, + RequestStartStopStatus, + ReserveNowStatus, + ResetStatus, + SendLocalListStatus, + SetNetworkProfileStatus, + TriggerMessageStatus, + UnlockStatus, + UnpublishFirmwareStatus, + UpdateFirmwareStatus, +) + + +@dataclass +class AFRRSignal: + status: GenericStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class Authorize: + id_token_info: IdTokenInfo + allowed_energy_transfer: Optional[List[EnergyTransferMode]] = None + certificate_status: Optional[AuthorizeCertificateStatus] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class BootNotification: + current_time: str + interval: int + status: RegistrationStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class CancelReservation: + status: CancelReservationStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class CertificateSigned: + status: CertificateSignedStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class ChangeAvailability: + status: ChangeAvailabilityStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class ClearCache: + status: ClearCacheStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class ClearChargingProfile: + status: ClearChargingProfileStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class ClearDisplayMessage: + status: ClearMessageStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class ClearVariableMonitoring: + clear_monitoring_result: List[ResponseClearMonitoringResult] + custom_data: Optional[CustomData] = None + + +@dataclass +class ClearedChargingLimit: + custom_data: Optional[CustomData] = None + + +@dataclass +class CostUpdated: + custom_data: Optional[CustomData] = None + + +@dataclass +class CustomerInformation: + status: CustomerInformationStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class DataTransfer: + status: DataTransferStatus + custom_data: Optional[CustomData] = None + data: Any = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class DeleteCertificate: + status: DeleteCertificateStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class FirmwareStatusNotification: + custom_data: Optional[CustomData] = None + + +@dataclass +class Get15118EVCertificate: + exi_response: str + status: Iso15118EVCertificateStatus + custom_data: Optional[CustomData] = None + remaining_contracts: Optional[int] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetBaseReport: + status: GenericDeviceModelStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetCRL: + request_id: int + status: GenericStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetCertificateStatus: + status: enums.GetCertificateStatus + custom_data: Optional[CustomData] = None + ocsp_result: Optional[str] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetChargingProfiles: + status: GetChargingProfileStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetCompositeSchedule: + status: GenericStatus + custom_data: Optional[CustomData] = None + schedule: Optional[Schedule] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetDisplayMessages: + status: GetDisplayMessagesStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetInstalledCertificateIds: + status: GetInstalledCertificateStatus + certificate_hash_data_chain: Optional[List[CertificateHashDataChain]] = None + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetLocalListVersion: + version_number: int + custom_data: Optional[CustomData] = None + + +@dataclass +class GetLog: + status: LogStatus + custom_data: Optional[CustomData] = None + filename: Optional[str] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetMonitoringReport: + status: GenericDeviceModelStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetReport: + status: GenericDeviceModelStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class GetTransactionStatus: + messages_in_queue: bool + custom_data: Optional[CustomData] = None + ongoing_indicator: Optional[bool] = None + + +@dataclass +class GetVariables: + get_variable_result: List[GetVariableResult] + custom_data: Optional[CustomData] = None + + +@dataclass +class Heartbeat: + current_time: str + custom_data: Optional[CustomData] = None + + +@dataclass +class InstallCertificate: + status: InstallCertificateStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class LogStatusNotification: + custom_data: Optional[CustomData] = None + + +@dataclass +class MeterValues: + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyAllowedEnergyTransfer: + status: NotifyAllowedEnergyTransferStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class NotifyCRL: + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyChargingLimit: + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyCustomerInformation: + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyDisplayMessages: + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyEVChargingNeeds: + status: NotifyEVChargingNeedsStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class NotifyEVChargingSchedule: + status: GenericStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class NotifyEvent: + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyMonitoringReport: + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyPriorityCharging: + custom_data: Optional[CustomData] = None + + +@dataclass +class NotifyReport: + custom_data: Optional[CustomData] = None + + +@dataclass +class PublishFirmware: + status: GenericStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class PublishFirmwareStatusNotification: + custom_data: Optional[CustomData] = None + + +@dataclass +class PullDynamicScheduleUpdate: + custom_data: Optional[CustomData] = None + discharge_limit: Optional[float] = None + discharge_limit_l2: Optional[float] = None + discharge_limit_l3: Optional[float] = None + limit: Optional[float] = None + limit_l2: Optional[float] = None + limit_l3: Optional[float] = None + setpoint: Optional[float] = None + setpoint_l2: Optional[float] = None + setpoint_l3: Optional[float] = None + setpoint_reactive: Optional[float] = None + setpoint_reactive_l2: Optional[float] = None + setpoint_reactive_l3: Optional[float] = None + + +@dataclass +class ReportChargingProfiles: + custom_data: Optional[CustomData] = None + + +@dataclass +class RequestStartTransaction: + status: RequestStartStopStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + transaction_id: Optional[str] = None + + +@dataclass +class RequestStopTransaction: + status: RequestStartStopStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class ReservationStatusUpdate: + custom_data: Optional[CustomData] = None + + +@dataclass +class ReserveNow: + status: ReserveNowStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class Reset: + status: ResetStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class SecurityEventNotification: + custom_data: Optional[CustomData] = None + + +@dataclass +class SendLocalList: + status: SendLocalListStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class SetChargingProfile: + status: ChargingProfileStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class SetDisplayMessage: + status: DisplayMessageStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class SetMonitoringBase: + status: GenericDeviceModelStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class SetMonitoringLevel: + status: GenericStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class SetNetworkProfile: + status: SetNetworkProfileStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class SetVariableMonitoring: + set_monitoring_result: List[SetMonitoringResult] + custom_data: Optional[CustomData] = None + + +@dataclass +class SetVariables: + set_variable_result: List[SetVariableResult] + custom_data: Optional[CustomData] = None + + +@dataclass +class SignCertificate: + status: GenericStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class StatusNotification: + custom_data: Optional[CustomData] = None + + +@dataclass +class TransactionEvent: + charging_priority: Optional[int] = None + custom_data: Optional[CustomData] = None + id_token_info: Optional[IdTokenInfo] = None + total_cost: Optional[float] = None + updated_personal_message: Optional[UpdatedPersonalMessage] = None + + +@dataclass +class TriggerMessage: + status: TriggerMessageStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class UnlockConnector: + status: UnlockStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class UnpublishFirmware: + status: UnpublishFirmwareStatus + custom_data: Optional[CustomData] = None + + +@dataclass +class UpdateDynamicSchedule: + status: ChargingProfileStatus + custom_data: Optional[CustomData] = None + + +@dataclass +class UpdateFirmware: + status: UpdateFirmwareStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class UsePriorityCharging: + status: PriorityChargingStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None diff --git a/ocpp/v21/datatypes.py b/ocpp/v21/datatypes.py new file mode 100644 index 000000000..e2fa7d7e5 --- /dev/null +++ b/ocpp/v21/datatypes.py @@ -0,0 +1,884 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import List, Optional + +from enums import ( + VPN, + APNAuthentication, + Attribute, + AuthorizationStatus, + ChargingLimitSource, + ChargingProfileKind, + ChargingProfilePurpose, + ChargingRateUnit, + ChargingState, + ClearMonitoringStatus, + ControlMode, + CostKind, + Data, + EnergyTransferMode, + EventNotification, + EventTrigger, + GetCertificateIdUse, + GetVariableStatus, + HashAlgorithm, + IdToken, + Location, + Measurand, + MessageFormat, + MessagePriority, + MessageState, + MobilityNeedsMode, + Monitor, + Mutability, + OCPPTransport, + OCPPVersion, + OperationMode, + Phase, + Pricing, + ReadingContext, + Reason, + RecurrencyKind, + SetMonitoringStatus, + SetVariableStatus, +) + + +@dataclass +class ACChargingParameters: + energy_amount: float + ev_max_current: float + ev_max_voltage: float + ev_min_current: float + custom_data: Optional[CustomData] = None + + +@dataclass +class AbsolutePriceSchedule: + currency: str + language: str + price_algorithm: str + price_rule_stacks: List[PriceRuleStack] + price_schedule_id: int + time_anchor: str + additional_selected_services: Optional[List[AdditionalSelectedServices]] = None + custom_data: Optional[CustomData] = None + maximum_cost: Optional[MaximumCost] = None + minimum_cost: Optional[MinimumCost] = None + overstay_rule_list: Optional[OverstayRuleList] = None + price_schedule_description: Optional[str] = None + tax_rules: Optional[List[TaxRule]] = None + + +@dataclass +class AdditionalInfo: + additional_id_token: str + type: str + custom_data: Optional[CustomData] = None + + +@dataclass +class AdditionalSelectedServices: + service_fee: ServiceFee + service_name: str + custom_data: Optional[CustomData] = None + + +@dataclass +class Apn: + apn: str + apn_authentication: APNAuthentication + apn_password: Optional[str] = None + apn_user_name: Optional[str] = None + custom_data: Optional[CustomData] = None + preferred_network: Optional[str] = None + sim_pin: Optional[int] = None + use_only_preferred_network: bool = False + + +@dataclass +class AttributeStatusInfo: + reason_code: str + additional_info: Optional[str] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class AuthorizationData: + id_token: IdToken + custom_data: Optional[CustomData] = None + id_token_info: Optional[IdTokenInfo] = None + + +@dataclass +class CertificateHashData: + hash_algorithm: HashAlgorithm + issuer_key_hash: str + issuer_name_hash: str + serial_number: str + custom_data: Optional[CustomData] = None + + +@dataclass +class CertificateHashDataChain: + certificate_hash_data: CertificateHashData + certificate_type: GetCertificateIdUse + child_certificate_hash_data: Optional[List[CertificateHashData]] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class ChargingLimit: + charging_limit_source: ChargingLimitSource + custom_data: Optional[CustomData] = None + is_grid_critical: Optional[bool] = None + is_local_generation: Optional[bool] = None + + +@dataclass +class ChargingNeeds: + requested_energy_transfer: EnergyTransferMode + ac_charging_parameters: Optional[ACChargingParameters] = None + available_energy_transfer: Optional[List[EnergyTransferMode]] = None + control_mode: Optional[ControlMode] = None + custom_data: Optional[CustomData] = None + dc_charging_parameters: Optional[DCChargingParameters] = None + departure_time: Optional[str] = None + ev_energy_offer: Optional[EVEnergyOffer] = None + mobility_needs_mode: Optional[MobilityNeedsMode] = None + pricing: Optional[Pricing] = None + v2x_charging_parameters: Optional[V2XChargingParameters] = None + + +@dataclass +class ChargingProfile: + charging_limit_source: Optional[List[ChargingLimitSource]] = None + charging_profile_id: Optional[List[int]] = None + charging_profile_purpose: Optional[ChargingProfilePurpose] = None + custom_data: Optional[CustomData] = None + stack_level: Optional[int] = None + + +@dataclass +class ChargingProfile: + charging_profile_kind: ChargingProfileKind + charging_profile_purpose: ChargingProfilePurpose + charging_schedule: List[ChargingSchedule] + id: int + stack_level: int + custom_data: Optional[CustomData] = None + max_offline_duration: Optional[int] = None + price_schedule_signature: Optional[str] = None + recurrency_kind: Optional[RecurrencyKind] = None + transaction_id: Optional[str] = None + update_interval: Optional[int] = None + valid_from: Optional[str] = None + valid_to: Optional[str] = None + + +@dataclass +class ChargingProfileCriteria: + charging_profile_purpose: Optional[ChargingProfilePurpose] = None + custom_data: Optional[CustomData] = None + evse_id: Optional[int] = None + stack_level: Optional[int] = None + + +@dataclass +class ChargingSchedule: + charging_rate_unit: ChargingRateUnit + charging_schedule_period: List[ChargingSchedulePeriod] + id: int + absolute_price_schedule: Optional[AbsolutePriceSchedule] = None + custom_data: Optional[CustomData] = None + digest_value: Optional[str] = None + duration: Optional[int] = None + limit_beyond_soc: Optional[LimitBeyondSoc] = None + min_charging_rate: Optional[float] = None + power_tolerance: Optional[float] = None + price_level_schedule: Optional[PriceLevelSchedule] = None + sales_tariff: Optional[SalesTariff] = None + signature_id: Optional[int] = None + start_schedule: Optional[str] = None + + +@dataclass +class ChargingSchedulePeriod: + start_period: int + custom_data: Optional[CustomData] = None + discharge_limit: Optional[float] = None + discharge_limit_l2: Optional[float] = None + discharge_limit_l3: Optional[float] = None + dyn_update_time: Optional[str] = None + limit: Optional[float] = None + limit_l2: Optional[float] = None + limit_l3: Optional[float] = None + number_phases: Optional[int] = None + operation_mode: Optional[OperationMode] = None + phase_to_use: Optional[int] = None + preconditioning_request: Optional[bool] = None + set_point_reactive: Optional[float] = None + set_point_reactive_l2: Optional[float] = None + set_point_reactive_l3: Optional[float] = None + setpoint: Optional[float] = None + setpoint_l2: Optional[float] = None + setpoint_l3: Optional[float] = None + v2x_baseline: Optional[float] = None + v2x_freq_watt_curve: Optional[List[V2XFreqWattEntry]] = None + v2x_signal_watt_curve: Optional[List[V2XSignalWattEntry]] = None + + +@dataclass +class ChargingStation: + model: str + vendor_name: str + custom_data: Optional[CustomData] = None + firmware_version: Optional[str] = None + modem: Optional[Modem] = None + serial_number: Optional[str] = None + + +@dataclass +class Component: + name: str + custom_data: Optional[CustomData] = None + evse: Optional[EVSE] = None + instance: Optional[str] = None + + +@dataclass +class ComponentVariable: + component: Component + custom_data: Optional[CustomData] = None + variable: Optional[Variable] = None + + +@dataclass +class ConnectionData: + message_timeout: int + ocpp_csms_url: str + ocpp_interface: OCPPTransport + ocpp_transport: OCPPTransport + ocpp_version: OCPPVersion + security_profile: int + apn: Optional[Apn] = None + custom_data: Optional[CustomData] = None + vpn: Optional[VPN] = None + + +@dataclass +class ConsumptionCost: + cost: List[Cost] + start_value: float + custom_data: Optional[CustomData] = None + + +@dataclass +class Cost: + amount: int + cost_kind: CostKind + amount_multiplier: Optional[int] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class CustomData: + vendor_id: str + + +@dataclass +class CustomerCertificate: + hash_algorithm: HashAlgorithm + issuer_key_hash: str + issuer_name_hash: str + serial_number: str + custom_data: Optional[CustomData] = None + + +@dataclass +class DCChargingParameters: + ev_max_current: float + ev_max_voltage: float + bulk_soc: Optional[int] = None + custom_data: Optional[CustomData] = None + energy_amount: Optional[float] = None + ev_energy_capacity: Optional[float] = None + ev_max_power: Optional[float] = None + full_soc: Optional[int] = None + state_of_charge: Optional[int] = None + + +@dataclass +class Display: + name: str + custom_data: Optional[CustomData] = None + evse: Optional[EVSE] = None + instance: Optional[str] = None + + +@dataclass +class EVAbsolutePriceSchedule: + currency: str + ev_absolute_price_schedule_entries: List[EVAbsolutePriceScheduleEntry] + price_algorithm: str + time_anchor: str + custom_data: Optional[CustomData] = None + + +@dataclass +class EVAbsolutePriceScheduleEntry: + duration: int + ev_price_rule: List[EVPriceRule] + custom_data: Optional[CustomData] = None + + +@dataclass +class EVEnergyOffer: + ev_power_schedule: EVPowerSchedule + custom_data: Optional[CustomData] = None + ev_absolute_price_schedule: Optional[EVAbsolutePriceSchedule] = None + + +@dataclass +class EVPowerSchedule: + ev_power_schedule_entries: List[EVPowerScheduleEntry] + time_anchor: str + custom_data: Optional[CustomData] = None + + +@dataclass +class EVPowerScheduleEntry: + duration: int + power: float + custom_data: Optional[CustomData] = None + + +@dataclass +class EVPriceRule: + energy_fee: float + power_range_start: float + custom_data: Optional[CustomData] = None + + +@dataclass +class EVSE: + id: int + connector_id: Optional[int] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class EnergyFee: + exponent: int + value: int + custom_data: Optional[CustomData] = None + + +@dataclass +class EventData: + actual_value: str + component: Component + event_id: int + event_notification_type: EventNotification + timestamp: str + trigger: EventTrigger + variable: Variable + cause: Optional[int] = None + cleared: Optional[bool] = None + custom_data: Optional[CustomData] = None + tech_code: Optional[str] = None + tech_info: Optional[str] = None + transaction_id: Optional[str] = None + variable_monitoring_id: Optional[int] = None + + +@dataclass +class Firmware: + location: str + retrieve_date_time: str + custom_data: Optional[CustomData] = None + install_date_time: Optional[str] = None + signature: Optional[str] = None + signing_certificate: Optional[str] = None + + +@dataclass +class GetVariableData: + component: Component + variable: Variable + attribute_type: Attribute = Attribute.actual + custom_data: Optional[CustomData] = None + + +@dataclass +class GetVariableResult: + attribute_status: GetVariableStatus + component: Component + variable: Variable + attribute_status_info: Optional[AttributeStatusInfo] = None + attribute_type: Attribute = Attribute.actual + attribute_value: Optional[str] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class GroupIdToken: + id_token: str + type: IdToken + additional_info: Optional[List[AdditionalInfo]] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class IdToken: + id_token: str + type: IdToken + additional_info: Optional[List[AdditionalInfo]] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class IdTokenInfo: + status: AuthorizationStatus + cache_expiry_date_time: Optional[str] = None + charging_priority: Optional[int] = None + custom_data: Optional[CustomData] = None + evse_id: Optional[List[int]] = None + group_id_token: Optional[GroupIdToken] = None + language1: Optional[str] = None + language2: Optional[str] = None + personal_message: Optional[PersonalMessage] = None + + +@dataclass +class LimitBeyondSoc: + limit: float + soc: int + custom_data: Optional[CustomData] = None + + +@dataclass +class Log: + remote_location: str + custom_data: Optional[CustomData] = None + latest_timestamp: Optional[str] = None + oldest_timestamp: Optional[str] = None + + +@dataclass +class MaximumCost: + exponent: int + value: int + custom_data: Optional[CustomData] = None + + +@dataclass +class Message: + id: int + message: Message + priority: MessagePriority + custom_data: Optional[CustomData] = None + display: Optional[Display] = None + end_date_time: Optional[str] = None + start_date_time: Optional[str] = None + state: Optional[MessageState] = None + transaction_id: Optional[str] = None + + +@dataclass +class Message: + content: str + format: MessageFormat + custom_data: Optional[CustomData] = None + language: Optional[str] = None + + +@dataclass +class MessageInfo: + id: int + message: Message + priority: MessagePriority + custom_data: Optional[CustomData] = None + display: Optional[Display] = None + end_date_time: Optional[str] = None + start_date_time: Optional[str] = None + state: Optional[MessageState] = None + transaction_id: Optional[str] = None + + +@dataclass +class MeterValue: + sampled_value: List[SampledValue] + timestamp: str + custom_data: Optional[CustomData] = None + + +@dataclass +class MinimumCost: + exponent: int + value: int + custom_data: Optional[CustomData] = None + + +@dataclass +class Modem: + custom_data: Optional[CustomData] = None + iccid: Optional[str] = None + imsi: Optional[str] = None + + +@dataclass +class MonitoringData: + component: Component + variable: Variable + variable_monitoring: List[VariableMonitoring] + custom_data: Optional[CustomData] = None + + +@dataclass +class OCSPRequestData: + hash_algorithm: HashAlgorithm + issuer_key_hash: str + issuer_name_hash: str + responder_url: str + serial_number: str + custom_data: Optional[CustomData] = None + + +@dataclass +class OverstayPowerThreshold: + exponent: int + value: int + custom_data: Optional[CustomData] = None + + +@dataclass +class OverstayRuleList: + custom_data: Optional[CustomData] = None + overstay_power_threshold: Optional[OverstayPowerThreshold] = None + overstay_time_threshold: Optional[int] = None + + +@dataclass +class ParkingFee: + exponent: int + value: int + custom_data: Optional[CustomData] = None + + +@dataclass +class PersonalMessage: + content: str + format: MessageFormat + custom_data: Optional[CustomData] = None + language: Optional[str] = None + + +@dataclass +class PowerRangeStart: + exponent: int + value: int + custom_data: Optional[CustomData] = None + + +@dataclass +class PriceLevelSchedule: + number_of_price_levels: int + price_level_schedule_entries: List[PriceLevelScheduleEntry] + price_schedule_id: int + time_anchor: str + custom_data: Optional[CustomData] = None + price_schedule_description: Optional[str] = None + + +@dataclass +class PriceLevelScheduleEntry: + duration: int + price_level: int + custom_data: Optional[CustomData] = None + + +@dataclass +class PriceRule: + energy_fee: EnergyFee + power_range_start: PowerRangeStart + carbon_dioxide_emission: Optional[int] = None + custom_data: Optional[CustomData] = None + parking_fee: Optional[ParkingFee] = None + parking_fee_period: Optional[int] = None + renewable_generation_percentage: Optional[int] = None + + +@dataclass +class PriceRuleStack: + duration: int + price_rule: List[PriceRule] + custom_data: Optional[CustomData] = None + + +@dataclass +class RelativeTimeInterval: + start: int + custom_data: Optional[CustomData] = None + duration: Optional[int] = None + + +@dataclass +class ReportData: + component: Component + variable: Variable + variable_attribute: List[VariableAttribute] + custom_data: Optional[CustomData] = None + variable_characteristics: Optional[VariableCharacteristics] = None + + +@dataclass +class ResponseClearMonitoringResult: + id: int + status: ClearMonitoringStatus + custom_data: Optional[CustomData] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class SalesTariff: + id: int + sales_tariff_entry: List[SalesTariffEntry] + custom_data: Optional[CustomData] = None + num_e_price_levels: Optional[int] = None + sales_tariff_description: Optional[str] = None + + +@dataclass +class SalesTariffEntry: + relative_time_interval: RelativeTimeInterval + consumption_cost: Optional[List[ConsumptionCost]] = None + custom_data: Optional[CustomData] = None + e_price_level: Optional[int] = None + + +@dataclass +class SampledValue: + value: float + context: ReadingContext = ReadingContext.sample_periodic + custom_data: Optional[CustomData] = None + location: Location = Location.outlet + measurand: Measurand = Measurand.energy_active_import_register + phase: Optional[Phase] = None + signed_meter_value: Optional[SignedMeterValue] = None + unit_of_measure: Optional[UnitOfMeasure] = None + + +@dataclass +class Schedule: + charging_rate_unit: ChargingRateUnit + charging_schedule_period: List[ChargingSchedulePeriod] + duration: int + evse_id: int + schedule_start: str + custom_data: Optional[CustomData] = None + + +@dataclass +class ServiceFee: + exponent: int + value: int + custom_data: Optional[CustomData] = None + + +@dataclass +class SetMonitoringData: + component: Component + severity: int + type: Monitor + value: float + variable: Variable + custom_data: Optional[CustomData] = None + id: Optional[int] = None + transaction: bool = False + + +@dataclass +class SetMonitoringResult: + component: Component + severity: int + status: SetMonitoringStatus + type: Monitor + variable: Variable + custom_data: Optional[CustomData] = None + id: Optional[int] = None + status_info: Optional[StatusInfo] = None + + +@dataclass +class SetVariableData: + attribute_value: str + component: Component + variable: Variable + attribute_type: Attribute = Attribute.actual + custom_data: Optional[CustomData] = None + + +@dataclass +class SetVariableResult: + attribute_status: SetVariableStatus + component: Component + variable: Variable + attribute_status_info: Optional[AttributeStatusInfo] = None + attribute_type: Attribute = Attribute.actual + custom_data: Optional[CustomData] = None + + +@dataclass +class SignedMeterValue: + encoding_method: str + public_key: str + signed_meter_data: str + signing_method: str + custom_data: Optional[CustomData] = None + + +@dataclass +class StatusInfo: + reason_code: str + additional_info: Optional[str] = None + custom_data: Optional[CustomData] = None + + +@dataclass +class TaxRate: + exponent: int + value: int + custom_data: Optional[CustomData] = None + + +@dataclass +class TaxRule: + applies_to_energy_fee: bool + applies_to_minimum_maximum_cost: bool + applies_to_overstay_fee: bool + applies_to_parking_fee: bool + tax_rate: TaxRate + tax_rule_id: int + custom_data: Optional[CustomData] = None + tax_included_in_price: Optional[bool] = None + tax_rule_name: Optional[str] = None + + +@dataclass +class TransactionInfo: + transaction_id: str + charging_state: Optional[ChargingState] = None + custom_data: Optional[CustomData] = None + operation_mode: Optional[OperationMode] = None + remote_start_id: Optional[int] = None + stopped_reason: Optional[Reason] = None + time_spent_charging: Optional[int] = None + + +@dataclass +class UnitOfMeasure: + custom_data: Optional[CustomData] = None + multiplier: int = 0 + unit: str = "Wh" + + +@dataclass +class UpdatedPersonalMessage: + content: str + format: MessageFormat + custom_data: Optional[CustomData] = None + language: Optional[str] = None + + +@dataclass +class V2XChargingParameters: + custom_data: Optional[CustomData] = None + ev_max_energy_request: Optional[float] = None + ev_max_v2x_energy_request: Optional[float] = None + ev_min_energy_request: Optional[float] = None + ev_min_v2x_energy_request: Optional[float] = None + ev_target_energy_request: Optional[float] = None + max_charge_current: Optional[float] = None + max_charge_power: Optional[float] = None + max_charge_power_l2: Optional[float] = None + max_charge_power_l3: Optional[float] = None + max_discharge_current: Optional[float] = None + max_discharge_power: Optional[float] = None + max_discharge_power_l2: Optional[float] = None + max_discharge_power_l3: Optional[float] = None + max_voltage: Optional[float] = None + min_charge_current: Optional[float] = None + min_charge_power: Optional[float] = None + min_charge_power_l2: Optional[float] = None + min_charge_power_l3: Optional[float] = None + min_discharge_current: Optional[float] = None + min_discharge_power: Optional[float] = None + min_discharge_power_l2: Optional[float] = None + min_discharge_power_l3: Optional[float] = None + min_voltage: Optional[float] = None + target_soc: Optional[int] = None + + +@dataclass +class V2XFreqWattEntry: + frequency: float + power: float + custom_data: Optional[CustomData] = None + + +@dataclass +class V2XSignalWattEntry: + power: float + signal: int + custom_data: Optional[CustomData] = None + + +@dataclass +class VPN: + key: str + password: str + server: str + type: VPN + user: str + custom_data: Optional[CustomData] = None + group: Optional[str] = None + + +@dataclass +class Variable: + name: str + custom_data: Optional[CustomData] = None + instance: Optional[str] = None + + +@dataclass +class VariableAttribute: + constant: bool = False + custom_data: Optional[CustomData] = None + mutability: Mutability = Mutability.read_write + persistent: bool = False + type: Attribute = Attribute.actual + value: Optional[str] = None + + +@dataclass +class VariableCharacteristics: + data_type: Data + supports_monitoring: bool + custom_data: Optional[CustomData] = None + max_limit: Optional[float] = None + min_limit: Optional[float] = None + unit: Optional[str] = None + values_list: Optional[str] = None + + +@dataclass +class VariableMonitoring: + id: int + severity: int + transaction: bool + type: Monitor + value: float + custom_data: Optional[CustomData] = None diff --git a/ocpp/v21/enums.py b/ocpp/v21/enums.py new file mode 100644 index 000000000..c6ff3838b --- /dev/null +++ b/ocpp/v21/enums.py @@ -0,0 +1,790 @@ +try: + # breaking change introduced in python 3.11 + from enum import StrEnum +except ImportError: # pragma: no cover + from enum import Enum # pragma: no cover + + class StrEnum(str, Enum): # pragma: no cover + pass # pragma: no cover + + +class APNAuthentication(StrEnum): + pap = "PAP" + chap = "CHAP" + none = "NONE" + auto = "AUTO" + + +class Attribute(StrEnum): + actual = "Actual" + target = "Target" + min_set = "MinSet" + max_set = "MaxSet" + + +class AuthorizationStatus(StrEnum): + accepted = "Accepted" + blocked = "Blocked" + expired = "Expired" + invalid = "Invalid" + no_credit = "NoCredit" + not_allowed_type_evse = "NotAllowedTypeEVSE" + not_at_this_location = "NotAtThisLocation" + not_at_this_time = "NotAtThisTime" + concurrent_tx = "ConcurrentTx" + unknown = "Unknown" + + +class AuthorizeCertificateStatus(StrEnum): + accepted = "Accepted" + signature_error = "SignatureError" + certificate_expired = "CertificateExpired" + certificate_revoked = "CertificateRevoked" + no_certificate_available = "NoCertificateAvailable" + cert_chain_error = "CertChainError" + contract_cancelled = "ContractCancelled" + + +class BootReason(StrEnum): + application_reset = "ApplicationReset" + firmware_update = "FirmwareUpdate" + local_reset = "LocalReset" + power_up = "PowerUp" + remote_reset = "RemoteReset" + scheduled_reset = "ScheduledReset" + triggered = "Triggered" + unknown = "Unknown" + watchdog = "Watchdog" + + +class CancelReservationStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + + +class CertificateAction(StrEnum): + install = "Install" + update = "Update" + + +class CertificateSignedStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + + +class CertificateSigningUse(StrEnum): + charging_station_certificate = "ChargingStationCertificate" + v2g_certificate = "V2GCertificate" + + +class ChangeAvailabilityStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + scheduled = "Scheduled" + + +class ChargingLimitSource(StrEnum): + cso = "CSO" + ems = "EMS" + other = "Other" + so = "SO" + + +class ChargingProfileKind(StrEnum): + absolute = "Absolute" + recurring = "Recurring" + relative = "Relative" + dynamic = "Dynamic" + + +class ChargingProfilePurpose(StrEnum): + charging_station_external_constraints = "ChargingStationExternalConstraints" + charging_station_max_profile = "ChargingStationMaxProfile" + tx_default_profile = "TxDefaultProfile" + tx_profile = "TxProfile" + priority_charging = "PriorityCharging" + local_generation = "LocalGeneration" + + +class ChargingProfileStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + + +class ChargingRateUnit(StrEnum): + w = "W" + a = "A" + + +class ChargingState(StrEnum): + ev_connected = "EVConnected" + charging = "Charging" + suspended_ev = "SuspendedEV" + suspended_evse = "SuspendedEVSE" + idle = "Idle" + + +class ClearCacheStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + + +class ClearChargingProfileStatus(StrEnum): + accepted = "Accepted" + unknown = "Unknown" + + +class ClearMessageStatus(StrEnum): + accepted = "Accepted" + unknown = "Unknown" + + +class ClearMonitoringStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + not_found = "NotFound" + + +class ComponentCriterion(StrEnum): + active = "Active" + available = "Available" + enabled = "Enabled" + problem = "Problem" + + +class Connector(StrEnum): + c_ccs1 = "cCCS1" + c_ccs2 = "cCCS2" + c_g105 = "cG105" + c_tesla = "cTesla" + c_type1 = "cType1" + c_type2 = "cType2" + s309_1_p_16a = "s309-1P-16A" + s309_1_p_32a = "s309-1P-32A" + s309_3_p_16a = "s309-3P-16A" + s309_3_p_32a = "s309-3P-32A" + s_bs1361 = "sBS1361" + s_cee_7_7 = "sCEE-7-7" + s_type2 = "sType2" + s_type3 = "sType3" + other1_ph_max16a = "Other1PhMax16A" + other1_ph_over16a = "Other1PhOver16A" + other3_ph = "Other3Ph" + pan = "Pan" + w_inductive = "wInductive" + w_resonant = "wResonant" + undetermined = "Undetermined" + unknown = "Unknown" + + +class ConnectorStatus(StrEnum): + available = "Available" + occupied = "Occupied" + reserved = "Reserved" + unavailable = "Unavailable" + faulted = "Faulted" + + +class ControlMode(StrEnum): + scheduled = "Scheduled" + dynamic = "Dynamic" + + +class CostKind(StrEnum): + carbon_dioxide_emission = "CarbonDioxideEmission" + relative_price_percentage = "RelativePricePercentage" + renewable_generation_percentage = "RenewableGenerationPercentage" + + +class CustomerInformationStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + invalid = "Invalid" + + +class Data(StrEnum): + string = "string" + decimal = "decimal" + integer = "integer" + date_time = "dateTime" + boolean = "boolean" + option_list = "OptionList" + sequence_list = "SequenceList" + member_list = "MemberList" + + +class DataTransferStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + unknown_message_id = "UnknownMessageId" + unknown_vendor_id = "UnknownVendorId" + + +class DeleteCertificateStatus(StrEnum): + accepted = "Accepted" + failed = "Failed" + not_found = "NotFound" + + +class DisplayMessageStatus(StrEnum): + accepted = "Accepted" + not_supported_message_format = "NotSupportedMessageFormat" + rejected = "Rejected" + not_supported_priority = "NotSupportedPriority" + not_supported_state = "NotSupportedState" + unknown_transaction = "UnknownTransaction" + + +class EnergyTransferMode(StrEnum): + ac_single_phase = "AC_single_phase" + ac_two_phase = "AC_two_phase" + ac_three_phase = "AC_three_phase" + dc = "DC" + ac_single_phase_bpt = "AC_single_phase_BPT" + ac_two_phase_bpt = "AC_two_phase_BPT" + ac_three_phase_bpt = "AC_three_phase_BPT" + dc_bpt = "DC_BPT" + dc_acdp = "DC_ACDP" + dc_acdp_bpt = "DC_ACDP_BPT" + wpt = "WPT" + + +class EventNotification(StrEnum): + hard_wired_notification = "HardWiredNotification" + hard_wired_monitor = "HardWiredMonitor" + preconfigured_monitor = "PreconfiguredMonitor" + custom_monitor = "CustomMonitor" + + +class EventTrigger(StrEnum): + alerting = "Alerting" + delta = "Delta" + periodic = "Periodic" + + +class FirmwareStatus(StrEnum): + downloaded = "Downloaded" + download_failed = "DownloadFailed" + downloading = "Downloading" + download_scheduled = "DownloadScheduled" + download_paused = "DownloadPaused" + idle = "Idle" + installation_failed = "InstallationFailed" + installing = "Installing" + installed = "Installed" + install_rebooting = "InstallRebooting" + install_scheduled = "InstallScheduled" + install_verification_failed = "InstallVerificationFailed" + invalid_signature = "InvalidSignature" + signature_verified = "SignatureVerified" + + +class GenericDeviceModelStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + not_supported = "NotSupported" + empty_result_set = "EmptyResultSet" + + +class GenericStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + + +class GetCertificateIdUse(StrEnum): + v2g_root_certificate = "V2GRootCertificate" + mo_root_certificate = "MORootCertificate" + csms_root_certificate = "CSMSRootCertificate" + v2g_certificate_chain = "V2GCertificateChain" + manufacturer_root_certificate = "ManufacturerRootCertificate" + oem_root_certificate = "OEMRootCertificate" + + +class GetCertificateStatus(StrEnum): + accepted = "Accepted" + failed = "Failed" + + +class GetChargingProfileStatus(StrEnum): + accepted = "Accepted" + no_profiles = "NoProfiles" + + +class GetDisplayMessagesStatus(StrEnum): + accepted = "Accepted" + unknown = "Unknown" + + +class GetInstalledCertificateStatus(StrEnum): + accepted = "Accepted" + not_found = "NotFound" + + +class GetVariableStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + unknown_component = "UnknownComponent" + unknown_variable = "UnknownVariable" + not_supported_attribute_type = "NotSupportedAttributeType" + + +class HashAlgorithm(StrEnum): + sha256 = "SHA256" + sha384 = "SHA384" + sha512 = "SHA512" + + +class IdToken(StrEnum): + central = "Central" + e_maid = "eMAID" + iso14443 = "ISO14443" + iso15693 = "ISO15693" + key_code = "KeyCode" + local = "Local" + mac_address = "MacAddress" + no_authorization = "NoAuthorization" + evccid = "EVCCID" + nema = "NEMA" + + +class InstallCertificateStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + failed = "Failed" + + +class InstallCertificateUse(StrEnum): + v2g_root_certificate = "V2GRootCertificate" + mo_root_certificate = "MORootCertificate" + csms_root_certificate = "CSMSRootCertificate" + oem_root_certificate = "OEMRootCertificate" + manufacturer_root_certificate = "ManufacturerRootCertificate" + + +class Iso15118EVCertificateStatus(StrEnum): + accepted = "Accepted" + failed = "Failed" + + +class Location(StrEnum): + body = "Body" + cable = "Cable" + ev = "EV" + inlet = "Inlet" + outlet = "Outlet" + local_grid = "LocalGrid" + + +class Log(StrEnum): + diagnostics_log = "DiagnosticsLog" + security_log = "SecurityLog" + data_collector_log = "DataCollectorLog" + + +class LogStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + accepted_canceled = "AcceptedCanceled" + + +class Measurand(StrEnum): + current_export = "Current.Export" + current_export_offered = "Current.Export.Offered" + current_export_minimum = "Current.Export.Minimum" + current_import = "Current.Import" + current_import_offered = "Current.Import.Offered" + current_import_minimum = "Current.Import.Minimum" + current_offered = "Current.Offered" + display_present_soc = "Display.PresentSOC" + display_minimum_soc = "Display.MinimumSOC" + display_target_soc = "Display.TargetSOC" + display_maximum_soc = "Display.MaximumSOC" + display_remaining_time_to_minimum_soc = "Display.RemainingTimeToMinimumSOC" + display_remaining_time_to_target_soc = "Display.RemainingTimeToTargetSOC" + display_remaining_time_to_maximum_soc = "Display.RemainingTimeToMaximumSOC" + display_charging_complete = "Display.ChargingComplete" + display_battery_energy_capacity = "Display.BatteryEnergyCapacity" + display_inlet_hot = "Display.InletHot" + energy_active_export_interval = "Energy.Active.Export.Interval" + energy_active_export_register = "Energy.Active.Export.Register" + energy_active_import_interval = "Energy.Active.Import.Interval" + energy_active_import_register = "Energy.Active.Import.Register" + energy_active_net = "Energy.Active.Net" + energy_active_setpoint_interval = "Energy.Active.Setpoint.Interval" + energy_apparent_export = "Energy.Apparent.Export" + energy_apparent_import = "Energy.Apparent.Import" + energy_apparent_net = "Energy.Apparent.Net" + energy_reactive_export_interval = "Energy.Reactive.Export.Interval" + energy_reactive_export_register = "Energy.Reactive.Export.Register" + energy_reactive_import_interval = "Energy.Reactive.Import.Interval" + energy_reactive_import_register = "Energy.Reactive.Import.Register" + energy_reactive_net = "Energy.Reactive.Net" + energy_request_target = "EnergyRequest.Target" + energy_request_minimum = "EnergyRequest.Minimum" + energy_request_maximum = "EnergyRequest.Maximum" + energy_request_minimum_v2x = "EnergyRequest.Minimum.V2X" + energy_request_maximum_v2x = "EnergyRequest.Maximum.V2X" + energy_request_bulk = "EnergyRequest.Bulk" + frequency = "Frequency" + power_active_export = "Power.Active.Export" + power_active_import = "Power.Active.Import" + power_active_setpoint = "Power.Active.Setpoint" + power_active_residual = "Power.Active.Residual" + power_export_minimum = "Power.Export.Minimum" + power_export_offered = "Power.Export.Offered" + power_factor = "Power.Factor" + power_import_offered = "Power.Import.Offered" + power_import_minimum = "Power.Import.Minimum" + power_offered = "Power.Offered" + power_reactive_export = "Power.Reactive.Export" + power_reactive_import = "Power.Reactive.Import" + soc = "SoC" + voltage = "Voltage" + voltage_minimum = "Voltage.Minimum" + voltage_maximum = "Voltage.Maximum" + + +class MessageFormat(StrEnum): + ascii = "ASCII" + html = "HTML" + uri = "URI" + utf8 = "UTF8" + + +class MessagePriority(StrEnum): + always_front = "AlwaysFront" + in_front = "InFront" + normal_cycle = "NormalCycle" + + +class MessageState(StrEnum): + charging = "Charging" + faulted = "Faulted" + idle = "Idle" + unavailable = "Unavailable" + + +class MessageTrigger(StrEnum): + boot_notification = "BootNotification" + log_status_notification = "LogStatusNotification" + firmware_status_notification = "FirmwareStatusNotification" + heartbeat = "Heartbeat" + meter_values = "MeterValues" + sign_charging_station_certificate = "SignChargingStationCertificate" + sign_v2g_certificate = "SignV2GCertificate" + status_notification = "StatusNotification" + transaction_event = "TransactionEvent" + sign_combined_certificate = "SignCombinedCertificate" + publish_firmware_status_notification = "PublishFirmwareStatusNotification" + + +class MobilityNeedsMode(StrEnum): + evcc = "EVCC" + evcc_secc = "EVCC_SECC" + + +class Monitor(StrEnum): + upper_threshold = "UpperThreshold" + lower_threshold = "LowerThreshold" + delta = "Delta" + periodic = "Periodic" + periodic_clock_aligned = "PeriodicClockAligned" + + +class MonitoringBase(StrEnum): + all = "All" + factory_default = "FactoryDefault" + hard_wired_only = "HardWiredOnly" + + +class MonitoringCriterion(StrEnum): + threshold_monitoring = "ThresholdMonitoring" + delta_monitoring = "DeltaMonitoring" + periodic_monitoring = "PeriodicMonitoring" + + +class Mutability(StrEnum): + read_only = "ReadOnly" + write_only = "WriteOnly" + read_write = "ReadWrite" + + +class NotifyAllowedEnergyTransferStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + + +class NotifyCRLStatus(StrEnum): + available = "Available" + unavailable = "Unavailable" + + +class NotifyEVChargingNeedsStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + processing = "Processing" + no_charging_profile = "NoChargingProfile" + + +class OCPPTransport(StrEnum): + soap = "SOAP" + json = "JSON" + + +class OCPPVersion(StrEnum): + ocpp12 = "OCPP12" + ocpp15 = "OCPP15" + ocpp16 = "OCPP16" + ocpp20 = "OCPP20" + + +class OperationMode(StrEnum): + idle = "Idle" + charging_only = "ChargingOnly" + central_setpoint = "CentralSetpoint" + external_setpoint = "ExternalSetpoint" + external_limits = "ExternalLimits" + central_frequency = "CentralFrequency" + local_frequency = "LocalFrequency" + local_load_balancing = "LocalLoadBalancing" + + +class OperationalStatus(StrEnum): + inoperative = "Inoperative" + operative = "Operative" + + +class Phase(StrEnum): + l1 = "L1" + l2 = "L2" + l3 = "L3" + n = "N" + l1_n = "L1-N" + l2_n = "L2-N" + l3_n = "L3-N" + l1_l2 = "L1-L2" + l2_l3 = "L2-L3" + l3_l1 = "L3-L1" + + +class PreconditioningStatus(StrEnum): + unknown = "Unknown" + ready = "Ready" + not_ready = "NotReady" + preconditioning = "Preconditioning" + + +class Pricing(StrEnum): + no_pricing = "NoPricing" + absolute_pricing = "AbsolutePricing" + price_levels = "PriceLevels" + + +class PriorityChargingStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + no_profile = "NoProfile" + + +class PublishFirmwareStatus(StrEnum): + idle = "Idle" + download_scheduled = "DownloadScheduled" + downloading = "Downloading" + downloaded = "Downloaded" + published = "Published" + download_failed = "DownloadFailed" + download_paused = "DownloadPaused" + invalid_checksum = "InvalidChecksum" + checksum_verified = "ChecksumVerified" + publish_failed = "PublishFailed" + + +class ReadingContext(StrEnum): + interruption_begin = "Interruption.Begin" + interruption_end = "Interruption.End" + other = "Other" + sample_clock = "Sample.Clock" + sample_periodic = "Sample.Periodic" + transaction_begin = "Transaction.Begin" + transaction_end = "Transaction.End" + trigger = "Trigger" + + +class Reason(StrEnum): + de_authorized = "DeAuthorized" + emergency_stop = "EmergencyStop" + energy_limit_reached = "EnergyLimitReached" + ev_disconnected = "EVDisconnected" + ground_fault = "GroundFault" + immediate_reset = "ImmediateReset" + master_pass = "MasterPass" + local = "Local" + out_of_credit = "OutOfCredit" + other = "Other" + overcurrent_fault = "OvercurrentFault" + power_loss = "PowerLoss" + power_quality = "PowerQuality" + reboot = "Reboot" + remote = "Remote" + soc_limit_reached = "SOCLimitReached" + stopped_by_ev = "StoppedByEV" + time_limit_reached = "TimeLimitReached" + timeout = "Timeout" + charging_needs_not_accepted = "ChargingNeedsNotAccepted" + + +class RecurrencyKind(StrEnum): + daily = "Daily" + weekly = "Weekly" + + +class RegistrationStatus(StrEnum): + accepted = "Accepted" + pending = "Pending" + rejected = "Rejected" + + +class ReportBase(StrEnum): + configuration_inventory = "ConfigurationInventory" + full_inventory = "FullInventory" + summary_inventory = "SummaryInventory" + + +class RequestStartStopStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + + +class ReservationUpdateStatus(StrEnum): + expired = "Expired" + removed = "Removed" + + +class ReserveNowStatus(StrEnum): + accepted = "Accepted" + faulted = "Faulted" + occupied = "Occupied" + rejected = "Rejected" + unavailable = "Unavailable" + + +class Reset(StrEnum): + immediate = "Immediate" + on_idle = "OnIdle" + + +class ResetStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + scheduled = "Scheduled" + + +class SendLocalListStatus(StrEnum): + accepted = "Accepted" + failed = "Failed" + version_mismatch = "VersionMismatch" + + +class SetMonitoringStatus(StrEnum): + accepted = "Accepted" + unknown_component = "UnknownComponent" + unknown_variable = "UnknownVariable" + unsupported_monitor_type = "UnsupportedMonitorType" + rejected = "Rejected" + duplicate = "Duplicate" + + +class SetNetworkProfileStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + failed = "Failed" + + +class SetVariableStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + unknown_component = "UnknownComponent" + unknown_variable = "UnknownVariable" + not_supported_attribute_type = "NotSupportedAttributeType" + reboot_required = "RebootRequired" + + +class TransactionEvent(StrEnum): + ended = "Ended" + started = "Started" + updated = "Updated" + + +class TriggerMessageStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + not_implemented = "NotImplemented" + + +class TriggerReason(StrEnum): + abnormal_condition = "AbnormalCondition" + authorized = "Authorized" + cable_plugged_in = "CablePluggedIn" + charging_rate_changed = "ChargingRateChanged" + charging_state_changed = "ChargingStateChanged" + deauthorized = "Deauthorized" + energy_limit_reached = "EnergyLimitReached" + ev_communication_lost = "EVCommunicationLost" + ev_connect_timeout = "EVConnectTimeout" + ev_departed = "EVDeparted" + ev_detected = "EVDetected" + meter_value_clock = "MeterValueClock" + meter_value_periodic = "MeterValuePeriodic" + remote_start = "RemoteStart" + remote_stop = "RemoteStop" + reset_command = "ResetCommand" + signed_data_received = "SignedDataReceived" + stop_authorized = "StopAuthorized" + time_limit_reached = "TimeLimitReached" + trigger = "Trigger" + unlock_command = "UnlockCommand" + operation_mode_changed = "OperationModeChanged" + + +class UnlockStatus(StrEnum): + unlocked = "Unlocked" + unlock_failed = "UnlockFailed" + ongoing_authorized_transaction = "OngoingAuthorizedTransaction" + unknown_connector = "UnknownConnector" + + +class UnpublishFirmwareStatus(StrEnum): + download_ongoing = "DownloadOngoing" + no_firmware = "NoFirmware" + unpublished = "Unpublished" + + +class Update(StrEnum): + differential = "Differential" + full = "Full" + + +class UpdateFirmwareStatus(StrEnum): + accepted = "Accepted" + rejected = "Rejected" + accepted_canceled = "AcceptedCanceled" + invalid_certificate = "InvalidCertificate" + revoked_certificate = "RevokedCertificate" + + +class UploadLogStatus(StrEnum): + bad_message = "BadMessage" + idle = "Idle" + not_supported_operation = "NotSupportedOperation" + permission_denied = "PermissionDenied" + uploaded = "Uploaded" + upload_failure = "UploadFailure" + uploading = "Uploading" + accepted_canceled = "AcceptedCanceled" + + +class VPN(StrEnum): + ik_ev2 = "IKEv2" + ip_sec = "IPSec" + l2_tp = "L2TP" + pptp = "PPTP" From f0af21a9c523370bc3fb254c5df9205f5d0c148b Mon Sep 17 00:00:00 2001 From: Auke Oosterhoff Date: Thu, 20 Jul 2023 17:08:17 +0200 Subject: [PATCH 2/2] Fix names --- ocpp/v21/__init__.py | 8 ++ ocpp/v21/call.py | 30 +++-- ocpp/v21/call_result.py | 8 +- ocpp/v21/datatypes.py | 253 +++++++++++----------------------------- 4 files changed, 97 insertions(+), 202 deletions(-) create mode 100644 ocpp/v21/__init__.py diff --git a/ocpp/v21/__init__.py b/ocpp/v21/__init__.py new file mode 100644 index 000000000..d6f6d6280 --- /dev/null +++ b/ocpp/v21/__init__.py @@ -0,0 +1,8 @@ +from ocpp.charge_point import ChargePoint as cp +from ocpp.v21 import call, call_result + + +class ChargePoint(cp): + _call = call + _call_result = call_result + _ocpp_version = "2.1" diff --git a/ocpp/v21/call.py b/ocpp/v21/call.py index 5b761f362..d455e58f9 100644 --- a/ocpp/v21/call.py +++ b/ocpp/v21/call.py @@ -9,28 +9,26 @@ ChargingLimit, ChargingNeeds, ChargingProfile, - ChargingProfileCriteria, + ChargingProfileCriterion, ChargingSchedule, ChargingStation, + ClearChargingProfile, ComponentVariable, - ConnectionData, CustomData, - CustomerCertificate, EventData, Firmware, GetVariableData, - GroupIdToken, IdToken, - Log, - Message, + LogParameters, MessageInfo, MeterValue, MonitoringData, + NetworkConnectionProfile, OCSPRequestData, ReportData, SetMonitoringData, SetVariableData, - TransactionInfo, + Transaction, ) from enums import ( BootReason, @@ -112,7 +110,7 @@ class ClearCache: @dataclass class ClearChargingProfile: - charging_profile_criteria: Optional[ChargingProfileCriteria] = None + charging_profile_criteria: Optional[ClearChargingProfile] = None charging_profile_id: Optional[int] = None custom_data: Optional[CustomData] = None @@ -149,7 +147,7 @@ class CustomerInformation: report: bool request_id: int custom_data: Optional[CustomData] = None - customer_certificate: Optional[CustomerCertificate] = None + customer_certificate: Optional[CertificateHashData] = None customer_identifier: Optional[str] = None id_token: Optional[IdToken] = None @@ -207,7 +205,7 @@ class GetCertificateStatus: @dataclass class GetChargingProfiles: - charging_profile: ChargingProfile + charging_profile: ChargingProfileCriterion request_id: int custom_data: Optional[CustomData] = None evse_id: Optional[int] = None @@ -243,7 +241,7 @@ class GetLocalListVersion: @dataclass class GetLog: - log: Log + log: LogParameters log_type: Log request_id: int custom_data: Optional[CustomData] = None @@ -440,7 +438,7 @@ class RequestStartTransaction: charging_profile: Optional[ChargingProfile] = None custom_data: Optional[CustomData] = None evse_id: Optional[int] = None - group_id_token: Optional[GroupIdToken] = None + group_id_token: Optional[IdToken] = None @dataclass @@ -464,7 +462,7 @@ class ReserveNow: connector_type: Optional[Connector] = None custom_data: Optional[CustomData] = None evse_id: Optional[int] = None - group_id_token: Optional[GroupIdToken] = None + group_id_token: Optional[IdToken] = None @dataclass @@ -499,7 +497,7 @@ class SetChargingProfile: @dataclass class SetDisplayMessage: - message: Message + message: MessageInfo custom_data: Optional[CustomData] = None @@ -518,7 +516,7 @@ class SetMonitoringLevel: @dataclass class SetNetworkProfile: configuration_slot: int - connection_data: ConnectionData + connection_data: NetworkConnectionProfile custom_data: Optional[CustomData] = None @@ -555,7 +553,7 @@ class TransactionEvent: event_type: enums.TransactionEvent seq_no: int timestamp: str - transaction_info: TransactionInfo + transaction_info: Transaction trigger_reason: TriggerReason cable_max_current: Optional[float] = None custom_data: Optional[CustomData] = None diff --git a/ocpp/v21/call_result.py b/ocpp/v21/call_result.py index 570ffc43c..5597b49a4 100644 --- a/ocpp/v21/call_result.py +++ b/ocpp/v21/call_result.py @@ -4,15 +4,15 @@ import enums from datatypes import ( CertificateHashDataChain, + CompositeSchedule, CustomData, GetVariableResult, IdTokenInfo, + MessageContent, ResponseClearMonitoringResult, - Schedule, SetMonitoringResult, SetVariableResult, StatusInfo, - UpdatedPersonalMessage, ) from enums import ( AuthorizeCertificateStatus, @@ -204,7 +204,7 @@ class GetChargingProfiles: class GetCompositeSchedule: status: GenericStatus custom_data: Optional[CustomData] = None - schedule: Optional[Schedule] = None + schedule: Optional[CompositeSchedule] = None status_info: Optional[StatusInfo] = None @@ -493,7 +493,7 @@ class TransactionEvent: custom_data: Optional[CustomData] = None id_token_info: Optional[IdTokenInfo] = None total_cost: Optional[float] = None - updated_personal_message: Optional[UpdatedPersonalMessage] = None + updated_personal_message: Optional[MessageContent] = None @dataclass diff --git a/ocpp/v21/datatypes.py b/ocpp/v21/datatypes.py index e2fa7d7e5..10024c5ad 100644 --- a/ocpp/v21/datatypes.py +++ b/ocpp/v21/datatypes.py @@ -3,8 +3,8 @@ from dataclasses import dataclass from typing import List, Optional +import enums from enums import ( - VPN, APNAuthentication, Attribute, AuthorizationStatus, @@ -23,7 +23,6 @@ GetCertificateIdUse, GetVariableStatus, HashAlgorithm, - IdToken, Location, Measurand, MessageFormat, @@ -54,6 +53,18 @@ class ACChargingParameters: custom_data: Optional[CustomData] = None +@dataclass +class APN: + apn: str + apn_authentication: APNAuthentication + apn_password: Optional[str] = None + apn_user_name: Optional[str] = None + custom_data: Optional[CustomData] = None + preferred_network: Optional[str] = None + sim_pin: Optional[int] = None + use_only_preferred_network: bool = False + + @dataclass class AbsolutePriceSchedule: currency: str @@ -64,8 +75,8 @@ class AbsolutePriceSchedule: time_anchor: str additional_selected_services: Optional[List[AdditionalSelectedServices]] = None custom_data: Optional[CustomData] = None - maximum_cost: Optional[MaximumCost] = None - minimum_cost: Optional[MinimumCost] = None + maximum_cost: Optional[RationalNumber] = None + minimum_cost: Optional[RationalNumber] = None overstay_rule_list: Optional[OverstayRuleList] = None price_schedule_description: Optional[str] = None tax_rules: Optional[List[TaxRule]] = None @@ -80,30 +91,11 @@ class AdditionalInfo: @dataclass class AdditionalSelectedServices: - service_fee: ServiceFee + service_fee: RationalNumber service_name: str custom_data: Optional[CustomData] = None -@dataclass -class Apn: - apn: str - apn_authentication: APNAuthentication - apn_password: Optional[str] = None - apn_user_name: Optional[str] = None - custom_data: Optional[CustomData] = None - preferred_network: Optional[str] = None - sim_pin: Optional[int] = None - use_only_preferred_network: bool = False - - -@dataclass -class AttributeStatusInfo: - reason_code: str - additional_info: Optional[str] = None - custom_data: Optional[CustomData] = None - - @dataclass class AuthorizationData: id_token: IdToken @@ -151,15 +143,6 @@ class ChargingNeeds: v2x_charging_parameters: Optional[V2XChargingParameters] = None -@dataclass -class ChargingProfile: - charging_limit_source: Optional[List[ChargingLimitSource]] = None - charging_profile_id: Optional[List[int]] = None - charging_profile_purpose: Optional[ChargingProfilePurpose] = None - custom_data: Optional[CustomData] = None - stack_level: Optional[int] = None - - @dataclass class ChargingProfile: charging_profile_kind: ChargingProfileKind @@ -178,10 +161,11 @@ class ChargingProfile: @dataclass -class ChargingProfileCriteria: +class ChargingProfileCriterion: + charging_limit_source: Optional[List[ChargingLimitSource]] = None + charging_profile_id: Optional[List[int]] = None charging_profile_purpose: Optional[ChargingProfilePurpose] = None custom_data: Optional[CustomData] = None - evse_id: Optional[int] = None stack_level: Optional[int] = None @@ -194,7 +178,7 @@ class ChargingSchedule: custom_data: Optional[CustomData] = None digest_value: Optional[str] = None duration: Optional[int] = None - limit_beyond_soc: Optional[LimitBeyondSoc] = None + limit_beyond_soc: Optional[LimitBeyondSoC] = None min_charging_rate: Optional[float] = None power_tolerance: Optional[float] = None price_level_schedule: Optional[PriceLevelSchedule] = None @@ -239,6 +223,14 @@ class ChargingStation: serial_number: Optional[str] = None +@dataclass +class ClearChargingProfile: + charging_profile_purpose: Optional[ChargingProfilePurpose] = None + custom_data: Optional[CustomData] = None + evse_id: Optional[int] = None + stack_level: Optional[int] = None + + @dataclass class Component: name: str @@ -255,16 +247,13 @@ class ComponentVariable: @dataclass -class ConnectionData: - message_timeout: int - ocpp_csms_url: str - ocpp_interface: OCPPTransport - ocpp_transport: OCPPTransport - ocpp_version: OCPPVersion - security_profile: int - apn: Optional[Apn] = None +class CompositeSchedule: + charging_rate_unit: ChargingRateUnit + charging_schedule_period: List[ChargingSchedulePeriod] + duration: int + evse_id: int + schedule_start: str custom_data: Optional[CustomData] = None - vpn: Optional[VPN] = None @dataclass @@ -287,15 +276,6 @@ class CustomData: vendor_id: str -@dataclass -class CustomerCertificate: - hash_algorithm: HashAlgorithm - issuer_key_hash: str - issuer_name_hash: str - serial_number: str - custom_data: Optional[CustomData] = None - - @dataclass class DCChargingParameters: ev_max_current: float @@ -309,14 +289,6 @@ class DCChargingParameters: state_of_charge: Optional[int] = None -@dataclass -class Display: - name: str - custom_data: Optional[CustomData] = None - evse: Optional[EVSE] = None - instance: Optional[str] = None - - @dataclass class EVAbsolutePriceSchedule: currency: str @@ -368,13 +340,6 @@ class EVSE: custom_data: Optional[CustomData] = None -@dataclass -class EnergyFee: - exponent: int - value: int - custom_data: Optional[CustomData] = None - - @dataclass class EventData: actual_value: str @@ -416,24 +381,16 @@ class GetVariableResult: attribute_status: GetVariableStatus component: Component variable: Variable - attribute_status_info: Optional[AttributeStatusInfo] = None + attribute_status_info: Optional[StatusInfo] = None attribute_type: Attribute = Attribute.actual attribute_value: Optional[str] = None custom_data: Optional[CustomData] = None -@dataclass -class GroupIdToken: - id_token: str - type: IdToken - additional_info: Optional[List[AdditionalInfo]] = None - custom_data: Optional[CustomData] = None - - @dataclass class IdToken: id_token: str - type: IdToken + type: enums.IdToken additional_info: Optional[List[AdditionalInfo]] = None custom_data: Optional[CustomData] = None @@ -445,21 +402,21 @@ class IdTokenInfo: charging_priority: Optional[int] = None custom_data: Optional[CustomData] = None evse_id: Optional[List[int]] = None - group_id_token: Optional[GroupIdToken] = None + group_id_token: Optional[IdToken] = None language1: Optional[str] = None language2: Optional[str] = None - personal_message: Optional[PersonalMessage] = None + personal_message: Optional[MessageContent] = None @dataclass -class LimitBeyondSoc: +class LimitBeyondSoC: limit: float soc: int custom_data: Optional[CustomData] = None @dataclass -class Log: +class LogParameters: remote_location: str custom_data: Optional[CustomData] = None latest_timestamp: Optional[str] = None @@ -467,27 +424,7 @@ class Log: @dataclass -class MaximumCost: - exponent: int - value: int - custom_data: Optional[CustomData] = None - - -@dataclass -class Message: - id: int - message: Message - priority: MessagePriority - custom_data: Optional[CustomData] = None - display: Optional[Display] = None - end_date_time: Optional[str] = None - start_date_time: Optional[str] = None - state: Optional[MessageState] = None - transaction_id: Optional[str] = None - - -@dataclass -class Message: +class MessageContent: content: str format: MessageFormat custom_data: Optional[CustomData] = None @@ -497,10 +434,10 @@ class Message: @dataclass class MessageInfo: id: int - message: Message + message: MessageContent priority: MessagePriority custom_data: Optional[CustomData] = None - display: Optional[Display] = None + display: Optional[Component] = None end_date_time: Optional[str] = None start_date_time: Optional[str] = None state: Optional[MessageState] = None @@ -514,13 +451,6 @@ class MeterValue: custom_data: Optional[CustomData] = None -@dataclass -class MinimumCost: - exponent: int - value: int - custom_data: Optional[CustomData] = None - - @dataclass class Modem: custom_data: Optional[CustomData] = None @@ -536,6 +466,19 @@ class MonitoringData: custom_data: Optional[CustomData] = None +@dataclass +class NetworkConnectionProfile: + message_timeout: int + ocpp_csms_url: str + ocpp_interface: OCPPTransport + ocpp_transport: OCPPTransport + ocpp_version: OCPPVersion + security_profile: int + apn: Optional[APN] = None + custom_data: Optional[CustomData] = None + vpn: Optional[VPN] = None + + @dataclass class OCSPRequestData: hash_algorithm: HashAlgorithm @@ -546,42 +489,13 @@ class OCSPRequestData: custom_data: Optional[CustomData] = None -@dataclass -class OverstayPowerThreshold: - exponent: int - value: int - custom_data: Optional[CustomData] = None - - @dataclass class OverstayRuleList: custom_data: Optional[CustomData] = None - overstay_power_threshold: Optional[OverstayPowerThreshold] = None + overstay_power_threshold: Optional[RationalNumber] = None overstay_time_threshold: Optional[int] = None -@dataclass -class ParkingFee: - exponent: int - value: int - custom_data: Optional[CustomData] = None - - -@dataclass -class PersonalMessage: - content: str - format: MessageFormat - custom_data: Optional[CustomData] = None - language: Optional[str] = None - - -@dataclass -class PowerRangeStart: - exponent: int - value: int - custom_data: Optional[CustomData] = None - - @dataclass class PriceLevelSchedule: number_of_price_levels: int @@ -601,11 +515,11 @@ class PriceLevelScheduleEntry: @dataclass class PriceRule: - energy_fee: EnergyFee - power_range_start: PowerRangeStart + energy_fee: RationalNumber + power_range_start: RationalNumber carbon_dioxide_emission: Optional[int] = None custom_data: Optional[CustomData] = None - parking_fee: Optional[ParkingFee] = None + parking_fee: Optional[RationalNumber] = None parking_fee_period: Optional[int] = None renewable_generation_percentage: Optional[int] = None @@ -617,6 +531,13 @@ class PriceRuleStack: custom_data: Optional[CustomData] = None +@dataclass +class RationalNumber: + exponent: int + value: int + custom_data: Optional[CustomData] = None + + @dataclass class RelativeTimeInterval: start: int @@ -670,23 +591,6 @@ class SampledValue: unit_of_measure: Optional[UnitOfMeasure] = None -@dataclass -class Schedule: - charging_rate_unit: ChargingRateUnit - charging_schedule_period: List[ChargingSchedulePeriod] - duration: int - evse_id: int - schedule_start: str - custom_data: Optional[CustomData] = None - - -@dataclass -class ServiceFee: - exponent: int - value: int - custom_data: Optional[CustomData] = None - - @dataclass class SetMonitoringData: component: Component @@ -725,7 +629,7 @@ class SetVariableResult: attribute_status: SetVariableStatus component: Component variable: Variable - attribute_status_info: Optional[AttributeStatusInfo] = None + attribute_status_info: Optional[StatusInfo] = None attribute_type: Attribute = Attribute.actual custom_data: Optional[CustomData] = None @@ -746,20 +650,13 @@ class StatusInfo: custom_data: Optional[CustomData] = None -@dataclass -class TaxRate: - exponent: int - value: int - custom_data: Optional[CustomData] = None - - @dataclass class TaxRule: applies_to_energy_fee: bool applies_to_minimum_maximum_cost: bool applies_to_overstay_fee: bool applies_to_parking_fee: bool - tax_rate: TaxRate + tax_rate: RationalNumber tax_rule_id: int custom_data: Optional[CustomData] = None tax_included_in_price: Optional[bool] = None @@ -767,7 +664,7 @@ class TaxRule: @dataclass -class TransactionInfo: +class Transaction: transaction_id: str charging_state: Optional[ChargingState] = None custom_data: Optional[CustomData] = None @@ -784,14 +681,6 @@ class UnitOfMeasure: unit: str = "Wh" -@dataclass -class UpdatedPersonalMessage: - content: str - format: MessageFormat - custom_data: Optional[CustomData] = None - language: Optional[str] = None - - @dataclass class V2XChargingParameters: custom_data: Optional[CustomData] = None @@ -840,7 +729,7 @@ class VPN: key: str password: str server: str - type: VPN + type: enums.VPN user: str custom_data: Optional[CustomData] = None group: Optional[str] = None