From adcb37f097f365a5272710127b35107a10af5e08 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Thu, 30 Nov 2023 09:47:18 +0100 Subject: [PATCH 01/39] 2.0.1 Optional fields in datatypes require the default of None (#530) --- CHANGELOG.md | 2 +- ocpp/v201/datatypes.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6cd7bf26..6f3158914 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change log - +- [#528](https://github.com/mobilityhouse/ocpp/issues/528) v2.0.1 CertificateHashDataChainType childCertificateHashData requires the default of None - [#510](https://github.com/mobilityhouse/ocpp/issues/510) v2.0.1 UnitOfMeasureType - Enums missing and update docstring to allow use for variableCharacteristics - [#508](https://github.com/mobilityhouse/ocpp/issues/508) Exception - OccurrenceConstraintViolationError doc string correction diff --git a/ocpp/v201/datatypes.py b/ocpp/v201/datatypes.py index 702e6ad5e..bfb76e0c9 100644 --- a/ocpp/v201/datatypes.py +++ b/ocpp/v201/datatypes.py @@ -67,7 +67,7 @@ class CertificateHashDataChainType: certificate_type: enums.GetCertificateIdUseType certificate_hash_data: CertificateHashDataType - child_certificate_hash_data: Optional[List[CertificateHashDataType]] + child_certificate_hash_data: Optional[List[CertificateHashDataType]] = None @dataclass From 98a7d393aa74d97732cf442fa1ee9d252cd550d4 Mon Sep 17 00:00:00 2001 From: Patrick Roelke Date: Thu, 30 Nov 2023 09:56:27 +0100 Subject: [PATCH 02/39] feat: add 1.6 security extension datatypes (#531) Add missing datatypes from 1.6 security extension whitepaper. --- CHANGELOG.md | 3 +++ ocpp/v16/datatypes.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f3158914..f811b9b31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Change log + +- [#531] (https://github.com/mobilityhouse/ocpp/pull/531) Add 1.6 security extension datatypes +======= - [#528](https://github.com/mobilityhouse/ocpp/issues/528) v2.0.1 CertificateHashDataChainType childCertificateHashData requires the default of None - [#510](https://github.com/mobilityhouse/ocpp/issues/510) v2.0.1 UnitOfMeasureType - Enums missing and update docstring to allow use for variableCharacteristics - [#508](https://github.com/mobilityhouse/ocpp/issues/508) Exception - OccurrenceConstraintViolationError doc string correction diff --git a/ocpp/v16/datatypes.py b/ocpp/v16/datatypes.py index 1f249e477..aa652f80d 100644 --- a/ocpp/v16/datatypes.py +++ b/ocpp/v16/datatypes.py @@ -7,6 +7,7 @@ ChargingProfilePurposeType, ChargingRateUnitType, CiStringType, + HashAlgorithm, Location, Measurand, Phase, @@ -121,3 +122,45 @@ class MeterValue: timestamp: str sampled_value: List[SampledValue] + + +# Security Extension + + +@dataclass +class CertificateHashData: + """ + CertificateHashDataType is used by: + DeleteCertificate.req, GetInstalledCertificateIds.conf + """ + + hash_algorithm: HashAlgorithm + issuer_name_hash: str + issuer_key_hash: str + serial_number: str + + +@dataclass +class Firmware: + """ + Represents a copy of the firmware that can be loaded/updated on the Charge Point. + FirmwareType is used by: SignedUpdateFirmware.req + """ + + location: str + retrieve_date_time: str + signing_certificate: str + install_date_time: Optional[str] = None + signature: Optional[str] = None + + +@dataclass +class LogParameters: + """ + Class for detailed information the retrieval of logging entries. + LogParametersType is used by: GetLog.req + """ + + remote_location: str + oldest_timestamp: Optional[str] = None + latest_timestamp: Optional[str] = None From 5a45de9c33dbde394cac5d527371474d129acb23 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:43:05 +0100 Subject: [PATCH 03/39] bump to 0.23.0 (#535) --- CHANGELOG.md | 10 +++++----- docs/source/conf.py | 2 +- pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f811b9b31..c4ae734db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,11 @@ # Change log +## 0.23.0 (2023-11-30) -- [#531] (https://github.com/mobilityhouse/ocpp/pull/531) Add 1.6 security extension datatypes -======= -- [#528](https://github.com/mobilityhouse/ocpp/issues/528) v2.0.1 CertificateHashDataChainType childCertificateHashData requires the default of None -- [#510](https://github.com/mobilityhouse/ocpp/issues/510) v2.0.1 UnitOfMeasureType - Enums missing and update docstring to allow use for variableCharacteristics -- [#508](https://github.com/mobilityhouse/ocpp/issues/508) Exception - OccurrenceConstraintViolationError doc string correction +- [#531] Feat: Add 1.6 security extension datatypes. Thanks [@proelke](https://github.com/proelke) +- [#528](https://github.com/mobilityhouse/ocpp/issues/528) v2.0.1 CertificateHashDataChainType childCertificateHashData requires the default of None. +- [#510](https://github.com/mobilityhouse/ocpp/issues/510) v2.0.1 UnitOfMeasureType - Enums missing and update docstring to allow use for variableCharacteristics. +- [#508](https://github.com/mobilityhouse/ocpp/issues/508) Exception - OccurrenceConstraintViolationError doc string correction. ## 0.22.0 (2023-11-03) diff --git a/docs/source/conf.py b/docs/source/conf.py index d6cccb118..4b751dfc9 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -23,7 +23,7 @@ author = "Auke Willem Oosterhoff" # The full version, including alpha/beta/rc tags -release = "0.22.0" +release = "0.23.0" # -- General configuration --------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index 03b1efad3..659a7be65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "ocpp" -version = "0.22.0" +version = "0.23.0" description = "Python package implementing the JSON version of the Open Charge Point Protocol (OCPP)." authors = [ "André Duarte ", From 88e20060aa9f4e741fe894cb6ec4d8f1c23fc91f Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 6 Dec 2023 13:18:49 +0100 Subject: [PATCH 04/39] OCPP-2.0.1-add-additional-security-events-in-v1.3 (#517) --- CHANGELOG.md | 2 ++ ocpp/v201/enums.py | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4ae734db..5223457d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change log +- [#516](https://github.com/mobilityhouse/ocpp/issues/516) OCPP 2.0.1 add additional security events from v1.3 + ## 0.23.0 (2023-11-30) - [#531] Feat: Add 1.6 security extension datatypes. Thanks [@proelke](https://github.com/proelke) diff --git a/ocpp/v201/enums.py b/ocpp/v201/enums.py index 50503d60f..545186ff9 100644 --- a/ocpp/v201/enums.py +++ b/ocpp/v201/enums.py @@ -1330,7 +1330,9 @@ class StatusInfoReasonType(str, Enum): class SecurityEventType(str, Enum): - """Security Events as listed in Appendices (Appendix 1. Security Events)""" + """ + Security Events as listed in Appendices (Appendix 1. Security Events) v1.3 + """ firmware_updated = "FirmwareUpdated" failed_to_authenticate_at_csms = "FailedToAuthenticateAtCsms" @@ -1350,3 +1352,5 @@ class SecurityEventType(str, Enum): invalid_charging_station_certificate = "InvalidChargingStationCertificate" invalid_tls_version = "InvalidTLSVersion" invalid_tls_cipher_suite = "InvalidTLSCipherSuite" + maintenance_login_accepted = "MaintenanceLoginAccepted" + maintenance_login_failed = "MaintenanceLoginFailed" From 94e5ea57a5fdae7ea34b8ba35a719a0ef9b182a6 Mon Sep 17 00:00:00 2001 From: Chad <34003459+mdwcrft@users.noreply.github.com> Date: Thu, 7 Dec 2023 06:49:33 +0000 Subject: [PATCH 05/39] Fix type hint DataTransfer.data. (#537) In 2.0.1 both DataTransferRequest and DataTransferResponse have a field called `data` which is defined as `AnyType` so I believe these should both by of type `Any` here --- CHANGELOG.md | 1 + ocpp/v201/call.py | 2 +- ocpp/v201/call_result.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5223457d7..9027a0d6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Change log - [#516](https://github.com/mobilityhouse/ocpp/issues/516) OCPP 2.0.1 add additional security events from v1.3 +- [#537] (https://github.com/mobilityhouse/ocpp/pull/537) Fix DataTransfer data types ## 0.23.0 (2023-11-30) diff --git a/ocpp/v201/call.py b/ocpp/v201/call.py index f97f9a1e1..bff98238b 100644 --- a/ocpp/v201/call.py +++ b/ocpp/v201/call.py @@ -90,7 +90,7 @@ class CustomerInformationPayload: class DataTransferPayload: vendor_id: str message_id: Optional[str] = None - data: Optional[str] = None + data: Optional[Any] = None custom_data: Optional[Dict[str, Any]] = None diff --git a/ocpp/v201/call_result.py b/ocpp/v201/call_result.py index 6f3b25f0b..3a59b07a2 100644 --- a/ocpp/v201/call_result.py +++ b/ocpp/v201/call_result.py @@ -87,7 +87,7 @@ class CustomerInformationPayload: class DataTransferPayload: status: str status_info: Optional[Dict] = None - data: Optional[Dict] = None + data: Optional[Any] = None custom_data: Optional[Dict[str, Any]] = None From b8eb7d66068a7dc97f011e1bf0816c2a71fd87d6 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Thu, 7 Dec 2023 09:45:41 +0100 Subject: [PATCH 06/39] Central System documentation link (#526) --- CHANGELOG.md | 4 ++++ README.rst | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9027a0d6c..1a2bc9931 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,12 @@ # Change log + +- [#266](https://github.com/mobilityhouse/ocpp/issues/266) Central System documentation link +======= - [#516](https://github.com/mobilityhouse/ocpp/issues/516) OCPP 2.0.1 add additional security events from v1.3 - [#537] (https://github.com/mobilityhouse/ocpp/pull/537) Fix DataTransfer data types + ## 0.23.0 (2023-11-30) - [#531] Feat: Add 1.6 security extension datatypes. Thanks [@proelke](https://github.com/proelke) diff --git a/README.rst b/README.rst index 1a7662234..0df940525 100644 --- a/README.rst +++ b/README.rst @@ -50,7 +50,7 @@ Central system The code snippet below creates a simple OCPP 2.0 central system which is able to handle BootNotification calls. You can find a detailed explanation of the -code in the `Central System documentation_`. +code in the `Central System documentation`_. .. code-block:: python From 268dc8521e00847fe7d08db70d32d64e48cf0a80 Mon Sep 17 00:00:00 2001 From: Wafa Yahyaoui <143813203+wafa-yah@users.noreply.github.com> Date: Thu, 7 Dec 2023 10:41:41 +0100 Subject: [PATCH 07/39] ChargePoint._handle_call return response (#538) Make `ChargePoint._handle_call` has the response` as return value. --- CHANGELOG.md | 4 ++-- ocpp/charge_point.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a2bc9931..eb8bdcdc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,10 @@ # Change log - +- [#539](https://github.com/mobilityhouse/ocpp/issues/539) Add ChargePoint._handle_call return value - [#266](https://github.com/mobilityhouse/ocpp/issues/266) Central System documentation link ======= - [#516](https://github.com/mobilityhouse/ocpp/issues/516) OCPP 2.0.1 add additional security events from v1.3 -- [#537] (https://github.com/mobilityhouse/ocpp/pull/537) Fix DataTransfer data types +- [#537](https://github.com/mobilityhouse/ocpp/pull/537) Fix DataTransfer data types ## 0.23.0 (2023-11-30) diff --git a/ocpp/charge_point.py b/ocpp/charge_point.py index 5e31f3fe7..c4a82d41c 100644 --- a/ocpp/charge_point.py +++ b/ocpp/charge_point.py @@ -267,6 +267,7 @@ async def _handle_call(self, msg): # '_on_after' hooks are not required. Therefore ignore exception # when no '_on_after' hook is installed. pass + return response async def call(self, payload, suppress=True, unique_id=None): """ From 06e13d78ec5cc63b7d0012b8cae81e4fe8a404b8 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Thu, 7 Dec 2023 12:36:49 +0100 Subject: [PATCH 08/39] Bump to 0.24.0 (#542) --- CHANGELOG.md | 11 +++++------ docs/source/conf.py | 2 +- pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb8bdcdc7..6c4142e32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,11 @@ # Change log -- [#539](https://github.com/mobilityhouse/ocpp/issues/539) Add ChargePoint._handle_call return value -- [#266](https://github.com/mobilityhouse/ocpp/issues/266) Central System documentation link -======= -- [#516](https://github.com/mobilityhouse/ocpp/issues/516) OCPP 2.0.1 add additional security events from v1.3 -- [#537](https://github.com/mobilityhouse/ocpp/pull/537) Fix DataTransfer data types +## 0.24.0 (2023-12-07) +- [#539](https://github.com/mobilityhouse/ocpp/issues/539) feat: Add ChargePoint._handle_call return value. Thanks [@wafa-yah](https://github.com/wafa-yah) +- [#266](https://github.com/mobilityhouse/ocpp/issues/266) fix: Central System documentation link. +- [#516](https://github.com/mobilityhouse/ocpp/issues/516) OCPP 2.0.1 add additional security events from v1.3. +- [#537](https://github.com/mobilityhouse/ocpp/pull/537) Fix DataTransfer data types. Thanks [@mdwcrft](https://github.com/mdwcrft) ## 0.23.0 (2023-11-30) @@ -14,7 +14,6 @@ - [#510](https://github.com/mobilityhouse/ocpp/issues/510) v2.0.1 UnitOfMeasureType - Enums missing and update docstring to allow use for variableCharacteristics. - [#508](https://github.com/mobilityhouse/ocpp/issues/508) Exception - OccurrenceConstraintViolationError doc string correction. - ## 0.22.0 (2023-11-03) - [#493](https://github.com/mobilityhouse/ocpp/issues/493) Reduce use of NotSupportedError in favor of NotImplementedError. Thanks [drc38](@https://github.com/drc38). diff --git a/docs/source/conf.py b/docs/source/conf.py index 4b751dfc9..94bd22556 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -23,7 +23,7 @@ author = "Auke Willem Oosterhoff" # The full version, including alpha/beta/rc tags -release = "0.23.0" +release = "0.24.0" # -- General configuration --------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index 659a7be65..b3e991d40 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "ocpp" -version = "0.23.0" +version = "0.24.0" description = "Python package implementing the JSON version of the Open Charge Point Protocol (OCPP)." authors = [ "André Duarte ", From daa34e7ac0d87b6bf414f30bf65a9755a1bd19c7 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:03:23 +0100 Subject: [PATCH 09/39] OCPP-2.0.1-add-additional-reason-codes-from-v1.3 (#520) --- CHANGELOG.md | 3 +++ ocpp/v201/enums.py | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c4142e32..481dfa5ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Change log + +- [#518](https://github.com/mobilityhouse/ocpp/issues/518) OCPP 2.0.1 add additional reason codes from v1.3 +======= ## 0.24.0 (2023-12-07) - [#539](https://github.com/mobilityhouse/ocpp/issues/539) feat: Add ChargePoint._handle_call return value. Thanks [@wafa-yah](https://github.com/wafa-yah) diff --git a/ocpp/v201/enums.py b/ocpp/v201/enums.py index 545186ff9..d0ba19194 100644 --- a/ocpp/v201/enums.py +++ b/ocpp/v201/enums.py @@ -1284,7 +1284,9 @@ class UnitOfMeasureType(str, Enum): class StatusInfoReasonType(str, Enum): - """Standardized reason codes for StatusInfo defined in Appendix 5.""" + """ + Standardized reason codes for StatusInfo defined in Appendix 5. v1.3 + """ cs_not_accepted = "CSNotAccepted" duplicate_profile = "DuplicateProfile" @@ -1295,11 +1297,13 @@ class StatusInfoReasonType(str, Enum): invalid_certificate = "InvalidCertificate" invalid_csr = "InvalidCSR" invalid_id_token = "InvalidIdToken" + invalid_message_sequence = "InvalidMessageSequence" invalid_profile = "InvalidProfile" invaild_schedule = "InvalidSchedule" invalid_stack_level = "InvalidStackLevel" invalid_url = "InvalidURL" invalid_value = "InvalidValue" + missing_device_model_info = "MissingDeviceModelInfo" missing_param = "MissingParam" no_cable = "NoCable" no_error = "NoError" From b24fade217d5670f5703a5d696bd79c5af4a8d53 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Fri, 22 Dec 2023 10:42:14 +0100 Subject: [PATCH 10/39] V201/missing component and type enums #300 (#487) OCPP 2.0.1 Referenced Components and Variables - sourced from a union of ocpp 2.0.1 part 2 appendices v1.3 plus the contents of Appendices_CSV_v1.3 - components.csv and variables.csv and dm_components_vars.xlsx --- CHANGELOG.md | 2 +- ocpp/v201/enums.py | 1348 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1348 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 481dfa5ac..e5227880f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change log - +- [#300](https://github.com/mobilityhouse/ocpp/issues/300) OCPP 2.0.1 add reference components and variables - [#518](https://github.com/mobilityhouse/ocpp/issues/518) OCPP 2.0.1 add additional reason codes from v1.3 ======= ## 0.24.0 (2023-12-07) diff --git a/ocpp/v201/enums.py b/ocpp/v201/enums.py index d0ba19194..625fafbf3 100644 --- a/ocpp/v201/enums.py +++ b/ocpp/v201/enums.py @@ -91,7 +91,8 @@ class AttributeType(str, Enum): getVariables:GetVariablesRequest.GetVariableDataType , getVariables:GetVariablesResponse.GetVariableResultType , setVariables:SetVariablesRequest.SetVariableDataType , - setVariables:SetVariablesResponse.SetVariableResultType + setVariables:SetVariablesResponse.SetVariableResultType , + ConnectedEV component variable AttributeType """ actual = "Actual" @@ -1358,3 +1359,1348 @@ class SecurityEventType(str, Enum): invalid_tls_cipher_suite = "InvalidTLSCipherSuite" maintenance_login_accepted = "MaintenanceLoginAccepted" maintenance_login_failed = "MaintenanceLoginFailed" + + +class ControllerComponentName(str, Enum): + """ + Referenced Controller Components (Logical Components) + Sourced from ocpp 2.0.1 part 2 appendices 3.1 v1.3, in + appendices_CSV_v1.3.zip dm_components_vars.csv and components.csv. + """ + + aligned_data_ctrlr = "AlignedDataCtrlr" + auth_cache_ctrlr = "AuthCacheCtrlr" + auth_ctrlr = "AuthCtrlr" + chademo_ctrlr = "CHAdeMOCtrlr" + clock_ctrlr = "ClockCtrlr" + customization_ctrlr = "CustomizationCtrlr" + device_data_ctrlr = "DeviceDataCtrlr" + display_message_ctrlr = "DisplayMessageCtrlr" + iso15118_ctrlr = "ISO15118Ctrlr" + local_auth_list_ctrlr = "LocalAuthListCtrlr" + monitoring_ctrlr = "MonitoringCtrlr" + ocpp_comm_ctrlr = "OCPPCommCtrlr" + reservation_ctrlr = "ReservationCtrlr" + sampled_data_ctrlr = "SampledDataCtrlr" + security_ctrlr = "SecurityCtrlr" + smart_charging_ctrlr = "SmartChargingCtrlr" + tariff_cost_ctrlr = "TariffCostCtrlr" + tx_ctrlr = "TxCtrlr" + + +class PhysicalComponentName(str, Enum): + """ + Referenced Physical Components - sourced from dm_components_vars.csv. + Note: specific variables for each component are sourced from a union of + ocpp 2.0.1 part 2 appendices 3.2 v1.3 and dm_components_vars.csv + from appendices_CSV_v1.3.zip. That is for all Physical Components in + section 3.2. expressed in this module as enums, + e.g. the variables of ControllerVariableName enum + """ + + access_barrier = "AccessBarrier" + ac_dc_converter = "AcDcConverter" + ac_phase_selector = "AcPhaseSelector" + actuator = "Actuator" + air_cooling_system = "AirCoolingSystem" + area_ventilation = "AreaVentilation" + bay_occupancy_sensor = "BayOccupancySensor" + beacon_lighting = "BeaconLighting" + cable_breakaway_sensor = "CableBreakawaySensor" + case_access_sensor = "CaseAccessSensor" + charging_station = "ChargingStation" + charging_status_indicator = "ChargingStatusIndicator" + connected_ev = "ConnectedEV" + connector = "Connector" + connector_holster_release = "ConnectorHolsterRelease" + connector_holster_sensor = "ConnectorHolsterSensor" + connector_plug_retention_lock = "ConnectorPlugRetentionLock" + connector_protection_release = "ConnectorProtectionRelease" + controller = "Controller" + control_metering = "ControlMetering" + cppwm_controller = "CPPWMController" + data_link = "DataLink" + display = "Display" + distribution_panel = "DistributionPanel" + electrical_feed = "ElectricalFeed" + elv_supply = "ELVSupply" + emergency_stop_sensor = "EmergencyStopSensor" + environmental_lighting = "EnvironmentalLighting" + ev_retention_lock = "EVRetentionLock" + evse = "EVSE" + external_temperature_sensor = "ExternalTemperatureSensor" + fiscal_metering = "FiscalMetering" + flood_sensor = "FloodSensor" + ground_isolation_protection = "GroundIsolationProtection" + heater = "Heater" + humidity_sensor = "HumiditySensor" + light_sensor = "LightSensor" + liquid_cooling_system = "LiquidCoolingSystem" + local_availability_sensor = "LocalAvailabilitySensor" + local_controller = "LocalController" + local_energy_storage = "LocalEnergyStorage" + over_current_protection = "OverCurrentProtection" + over_current_protection_recloser = "OverCurrentProtectionRecloser" + power_contactor = "PowerContactor" + rcd = "RCD" + rcd_recloser = "RCDRecloser" + real_time_clock = "RealTimeClock" + shock_sensor = "ShockSensor" + spaces_count_signage = "SpacesCountSignage" + switch = "Switch" + temperature_sensor = "TemperatureSensor" + tilt_sensor = "TiltSensor" + token_reader = "TokenReader" + ui_input = "UIInput" + upstream_protection_trigger = "UpstreamProtectionTrigger" + vehicle_id_sensor = "VehicleIdSensor" + + +class GenericVariableName(str, Enum): + """ + Variable names where the component type is non-specific + derived from a union of in appendices_CSV_v1.3.zip, + dm_components_vars.csv (Generic) and variables.csv + """ + + ac_current = "ACCurrent" + active = "Active" + ac_voltage = "ACVoltage" + allow_reset = "AllowReset" + angle = "Angle" + attempts = "Attempts" + availability_state = "AvailabilityState" + available = "Available" + certificate = "Certificate" + charge_protocol = "ChargeProtocol" + charging_complete_bulk = "ChargingCompleteBulk" + charging_complete_full = "ChargingCompleteFull" + charging_time = "ChargingTime" + color = "Color" + complete = "Complete" + connected_time = "ConnectedTime" + connector_type = "ConnectorType" + count = "Count" + currency = "Currency" + current_imbalance = "CurrentImbalance" + data_text = "DataText" + date_time = "DateTime" + dc_current = "DCCurrent" + dc_voltage = "DCVoltage" + departure_time = "DepartureTime" + ec_variant = "ECVariant" + enabled = "Enabled" + energy = "Energy" + energy_capacity = "EnergyCapacity" + energy_export = "EnergyExport" + energy_export_register = "EnergyExportRegister" + energy_import = "EnergyImport" + energy_import_register = "EnergyImportRegister" + entries = "Entries" + evse_id = "EvseId" + fallback = "Fallback" + fan_speed = "FanSpeed" + firmware_version = "FirmwareVersion" + force = "Force" + formats = "Formats" + frequency = "Frequency" + fuse_rating = "FuseRating" + height = "Height" + humidity = "Humidity" + hysteresis = "Hysteresis" + iccid = "ICCID" + impedance = "Impedance" + imsi = "IMSI" + interval = "Interval" + length = "Length" + light = "Light" + manufacturer = "Manufacturer" + message = "Message" + minimum_status_duration = "MinimumStatusDuration" + mode = "Mode" + model = "Model" + network_address = "NetworkAddress" + operated = "Operated" + operating_times = "OperatingTimes" + overload = "Overload" + percent = "Percent" + phase_rotation = "PhaseRotation" + post_charging_time = "PostChargingTime" + power = "Power" + problem = "Problem" + protecting = "Protecting" + remaining_time_bulk = "RemainingTimeBulk" + remaining_time_full = "RemainingTimeFull" + secc_id = "SeccId" + serial_number = "SerialNumber" + signal_strength = "SignalStrength" + state = "State" + state_of_charge = "StateOfCharge" + state_of_charge_bulk = "StateOfChargeBulk" + storage = "Storage" + supply_phases = "SupplyPhases" + suspending = "Suspending" + suspension = "Suspension" + temperature = "Temperature" + time = "Time" + time_offset = "TimeOffset" + timeout = "Timeout" + token = "Token" + token_type = "TokenType" + tries = "Tries" + tripped = "Tripped" + vehicle_id = "VehicleId" + version_date = "VersionDate" + version_number = "VersionNumber" + voltage_imbalance = "VoltageImbalance" + + +class AlignedDataCtrlrVariableName(str, Enum): + """ + Variable names where the component type is AlignedDataCtrlr + See ControllerComponentName for referenced logical component + """ + + available = "Available" + enabled = "Enabled" + interval = "Interval" + measurands = "Measurands" + send_during_idle = "SendDuringIdle" + sign_readings = "SignReadings" + tx_ended_interval = "TxEndedInterval" + tx_ended_measurands = "TxEndedMeasurands" + + +class AuthCacheCtrlrVariableName(str, Enum): + """ + Variable names where the component type is AuthCacheCtrlr + See ControllerComponentName for referenced logical component + """ + + available = "Available" + enabled = "Enabled" + life_time = "LifeTime" + policy = "Policy" + storage = "Storage" + disable_post_authorize = "DisablePostAuthorize" + + +class AuthCtrlrVariableName(str, Enum): + """ + Variable names where the component type is AuthCtrlr + See ControllerComponentName for referenced logical component + """ + + additional_info_items_per_message = "AdditionalInfoItemsPerMessage" + authorize_remote_start = "AuthorizeRemoteStart" + enabled = "Enabled" + local_authorize_offline = "LocalAuthorizeOffline" + local_pre_authorize = "LocalPreAuthorize" + master_pass_group_id = "MasterPassGroupId" + offline_tx_for_unknown_id_enabled = "OfflineTxForUnknownIdEnabled" + disable_remote_authorization = "DisableRemoteAuthorization" + + +class CHAdeMOCtrlrVariableName(str, Enum): + """ + Variable names where the component type is CHAdeMOCtrlr + See ControllerComponentName for referenced logical component + """ + + enabled = "Enabled" + active = "Active" + complete = "Complete" + tripped = "Tripped" + problem = "Problem" + selftest_active = "SelftestActive" + selftest_active_set = "SelftestActive(Set)" + chademo_protocol_number = "CHAdeMOProtocolNumber" + vehicle_status = "VehicleStatus" + dynamic_control = "DynamicControl" + high_current_control = "HighCurrentControl" + high_voltage_control = "HighVoltageControl" + auto_manufacturer_code = "AutoManufacturerCode" + + +class ClockCtrlrVariableName(str, Enum): + """ + Variable names where the component type is ClockCtrlr + See ControllerComponentName for referenced logical component + """ + + date_time = "DateTime" + next_time_offset_transition_date_time = "NextTimeOffsetTransitionDateTime" + ntp_server_uri = "NtpServerUri" + ntp_source = "NtpSource" + time_adjustment_reporting_threshold = "TimeAdjustmentReportingThreshold" + time_offset = "TimeOffset" + time_source = "TimeSource" + time_zone = "TimeZone" + + +class CustomizationCtrlrVariableName(str, Enum): + """ + Variable names where the component type is CustomizationCtrlr + See ControllerComponentName for referenced logical component + """ + + custom_implementation_enabled = "CustomImplementationEnabled" + + +class DeviceDataCtrlrVariableName(str, Enum): + """ + Variable names where the component type is DeviceDataCtrlr + See ControllerComponentName for referenced logical component + """ + + bytes_per_message = "BytesPerMessage" + configuration_value_size = "ConfigurationValueSize" + items_per_message = "ItemsPerMessage" + reporting_value_size = "ReportingValueSize" + value_size = "ValueSize" + + +class DeviceDataCtrlrInstanceName(str, Enum): + """ + Instance names where the component type is DeviceDataCtrlr + """ + + get_report = "GetReport" + get_variables = "GetVariables" + set_variables = "SetVariables" + + +class DisplayMessageCtrlrVariableName(str, Enum): + """ + Variable names where the component type is DisplayMessageCtrlr + See ControllerComponentName for referenced logical component + """ + + available = "Available" + display_messages = "DisplayMessages" + enabled = "Enabled" + personal_message_size = "PersonalMessageSize" + supported_formats = "SupportedFormats" + supported_priorities = "SupportedPriorities" + + +class ISO15118CtrlrVariableName(str, Enum): + """ + Variable names where the component type is ISO15118Ctrlr + See ControllerComponentName for referenced logical component + """ + + active = "Active" + enabled = "Enabled" + central_contract_validation_allowed = "CentralContractValidationAllowed" + complete = "Complete" + contract_validation_offline = "ContractValidationOffline" + secc_id = "SeccId" + selftest_active = "SelftestActive" + selftest_active_set = "SelftestActive(Set)" + max_schedule_entries = "MaxScheduleEntries" + requested_energy_transfer_mode = "RequestedEnergyTransferMode" + request_metering_receipt = "RequestMeteringReceipt" + country_name = "CountryName" + organization_name = "OrganizationName" + pnc_enabled = "PnCEnabled" + problem = "Problem" + tripped = "Tripped" + v2g_certificate_installation_enabled = "V2GCertificateInstallationEnabled" + contract_certificate_installation_enabled = "ContractCertificateInstallationEnabled" + + +class LocalAuthListCtrlrVariableName(str, Enum): + """ + Variable names where the component type is LocalAuthListCtrlr + See ControllerComponentName for referenced logical component + """ + + available = "Available" + bytes_per_message = "BytesPerMessage" + enabled = "Enabled" + entries = "Entries" + items_per_message = "ItemsPerMessage" + storage = "Storage" + disable_post_authorize = "DisablePostAuthorize" + + +class MonitoringCtrlrVariableName(str, Enum): + """ + Variable names where the component type is MonitoringCtrlr + See ControllerComponentName for referenced logical component + """ + + available = "Available" + bytes_per_message = "BytesPerMessage" + enabled = "Enabled" + items_per_message = "ItemsPerMessage" + offline_queuing_severity = "OfflineQueuingSeverity" + monitoring_base = "MonitoringBase" + monitoring_level = "MonitoringLevel" + active_monitoring_base = "ActiveMonitoringBase" + active_monitoring_level = "ActiveMonitoringLevel" + + +class MonitoringCtrlrInstanceName(str, Enum): + """ + Instance names where the component type is MonitoringCtrlr + """ + + clear_variable_monitoring = "ClearVariableMonitoring" + set_variable_monitoring = "SetVariableMonitoring" + + +class OCPPCommCtrlrVariableName(str, Enum): + """ + Variable names where the component type is OCPPCommCtrlr + See ControllerComponentName for referenced logical component + """ + + active_network_profile = "ActiveNetworkProfile" + file_transfer_protocols = "FileTransferProtocols" + heartbeat_interval = "HeartbeatInterval" + message_timeout = "MessageTimeout" + message_attempt_interval = "MessageAttemptInterval" + message_attempts = "MessageAttempts" + minimum_status_duration = "MinimumStatusDuration" + network_configuration_priority = "NetworkConfigurationPriority" + network_profile_connection_attempts = "NetworkProfileConnectionAttempts" + offline_threshold = "OfflineThreshold" + public_key_with_signed_meter_value = "PublicKeyWithSignedMeterValue" + queue_all_messages = "QueueAllMessages" + reset_retries = "ResetRetries" + retry_back_off_random_range = "RetryBackOffRandomRange" + retry_back_off_repeat_times = "RetryBackOffRepeatTimes" + retry_back_off_wait_minimum = "RetryBackOffWaitMinimum" + unlock_on_ev_side_disconnect = "UnlockOnEVSideDisconnect" + web_socket_ping_interval = "WebSocketPingInterval" + field_length = "FieldLength" + + +class OCPPCommCtrlrInstanceName(str, Enum): + """ + Instance names where the component type is OCPPCommCtrlr + """ + + default = "Default" + transaction_event = "TransactionEvent" + + +class ReservationCtrlrVariableName(str, Enum): + """ + Variable names where the component type is ReservationCtrlr + See ControllerComponentName for referenced logical component + """ + + available = "Available" + enabled = "Enabled" + non_evse_specific = "NonEvseSpecific" + + +class SampledDataCtrlrVariableName(str, Enum): + """ + Variable names where the component type is SampledDataCtrlr + See ControllerComponentName for referenced logical component + """ + + available = "Available" + enabled = "Enabled" + sign_readings = "SignReadings" + tx_ended_interval = "TxEndedInterval" + tx_ended_measurands = "TxEndedMeasurands" + tx_started_measurands = "TxStartedMeasurands" + tx_updated_interval = "TxUpdatedInterval" + tx_updated_measurands = "TxUpdatedMeasurands" + register_values_without_phases = "RegisterValuesWithoutPhases" + + +class SecurityCtrlrVariableName(str, Enum): + """ + Variable names where the component type is SampledDataCtrlr + See ControllerComponentName for referenced logical component + """ + + additional_root_certificate_check = "AdditionalRootCertificateCheck" + basic_auth_password = "BasicAuthPassword" + certificate_entries = "CertificateEntries" + cert_signing_repeat_times = "CertSigningRepeatTimes" + cert_signing_wait_minimum = "CertSigningWaitMinimum" + identity = "Identity" + max_certificate_chain_size = "MaxCertificateChainSize" + organization_name = "OrganizationName" + security_profile = "SecurityProfile" + + +class SmartChargingCtrlrVariableName(str, Enum): + """ + Variable names where the component type is SmartChargingCtrlr + See ControllerComponentName for referenced logical component + """ + + ac_phase_switching_supported = "ACPhaseSwitchingSupported" + available = "Available" + enabled = "Enabled" + entries = "Entries" + external_control_signals_enabled = "ExternalControlSignalsEnabled" + limit_change_significance = "LimitChangeSignificance" + notify_charging_limit_with_schedules = "NotifyChargingLimitWithSchedules" + periods_per_schedule = "PeriodsPerSchedule" + phases_3to1 = "Phases3to1" + profile_stack_level = "ProfileStackLevel" + rate_unit = "RateUnit" + + +class SmartChargingCtrlrInstanceName(str, Enum): + """ + Instance names where the component type is SmartChargingCtrlr + """ + + charging_profiles = "ChargingProfiles" + + +class TariffCostCtrlrVariableName(str, Enum): + """ + Variable names where the component type is TariffCostCtrlr + See ControllerComponentName for referenced logical component + """ + + available = "Available" + currency = "Currency" + enabled = "Enabled" + tariff_fallback_message = "TariffFallbackMessage" + total_cost_fallback_message = "TotalCostFallbackMessage" + + +class TariffCostCtrlrInstanceName(str, Enum): + """ + Instance names where the component type is TariffCostCtrlr + """ + + tariff = "Tariff" + cost = "Cost" + + +class TxCtrlrVariableName(str, Enum): + """ + Instance names where the component type is TxCtrlr + See ControllerComponentName for referenced logical component + """ + + charging_time = "ChargingTime" + ev_connection_time_out = "EVConnectionTimeOut" + max_energy_on_invalid_id = "MaxEnergyOnInvalidId" + stop_tx_on_ev_side_disconnect = "StopTxOnEVSideDisconnect" + stop_tx_on_invalid_id = "StopTxOnInvalidId" + tx_before_accepted_enabled = "TxBeforeAcceptedEnabled" + tx_start_point = "TxStartPoint" + tx_stop_point = "TxStopPoint" + + +class AccessBarrierVariableName(str, Enum): + """ + Variable names where the component type is AccessBarrier + See PhysicalComponentName for referenced physical component + """ + + enabled = "Enabled" + active = "Active" + problem = "Problem" + + +class AcDcConverterVariableName(str, Enum): + """ + Variable names where the component type is AcDcConverter + See PhysicalComponentName for referenced physical component + """ + + dc_current = "DCCurrent" + dc_voltage = "DCVoltage" + enabled = "Enabled" + fan_speed = "FanSpeed" + overload = "Overload" + power = "Power" + problem = "Problem" + temperature = "Temperature" + tripped = "Tripped" + + +class AcPhaseSelectorVariableName(str, Enum): + """ + Variable names where the component type is AcPhaseSelector + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + phase_rotation = "PhaseRotation" + problem = "Problem" + + +class ActuatorVariableName(str, Enum): + """ + Variable names where the component type is Actuator + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + problem = "Problem" + state = "State" + + +class AirCoolingSystemVariableName(str, Enum): + """ + Variable names where the component type is AirCoolingSystem + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + problem = "Problem" + fan_speed = "FanSpeed" + + +class AreaVentilationVariableName(str, Enum): + """ + Variable names where the component type is AreaVentilation + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + problem = "Problem" + fan_speed = "FanSpeed" + + +class BayOccupancySensorVariableName(str, Enum): + """ + Variable names where the component type is BayOccupancySensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + percent = "Percent" + + +class BeaconLightingVariableName(str, Enum): + """ + Variable names where the component type is BeaconLighting + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + color = "Color" + enabled = "Enabled" + enabled_set = "Enabled(Set)" + percent = "Percent" + percent_set = "Percent(Set)" + power = "Power" + problem = "Problem" + + +class CableBreakawaySensorVariableName(str, Enum): + """ + Variable names where the component type is CableBreakawaySensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + tripped = "Tripped" + + +class CaseAccessSensorVariableName(str, Enum): + """ + Variable names where the component type is CaseAccessSensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + enabled_set = "Enabled(Set)" + problem = "Problem" + tripped = "Tripped" + + +class ChargingStationVariableName(str, Enum): + """ + Variable names where the component type is ChargingStation + See PhysicalComponentName for referenced physical component + """ + + ac_current = "ACCurrent" + ac_voltage = "ACVoltage" + ac_voltage_max_limit = "ACVoltage(MaxLimit)" + allow_new_sessions_pending_firmware_update = "AllowNewSessionsPendingFirmwareUpdate" + available = "Available" + availability_state = "AvailabilityState" + charge_protocol = "ChargeProtocol" + current_imbalance = "CurrentImbalance" + ec_variant = "ECVariant" + enabled = "Enabled" + identity = "Identity" + model = "Model" + operating_times = "OperatingTimes" + overload = "Overload" + phase_rotation = "PhaseRotation" + power = "Power" + power_max_limit = "Power(MaxLimit)" + problem = "Problem" + serial_number = "SerialNumber" + supply_phases = "SupplyPhases" + supply_phases_max_limit = "SupplyPhases(MaxLimit)" + tripped = "Tripped" + vendor_name = "VendorName" + voltage_imbalance = "VoltageImbalance" + + +class ChargingStatusIndicatorVariableName(str, Enum): + """ + Variable names where the component type is ChargingStatusIndicator + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + color = "Color" + + +class ConnectedEVVariableName(str, Enum): + """ + Variable names where the component type is ConnectedEV + See PhysicalComponentName for referenced physical component + """ + + protocol_agreed = "ProtocolAgreed" + protocol_supported_by_ev = "ProtocolSupportedByEV" + vehicle_id = "VehicleId" + # Voltage and current values + ac_current = "ACCurrent" + ac_voltage = "ACVoltage" + dc_current = "DCCurrent" + dc_voltage = "DCVoltage" + # Power, energy and time values + power = "Power" + energy_import = "EnergyImport" + departure_time = "DepartureTime" + energy_capacity = "EnergyCapacity" + remaining_time_bulk = "RemainingTimeBulk" + remaining_time_full = "RemainingTimeFull" + state_of_charge = "StateOfCharge" + state_of_charge_bulk = "StateOfChargeBulk" + charging_complete_bulk = "ChargingCompleteBulk" + charging_complete_full = "ChargingCompleteFull" + + +class ChargingStateVariableName(str, Enum): + """ + Variable names where the component type is ChargingState + """ + + # Status values - ChargingState + battery_overvoltage = "BatteryOvervoltage" + battery_undervoltage = "BatteryUndervoltage" + charging_current_deviation = "ChargingCurrentDeviation" + battery_temperature = "BatteryTemperature" + voltage_deviation = "VoltageDeviation" + charging_system_error = "ChargingSystemError" + vehicle_shift_position = "VehicleShiftPosition" + vehicle_charging_enabled = "VehicleChargingEnabled" + charging_system_incompatibility = "ChargingSystemIncompatibility" + charger_connector_lock_fault = "ChargerConnectorLockFault" + + +class ConnectorVariableName(str, Enum): + """ + Variable names where the component type is Connector + See PhysicalComponentName for referenced physical component + """ + + availability_state = "AvailabilityState" + available = "Available" + charge_protocol = "ChargeProtocol" + connector_type = "ConnectorType" + enabled = "Enabled" + phase_rotation = "PhaseRotation" + problem = "Problem" + supply_phases = "SupplyPhases" + supply_phases_max_limit = "SupplyPhases(MaxLimit)" + tripped = "Tripped" + + +class ConnectorHolsterReleaseVariableName(str, Enum): + """ + Variable names where the component type is ConnectorHolsterRelease + See PhysicalComponentName for referenced physical component + """ + + enabled = "Enabled" + active = "Active" + problem = "Problem" + state = "State" + + +class ConnectorHolsterSensorVariableName(str, Enum): + """ + Variable names where the component type is ConnectorHolsterSensor + See PhysicalComponentName for referenced physical component + """ + + enabled = "Enabled" + active = "Active" + problem = "Problem" + + +class ConnectorPlugRetentionLockVariableName(str, Enum): + """ + Variable names where the component type is ConnectorPlugRetentionLock + See PhysicalComponentName for referenced physical component + """ + + enabled = "Enabled" + active = "Active" + problem = "Problem" + tripped = "Tripped" + tries = "Tries" + tries_set_limit = "Tries(SetLimit)" + tries_max_limit = "Tries(MaxLimit)" + + +class ConnectorProtectionReleaseVariableName(str, Enum): + """ + Variable names where the component type is ConnectorProtectionRelease + See PhysicalComponentName for referenced physical component + """ + + enabled = "Enabled" + active = "Active" + problem = "Problem" + tripped = "Tripped" + + +class ControllerVariableName(str, Enum): + """ + Variable names where the component type is Controller + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + ec_variant = "ECVariant" + firmware_version = "FirmwareVersion" + interval_heartbeat = "Interval[Heartbeat]" + manufacturer = "Manufacturer" + max_msg_elements = "MaxMsgElements" + model = "Model" + problem = "Problem" + selftest_active = "SelftestActive" + selftest_active_set = "SelftestActive(Set)" + serial_number = "SerialNumber" + version_date = "VersionDate" + version_number = "VersionNumber" + + +class ControlMeteringVariableName(str, Enum): + """ + Variable names where the component type is ControlMetering + See PhysicalComponentName for referenced physical component + """ + + power = "Power" + ac_current = "ACCurrent" + dc_current = "DCCurrent" + dc_voltage = "DCVoltage" + + +class CPPWMControllerVariableName(str, Enum): + """ + Variable names where the component type is CPPWMController + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + dc_voltage = "DCVoltage" + enabled = "Enabled" + percentage = "Percentage" + problem = "Problem" + selftest_active = "SelftestActive" + selftest_active_set = "SelftestActive(Set)" + state = "State" + + +class DataLinkVariableName(str, Enum): + """ + Variable names where the component type is DataLink + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + complete = "Complete" + enabled = "Enabled" + fallback = "Fallback" + iccid = "ICCID" + imsi = "IMSI" + network_address = "NetworkAddress" + problem = "Problem" + signal_strength = "SignalStrength" + + +class DisplayVariableName(str, Enum): + """ + Variable names where the component type is Display + See PhysicalComponentName for referenced physical component + """ + + color = "Color" + count_height_in_chars = "Count[HeightInChars]" + count_width_in_chars = "Count[WidthInChars]" + data_text_visible = "DataText[Visible]" + enabled = "Enabled" + problem = "Problem" + state = "State" + + +class DistributionPanelVariableName(str, Enum): + """ + Variable names where the component type is DistributionPanel + See PhysicalComponentName for referenced physical component + """ + + charging_station = "ChargingStation" + distribution_panel = "DistributionPanel" + fuse = "Fuse" + instance_name = "InstanceName" + + +class ElectricalFeedVariableName(str, Enum): + """ + Variable names where the component type is ElectricalFeed + See PhysicalComponentName for referenced physical component + """ + + ac_voltage = "ACVoltage" + active = "Active" + dc_voltage = "DCVoltage" + enabled = "Enabled" + energy = "Energy" + phase_rotation = "PhaseRotation" + power = "Power" + power_type = "PowerType" + problem = "Problem" + supply_phases = "SupplyPhases" + + +class ELVSupplyVariableName(str, Enum): + """ + Variable names where the component type is ELVSupply + See PhysicalComponentName for referenced physical component + """ + + energy_import_register = "EnergyImportRegister" + fallback = "Fallback" + fallback_max_limit = "Fallback(MaxLimit)" + power = "Power" + power_max_limit = "Power(MaxLimit)" + state_of_charge = "StateOfCharge" + time = "Time" + + +class EmergencyStopSensorVariableName(str, Enum): + """ + Variable names where the component type is EmergencyStopSensor + See PhysicalComponentName for referenced physical component + """ + + enabled = "Enabled" + active = "Active" + tripped = "Tripped" + + +class EnvironmentalLightingVariableName(str, Enum): + """ + Variable names where the component type is EnvironmentalLighting + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + color = "Color" + enabled = "Enabled" + enabled_set = "Enabled(Set)" + percent = "Percent" + percent_set = "Percent(Set)" + power = "Power" + problem = "Problem" + + +class EVRetentionLockVariableName(str, Enum): + """ + Variable names where the component type is EVRetentionLock + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + complete = "Complete" + enabled = "Enabled" + problem = "Problem" + + +class EVSEVariableName(str, Enum): + """ + Variable names where the component type is EVSE + See PhysicalComponentName for referenced physical component + """ + + ac_current = "ACCurrent" + ac_voltage = "ACVoltage" + available = "Available" + availability_state = "AvailabilityState" + allow_reset = "AllowReset" + charge_protocol = "ChargeProtocol" + charging_time = "ChargingTime" + count_charging_profiles_max_limit = "Count[ChargingProfiles](MaxLimit)" + count_charging_profiles = "Count[ChargingProfiles]" + current_imbalance = "CurrentImbalance" + dc_current = "DCCurrent" + dc_voltage = "DCVoltage" + enabled = "Enabled" + evse_id = "EvseId" + iso15118_evse_id = "ISO15118EvseId" + overload = "Overload" + phase_rotation = "PhaseRotation" + post_charging_time = "PostChargingTime" + power = "Power" + problem = "Problem" + supply_phases = "SupplyPhases" + tripped = "Tripped" + voltage_imbalance = "VoltageImbalance" + + +class ExternalTemperatureSensorVariableName(str, Enum): + """ + Variable names where the component type is ExternalTemperatureSensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + problem = "Problem" + temperature = "Temperature" + + +class FiscalMeteringVariableName(str, Enum): + """ + Variable names where the component type is FiscalMetering + See PhysicalComponentName for referenced physical component + """ + + problem = "Problem" + certificate = "Certificate" + ec_variant = "ECVariant" + energy_export = "EnergyExport" + energy_export_register = "EnergyExportRegister" + energy_import = "EnergyImport" + energy_import_register = "EnergyImportRegister" + manufacturer_ct = "Manufacturer[CT]" + manufacturer_meter = "Manufacturer[Meter]" + model_ct = "Model[CT]" + model_meter = "Model[Meter]" + options_set_meter_value_aligned_data = "OptionsSet[MeterValueAlignedData]" + options_set_txn_stopped_aligned_data = "OptionsSet[TxnStoppedAlignedData]" + serial_number_ct = "SerialNumber[CT]" + serial_number_meter = "SerialNumber[Meter]" + + +class FloodSensorVariableName(str, Enum): + """ + Variable names where the component type is FloodSensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + height = "Height" + percent = "Percent" + tripped = "Tripped" + + +class GroundIsolationProtectionVariableName(str, Enum): + """ + Variable names where the component type is GroundIsolationProtection + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + complete = "Complete" + enabled = "Enabled" + impedance = "Impedance" + problem = "Problem" + + +class HeaterVariableName(str, Enum): + """ + Variable names where the component type is Heater + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + problem = "Problem" + tripped = "Tripped" + power = "Power" + power_max_limit = "Power(MaxLimit)" + power_max_set = "Power(MaxSet)" + temperature_min_set = "Temperature(MinSet)" + temperature_max_set = "Temperature(MaxSet)" + + +class HumiditySensorVariableName(str, Enum): + """ + Variable names where the component type is HumiditySensor + See PhysicalComponentName for referenced physical component + """ + + enabled = "Enabled" + humidity = "Humidity" + problem = "Problem" + + +class LightSensorVariableName(str, Enum): + """ + Variable names where the component type is LightSensor + See PhysicalComponentName for referenced physical component + """ + + enabled = "Enabled" + light = "Light" + problem = "Problem" + + +class LiquidCoolingSystemVariableName(str, Enum): + """ + Variable names where the component type is LiquidCoolingSystem + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + problem = "Problem" + temperature = "Temperature" + + +class LocalAvailabilitySensorVariableName(str, Enum): + """ + Variable names where the component type is LocalAvailabilitySensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + problem = "Problem" + + +class LocalControllerVariableName(str, Enum): + """ + Variable names where the component type is LocalController + See PhysicalComponentName for referenced physical component + """ + + charging_station = "ChargingStation" + distribution_panel = "DistributionPanel" + ec_variant = "ECVariant" + enabled = "Enabled" + identity = "Identity" + manufacturer = "Manufacturer" + model = "Model" + problem = "Problem" + serial_number = "SerialNumber" + tripped = "Tripped" + + +class LocalEnergyStorageVariableName(str, Enum): + """ + Variable names where the component type is LocalEnergyStorage + See PhysicalComponentName for referenced physical component + """ + + capacity = "Capacity" + energy_capacity = "EnergyCapacity" + identity = "Identity" + + +class OverCurrentProtectionVariableName(str, Enum): + """ + Variable names where the component type is OverCurrentProtection + See PhysicalComponentName for referenced physical component + """ + + ac_current = "ACCurrent" + active = "Active" + operated = "Operated" + + +class OverCurrentProtectionRecloserVariableName(str, Enum): + """ + Variable names where the component type is OverCurrentProtectionRecloser + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + active_set = "Active(Set)" + enabled = "Enabled" + complete = "Complete" + problem = "Problem" + mode = "Mode" + tries = "Tries" + tries_set_limit = "Tries(SetLimit)" + tries_max_limit = "Tries(MaxLimit)" + + +class PowerContactorVariableName(str, Enum): + """ + Variable names where the component type is PowerContactor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + problem = "Problem" + tripped = "Tripped" + + +class RCDVariableName(str, Enum): + """ + Variable names where the component type is RCD + See PhysicalComponentName for referenced physical component + """ + + operated = "Operated" + tripped = "Tripped" + + +class RCDRecloserVariableName(str, Enum): + """ + Variable names where the component type is RCDRecloser + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + active_set = "Active(Set)" + complete = "Complete" + enabled = "Enabled" + problem = "Problem" + tries = "Tries" + tries_max_limit = "Tries(MaxLimit)" + tries_set_limit = "Tries(SetLimit)" + + +class RealTimeClockVariableName(str, Enum): + """ + Variable names where the component type is RealTimeClock + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + dc_voltage = "DCVoltage" + fallback = "Fallback" + fallback_max_limit = "Fallback(MaxLimit)" + problem = "Problem" + + +class ShockSensorVariableName(str, Enum): + """ + Variable names where the component type is ShockSensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + force = "Force" + + +class SpacesCountSignageVariableName(str, Enum): + """ + Variable names where the component type is SpacesCountSignage + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + count = "Count" + enabled = "Enabled" + + +class SwitchVariableName(str, Enum): + """ + Variable names where the component type is Switch + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + state = "State" + + +class TemperatureSensorVariableName(str, Enum): + """ + Variable names where the component type is TemperatureSensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + problem = "Problem" + temperature = "Temperature" + + +class TiltSensorVariableName(str, Enum): + """ + Variable names where the component type is TiltSensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + angle = "Angle" + + +class TokenReaderVariableName(str, Enum): + """ + Variable names where the component type is TokenReader + See PhysicalComponentName for referenced physical component + """ + + enabled = "Enabled" + enabled_set = "Enabled(Set)" + operated = "Operated" + problem = "Problem" + token = "Token" + token_type = "TokenType" + + +class UIInputVariableName(str, Enum): + """ + Variable names where the component type is UIInput + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" + operated = "Operated" + + +class UpstreamProtectionTriggerVariableName(str, Enum): + """ + Variable names where the component type is UpstreamProtectionTrigger + See PhysicalComponentName for referenced physical component + """ + + active_set = "Active(Set)" + enabled = "Enabled" + problem = "Problem" + tripped = "Tripped" + + +class VehicleIdSensorVariableName(str, Enum): + """ + Variable names where the component type is VehicleIdSensor + See PhysicalComponentName for referenced physical component + """ + + active = "Active" + enabled = "Enabled" From ebdfd9f6553b8e2a1a9af1c3ff063bf498190ac7 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Fri, 22 Dec 2023 10:54:06 +0100 Subject: [PATCH 11/39] MessageInfoType in ocpp201 attribute name is wrong (#549) --- CHANGELOG.md | 3 ++- ocpp/v201/datatypes.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5227880f..6b6991cb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ # Change log +- [#548](https://github.com/mobilityhouse/ocpp/issues/548) OCPP 2.0.1 MessageInfoType attribute name correction - [#300](https://github.com/mobilityhouse/ocpp/issues/300) OCPP 2.0.1 add reference components and variables - [#518](https://github.com/mobilityhouse/ocpp/issues/518) OCPP 2.0.1 add additional reason codes from v1.3 -======= + ## 0.24.0 (2023-12-07) - [#539](https://github.com/mobilityhouse/ocpp/issues/539) feat: Add ChargePoint._handle_call return value. Thanks [@wafa-yah](https://github.com/wafa-yah) diff --git a/ocpp/v201/datatypes.py b/ocpp/v201/datatypes.py index bfb76e0c9..b9a2fabd7 100644 --- a/ocpp/v201/datatypes.py +++ b/ocpp/v201/datatypes.py @@ -530,7 +530,7 @@ class MessageInfoType: message: MessageContentType state: Optional[enums.MessageStateType] = None start_date_time: Optional[str] = None - end_data_time: Optional[str] = None + end_date_time: Optional[str] = None transaction_id: Optional[str] = None display: Optional[ComponentType] = None From 84cb2f2af266ef42c3eee7a102362faebe8178a4 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Fri, 22 Dec 2023 12:05:21 +0100 Subject: [PATCH 12/39] OCPP 2.0.1 Edition 2 Errata 2023-12 added (#556) --- CHANGELOG.md | 1 + .../OCPP-2.0.1_edition2_errata_2023-12.pdf | Bin 0 -> 1996553 bytes 2 files changed, 1 insertion(+) create mode 100644 docs/v201/OCPP-2.0.1_edition2_errata_2023-12.pdf diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b6991cb0..013775bc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Change log +- [#554](https://github.com/mobilityhouse/ocpp/issues/554) OCPP 2.0.1 Edition 2 Errata 2023-12 document added - [#548](https://github.com/mobilityhouse/ocpp/issues/548) OCPP 2.0.1 MessageInfoType attribute name correction - [#300](https://github.com/mobilityhouse/ocpp/issues/300) OCPP 2.0.1 add reference components and variables - [#518](https://github.com/mobilityhouse/ocpp/issues/518) OCPP 2.0.1 add additional reason codes from v1.3 diff --git a/docs/v201/OCPP-2.0.1_edition2_errata_2023-12.pdf b/docs/v201/OCPP-2.0.1_edition2_errata_2023-12.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b55afbbc21fcda9553f6030b77cc93dcaceef64 GIT binary patch literal 1996553 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%0Am$CDG~yC-DG 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�pU_ZRiEg;h=4H#+Q|PIy72 zdsv@a)X^*|75v6s-u;dqN_<3GlImPzk$?W-@##1J`{xh8_|EA*5|*H+PAGTeTSBA} zV^lT@(1!U(Vn zt1FoT;=*WAft(lLLiOxA!tNtM2TE}F6@+j>EX3i}>0=)L3{%0mx7V z$OzGMCaB|0-oor{Jl8zb{d57s$TC29XdK8G3hJLDUMK}3Ls#O_ox+Z|(1m&}(H2z| zMwW^(*25G&BD*PS3>imJ*8z^4%x<>c5&h(;`pe%aEP2F95Y}3L9_^)wxM_+%cDK`o zR5?loEONGrQ#K;RUd9p2=waX3BW zOit%$`0tme<-NscYe=&6!Qs=FiIq?zj@#UZy-R4h7=2mLr@~tfsCr?P>+<{ z>o2wMoGGe+gG~cB&?fls963Q6LX-N;^){x`Md7jj7B43cbak_65V1;{gWTbEGk$EDBNq)8%eeoVm}D z<%$&P#boU31LncfVm2^Q10L#g1_cTZRI>rTW(yz<4FbTR%Jv#=0r$3@{X!2nG@ zTNaj^Vr_%5AcUK)qP0B;;Q-lni1t?nJ{*K_K-H2N4niQ(NFKLPJTP}w>vBc{5GdWU zpvQIC$@S~lB9d=3w$K43C8yY9TLKMfh~zYnLDXMxAqZh77}R`|QHacnSt+i1Mu-fK zR7JafBt?*$bp7KiGo4AWBBFuTRRl2(DGAI^)t4E;vn&(c%FQltH>-GffnVc)c8}np zu9}a#6tv=uO(C7eX)^8%ZrLLQfGEidkP#g>hBtYO;!ad+)cD;G7Z60$2~kYhW_Vy6 z1g#?C&p<`nS{TAzAZFbWL>gET1j_)7;Lq<7a8x3#B|GZEST62q@FDzQW~lBmXK+o{ zpxh$PA_}=cTOyGVNytnHsTuC?O1NiNdvkM zr?h;$8|^A6#St79KAAo&lo$^;b|bQI>l27Vgq>D-c!$Ib{mhLTh_%HH>H~@3C~9LA zQ2e{AI*hVGSRBg691;lTK)$yq8wS7w`Si`Y2i^(jo+2UtqQowc>{y;mBsLAzB)0y7 z3leK57?veQVlP5Urw9xLZ9!~>jSSINuo74X{|57cp^~E!f5SJ1f6@~qMf88Myl1G@ zkuujXasz`gcZjng@yj@WETNc%yBf|z<3ONsP{`7-7=g$-_SKI;X5kTp3{*gDXSA90 ze6qLoSb|+Hze*+9SgW0)yNTK6x~}G^X9L9ta;?Sa_d1lwaxP8^K@Ee+Vw5TDk%5`m z`FmTgHR_4Lye(eJa@ls+F1UY&@=C-3?6Bn_Bc1wF^))SrEmS$IoshuHP9|~Kn&18w z4%<4d7MNob`?*zl_)V3>J!EYiqY_Aa5uE*C6iT|^#|$r0A7PIRR!}3)dI$Gv*cI8$ z*;p8*_VG0_gi!JD9B<5jwZbVZmYHfOa7wu%M^jS~#-f3J%CR zf(E6m-gjYDFamLpIQ99!cq-UWpMHSzlF&$BfoGkgJ0LJz&c!;hCVHmjJYGUo*Pin@ z^(%(f!20nz5^C#68M6vRv0b~R3jo&7Vpi}#S78eXR@gF7(YAGkEk;08*Xhs7^igFk z4&#+nUObYpoY#KKoXPoBMoBI=;I=!H0~_9+TrO4^Q^*8$d8kV?0fJ2nrL}y4!!$Gw zgkGDq$|Sf)lv?NlaoiGt$WR5yC!OQR1$##uSBv-ck-_^adv^7jZHI@tEM``Miw)Qw%<-<`z^${G*&Y~(4wbItQ8rV#M+(gp z&jyZ_kpFB>)!}5tZcMtKEmNwj)IH!0?HK6Yv~mGH)x|LWI7N^gq-TWJ;1wW0TRLT3 zSN99ul8&(upS5+m`-PpRYov8i=D%09(6Bp73EA687JvS6DD(MDCBp3EX0OODkk~4( z*Xv}~pQ4j_pv&!!E5Y92cGiX|g0cYw-RubhTi0rElX!Z$43utiMk=%}1D(u;k8kuc5Zzh1+hw4*Zw7$BB1JgS zl^j6-6>WCdNazo`+Vfxk{_b~l*@iArh08w^E&~xV@oe~ekIO)DE*_^DdKoC(8SaM z9C>IAfXRD~@KCRBq{gZ6i~^7$sE8jlqxGt!|X*dgODj9O&clh5dBT& zMh3IC8auV*FIg=kT#h3=&_$qtV3Z389vBBPhQ_)JARS;7L>jn(4s!grv@nMdlw1fo zFfnpJw*reOzX`ouBx9m)20W$|(?_T-ODTlckO~(@a?Gw;dXg1`V;jQFR`89r9v z0hTEmXHM-dl8v>Xu}qHT+0$s>q!G@&koY`dc8o@5uHvSkOUjn&ru%n%_UPb)tJ3*O z>FQ8}a^`tm-2mmxyaCFYrw!$xtxy0AMMc1kQ;6%Lu2#0rRP7BK3_bLU@AC9(HoZlb z%A{!^*ntx=2}@ zmdIv56?G6ZJ$i1^l8Q_fTG-RFOpila&mJic59q%lvlU-qkA;nMtL9u!X!%{}__pS> z&+BT+bQ`-qr`u+H&UwP_X(2V~2?HAe1MHdhX+uxCR$Sz%xc7;@g1iyrqme{$P^|Kk zO=Lm|o<_uTrEID~Esqk^&Q=s^2*L&?!X=*0<_Gilb+MQW6x7G{?J$ox6oRxam=x3c z4u#3y&j^kn#fO9@GWRr2Bpv*S1C4Z z5hxii&yRd1<(!Z(;opx?3HT@e+XrE0=(Txu^AeXIS7h)}31% zhnoy|b!LiPAhLOW==&+#|9v!&V@Pa%qV-WDJ4cZjeY2JY*D|PAcx6Qy(UCrQpum-V z+F}94tzeSl|0ys>h7m6Kxc4asP;r-HL%e_i^ZW<~DA_G=Iw!j|z8^)}&j@fntOkCY z3l>xnUg3SRPrL8;%8Sw>LTHlJCk{akd@LvgjH_umM|jf^WgS|Z(t?DN*hbJsExiuQ z&1XJ<*}00_=Q1#$8Y&g!+myG@>+1RjhMm`>D7YgY%k0xi(aarmDIF7utLWI>qu-%P zKPph&vF_VO#bRbFj+pCiH7XX|`9ssE{M(u)p?zLgbB$49AvI|zMumOa(9p{y5|!#2 zX+foo9ereBPslH0=EVMd#LkkV%Zp;0ly6SwO8atJnFWaf|vj z*9tQD@Ek_9Q{TGv$N^wRwT{jv*i&&{lr5kU_POcVk_a{rX{fTtCp$_%B=*sp{T(8gea@CoK;)Qn?*pGFfKb$!@_BfDV;FMmJXY5s+YZ!Y7xvcR;m7 zA#ACMLPa1T-wErVu1ihmmL#Zg{3{HhK{70kqZCjOSVkX-^>5*q3J4y!o(giXX;DIN zE0L6B_B!MRxj)Drp4yP z1^>*mqu4jAU<&9^iNMQ}BQ!9p$jCTK0hJs}1w9E5?BwtGMiZ{mkReOIR1baaty&j+2i6xt zFyD@n!L6c?$vQXjONAIba6KthdMr7N^mGa?Y$QhHM!}+DWfYGA0DQ5?5e=;;`N+US zU6xKOfT0v>%nCddfZQSv2xmqB@(Hwp49GTlKzlVRLy#RADD#p0*OYq}4sM}H&PKG$ zB9DT4!#bo|x_A>1jA=Qo^T0TW;}G^P%YcALA94fwRR$~xR0iPlNLBdO{qi2^denwJ z6r|$1ca)k41;tx_@{nM3uzFvbZ%*{F;2>0=y9+`^ut*`&3h1U1=7oNrG>-qZIIXbNX_s&B3+xREo9Z+1RJK0DS1JI!o$R=fSprT1d zlZlmzN28P%#l=k4+Qw5C%li!qfDx=95)tl=w2L|fCQu?A>yYcQE;__w-l>onbp-y2 z>(OJ4M0i^l=&I78^E4!t_8B!K5}(r^Hx1yYv|UQ(#aY<-kHg#x5e!)r1MMXx4(tjif=Ws%d{ ztdKO+W#hC0RJ($vNLD#iI6Ur~wqjHwiU3q`lt8vA4piXU&E;t}Zf?B6 zQRQ~h?r0;AjZn9iG4$(Vlhog$280MK!=ofHs~ExJWlbW4FssODIZ6iAB$gDaN}?wp z0!p$3zdht3Zl|GwImW5{Fj*($c7Uj+-{~e8`UXJMDF%Rx6nwKZ$P+22Bvq*43u{6D z#%4_rk@v;2%W2^F8;T*6-KEB=DBw?Ui7kSKqU)n8LXdZ?Gp!NN`cnUajpoOOTA^}Q z>|s$vgyoP8L4hcKsaraIC^Q!>1mPfB1fGkF4jCXAIb&g|c(Hr=e4_Ly+~YXdm+LW= zv=w20&Ats=tot%kT_6NRk0f5Ow;WjgrmUiu@&Ysr2$pMB;sv!%J9KJTt%N=x>81@N zYzv7SNil%W;%0@+I&3Pm*=3e2u!k**_!0jLcB@0bemIi2Pit|tl4uGp93zKt0GGSgBtd{Z@b(PAi1r!N-m=8_!Ky|# zeKOP*iX=Fzn}-H*hS!~eq_la43uLh3yOZ5|BLEqy02#qs5NwK>ujl>ibFp_Wq=-YO z9bY2WWTuhs6~%SacAF@)ol6x%D6oQzVP*6+4cvxz0Ko;nKJg5H zN7AJMT15t6lyIVH8pOM>g~&eGtgx`wiQ7pWteYD5qyahrA#h^!6%UM)aixOOpqV)~ z6OhAkTyH4|CSwU;I~j2saL0G?&3;V*nD@ax!EQ7_IiyFUMryv{-blGSpk4GP<17tq zpd6a?Odyk`99`BO(VqNL0l@<$fbEpS&XVqxDcvr0sf>q@R?_Y|Q*gaFjCLq^L(=X` zsnMT8((e8xX?G}Tmx^a{J;`r0X_r!9@0PSniLI%kD3@st&~4q(t4fX9q}|0JJtghV zC=qpXNxRW}xSX6DjQA769o~PHM$BH)NI(nox!j%ENO;IVs9Q5>0jSwPov8#|R)MoV zS1h5Ss*|;S$ROwO%d7m{BeprZ32ElC*^@#@E}U}7^?;LeIK%p47&*}HrzBdW4Rx3j zf(%BzSob{8rG2F#?M$;NSa%2$vABfjk!Ecf#@Nne$)kpDav! zSe-F7jQ0Rw#t{J>Ev+@iLtVnj3eG58l%$9zkEG1N@^+o_PQ~@$dwwM!z^H^Dj z6SsZo4yZb4RM2p#bbA7#9pt zdN~gEgmnRuhBg2xF;8%DNxM%zeXRh|p%Ta_`BdsoNaI9Sb)JsU@dk?*FBj>C3<>h^ z6;Y0i=AeNtHr-c8k}!x-f+&a~T-HB@Un(GY;Cf<6cZg$)7%>305$X43;sYu^okCKl zppl2Vv~w##fWc}(0&*Bh?v&S(>_i|kQ~|PG5~!m$DkVb_ib^g={f(`@|NQXkXSk;9 zwH&&ny`Cn76Wj#j?%UwTrwtEIbp%_W4bcl3p&FBGA-v%CP`rOX6|Tu{{58FXY@7yQ z+#<#qJ=fg5?luS$=`^*hQUE$sE%fgLX^$t|iElrBCViuVqgsp7DY)#e5*Z1&UO1@h6MTW# zhV2APT#0dM8~bPs1oo#Gl2DM?9`z}3AsqDp9Y9?{m+k9C9Q4Di)ayD`4Bcw>C`XMD z7FJ`Y>1v8t))N^?Q4|njd_)Fdh;IT3=c3-;0?P?)ku%`BrW`XU(T4KU+2bl0`$q&? zDMyH67NL7_{`Pp4Z0`#PDQ3|3d*X`H3Ko$`YNLxLyZemvXkdZF4y?ycY%U)OZ#c2i z^6ldnQAt&lV}RHvP6j?fsmmGlQ$4um+YwSj!UwUHeY<`oAukI!=M`fWQC0yeh@2Nz zl&$w4kRuS8^wET!&^R7fU(7D0FVo-bE|tFw#XM;_Vl=p+m0}wT0-Jm{N3+F!$m_tdC4ek(sJ{*35Rl@z-eYV= zq9#eJd6_FumTdy?|L;gz-Q)VXb&SE7Vl>Dq%tw#e2V&OpUT#i_Jk+%i6bK?b6H0Mf zAZcg=5Zo}E!VM6GiLVWVRij9o={x81^t1A;+F6 zeX!GXE9{%nZlcAaUmiCWc8{wVVT*7n>SVi^b_HVsBc?1%hZxj6(B*UmA>zWO?5MCP z2oV+?D*61PL9L>~t0)1C3X1MVV90%JC0c4({mp7w)JD%NE;hEoo(#-uQ4u0Fw#QGL zx>m3y%4HY+qbzZYBk|DpmxZTx5*=eMRd~V~O4d={5Fjfm&SUR1$~cX5IaEL(>l^7= zuHpf~7)kwg3y&~lsDv@fV50F>1U$%tVvNYzZ;rtZ8H0(IHozJT*4NVGjHl~_1AKQ% z9tqWl-7{Z}!JH2T=NF`e6sd?k{p_acdiwg=P3-Gu_qfr|*B1S#t2f~`V&Z6(u!0*E zB>^F#lpu@>k^oRalA%%v>fd1&9mUA3!3*N35UJ+dp+YA2%us?uakn(FonQ%F(ZoY; zkAnrME9ijx?KMv;w%lFE5u-0cAq z14U2k2T${x-LdkQUF-I6;M>?^w}*S&WA7G^8!jN=E_892Z?hh|Jz#l}KgRC$N+$iS zgE>Ad2dlq+uhVhDf&!qy?O|T;t%L0G>wVoGva!2u8CLVSjl95Vj`~2> z&gP+UAhZsj;6yNR2fn`$xAIsifL$IH7^60V7^w@cT_2;r%rXaV`Fk5djA=K)DjTs8 z`o^@g9UPD8x={6RIwftQ8_aXLJQnm!*mI(YepSz;cGGl~eUsWv)c0jU5+p~*=%IUD zMd-dR4-pn)fsTlZa45@#_)K`9D<}d&1Vu(FOn%Xj76|DpD)UE$L^S9^%m|-lO}m=k zoB*9N0g~9Fn_x*V0(6tRBd|(YyyNfa?O-l2o(dl7GKRP+7VIV{%9*1sPfT$6fr`KYivho`TN-v zF-i)dT3I~6=vQ?Wv7NR_5!;FSzNR9!k6%#4HrzVq98_i!gTrVrvOv0gt{_BM7{sWk zD2O30zo>~-P|PZ>6cbg&U`O(kR8_J5W?41XbarOOensGMk4y-}JsF%gW$&bn!7c}G zey41CweZwjgJbOF6yD8>6!lPFBiY4jV;<^qsawekt!cC|0okJ$aTkd4DL6XZJeS`=Wh+PQKWqt0R?Eeb@2DnK@CXJiJVpK}pegLW=5 zHCQ{lDOFbLYG9iJE$_yx8 zBhs8l)|cU8*9WT7g%=be_@y)Y32-1%zdfaho4y`R85F^b8$LU$eg&2}c0Dl?&`OF&MnB@}DC ze9*F#gr?NTW3cie5?WFHqE5B>jGG0~w{Mq&coP*9ika`R@FF~0spw2h=&4bO*al^e z8hy2iwv_W)tJ5L)nNcuq$4#bn+l$qVz#3FZ$85vm-_om*?fC2kv zHMl~x&&`yl66j1JW6kqWpJ)L9CGVbHO?F%<4nuyXEl zQ_g#Y1Y`B^T`GJKhNz1a;RB7BaKQo<+uZ6@`P1si_#h+2R(i@$hQ3v6xY6M+BM=BF3@d88u}JE4DQK)QaSPg|)_))E1B9Ni^^x<)0y!-Ql`RJIR8h6wso^@YaZ zv`o`3fiH^rCPhEtSU5+sl7w&%~BbE0%RC}0%RUSL4CK7*D4Shx)P6GKBy!g+T>*id+ZoRjwqiGA$mGR z_1KoGmUK52`s89J|AfMP`*=CZT6npR9!^H?c<*qc!9jU*rl^~y`yZc1DMi{VCOVJP zrC2x7VljI>g|*$|s>iY&DjZ`x06tDrFzkFRzK?gGtSGQie-rYGj^GfeKR&+lkWqj7 zQ}s2ilP$?e%3WX+Urui3H+z(9o^0>FLp2ZyX_ov4r3CXKb`~rIGD3$+6jfcGmJcib zy=5!Qj4f36rQ7=8nfj{-HZuc)ioJyT)!+>L7eS3fO3l6gRQ*<}Do%T513^@>64&Ol zEmwUInK?SRA95-WD{(#Wj+*aAak5rVw)e137Z79WxUSR1;OCuDR#9xOBl{xhb2%52 z*2GO@zfdJ31QM6$Jjr?7&ah^|*m2y>R%>MYY23oG zs}PN^95Q?uw=m7VIeHd{0}e+?YDa;cC+@P9)eM}&adQ=$b=;ox+t?5in8pOc0UP!a zSwMW$P9wTy$}e^3?K8N2-eBdMJc4I-%ZkQT=rk}t)W4Bjs!fXi@s-RL?5`_IuFrs1 zU|)Wzzv;r^`-a-F^TRJc!3A>zgoPleB<(VvR>{jXA5(9B*l@|qi=+!&RZb@WWwnI@ z!@CuICa3}u^>jz#M(92L7FCxQM2hIFhX2y2AJy&)!8M3s>O(-Y(WepJ$3=kb!me5P zt@G)_QH>5=6HorzRp{Z;UtVg*4%LobO&QZ~w0102V!d1K*tokE$09?mEcLVx3Nn(;3mKYsf9<>7l=yP@F+?ELia-_nmyAKy~}-}n=k z^8NXz&+nf;KYR~g_`~kEuTUuU%h!j0`uz0n)2FZRo<4l~{Pf|6&p-aSk`}K!UAOHE)oA3Vg?(1Lw@bvKJ-+uV`Kd;{W=IQb4!}sbuM`tMbSReLi^NrIi zdDD+HfHy=22n%(qqJ?f>)!WCfKm2)YO*je9C@_cv3);uym~%#g@p`(jqLW!ss=j+d zm2q12m#?3n-u@W$_xkV`LffBzczpWJ|Ni;IFTQhHnUq&B?_Y}V0y!_mcQqycrTFge zf}6o^)t!)rR&tf28xM6)i$MrstDxS23x4y^7yzxEEAXhfZ+Eg=Z&rMlR*(T1IV+Cg z&As@#f~yJw7b;J1&dE{zmeHUyv;*KKJ};SYg&=-!=6kgSB65i z8}r-WBJwRBJ73))3sgu1UvD_i<_lvO6(jPx?nutBd%_FGs-NMgY{ zu_k(^6@p)JU1yI97#WHfuTb)o5gJ`^5!=i0*5lsuTM%)-c3=3W|X;}Td*~Q>Zb2N zU__ikz+8!?uS#UU?_Rqi+`A7Ab(9&>P?z>@B~V6g#|DtyNMjv+El3rC=uin{^On6L z?Mu>7H82Y*TT97p*=|ae%H1uSR0b)-aB7|E+BB57Dl6Yzor2Lxvs)3N!)6gRlYUk2 zlB}Di_>0G)SjN|X9;ey4iTb`QQYn{Y-Q#LAXK8jflq_JCc7u*nVPO?DDk{p-LtK7Q zPtu1(K{2byWNlPTL{XZ0YlWgTzh#Otzs)C#(oM0%zt5%Ez$|>VOqud((YZc*Np)ai z1$*)t1zdu4qfMIb*AmQhqty&JA*d1=8xCL zc1o3%?xT%y|MY~LUBPfumck`{?wdzWNK}9)Cl8&u(uEz`x;w@3n{y4X%pb{jKV`{03 zQpUVea7Hxo4S7E=U8jEvU8mQV%%P#oAxd`Pq>yhkbBMA?{{ERm6EcU=N;O-6_)KlGu+!?farXy+O(K$JSs9S)o9 z1ZW)FF@^tu$A0Q_v+Oszi_MExrllGNI5w z@ttkTndfzN1C%rK1}JBqHk5<5!U+}iF`%<14y$AwmI{nPlTp*C;NLOt^YlBk=!g7_ z*9B6>M9fT8{8&FqLCGNrgIGcYitlOC$v&^^=+nv0Gk9xAn0?yNDU&cnhSTkpY*%*@ zhlERX6f8-0Vka^=q)>+$MN#N85Gs%iuNVN%l+BELIB;Oi4-T;6qM*ZV619hp+E37J z?sXQ0)SnnDPbxaZir!P?K1Aa2Z861%L)ZLGV09FNK@1rMUGd)_IR6r&PBG6>U2`6# z$jCs*nYf1C{IUsAwnqBRx|X_}DgyOEdnh+Qwr-+Vcc{RN0 z9Z-#D?#lDADbKjje^?6M$|d^FETOnYuZ>-qXWHH$4|amG?11>%i5C5iTF8ZnJEVJ$ z5#SAqmQo-P;4U+6%z zP3)7=J$`|VO>1YxP0z!*{4!5ORGMy*5hoqEJ#sD>B%__IXnHm>BH?PSY&6ZibhQ(7 zeFJ2)69>p>A6GJNs2uIIKQ6?hu0cVQ%!WlaSBt0%Zhh@brR#}W=EWXSa}}B#w};Ji zMH{DV)7E#3nRiM>vV_#cqN1L>=5i{-nbS*@;x15RDh=tMIlj6{G>6>~SS3 z8X&=W1skoA2eiy6^|NIYaT7+q6~;DfO4!M8=)kDNKgnkH-wch5+(>*xV>Q_~9k zWhnjQ`pxs)s2tqlKV-}wE89&|121;M5Dv&LexLI3V$%E*2^-nq9uq4HY%a(hcduxR zG+HX+Qe5`9#RLvJWU-qn*mDaDsPQ+Kd*%hMw-ZLNKu*2D_niFNzyZSAXIxQuSnLbh zI9Ny(!L{!mcR27$jnZ#JIt43MoM#$1K}~Q}e(djA&67LMSGbZ;0Pw0UJ1HVTIJ(E& zWJU0E86tb)y>fqTGk}|*>+2gLZeo+Lax8F+op$`u83m(yVdmAPw~cn?pHgbB*cYKs8AzriXjnkkU&if-O!firInP z6S+lov%~y0W_HYI+_IEgpO?)xQQdS!;`L?+)mb=g*@oN%UBPW;hXdLsD4QMbaYN9K z*?}zd*ZVD-jhis?ty|0v2fY2wY<9TE^_%Cpa=)XovCI^4sBA1vk#!S>zJIgH;a<_k z0-GG}afgLrlVc9Oiwm{d-f`T75iD#qIou1{IAD{*J??Pe71{=qW2SgZWf#u(s=2jS z!G=S<@dBw{t+h-JH(3$|$Et0W=_PVMZ{nOmPgPrBD%?nq$`sm>mGL5k|#9TT+3bb0txK|U0pqw7^UCV9nLqc zxA=qM1W&*bg^c{;hI|MR;Q(@{eBxMK?Z)H`G|fdv1y|ODhq{>slFk9j(xvCHAizUx zeM5E!r4U2_k}p9k$bgJwcWlhc;0%fzQYsi#3L>Gii#z?+q0hgVm7y5qtc>gM=iH@K zY&YkuQlVjZ~9nnkr^S>lnTPrW$d1ni0(w^E;>M4e8G> zg%f`Y>CcCk^yiWE=L6OD<4oLdGyORv6aW3wpL>N9ZTjA6n++Oo* zr5+%u=&;WoQH*0Zr@S|{FpwO=&P}>(kGtIArb|kzpv)6WlYlz}=_2G>SQk`b{jfZ) zALwcP*M8knNtFs1S`95F3(-9WH=sjZC~g45LuPA454tX)Tp|M(V z4E2N(S(t%97j>pG8D33G=6RVP=~oAIv9Z#VhPna}r3Z;93!>I6J(SLMTDM4#08m~i zfozkW15Ow?tK=qWMS4iTZN!+bX09e5Zyw0qT$%yau-|p5M0q9T(WEAo6 z`r^I<`D-~v!JNjhZG>z{**1vrv(i#qHx40yVVWWIyRVHTU=X7OP!K`{9V&5nnfnEV zSw%+4Q6eb!TS6%JFOLY`wNI_}bw++qsIi)Q6k8DhbxrbxX^&}Wkl*pT0~nn79YrU% z^?yPCvIIbBRRS4Bb>w%{JwSM}Q1zViOm4K5vKK-Dz!S2EwK4Qoeis55HX-iqVo$$T zNWdUQ37{Z`a9HOfeyM=qf$NE&{B8-6^ZWdStv7UUz)9mV%7BakL@`E{AM@uB!)Wf* z_3ynC+oMg$8G#Nfcxk9hd07F~6=Au-h);`k1V96Tei5!2{QmLZ!!&!$?o3 zXv;=oL~ax;Dpp4E7yzJO39>oeJx?C$vUFMj3?&Fak_VcMI~-f&0jY-(fP6v)$ToQh z2^+zrYfeF7p+7jz<{cU0vv|A~gcK(-7-A>s z>^cYDoN9N14W5FU3|)q39REY=BAQkgeV;KhAJyn^v6I6Y9jK5*nI%MprI6+gsbU14 ziW*y&Lhf+z*~0iFoB_bCD3=@xb?yO)E&v92KnOlE@G{&M!I1PAj0&=Mq+=$?#Zik|+kCLRJFVq)ZOz)mzzHsmMDndr@4>H^d zl4vWP!&@kf=#(WjP`Cm?b-5;vH|A;zMa}7Sf|-!m@K35&9O9*3!C7Y^$@QUi=MPsN zDmkDbz50lMvQoLcPz655pivlwvkGSG@>T?Zq$1SxGN$$+jtox6O|#TJm~sqg?xyqE zLFViF3mBtJ8P2CTFC+X?o=+nmFfUNg1k%^*Z5|ocoN63w7i=Z~3*{jC6<;GLysQ`m zf?0zn<0uJKFIY0DVxZ(7)Kv&VOLwdxcyV(KT>~&q1;5GSAe$fvY4{zNM5tQ_M37P& zOsV3aP)OBK?+!piITY;u`ghkBp=b95J!})SNh5X3t&c9`K=iSWw8o;rMsRY>k7A^H zivyiiP~;)EID%3jdxQLg{8G1c`cPO9WHBH@MvK66!5YSr^ZOD$+i9l01VF~a!Mg_Sfv&RuYmAc+H3K@<&rwB?QXCl?7N&4y+-rsxXfN1R7ym4ZpR2lS(+96`1e{P&#%xwR)ctBfI2sr6IhZD+n)?<*4(p8o z4Y24+YD6PJ@#Rp4l zbsdi?hREH3?j*wIYZ~YhO+e5pa=Zh`ejOm5;qM3{4bUnw0HcJ{U9LgA3#wc6+S*FL zs}r}AeOKS$1%Zt68)!giql*a&A`Og_kye2!DNcatY8k?3T_A>P5d;sE05+46D(j!P z2EExPDT?u)WROgX0m2<{2MOWHOe}At+#S#^dXsUM2D(UB{=q7!OKqllhqNcZR6y`R zseZRpZaKU@SIT3Polky5F%y(}(c*6kA2y1@J#-ZX!;ZuIQ-(L%#k$CkTh<=Q9uDs? z)@fvH`igQiJ8W_6`Nd%miC5jZN_UwrLwJ7%W0Y!f>%x`9X_t&aCu`LH##@ka!VdS) zr$VZ**}-fkpCDQAuvfzY9@`!zJgfI_%s!EiQ+jDR?(M-#XjR6y{+^~5k`*&D=&-usP6S4j|zDF#MyCP3)o{m!@X;h_zZfY+i$x7~a8XV@a! z+V}_%`J4)n&60pbJm}YY(>C*)EnHSM_<@>3DQ1)@P+;zE*oIRw^dITOc=io#er#Yu zc)=admm})gAtI0`?-?&@HTqGjiSGd)V724BGJB}kP-3yubccxHpIAuJe+aC%_Y1T9gJTxfXZg$ zK|f)PaF$1kPuS@jLabuwr{T8yX~nHPH%(Vl1UEuRF^U5GUylfv2lpY6a4t&55QDEX z63`rQi#xX#fIw|rWbwMkRWSCC@MBUyja(CGa_P(TH@i#aFGFQ2 z+FD|Ds!+WuC%)$;+_ybbM)+dEx3RaPh%p)*`p5OtZ)QE%;d`!1t6cpJzC$Z&^Blgk2Rm^WNN9YWthO3c&xiJSNiM>BM{&Eyk@t8Okslkt#Yg7okz z`sAlU^g+*sFo<`DE+|EK3Sw&DwUITGhlcpfJl#W9IA2B-$QsNCkC_GcHHkwF-;i0X zyE<~J_ZaG$25u#@Z^%Y)adWy4L|#i4NdzK86(FPLft)b+DAqbv8nWe`{U)}Z-2_X2 zF%SA#NzQC=BB|@by^Xc>Hx>3VHY3`Y$p@une;`L@xA7T7jn~1WSd{nf+0Xb4o}{~9 z-+DIFEdKn$a8%eK#_(VsR`J1(aH;J1n4kz7v8{W9@vCCOmg}gHxK;G|`=b4zvjRT?A9zw3VERKL6__sj|D-gGm49F;xskVa)nhuX< z|E~S!nCxKk8lyKLc{lb7>~HDaKo3vY@#)l|%-22U)tJnAH*m262gzVm+wbXWXFE;T zGoYXCL@T5X4Q(G+9ZkCq=g;B4w%#rf_F`!f?aTvR&KD3YD*}QC#zBnn{YCApAd+^j zNZ+X7sK#5UjDO)$gY!N+;)({g6D)Bn8rYdBE$;@Jr`J}{W&3(fC;hOx5cj+rPWF}Q z%R?qiB$MZT`H0Eh4F}xf&IyKiH{9bY7`GlV_b8f!yo>zw)IMUecf(C=E?>MG?(vJL z%$x%r8|>Y1;F@n2?}mHaBX88Z;q<10$a!JhyRk>H^B9aOoE!R+-J|kXUF+Mh(A%hE z*M@ysKl@g;n~_q%)iM=oo9o!ILDf0uSW>jWn)$7RwgK0GXFGU&;v#SjZ2h9}n7C3~C3>+HS00O*@L}ME_MDj6w#C;gXMqwB_RKOTD55#sx zTlv@L;wmWaym{+DoE!FeD=cCh+{L#sqc$DN1qSz@ZY)=y((0Ck;$VVV#&r|)qk87^ zY^Uie`{uKosPD_ihGPB5t4i)@;(SDu<0^85U z{89N3E0Z{poG#|vS^Lc@*8M3H9&v6MU|w;G^xWj!2#iw6XUZ=7aQ<1>BUn3kZgg%4 zR~VXZ)SVMtHp{{3Umn_^fXT`3a@Pn3`eSZUzzjpar2=D=!9@8?==g)X9=WdDmu=mW z^TJKA+C!M=E-Dx0tM`>fjA+rp5$E zSW5&)RN0u=2mqE5QOG>d6&e9SYlv4A*zl<^{AG>I5Yksv=8p=DXx+e=F@Rc_y5={h zks)n`PCmgAjBE!t#WI43(@i=#Fizopxmt?uppuynj7`i#UDgnrIA#7C7^Ats0)k$O zq6pR|F7tWo+$9{UFl4BNG0I`8lBxJNH~3Yh5=&*eBN6VK!lR2IR4Dz;Q>t9lRm!*_ zM)%!tH5vayuns4obd%6jKcFOXN>Nc~sdEIQ-!p<@MVO8O;ij@nnqgCwF0bM6iaXKB zQb#He{v8jqrXv#;lphHYV_>%^j6xCMzxlx zmm!T)*IH%|jCxPkaP2JycA-rRnk+8$>=yG|wkM(}m(yl@bd!#IqJrCgP66j;H={#E z6@67s^&6_SPY=KR1Wj=RggrsXS7iUDYQ>lSj+H8RuH1J1JZZ9Ug@*EQaZ1g_YatV3 zhqO}Y!1;-66?mq1q>|p^wikL*?jUx!Mr>|1Kw~327`hr_2US6$NwZO45T%2Ks`*0f z-y;jR&*z93nNJ^%+c7vuoUlcjZ`Um{6j=JOKbus|Ti<%?d|LGaSva5wb7R%WC4?G; zs!O-vLAOA!CGM|qpi=D}rpNpqwu7dk_SW}n+WekAzW?&|^V8cO>A$E(`*PTu!r|X& zwRWm~ez$7vv|rAI6hQn{wA12$6L(DzN&JAq>u>(+-{1Z2>GA8s&wlps=DV+NfBeJr zKv#ysv*GXk0}6cc_GvXa3BiT?8OXDBgXW; zSo0Z%%>fNJ%q6~K8Zr>-`%hW`noi3lJes=$mv`ry<)-;EQh`ykxD9e1zc`IbiX>>r zP{S6@mZW68+TJ*fr3-e@bayI#F0@Gd@GvFZr$=fe5W}<(5U1S$KI`<9WhV$`4H->q z^sq{ZDIiwhu|Wkg0K*xAcANYVONOVdb`(tNa22v$Afvid#hs;H^#4{FI3f?{6fQ*y z8F;8G2tkO5%x4_4aQvlGLo|6ExeTeV6976?0vRD&PR2T`=vxGLhFge*yC1F~1bYl3 z4Qv20^!fEq;g<>s9=HyFqp9VArL>GVHN8mE(eCh34C+b6^;DR7mg{=#c>w>HY9oa+vUW?`1nq}$fg4#jnvI8G`800gJZ{dh+Y>KgC zqg>8NEk)WL4-uax?}GkReL>k*6-iQO6nX?KGr^#TJT|!pfolK6nv&#Bf#H~ZJJbUL z=W+bgF-xfVw6#E80Xf`^N`&&~e*BdMgam&c=_m|6@y%-eL^|e2zfm}Sl$5nZK&SNc z6s#50YdTECs%gj&L4T^g&>T`N)ATk8(Ncxt>guVW)DJsU(hK*61pp6?0YHyG6oQoI z7zfl2IFH;Dme(l&8L9wzj!i;vCvK17{n0Fy@h3or@h3pWP*C3}r5NEf%xK)BO zs&9p~9;F2HA^TE-gBh-FF0i*{E6Xe`)L_KbZnS2F*RA&Ifz8Z-Kz-3rF=`LaK;(y@ z#v!Gq`KkKCnVj(0GaCqkemG1iTBryLA`zkynJGHBA9D1TmALrNd7!_cF$h-S0)hv| zL5!*6x=t5cpSRXDaDzUVxbl&%5BmBUwcps&^q(JI{S4$N)98~A-GJNfL)RpB)8&+O zysU^SDC2T`lqJ=kSL^ue1IzcZmT-Q?ElXEfg@^jA73%%MUR%Ny(y$;DGQjRUP~k#s z4dUboK!z$np26H=5!x66A)vce^D$Igsh?=k7b}Dz%RkXGr%N-!Q4$=Oqz=zM}4yf)C!v}Lj=jbpV%J$xLD2KD}^|~~} z{_>5+AVOdo$&}$d$R}?e(k)cZ>x~z*59MxxLCrULD9I!*Kq>;weF$P4QWBV-42>0|=6s_Zyi0DSrr(xzl8IgL(3pxxrcE$;4FDb*13<4M zyDj-`XEZ6KsCjp?C`kn%Llqz+I&KVa@)kyv>=8ULzV-!iSlpSy$0zN~1LGhnpHDzg z1H6wz*%FupW)&HL5&Zc*f@+JyG|%n}z&tDNF~}Zar&!%AM{!O2qhuUTy9voNHZ=>! zOR8|(EEW!-q@wVYc;ixbj12j2K{get_r!0}h4E>#s#eKzgVRdSXFcSd&+@#*0m+|BJooVsx*I*9ef4GLsImiG>IeH26*7}r6x3b>Yt z*|}*r7=o_y4eKBU!8)h}uvrJ8zzVJ@Y!TZ9Rl;Jm1vZA#NJVJt(AzR=pEo=!X^l{g ziH{&KNGOH=!rzoT1m2{`6E!Ue!3lOa;%|rv{z)w}NCfHsz-#1=3>+O>VPND24ioke zPc3uIID^3R3A>bf!V3@{8V5qJ-GikJmk|)U3DgB5uT>y2Q~|P`)8H|jW4)E^M3i4V zlJw-oPSH&T5qn87?(Jhy-3Gc}ot}&T8`ij-}tu8*1Bq3s)t) zapAPWK3X0!5~@E{U(<5m?s2R|r#8|Te2YQC(B`+lh5J@a3TKDx(YOV^H;g?J+d zssqImu@N1kDo9%r^fPTheWE({uN!U2gg z*byGlJ+i+)v%lFI6x@ObaKh4q;ee#)#*)x#=~z0pBVSW9Rj5+RihUQB1#@tj===>F zJ>s7!$WLF78k3ahgk-|dx{s7ATQ+eaArym!Vo~%=%aM$WEeO2!9LX?!=vBbnfiQ=p zA0pCL`#^LXtLp8WyMSOtEg*Q{-b%M_>aaN=%0CUOOy_1#LS8n@lI0feer zb%8i8j6ig#1hRSGrfM&TN+Ch&cde)oN|;ZnZi?<*TlQ_X-@>JlM!*<$AI$PpFh)I| zR|gY10b?q=QXFu5;bJpMSJ)30n`st*UXM#DL0y<`ELouVhFkV3CPuH2sk(tRMMxOL zsE8;lLlO14`=WxR4~ZbmDl!=x6%SE@feBk>1c^Z_CNJvrW}+hs(tz8pAp7w*;wv1bD(9gtmkN+Qa-FEEq|w3^H));4%-R`<3{`-P zvY8myIKttIWV(W*gaf|+xH|^=*n=%oRhA}2?>WaIeF;N zosKZ^#^}a!t|*;O*Ks2M>NoYYu$!i9q;=6HC9hU-mvBeP7jBZiD~oW@P3ifJ-U;q; zqldGsMFc{mweAhY14U?zDkC$b%k73MIV_Pt3=52aP=S%53a{4%M%K;ZBC9B(8>7M^ zI+<9K+WeSPYV9{?w2}|Wn=_)54Y=pf$;3GDs^&WRN&y<4RtGPw@jb2@(i-32#x)`_40Pt6| zBc|Jm(cPEsG*+)JqDBHLmFd;R1y>iR@OQko_~u_ee*En=6Y zPkgEI=bt{mfBO9JJzap@{q_~^>3#Y7@K2wg-hKM?_1)8lPoJMY{P6k5zr6kY^uxz5 zU*G=z_iw-c@af|}zk2iCpWc1_>mQyT-u&ASAOGjoo8QnC%kO7Yph)*e=-TfC)$@jv z0g3DENc+`gu_k6(ZI^Vo{0nJIemVMz!X=B?D2RRKGq>&|290^bmJ)m7s-Ep&@T17gXmt~ zOd?_=o1-NU^(}VF6Prp+}( zJ(b~jii>(w&L>10s8mGk(G{-Znd=o}_?Oi(!f)Vwr2?N;Mrq(y5$Pa96*OKvGbts^ zDl%e@(m@;y_Tr>D?7oH5R>SXeD=v6M7dCX{4Vg?jdqMkW_&P~;5NXQ~&d6SvR-Ci# zT*C$CoLso45Mct`(4&!D6#o3q88GO?h6_IVn&^6W_B=wG3$4REuj^?0YAHC4%2jTj zetZ5F#M&Ug{%PYSh}CEC%@j#9egPNU#9DB-vG^iSqkWS`@J6o5^{49`q>-7cxGCsD zoPy}ytyi;f0~S}8itlVw&OEQH8=#z-rx2WGJEKCkQO)5*@$PjAu5 zKCN^LndWbUPx69<9Z*A$Tb-CUc?uny6rwtIMTlsSL}sqyrl8B6B2sX<*ikc2!Ebixs1temo%C{8VauPrY-KdQ=dw(5{2jGjkO`&qclUgw`a5 zCU5U-_IX`hpL%v)pL+IbrQU{GvyPU?=|H2wfDrIb!k`U_MaKdiRPvFDh1ReC$fBA(_L`; zu%Ra1;x4j)+}p&WT=($8huxt_71N(=rWh*5X|*xW3=nmJe3 z;1%mUp?Cw;d9_a~F`-y-oF$X3PC)8n%-0h}zSBNG@|~2=L&hTh{fPRW_$U6`8}l=g zPmpyMJG)obl6^0#ryNkCCiGwCr}ca1IUencB(?_EQCoM;*cX^J6&FPoTr+K~D8s@5CD18=X`i-ONG)HC>X=&?K(S-46)}VX^ZW<~h!V)= zqFRtKosbk-<@>3W0n&}&6|Sx)`+hW%o>qAI?9=Z1y#k|j#t@=r1&X6;3m-^OjM=X) z5SVXDOKVeFsM%_GcZ09O&pUcEpPil%~G8%)WldOdPi>c=HxrI$hSul2D(aT^F8_6Hiez7C}O6&)uz}Z<_!&zt*uQk z`@F8^8mq!WYLZaQ3j4Gnp%+P9GpcV%aQYyBiN3P1DfFi?n_`dqqv+3(A#9kKX11d5 zdYgh0C^)^xAhCIrw$JPPZ?h>ZOtS_ri(*sQrwt)HHU+Hf%6+2?Y-*k#`A+N}!!|`@ zE!p?7O<|wb@15sLQha0g*u!{(%RS?`3*T;@ANuyq_C#Yv83x#%uunS-6i1QP{)s&t zw=*_iz&t;KfvxsLV?EjTvpr#-cHi%n*9LondJmQzyfTL%RmXl?SBEoh?{)U0mN{Xj zDrTR{n!r60RKpmjyM10)*S99@yru>dYr;OQ^vtY@rZXN@_FnV-TJtV%Odvh8NjtQ# z!|mrx8~FXFNjx)G@pEOySm(5ht2Q`t=Id;0E&IH#t)6O$!Unk4joiulJG>mCiWQsy zlxb<6HgtpE7iWq0aK_V_VzusV6Hplo8iry#8trqTIts&%#at)U@j~$d8?@!2F#xoJ z1GbD*`GF?WF{nG)tv3RYp$d?ZVBr|v5b`9Ml8T;HQy1M;=e@t8_61P4hT3vVfx=}a!aVy9i6W(28ZFUe_o zLtf}hON*aEON;YMUa0Gc(#i{^R7Os)`$qFZQzMDrJbn4}r_Ya1UqYLS|M>jr@w+GF zL%#WsU;gUh&3``q->(mE{`JSV|NZpy^zUD!fB!4e4}bOPW9&}R>SEE)3*FGtBDA_- zq^GP#97dPfWi?*z*I<7A#dofo1LsbMjsJK?b`sw*Q40g%6ZTWm?PFZL2{#%;rIS!m zC3Sd!1qlxz{f7QHAC|}U13iuZLPyoA?yVYsoO76rKeJes{8L?ni7;5r7VrKt>D`+E{T$M?V9!{-k7$6N*6*pU+!hjcf$Io>r%1$NP%P&(C5&AK|lll3PWhXFh(h$Acl}w{}z6! zfZ&1asUVTR7A44}xxEiZmT&`$h6*8t#0YrusZwor5`gi9I#-Bup;k-?njZ1b;3dW{ z6l+86g^;91FhY_cC4!2iI?L?{2PDPcGA2t+t&j->7vOq4(oqac+DCBcP8M2WaduE~ z%r?1hSYoVBg@w6rSk9si{)*x$yrsM{%3TovYWq-aBC8Vh}UHb@qq+-NvrSjX`NEtLNj$ zAh!c4CvYa)ftZWTnC@I9l+4$m0>(C8N8lRUc)mePUJv;QSIV#m`4%VC7dbaIeI4<- z(!`hIpgN|34d2h`XC@m&zFR{ifDRQ1tbYf;Qb@o9#r#nMD4$y*vpaL3aa{jw4Lx?m=OVZjjs zC;%Y>Ll`B2f?zV}NQuVFlEe^X4FxGj$)J*CNns?ZQ@(X0A@0M-2jss^^J*o5hq~M> zE7*rZ>*3D>u7{m)gQq*$Pz;7rtklj`Rx3b8i4bJraHfKS<$*77JWjK4&uf$Qjc9l4 zjygnGCn}ZkPiIWaX2b*IAW#c%0DG53KtQAqxdHtm1C9hL18~QsPWJ15d5?s@baGZF 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�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 Date: Tue, 9 Jan 2024 08:30:52 +0000 Subject: [PATCH 13/39] Remove unreachable code from 2.0.1 CSMS example. (#561) --- examples/v201/central_system.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/v201/central_system.py b/examples/v201/central_system.py index 0f5fb515e..54a880d89 100644 --- a/examples/v201/central_system.py +++ b/examples/v201/central_system.py @@ -42,8 +42,6 @@ async def on_connect(websocket, path): try: requested_protocols = websocket.request_headers["Sec-WebSocket-Protocol"] except KeyError: - logging.info("Client hasn't requested any Subprotocol. " "Closing Connection") - return await websocket.close() logging.error("Client hasn't requested any Subprotocol. Closing Connection") return await websocket.close() if websocket.subprotocol: From 71fee9c7f102d836f744d4d50e21adaa97f398dd Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Tue, 9 Jan 2024 09:39:14 +0100 Subject: [PATCH 14/39] Attributes with 'v2x' are serialized as 'V2x', but should be serialized as 'V2X' (#522) --- CHANGELOG.md | 1 + ocpp/charge_point.py | 3 ++- tests/test_charge_point.py | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 013775bc6..32e052bb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Change log +- [#431](https://github.com/mobilityhouse/ocpp/issues/431) Attributes with 'v2x' are serialized as 'V2x', but should be serialized as 'V2X' - [#554](https://github.com/mobilityhouse/ocpp/issues/554) OCPP 2.0.1 Edition 2 Errata 2023-12 document added - [#548](https://github.com/mobilityhouse/ocpp/issues/548) OCPP 2.0.1 MessageInfoType attribute name correction - [#300](https://github.com/mobilityhouse/ocpp/issues/300) OCPP 2.0.1 add reference components and variables diff --git a/ocpp/charge_point.py b/ocpp/charge_point.py index c4a82d41c..997943de7 100644 --- a/ocpp/charge_point.py +++ b/ocpp/charge_point.py @@ -44,7 +44,7 @@ def camel_to_snake_case(data): def snake_to_camel_case(data): """ - Convert all keys of a all dictionaries inside given argument from + Convert all keys of all dictionaries inside given argument from snake_case to camelCase. Inspired by: https://stackoverflow.com/a/19053800/1073222 @@ -53,6 +53,7 @@ def snake_to_camel_case(data): camel_case_dict = {} for key, value in data.items(): key = key.replace("soc", "SoC") + key = key.replace("_v2x", "V2X") components = key.split("_") key = components[0] + "".join(x[:1].upper() + x[1:] for x in components[1:]) camel_case_dict[key] = snake_to_camel_case(value) diff --git a/tests/test_charge_point.py b/tests/test_charge_point.py index de505baad..e6b320ef0 100644 --- a/tests/test_charge_point.py +++ b/tests/test_charge_point.py @@ -65,6 +65,8 @@ def test_camel_to_snake_case(test_input, expected): [ ({"transaction_id": "74563478"}, {"transactionId": "74563478"}), ({"full_soc": 100}, {"fullSoC": 100}), + ({"ev_min_v2x_energy_request": 200}, {"evMinV2XEnergyRequest": 200}), + ({"v2x_charging_ctrlr": 200}, {"v2xChargingCtrlr": 200}), ], ) def test_snake_to_camel_case(test_input, expected): From 5f27521b5c7b83abfb61217036ae5776e1fb6998 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Tue, 9 Jan 2024 09:43:06 +0100 Subject: [PATCH 15/39] Fix type hint of OCPP 1.6 ChangeConfiguration.value (#525) --- CHANGELOG.md | 2 ++ ocpp/v16/call.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32e052bb8..e83bb5514 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Change log +- [#366](https://github.com/mobilityhouse/ocpp/issues/366) Fix type hint of OCPP 1.6 ChangeConfiguration.value - [#431](https://github.com/mobilityhouse/ocpp/issues/431) Attributes with 'v2x' are serialized as 'V2x', but should be serialized as 'V2X' - [#554](https://github.com/mobilityhouse/ocpp/issues/554) OCPP 2.0.1 Edition 2 Errata 2023-12 document added - [#548](https://github.com/mobilityhouse/ocpp/issues/548) OCPP 2.0.1 MessageInfoType attribute name correction @@ -8,6 +9,7 @@ ## 0.24.0 (2023-12-07) + - [#539](https://github.com/mobilityhouse/ocpp/issues/539) feat: Add ChargePoint._handle_call return value. Thanks [@wafa-yah](https://github.com/wafa-yah) - [#266](https://github.com/mobilityhouse/ocpp/issues/266) fix: Central System documentation link. - [#516](https://github.com/mobilityhouse/ocpp/issues/516) OCPP 2.0.1 add additional security events from v1.3. diff --git a/ocpp/v16/call.py b/ocpp/v16/call.py index 54e35c4d6..fe07e7d6d 100644 --- a/ocpp/v16/call.py +++ b/ocpp/v16/call.py @@ -1,5 +1,5 @@ from dataclasses import dataclass, field -from typing import Any, Dict, List, Optional +from typing import Dict, List, Optional from ocpp.v16.enums import ( AvailabilityType, @@ -55,7 +55,7 @@ class ChangeAvailabilityPayload: @dataclass class ChangeConfigurationPayload: key: str - value: Any + value: str @dataclass From a9df8ebdaee922c323be1d06eace2d5a35a5f747 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Tue, 9 Jan 2024 10:03:44 +0100 Subject: [PATCH 16/39] Bump to 0.25.0 (#558) --- CHANGELOG.md | 3 ++- docs/source/conf.py | 2 +- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e83bb5514..5d263a851 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change log +## 0.25.0 (2024-01-08) + - [#366](https://github.com/mobilityhouse/ocpp/issues/366) Fix type hint of OCPP 1.6 ChangeConfiguration.value - [#431](https://github.com/mobilityhouse/ocpp/issues/431) Attributes with 'v2x' are serialized as 'V2x', but should be serialized as 'V2X' - [#554](https://github.com/mobilityhouse/ocpp/issues/554) OCPP 2.0.1 Edition 2 Errata 2023-12 document added @@ -9,7 +11,6 @@ ## 0.24.0 (2023-12-07) - - [#539](https://github.com/mobilityhouse/ocpp/issues/539) feat: Add ChargePoint._handle_call return value. Thanks [@wafa-yah](https://github.com/wafa-yah) - [#266](https://github.com/mobilityhouse/ocpp/issues/266) fix: Central System documentation link. - [#516](https://github.com/mobilityhouse/ocpp/issues/516) OCPP 2.0.1 add additional security events from v1.3. diff --git a/docs/source/conf.py b/docs/source/conf.py index 94bd22556..592b903c2 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -23,7 +23,7 @@ author = "Auke Willem Oosterhoff" # The full version, including alpha/beta/rc tags -release = "0.24.0" +release = "0.25.0" # -- General configuration --------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index b3e991d40..fa17c9d27 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "ocpp" -version = "0.24.0" +version = "0.25.0" description = "Python package implementing the JSON version of the Open Charge Point Protocol (OCPP)." authors = [ "André Duarte ", From 7d50b6cc3dfc173f9e72727107cfacfe34893c41 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Mon, 15 Jan 2024 14:59:13 +0100 Subject: [PATCH 17/39] Fix type hint v16.datatypes.SampledValue.context (#495) Co-authored-by: Auke Willem Oosterhoff <1565144+OrangeTux@users.noreply.github.com> --- CHANGELOG.md | 2 ++ ocpp/v16/datatypes.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d263a851..7bc698c14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change log +- [#421](https://github.com/mobilityhouse/ocpp/issues/421) Type of v16.datatypes.SampledValue.context is incorrect + ## 0.25.0 (2024-01-08) - [#366](https://github.com/mobilityhouse/ocpp/issues/366) Fix type hint of OCPP 1.6 ChangeConfiguration.value diff --git a/ocpp/v16/datatypes.py b/ocpp/v16/datatypes.py index aa652f80d..36c751a7c 100644 --- a/ocpp/v16/datatypes.py +++ b/ocpp/v16/datatypes.py @@ -105,7 +105,7 @@ class SampledValue: """ value: str - context: ReadingContext + context: Optional[ReadingContext] = None format: Optional[ValueFormat] = None measurand: Optional[Measurand] = None phase: Optional[Phase] = None From fab6536c648f4a10f957bdeb0701ce99817f2757 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Mon, 15 Jan 2024 15:59:17 +0100 Subject: [PATCH 18/39] Make formatting of enums in py3.11 consistent with earlier Python versions (#550) Python 3.11 changes the behavior of `enum.Enum.__format__()` slightly. f-strings (and a few other string formatting methods) rely on dunder method `__format___()`. This change makes the formatting of enums as strings consistent among all supported Python versions. Fixes #447 --- CHANGELOG.md | 2 + ocpp/v16/enums.py | 105 +++++++------ ocpp/v201/enums.py | 361 +++++++++++++++++++++++---------------------- 3 files changed, 242 insertions(+), 226 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bc698c14..b1afefabc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Change log +- [#447](https://github.com/mobilityhouse/ocpp/issues/447) Make formatting of enums in py3.11 consistent with earlier Python versions - [#421](https://github.com/mobilityhouse/ocpp/issues/421) Type of v16.datatypes.SampledValue.context is incorrect ## 0.25.0 (2024-01-08) @@ -13,6 +14,7 @@ ## 0.24.0 (2023-12-07) + - [#539](https://github.com/mobilityhouse/ocpp/issues/539) feat: Add ChargePoint._handle_call return value. Thanks [@wafa-yah](https://github.com/wafa-yah) - [#266](https://github.com/mobilityhouse/ocpp/issues/266) fix: Central System documentation link. - [#516](https://github.com/mobilityhouse/ocpp/issues/516) OCPP 2.0.1 add additional security events from v1.3. diff --git a/ocpp/v16/enums.py b/ocpp/v16/enums.py index 8071fe17c..1d84ba10b 100644 --- a/ocpp/v16/enums.py +++ b/ocpp/v16/enums.py @@ -1,7 +1,14 @@ -from enum import Enum +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 Action(str, Enum): + +class Action(StrEnum): """An Action is a required part of a Call message.""" Authorize = "Authorize" @@ -45,7 +52,7 @@ class Action(str, Enum): UpdateFirmware = "UpdateFirmware" -class AuthorizationStatus(str, Enum): +class AuthorizationStatus(StrEnum): """ Elements that constitute an entry of a Local Authorization List update. """ @@ -57,7 +64,7 @@ class AuthorizationStatus(str, Enum): concurrent_tx = "ConcurrentTx" -class AvailabilityStatus(str, Enum): +class AvailabilityStatus(StrEnum): """ Status returned in response to ChangeAvailability.req. """ @@ -67,7 +74,7 @@ class AvailabilityStatus(str, Enum): scheduled = "Scheduled" -class AvailabilityType(str, Enum): +class AvailabilityType(StrEnum): """ Requested availability change in ChangeAvailability.req. """ @@ -76,7 +83,7 @@ class AvailabilityType(str, Enum): operative = "Operative" -class CancelReservationStatus(str, Enum): +class CancelReservationStatus(StrEnum): """ Status in CancelReservation.conf. """ @@ -85,7 +92,7 @@ class CancelReservationStatus(str, Enum): rejected = "Rejected" -class CertificateSignedStatus(str, Enum): +class CertificateSignedStatus(StrEnum): """ CertificateSignedStatusEnumType is used by: CertificateSigned.conf """ @@ -94,7 +101,7 @@ class CertificateSignedStatus(str, Enum): rejected = "Rejected" -class CertificateStatus(str, Enum): +class CertificateStatus(StrEnum): """ CertificateStatusEnumType is used by: InstallCertificate.conf """ @@ -104,7 +111,7 @@ class CertificateStatus(str, Enum): failed = "Failed" -class CertificateUse(str, Enum): +class CertificateUse(StrEnum): """ CertificateUseEnumType is used by: GetInstalledCertificateIds.req, InstallCertificate.req @@ -114,7 +121,7 @@ class CertificateUse(str, Enum): manufacturer_root_certificate = "ManufacturerRootCertificate" -class ChargePointErrorCode(str, Enum): +class ChargePointErrorCode(StrEnum): """ Charge Point status reported in StatusNotification.req. """ @@ -155,7 +162,7 @@ class ChargePointErrorCode(str, Enum): weakSignal = "WeakSignal" -class ChargePointStatus(str, Enum): +class ChargePointStatus(StrEnum): """ Status reported in StatusNotification.req. A status can be reported for the Charge Point main controller (connectorId = 0) or for a specific @@ -182,7 +189,7 @@ class ChargePointStatus(str, Enum): suspendedev = "SuspendedEV" -class ChargingProfileKindType(str, Enum): +class ChargingProfileKindType(StrEnum): """ "Absolute": Schedule periods are relative to a fixed point in time defined in the schedule. @@ -196,7 +203,7 @@ class ChargingProfileKindType(str, Enum): relative = "Relative" -class ChargingProfilePurposeType(str, Enum): +class ChargingProfilePurposeType(StrEnum): """ In load balancing scenarios, the Charge Point has one or more local charging profiles that limit the power or current to be shared by all @@ -242,7 +249,7 @@ class ChargingProfilePurposeType(str, Enum): txprofile = "TxProfile" -class ChargingProfileStatus(str, Enum): +class ChargingProfileStatus(StrEnum): """ Status returned in response to SetChargingProfile.req. """ @@ -254,7 +261,7 @@ class ChargingProfileStatus(str, Enum): notSupported = "NotSupported" -class ChargingRateUnitType(str, Enum): +class ChargingRateUnitType(StrEnum): """ Unit in which a charging schedule is defined, as used in: GetCompositeSchedule.req and ChargingSchedule @@ -276,7 +283,7 @@ class CiStringType(int): ci_string_500 = 500 -class ClearCacheStatus(str, Enum): +class ClearCacheStatus(StrEnum): """ Status returned in response to ClearCache.req. """ @@ -285,7 +292,7 @@ class ClearCacheStatus(str, Enum): rejected = "Rejected" -class ClearChargingProfileStatus(str, Enum): +class ClearChargingProfileStatus(StrEnum): """ Status returned in response to ClearChargingProfile.req. """ @@ -294,7 +301,7 @@ class ClearChargingProfileStatus(str, Enum): unknown = "Unknown" -class ConfigurationStatus(str, Enum): +class ConfigurationStatus(StrEnum): """ Status in ChangeConfiguration.conf. """ @@ -309,7 +316,7 @@ class ConfigurationStatus(str, Enum): notSupported = "NotSupported" -class ConfigurationKey(str, Enum): +class ConfigurationKey(StrEnum): """ Configuration Key Names. """ @@ -383,7 +390,7 @@ class ConfigurationKey(str, Enum): security_profile = "SecurityProfile" -class DataTransferStatus(str, Enum): +class DataTransferStatus(StrEnum): """ Status in DataTransfer.conf. """ @@ -398,7 +405,7 @@ class DataTransferStatus(str, Enum): unknownVendorId = "UnknownVendorId" -class DeleteCertificateStatus(str, Enum): +class DeleteCertificateStatus(StrEnum): """ DeleteCertificateStatusEnumType is used by: DeleteCertificate.conf """ @@ -408,7 +415,7 @@ class DeleteCertificateStatus(str, Enum): not_found = "NotFound" -class DiagnosticsStatus(str, Enum): +class DiagnosticsStatus(StrEnum): """ Status in DiagnosticsStatusNotification.req. """ @@ -422,7 +429,7 @@ class DiagnosticsStatus(str, Enum): uploadFailed = "UploadFailed" -class FirmwareStatus(str, Enum): +class FirmwareStatus(StrEnum): """ Status of a firmware download as reported in FirmwareStatusNotification.req """ @@ -451,7 +458,7 @@ class FirmwareStatus(str, Enum): installationFailed = "InstallationFailed" -class GenericStatus(str, Enum): +class GenericStatus(StrEnum): """ Generic message response status """ @@ -460,7 +467,7 @@ class GenericStatus(str, Enum): rejected = "Rejected" -class GetCompositeScheduleStatus(str, Enum): +class GetCompositeScheduleStatus(StrEnum): """ Status returned in response to GetCompositeSchedule.req """ @@ -469,7 +476,7 @@ class GetCompositeScheduleStatus(str, Enum): rejected = "Rejected" -class GetInstalledCertificateStatus(str, Enum): +class GetInstalledCertificateStatus(StrEnum): """ GetInstalledCertificateStatusEnumType is used by: GetInstalledCertificateIds.conf @@ -479,7 +486,7 @@ class GetInstalledCertificateStatus(str, Enum): not_found = "NotFound" -class HashAlgorithm(str, Enum): +class HashAlgorithm(StrEnum): """ HashAlgorithmEnumType is used by: CertificateHashDataType """ @@ -489,7 +496,7 @@ class HashAlgorithm(str, Enum): sha512 = "SHA512" -class Location(str, Enum): +class Location(StrEnum): """ Allowable values of the optional "location" field of a value element in SampledValue. @@ -502,7 +509,7 @@ class Location(str, Enum): ev = "EV" -class Log(str, Enum): +class Log(StrEnum): """ LogEnumType is used by GetLog.req """ @@ -511,7 +518,7 @@ class Log(str, Enum): security_log = "SecurityLog" -class LogStatus(str, Enum): +class LogStatus(StrEnum): """ LogStatusEnumType is used by: GetLog.conf """ @@ -521,7 +528,7 @@ class LogStatus(str, Enum): accepted_canceled = "AcceptedCanceled" -class Measurand(str, Enum): +class Measurand(StrEnum): """ Allowable values of the optional "measurand" field of a Value element, as used in MeterValues.req and StopTransaction.req messages. Default value of @@ -571,7 +578,7 @@ class Measurand(str, Enum): powerReactiveImport = "Power.Reactive.Import" -class MessageTrigger(str, Enum): +class MessageTrigger(StrEnum): """ Type of request to be triggered in a TriggerMessage.req """ @@ -598,7 +605,7 @@ class MessageTrigger(str, Enum): statusNotification = "StatusNotification" -class Phase(str, Enum): +class Phase(StrEnum): """ Phase as used in SampledValue. Phase specifies how a measured value is to be interpreted. Please note that not all values of Phase are applicable to @@ -625,7 +632,7 @@ class Phase(str, Enum): l3l1 = "L3-L1" -class ReadingContext(str, Enum): +class ReadingContext(StrEnum): """ Values of the context field of a value in SampledValue. """ @@ -648,7 +655,7 @@ class ReadingContext(str, Enum): transactionEnd = "Transaction.End" -class Reason(str, Enum): +class Reason(StrEnum): """ Reason for stopping a transaction in StopTransaction.req. """ @@ -675,7 +682,7 @@ class Reason(str, Enum): deAuthorized = "DeAuthorized" -class RecurrencyKind(str, Enum): +class RecurrencyKind(StrEnum): """ "Daily": The schedule restarts at the beginning of the next day. "Weekly": The schedule restarts at the beginning of the next week @@ -686,7 +693,7 @@ class RecurrencyKind(str, Enum): weekly = "Weekly" -class RegistrationStatus(str, Enum): +class RegistrationStatus(StrEnum): """ Result of registration in response to BootNotification.req. """ @@ -696,7 +703,7 @@ class RegistrationStatus(str, Enum): rejected = "Rejected" -class RemoteStartStopStatus(str, Enum): +class RemoteStartStopStatus(StrEnum): """ The result of a RemoteStartTransaction.req or RemoteStopTransaction.req request. @@ -706,7 +713,7 @@ class RemoteStartStopStatus(str, Enum): rejected = "Rejected" -class ReservationStatus(str, Enum): +class ReservationStatus(StrEnum): """ Status in ReserveNow.conf. """ @@ -718,7 +725,7 @@ class ReservationStatus(str, Enum): unavailable = "Unavailable" -class ResetStatus(str, Enum): +class ResetStatus(StrEnum): """ Result of Reset.req """ @@ -727,7 +734,7 @@ class ResetStatus(str, Enum): rejected = "Rejected" -class ResetType(str, Enum): +class ResetType(StrEnum): """ Type of reset requested by Reset.req """ @@ -736,7 +743,7 @@ class ResetType(str, Enum): soft = "Soft" -class TriggerMessageStatus(str, Enum): +class TriggerMessageStatus(StrEnum): """ Status in TriggerMessage.conf. """ @@ -749,7 +756,7 @@ class TriggerMessageStatus(str, Enum): notImplemented = "NotImplemented" -class UnitOfMeasure(str, Enum): +class UnitOfMeasure(StrEnum): """ Allowable values of the optional "unit" field of a Value element, as used in MeterValues.req and StopTransaction.req messages. Default value of @@ -775,7 +782,7 @@ class UnitOfMeasure(str, Enum): hertz = "Hertz" -class UnlockStatus(str, Enum): +class UnlockStatus(StrEnum): """ Status in response to UnlockConnector.req. """ @@ -789,7 +796,7 @@ class UnlockStatus(str, Enum): notSupported = "NotSupported" -class UpdateFirmwareStatus(str, Enum): +class UpdateFirmwareStatus(StrEnum): """ UpdateFirmwareStatusEnumType is used by: SignedUpdateFirmware.conf """ @@ -801,7 +808,7 @@ class UpdateFirmwareStatus(str, Enum): revoked_certificate = "RevokedCertificate" -class UploadLogStatus(str, Enum): +class UploadLogStatus(StrEnum): """ UploadLogStatusEnumType is used by: LogStatusNotification.req """ @@ -815,7 +822,7 @@ class UploadLogStatus(str, Enum): uploading = "Uploading" -class UpdateStatus(str, Enum): +class UpdateStatus(StrEnum): """ Type of update for a SendLocalList.req. """ @@ -830,7 +837,7 @@ class UpdateStatus(str, Enum): versionMismatch = "VersionMismatch" -class UpdateType(str, Enum): +class UpdateType(StrEnum): """ Type of update for a SendLocalList.req. """ @@ -839,7 +846,7 @@ class UpdateType(str, Enum): full = "Full" -class ValueFormat(str, Enum): +class ValueFormat(StrEnum): """ Format that specifies how the value element in SampledValue is to be interpreted. diff --git a/ocpp/v201/enums.py b/ocpp/v201/enums.py index 625fafbf3..60b2fb533 100644 --- a/ocpp/v201/enums.py +++ b/ocpp/v201/enums.py @@ -1,7 +1,14 @@ -from enum import Enum +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 Action(str, Enum): + +class Action(StrEnum): """An Action is a required part of a Call message.""" Authorize = "Authorize" @@ -73,7 +80,7 @@ class Action(str, Enum): # Enums -class APNAuthenticationType(str, Enum): +class APNAuthenticationType(StrEnum): """ APNAuthenticationEnumType is used by setNetworkProfileSetNetworkProfileRequest.APNType @@ -85,7 +92,7 @@ class APNAuthenticationType(str, Enum): auto = "AUTO" -class AttributeType(str, Enum): +class AttributeType(StrEnum): """ AttributeEnumType is used by Common:VariableAttributeType, getVariables:GetVariablesRequest.GetVariableDataType , @@ -101,7 +108,7 @@ class AttributeType(str, Enum): maxSet = "MaxSet" -class AuthorizationStatusType(str, Enum): +class AuthorizationStatusType(StrEnum): """ Elements that constitute an entry of a Local Authorization List update. """ @@ -121,7 +128,7 @@ class AuthorizationStatusType(str, Enum): unknown = "Unknown" -class AuthorizeCertificateStatusType(str, Enum): +class AuthorizeCertificateStatusType(StrEnum): """ Status of the EV Contract certificate. """ @@ -135,7 +142,7 @@ class AuthorizeCertificateStatusType(str, Enum): contract_cancelled = "ContractCancelled" -class BootReasonType(str, Enum): +class BootReasonType(StrEnum): """ BootReasonEnumType is used by bootNotificationBootNotificationRequest """ @@ -151,7 +158,7 @@ class BootReasonType(str, Enum): watchdog = "Watchdog" -class CancelReservationStatusType(str, Enum): +class CancelReservationStatusType(StrEnum): """ Status in CancelReservationResponse. """ @@ -160,7 +167,7 @@ class CancelReservationStatusType(str, Enum): rejected = "Rejected" -class CertificateActionType(str, Enum): +class CertificateActionType(StrEnum): """ CertificateActionEnumType is used by get15118EVCertificateGet15118EVCertificateRequest @@ -170,12 +177,12 @@ class CertificateActionType(str, Enum): update = "Update" -class CertificateSignedStatusType(str, Enum): +class CertificateSignedStatusType(StrEnum): accepted = "Accepted" rejected = "Rejected" -class CertificateSigningUseType(str, Enum): +class CertificateSigningUseType(StrEnum): """ CertificateSigningUseEnumType is used by signCertificate SignCertificateRequest , @@ -186,7 +193,7 @@ class CertificateSigningUseType(str, Enum): v2g_certificate = "V2GCertificate" -class ChangeAvailabilityStatusType(str, Enum): +class ChangeAvailabilityStatusType(StrEnum): """ Status returned in response to ChangeAvailability.req. """ @@ -196,7 +203,7 @@ class ChangeAvailabilityStatusType(str, Enum): scheduled = "Scheduled" -class ChargingLimitSourceType(str, Enum): +class ChargingLimitSourceType(StrEnum): """ Enumeration for indicating from which source a charging limit originates. """ @@ -207,7 +214,7 @@ class ChargingLimitSourceType(str, Enum): cso = "CSO" -class ChargingProfileKindType(str, Enum): +class ChargingProfileKindType(StrEnum): """ "Absolute" Schedule periods are relative to a fixed point in time defined in the schedule. @@ -221,7 +228,7 @@ class ChargingProfileKindType(str, Enum): relative = "Relative" -class ChargingProfilePurposeType(str, Enum): +class ChargingProfilePurposeType(StrEnum): """ In load balancing scenarios, the Charge Point has one or more local charging profiles that limit the power or current to be shared by all @@ -265,7 +272,7 @@ class ChargingProfilePurposeType(str, Enum): tx_profile = "TxProfile" -class ChargingProfileStatus(str, Enum): +class ChargingProfileStatus(StrEnum): """ Status returned in response to SetChargingProfile.req. """ @@ -274,7 +281,7 @@ class ChargingProfileStatus(str, Enum): rejected = "Rejected" -class ChargingRateUnitType(str, Enum): +class ChargingRateUnitType(StrEnum): """ Unit in which a charging schedule is defined, as used in GetCompositeSchedule.req and ChargingSchedule @@ -284,7 +291,7 @@ class ChargingRateUnitType(str, Enum): amps = "A" -class ChargingStateType(str, Enum): +class ChargingStateType(StrEnum): """ The state of the charging process. """ @@ -296,7 +303,7 @@ class ChargingStateType(str, Enum): idle = "Idle" -class ClearCacheStatusType(str, Enum): +class ClearCacheStatusType(StrEnum): """ Status returned in response to ClearCache.req. """ @@ -305,7 +312,7 @@ class ClearCacheStatusType(str, Enum): rejected = "Rejected" -class ClearChargingProfileStatusType(str, Enum): +class ClearChargingProfileStatusType(StrEnum): """ Status returned in response to ClearChargingProfile.req. """ @@ -314,7 +321,7 @@ class ClearChargingProfileStatusType(str, Enum): unknown = "Unknown" -class ClearMessageStatusType(str, Enum): +class ClearMessageStatusType(StrEnum): """ Status returned in response to ClearDisplayMessageRequest. """ @@ -323,7 +330,7 @@ class ClearMessageStatusType(str, Enum): unknown = "Unknown" -class ClearMonitoringStatusType(str, Enum): +class ClearMonitoringStatusType(StrEnum): """ ClearMonitoringStatusEnumType is used by CommonClearMonitoringResultType """ @@ -333,7 +340,7 @@ class ClearMonitoringStatusType(str, Enum): not_found = "NotFound" -class ComponentCriterionType(str, Enum): +class ComponentCriterionType(StrEnum): """ ComponentCriterionEnumType is used by getReportGetReportRequest """ @@ -344,7 +351,7 @@ class ComponentCriterionType(str, Enum): problem = "Problem" -class ConnectorStatusType(str, Enum): +class ConnectorStatusType(StrEnum): """ Status reported in StatusNotification.req. A status can be reported for the Charge Point main controller (connectorId = 0) or for a specific @@ -363,7 +370,7 @@ class ConnectorStatusType(str, Enum): faulted = "Faulted" -class ConnectorType(str, Enum): +class ConnectorType(StrEnum): """ Allowed values of ConnectorCode. """ @@ -422,7 +429,7 @@ class ConnectorType(str, Enum): unknown = "Unknown" -class CostKindType(str, Enum): +class CostKindType(StrEnum): """ CostKindEnumType is used by CommonCostType """ @@ -432,7 +439,7 @@ class CostKindType(str, Enum): renewable_generation_percentage = "RenewableGenerationPercentage" -class CustomerInformationStatusType(str, Enum): +class CustomerInformationStatusType(StrEnum): """ Status in CustomerInformationResponse """ @@ -442,7 +449,7 @@ class CustomerInformationStatusType(str, Enum): invalid = "Invalid" -class DataTransferStatusType(str, Enum): +class DataTransferStatusType(StrEnum): """ Status in DataTransferResponse. """ @@ -453,7 +460,7 @@ class DataTransferStatusType(str, Enum): unknown_vendor_id = "UnknownVendorId" -class DataType(str, Enum): +class DataType(StrEnum): """ DataEnumType is used by CommonVariableCharacteristicsType """ @@ -469,7 +476,7 @@ class DataType(str, Enum): password_string = "passwordString" -class DeleteCertificateStatusType(str, Enum): +class DeleteCertificateStatusType(StrEnum): """ DeleteCertificateStatusEnumType is used by deleteCertificateDeleteCertificateResponse @@ -480,7 +487,7 @@ class DeleteCertificateStatusType(str, Enum): not_found = "NotFound" -class DisplayMessageStatusType(str, Enum): +class DisplayMessageStatusType(StrEnum): """ Result for a SetDisplayMessageRequest as used in a SetDisplayMessageResponse. @@ -494,7 +501,7 @@ class DisplayMessageStatusType(str, Enum): unknown_transaction = "UnknownTransaction" -class EnergyTransferModeType(str, Enum): +class EnergyTransferModeType(StrEnum): """ Enumeration of energy transfer modes. """ @@ -505,7 +512,7 @@ class EnergyTransferModeType(str, Enum): ac_three_phase = "AC_three_phase" -class EventNotificationType(str, Enum): +class EventNotificationType(StrEnum): """ Specifies the event notification type of the message. """ @@ -516,7 +523,7 @@ class EventNotificationType(str, Enum): custom_monitor = "CustomMonitor" -class EventTriggerType(str, Enum): +class EventTriggerType(StrEnum): """ EventTriggerEnumType is used by notifyEventNotifyEventRequest.EventDataType @@ -527,7 +534,7 @@ class EventTriggerType(str, Enum): periodic = "Periodic" -class FirmwareStatusType(str, Enum): +class FirmwareStatusType(StrEnum): """ Status of a firmware download as reported in FirmwareStatusNotificationRequest @@ -549,7 +556,7 @@ class FirmwareStatusType(str, Enum): signature_verified = "SignatureVerified" -class GenericDeviceModelStatusType(str, Enum): +class GenericDeviceModelStatusType(StrEnum): """ Status of a firmware download as reported in GetBaseReportResponse """ @@ -560,7 +567,7 @@ class GenericDeviceModelStatusType(str, Enum): empty_result_set = "EmptyResultSet" -class GenericStatusType(str, Enum): +class GenericStatusType(StrEnum): """ Generic message response status """ @@ -569,7 +576,7 @@ class GenericStatusType(str, Enum): rejected = "Rejected" -class GetCertificateIdUseType(str, Enum): +class GetCertificateIdUseType(StrEnum): v2g_root_certificate = "V2GRootCertificate" mo_root_certificate = "MORootCertificate" csms_root_certificate = "CSMSRootCertificate" @@ -577,7 +584,7 @@ class GetCertificateIdUseType(str, Enum): manufacturer_root_certificate = "ManufacturerRootCertificate" -class GetCertificateStatusType(str, Enum): +class GetCertificateStatusType(StrEnum): """ GetCertificateStatusEnumType is used by getCertificateStatusGetCertificateStatusResponse @@ -587,7 +594,7 @@ class GetCertificateStatusType(str, Enum): failed = "Failed" -class GetChargingProfileStatusType(str, Enum): +class GetChargingProfileStatusType(StrEnum): """ GetChargingProfileStatusEnumType is used by getChargingProfilesGetChargingProfilesResponse @@ -597,7 +604,7 @@ class GetChargingProfileStatusType(str, Enum): no_profiles = "NoProfiles" -class GetDisplayMessagesStatusType(str, Enum): +class GetDisplayMessagesStatusType(StrEnum): """ GetDisplayMessagesStatusEnumType is used by getDisplayMessagesGetDisplayMessagesResponse @@ -607,7 +614,7 @@ class GetDisplayMessagesStatusType(str, Enum): unknown = "Unknown" -class GetInstalledCertificateStatusType(str, Enum): +class GetInstalledCertificateStatusType(StrEnum): """ GetInstalledCertificateStatusEnumType is used by getInstalledCertificateIdsGetInstalledCertificateIdsResponse @@ -617,7 +624,7 @@ class GetInstalledCertificateStatusType(str, Enum): notFound = "NotFound" -class GetVariableStatusType(str, Enum): +class GetVariableStatusType(StrEnum): """ GetVariableStatusEnumType is used by getVariablesGetVariablesResponse.GetVariableResultType @@ -630,7 +637,7 @@ class GetVariableStatusType(str, Enum): not_supported_attribute_type = "NotSupportedAttributeType" -class HashAlgorithmType(str, Enum): +class HashAlgorithmType(StrEnum): """ HashAlgorithmEnumType is used by CommonCertificateHashDataType , CommonOCSPRequestDataType @@ -641,7 +648,7 @@ class HashAlgorithmType(str, Enum): sha512 = "SHA512" -class IdTokenType(str, Enum): +class IdTokenType(StrEnum): """ Allowable values of the IdTokenType field. """ @@ -656,7 +663,7 @@ class IdTokenType(str, Enum): no_authorization = "NoAuthorization" -class InstallCertificateStatusType(str, Enum): +class InstallCertificateStatusType(StrEnum): """ InstallCertificateStatusEnumType is used by installCertificateInstallCertificateResponse @@ -667,7 +674,7 @@ class InstallCertificateStatusType(str, Enum): failed = "Failed" -class InstallCertificateUseType(str, Enum): +class InstallCertificateUseType(StrEnum): """ InstallCertificateUseEnumType is used by installCertificateInstallCertificateRequest @@ -679,7 +686,7 @@ class InstallCertificateUseType(str, Enum): manufacturer_root_certificate = "ManufacturerRootCertificate" -class Iso15118EVCertificateStatusType(str, Enum): +class Iso15118EVCertificateStatusType(StrEnum): """ Iso15118EVCertificateStatusEnumType is used by get15118EVCertificateGet15118EVCertificateResponse @@ -689,7 +696,7 @@ class Iso15118EVCertificateStatusType(str, Enum): failed = "Failed" -class LocationType(str, Enum): +class LocationType(StrEnum): """ Allowable values of the optional "location" field of a value element in SampledValue. @@ -702,7 +709,7 @@ class LocationType(str, Enum): outlet = "Outlet" -class LogType(str, Enum): +class LogType(StrEnum): """ LogEnumType is used by getLogGetLogRequest """ @@ -711,7 +718,7 @@ class LogType(str, Enum): security_log = "SecurityLog" -class LogStatusType(str, Enum): +class LogStatusType(StrEnum): """ Generic message response status """ @@ -721,7 +728,7 @@ class LogStatusType(str, Enum): accepted_canceled = "AcceptedCanceled" -class MeasurandType(str, Enum): +class MeasurandType(StrEnum): """ Allowable values of the optional "measurand" field of a Value element, as used in MeterValues.req and StopTransaction.req messages. Default value of @@ -755,7 +762,7 @@ class MeasurandType(str, Enum): voltage = "Voltage" -class MessageFormatType(str, Enum): +class MessageFormatType(StrEnum): """ Format of a message to be displayed on the display of the Charging Station. """ @@ -766,7 +773,7 @@ class MessageFormatType(str, Enum): utf8 = "UTF8" -class MessagePriorityType(str, Enum): +class MessagePriorityType(StrEnum): """ Priority with which a message should be displayed on a Charging Station. """ @@ -776,7 +783,7 @@ class MessagePriorityType(str, Enum): normal_cycle = "NormalCycle" -class MessageStateType(str, Enum): +class MessageStateType(StrEnum): """ State of the Charging Station during which a message SHALL be displayed. """ @@ -786,7 +793,7 @@ class MessageStateType(str, Enum): idle = "Idle" -class MessageTriggerType(str, Enum): +class MessageTriggerType(StrEnum): """ Type of request to be triggered in a TriggerMessage.req """ @@ -807,7 +814,7 @@ class MessageTriggerType(str, Enum): publish_firmware_status_notification = "PublishFirmwareStatusNotification" -class MonitorType(str, Enum): +class MonitorType(StrEnum): """ MonitorEnumType is used by CommonVariableMonitoringType """ @@ -819,7 +826,7 @@ class MonitorType(str, Enum): periodic_clock_aligned = "PeriodicClockAligned" -class MonitorBaseType(str, Enum): +class MonitorBaseType(StrEnum): """ MonitoringBaseEnumType is used by setMonitoringBaseSetMonitoringBaseRequest @@ -830,7 +837,7 @@ class MonitorBaseType(str, Enum): hard_wired_only = "HardWiredOnly" -class MonitoringCriterionType(str, Enum): +class MonitoringCriterionType(StrEnum): """ MonitoringCriterionEnumType is used by getMonitoringReportGetMonitoringReportRequest @@ -841,7 +848,7 @@ class MonitoringCriterionType(str, Enum): periodic_monitoring = "PeriodicMonitoring" -class MutabilityType(str, Enum): +class MutabilityType(StrEnum): """ MutabilityEnumType is used by CommonVariableAttributeType """ @@ -851,7 +858,7 @@ class MutabilityType(str, Enum): read_write = "ReadWrite" -class NotifyEVChargingNeedsStatusType(str, Enum): +class NotifyEVChargingNeedsStatusType(StrEnum): """ Accepted a SASchedule will be provided momentarily. Rejected Servoce is Not Available @@ -863,7 +870,7 @@ class NotifyEVChargingNeedsStatusType(str, Enum): processing = "Processing" -class OCPPInterfaceType(str, Enum): +class OCPPInterfaceType(StrEnum): """ Enumeration of network interfaces. """ @@ -878,7 +885,7 @@ class OCPPInterfaceType(str, Enum): wireless3 = "Wireless3" -class OCPPTransportType(str, Enum): +class OCPPTransportType(StrEnum): """ Enumeration of OCPP transport mechanisms. SOAP is currently not a valid value for OCPP 2.0. @@ -888,7 +895,7 @@ class OCPPTransportType(str, Enum): soap = "SOAP" -class OCPPVersionType(str, Enum): +class OCPPVersionType(StrEnum): """ Enumeration of OCPP transport mechanisms. SOAP is currently not a valid value for OCPP 2.0. @@ -900,7 +907,7 @@ class OCPPVersionType(str, Enum): ocpp20 = "OCPP20" -class OperationalStatusType(str, Enum): +class OperationalStatusType(StrEnum): """ Requested availability change in ChangeAvailability.req. """ @@ -909,7 +916,7 @@ class OperationalStatusType(str, Enum): operative = "Operative" -class PhaseType(str, Enum): +class PhaseType(StrEnum): """ Phase as used in SampledValue. Phase specifies how a measured value is to be interpreted. Please note that not all values of Phase are applicable to @@ -928,7 +935,7 @@ class PhaseType(str, Enum): l3_l1 = "L3-L1" -class PublishFirmwareStatusType(str, Enum): +class PublishFirmwareStatusType(StrEnum): """ Status for when publishing a Firmware """ @@ -945,7 +952,7 @@ class PublishFirmwareStatusType(str, Enum): publish_failed = "PublishFailed" -class ReadingContextType(str, Enum): +class ReadingContextType(StrEnum): """ Values of the context field of a value in SampledValue. """ @@ -960,7 +967,7 @@ class ReadingContextType(str, Enum): trigger = "Trigger" -class ReasonType(str, Enum): +class ReasonType(StrEnum): """ Reason for stopping a transaction in StopTransactionRequest """ @@ -986,7 +993,7 @@ class ReasonType(str, Enum): timeout = "Timeout" -class RecurrencyKindType(str, Enum): +class RecurrencyKindType(StrEnum): """ "Daily" The schedule restarts at the beginning of the next day. "Weekly" The schedule restarts at the beginning of the next week @@ -997,7 +1004,7 @@ class RecurrencyKindType(str, Enum): weekly = "Weekly" -class RegistrationStatusType(str, Enum): +class RegistrationStatusType(StrEnum): """ Result of registration in response to BootNotification.req. """ @@ -1007,7 +1014,7 @@ class RegistrationStatusType(str, Enum): rejected = "Rejected" -class ReportBaseType(str, Enum): +class ReportBaseType(StrEnum): """ Report Base Type required in GetBaseReportRequest """ @@ -1017,7 +1024,7 @@ class ReportBaseType(str, Enum): summary_inventory = "SummaryInventory" -class RequestStartStopStatusType(str, Enum): +class RequestStartStopStatusType(StrEnum): """ The result of a RemoteStartTransaction.req or RemoteStopTransaction.req request. @@ -1027,12 +1034,12 @@ class RequestStartStopStatusType(str, Enum): rejected = "Rejected" -class ReservationUpdateStatusType(str, Enum): +class ReservationUpdateStatusType(StrEnum): expired = "Expired" removed = "Removed" -class ReserveNowStatusType(str, Enum): +class ReserveNowStatusType(StrEnum): """ Status in ReserveNowResponse. """ @@ -1044,7 +1051,7 @@ class ReserveNowStatusType(str, Enum): unavailable = "Unavailable" -class ResetStatusType(str, Enum): +class ResetStatusType(StrEnum): """ Result of Reset.req """ @@ -1054,7 +1061,7 @@ class ResetStatusType(str, Enum): scheduled = "Scheduled" -class ResetType(str, Enum): +class ResetType(StrEnum): """ Type of reset requested by Reset.req """ @@ -1063,7 +1070,7 @@ class ResetType(str, Enum): on_idle = "OnIdle" -class SendLocalListStatusType(str, Enum): +class SendLocalListStatusType(StrEnum): """ Type of update for a SendLocalList Request. """ @@ -1073,7 +1080,7 @@ class SendLocalListStatusType(str, Enum): version_mismatch = "VersionMismatch" -class SetMonitoringStatusType(str, Enum): +class SetMonitoringStatusType(StrEnum): """ Status in SetVariableMonitoringResponse """ @@ -1086,7 +1093,7 @@ class SetMonitoringStatusType(str, Enum): duplicate = "Duplicate" -class SetNetworkProfileStatusType(str, Enum): +class SetNetworkProfileStatusType(StrEnum): """ Status in SetNetworkProfileResponse """ @@ -1096,7 +1103,7 @@ class SetNetworkProfileStatusType(str, Enum): failed = "Failed" -class SetVariableStatusType(str, Enum): +class SetVariableStatusType(StrEnum): """ Status in ChangeConfigurationResponse. """ @@ -1109,7 +1116,7 @@ class SetVariableStatusType(str, Enum): reboot_required = "RebootRequired" -class TransactionEventType(str, Enum): +class TransactionEventType(StrEnum): """ Type of Event in TransactionEventRequest """ @@ -1119,7 +1126,7 @@ class TransactionEventType(str, Enum): updated = "Updated" -class TriggerMessageStatusType(str, Enum): +class TriggerMessageStatusType(StrEnum): """ Status in TriggerMessageResponse. """ @@ -1129,7 +1136,7 @@ class TriggerMessageStatusType(str, Enum): not_implemented = "NotImplemented" -class TriggerReasonType(str, Enum): +class TriggerReasonType(StrEnum): """ Reason that triggered a transactionEventRequest """ @@ -1157,7 +1164,7 @@ class TriggerReasonType(str, Enum): reset_command = "ResetCommand" -class TxStartStopPointType(str, Enum): +class TxStartStopPointType(StrEnum): """ The values allowed for the TxStartPoint and TxStopPoint variables. """ @@ -1170,7 +1177,7 @@ class TxStartStopPointType(str, Enum): power_path_closed = "PowerPathClosed" -class UnlockStatusType(str, Enum): +class UnlockStatusType(StrEnum): """ Status in response to UnlockConnector.req. """ @@ -1181,7 +1188,7 @@ class UnlockStatusType(str, Enum): unknown_connector = "UnknownConnector" -class UnpublishFirmwareStatusType(str, Enum): +class UnpublishFirmwareStatusType(StrEnum): """ Status for when unpublishing a Firmware (used by UnpublishFirmwareResponse) """ @@ -1191,7 +1198,7 @@ class UnpublishFirmwareStatusType(str, Enum): unpublished = "Unpublished" -class UpdateFirmwareStatusType(str, Enum): +class UpdateFirmwareStatusType(StrEnum): """ Generic message response status for UpdateFirmwareResponse """ @@ -1203,7 +1210,7 @@ class UpdateFirmwareStatusType(str, Enum): revoked_certificate = "RevokedCertificate" -class UpdateType(str, Enum): +class UpdateType(StrEnum): """ Type of update for a SendLocalList Request. """ @@ -1212,7 +1219,7 @@ class UpdateType(str, Enum): full = "Full" -class UploadLogStatusType(str, Enum): +class UploadLogStatusType(StrEnum): """ Status in LogStatusNotificationRequest. """ @@ -1227,7 +1234,7 @@ class UploadLogStatusType(str, Enum): accepted_canceled = "AcceptedCanceled" -class VPNType(str, Enum): +class VPNType(StrEnum): """ Enumeration of VPN Types used in SetNetworkProfileRequest.VPNType """ @@ -1241,7 +1248,7 @@ class VPNType(str, Enum): # DataTypes -class UnitOfMeasureType(str, Enum): +class UnitOfMeasureType(StrEnum): """ Allowable values of the optional "unit" field of a Value element, as used in MeterValues.req and StopTransaction.req messages. Default value of @@ -1284,7 +1291,7 @@ class UnitOfMeasureType(str, Enum): k = "K" -class StatusInfoReasonType(str, Enum): +class StatusInfoReasonType(StrEnum): """ Standardized reason codes for StatusInfo defined in Appendix 5. v1.3 """ @@ -1334,7 +1341,7 @@ class StatusInfoReasonType(str, Enum): write_only = "WriteOnly" -class SecurityEventType(str, Enum): +class SecurityEventType(StrEnum): """ Security Events as listed in Appendices (Appendix 1. Security Events) v1.3 """ @@ -1361,7 +1368,7 @@ class SecurityEventType(str, Enum): maintenance_login_failed = "MaintenanceLoginFailed" -class ControllerComponentName(str, Enum): +class ControllerComponentName(StrEnum): """ Referenced Controller Components (Logical Components) Sourced from ocpp 2.0.1 part 2 appendices 3.1 v1.3, in @@ -1388,7 +1395,7 @@ class ControllerComponentName(str, Enum): tx_ctrlr = "TxCtrlr" -class PhysicalComponentName(str, Enum): +class PhysicalComponentName(StrEnum): """ Referenced Physical Components - sourced from dm_components_vars.csv. Note: specific variables for each component are sourced from a union of @@ -1456,7 +1463,7 @@ class PhysicalComponentName(str, Enum): vehicle_id_sensor = "VehicleIdSensor" -class GenericVariableName(str, Enum): +class GenericVariableName(StrEnum): """ Variable names where the component type is non-specific derived from a union of in appendices_CSV_v1.3.zip, @@ -1555,7 +1562,7 @@ class GenericVariableName(str, Enum): voltage_imbalance = "VoltageImbalance" -class AlignedDataCtrlrVariableName(str, Enum): +class AlignedDataCtrlrVariableName(StrEnum): """ Variable names where the component type is AlignedDataCtrlr See ControllerComponentName for referenced logical component @@ -1571,7 +1578,7 @@ class AlignedDataCtrlrVariableName(str, Enum): tx_ended_measurands = "TxEndedMeasurands" -class AuthCacheCtrlrVariableName(str, Enum): +class AuthCacheCtrlrVariableName(StrEnum): """ Variable names where the component type is AuthCacheCtrlr See ControllerComponentName for referenced logical component @@ -1585,7 +1592,7 @@ class AuthCacheCtrlrVariableName(str, Enum): disable_post_authorize = "DisablePostAuthorize" -class AuthCtrlrVariableName(str, Enum): +class AuthCtrlrVariableName(StrEnum): """ Variable names where the component type is AuthCtrlr See ControllerComponentName for referenced logical component @@ -1601,7 +1608,7 @@ class AuthCtrlrVariableName(str, Enum): disable_remote_authorization = "DisableRemoteAuthorization" -class CHAdeMOCtrlrVariableName(str, Enum): +class CHAdeMOCtrlrVariableName(StrEnum): """ Variable names where the component type is CHAdeMOCtrlr See ControllerComponentName for referenced logical component @@ -1622,7 +1629,7 @@ class CHAdeMOCtrlrVariableName(str, Enum): auto_manufacturer_code = "AutoManufacturerCode" -class ClockCtrlrVariableName(str, Enum): +class ClockCtrlrVariableName(StrEnum): """ Variable names where the component type is ClockCtrlr See ControllerComponentName for referenced logical component @@ -1638,7 +1645,7 @@ class ClockCtrlrVariableName(str, Enum): time_zone = "TimeZone" -class CustomizationCtrlrVariableName(str, Enum): +class CustomizationCtrlrVariableName(StrEnum): """ Variable names where the component type is CustomizationCtrlr See ControllerComponentName for referenced logical component @@ -1647,7 +1654,7 @@ class CustomizationCtrlrVariableName(str, Enum): custom_implementation_enabled = "CustomImplementationEnabled" -class DeviceDataCtrlrVariableName(str, Enum): +class DeviceDataCtrlrVariableName(StrEnum): """ Variable names where the component type is DeviceDataCtrlr See ControllerComponentName for referenced logical component @@ -1660,7 +1667,7 @@ class DeviceDataCtrlrVariableName(str, Enum): value_size = "ValueSize" -class DeviceDataCtrlrInstanceName(str, Enum): +class DeviceDataCtrlrInstanceName(StrEnum): """ Instance names where the component type is DeviceDataCtrlr """ @@ -1670,7 +1677,7 @@ class DeviceDataCtrlrInstanceName(str, Enum): set_variables = "SetVariables" -class DisplayMessageCtrlrVariableName(str, Enum): +class DisplayMessageCtrlrVariableName(StrEnum): """ Variable names where the component type is DisplayMessageCtrlr See ControllerComponentName for referenced logical component @@ -1684,7 +1691,7 @@ class DisplayMessageCtrlrVariableName(str, Enum): supported_priorities = "SupportedPriorities" -class ISO15118CtrlrVariableName(str, Enum): +class ISO15118CtrlrVariableName(StrEnum): """ Variable names where the component type is ISO15118Ctrlr See ControllerComponentName for referenced logical component @@ -1710,7 +1717,7 @@ class ISO15118CtrlrVariableName(str, Enum): contract_certificate_installation_enabled = "ContractCertificateInstallationEnabled" -class LocalAuthListCtrlrVariableName(str, Enum): +class LocalAuthListCtrlrVariableName(StrEnum): """ Variable names where the component type is LocalAuthListCtrlr See ControllerComponentName for referenced logical component @@ -1725,7 +1732,7 @@ class LocalAuthListCtrlrVariableName(str, Enum): disable_post_authorize = "DisablePostAuthorize" -class MonitoringCtrlrVariableName(str, Enum): +class MonitoringCtrlrVariableName(StrEnum): """ Variable names where the component type is MonitoringCtrlr See ControllerComponentName for referenced logical component @@ -1742,7 +1749,7 @@ class MonitoringCtrlrVariableName(str, Enum): active_monitoring_level = "ActiveMonitoringLevel" -class MonitoringCtrlrInstanceName(str, Enum): +class MonitoringCtrlrInstanceName(StrEnum): """ Instance names where the component type is MonitoringCtrlr """ @@ -1751,7 +1758,7 @@ class MonitoringCtrlrInstanceName(str, Enum): set_variable_monitoring = "SetVariableMonitoring" -class OCPPCommCtrlrVariableName(str, Enum): +class OCPPCommCtrlrVariableName(StrEnum): """ Variable names where the component type is OCPPCommCtrlr See ControllerComponentName for referenced logical component @@ -1778,7 +1785,7 @@ class OCPPCommCtrlrVariableName(str, Enum): field_length = "FieldLength" -class OCPPCommCtrlrInstanceName(str, Enum): +class OCPPCommCtrlrInstanceName(StrEnum): """ Instance names where the component type is OCPPCommCtrlr """ @@ -1787,7 +1794,7 @@ class OCPPCommCtrlrInstanceName(str, Enum): transaction_event = "TransactionEvent" -class ReservationCtrlrVariableName(str, Enum): +class ReservationCtrlrVariableName(StrEnum): """ Variable names where the component type is ReservationCtrlr See ControllerComponentName for referenced logical component @@ -1798,7 +1805,7 @@ class ReservationCtrlrVariableName(str, Enum): non_evse_specific = "NonEvseSpecific" -class SampledDataCtrlrVariableName(str, Enum): +class SampledDataCtrlrVariableName(StrEnum): """ Variable names where the component type is SampledDataCtrlr See ControllerComponentName for referenced logical component @@ -1815,7 +1822,7 @@ class SampledDataCtrlrVariableName(str, Enum): register_values_without_phases = "RegisterValuesWithoutPhases" -class SecurityCtrlrVariableName(str, Enum): +class SecurityCtrlrVariableName(StrEnum): """ Variable names where the component type is SampledDataCtrlr See ControllerComponentName for referenced logical component @@ -1832,7 +1839,7 @@ class SecurityCtrlrVariableName(str, Enum): security_profile = "SecurityProfile" -class SmartChargingCtrlrVariableName(str, Enum): +class SmartChargingCtrlrVariableName(StrEnum): """ Variable names where the component type is SmartChargingCtrlr See ControllerComponentName for referenced logical component @@ -1851,7 +1858,7 @@ class SmartChargingCtrlrVariableName(str, Enum): rate_unit = "RateUnit" -class SmartChargingCtrlrInstanceName(str, Enum): +class SmartChargingCtrlrInstanceName(StrEnum): """ Instance names where the component type is SmartChargingCtrlr """ @@ -1859,7 +1866,7 @@ class SmartChargingCtrlrInstanceName(str, Enum): charging_profiles = "ChargingProfiles" -class TariffCostCtrlrVariableName(str, Enum): +class TariffCostCtrlrVariableName(StrEnum): """ Variable names where the component type is TariffCostCtrlr See ControllerComponentName for referenced logical component @@ -1872,7 +1879,7 @@ class TariffCostCtrlrVariableName(str, Enum): total_cost_fallback_message = "TotalCostFallbackMessage" -class TariffCostCtrlrInstanceName(str, Enum): +class TariffCostCtrlrInstanceName(StrEnum): """ Instance names where the component type is TariffCostCtrlr """ @@ -1881,7 +1888,7 @@ class TariffCostCtrlrInstanceName(str, Enum): cost = "Cost" -class TxCtrlrVariableName(str, Enum): +class TxCtrlrVariableName(StrEnum): """ Instance names where the component type is TxCtrlr See ControllerComponentName for referenced logical component @@ -1897,7 +1904,7 @@ class TxCtrlrVariableName(str, Enum): tx_stop_point = "TxStopPoint" -class AccessBarrierVariableName(str, Enum): +class AccessBarrierVariableName(StrEnum): """ Variable names where the component type is AccessBarrier See PhysicalComponentName for referenced physical component @@ -1908,7 +1915,7 @@ class AccessBarrierVariableName(str, Enum): problem = "Problem" -class AcDcConverterVariableName(str, Enum): +class AcDcConverterVariableName(StrEnum): """ Variable names where the component type is AcDcConverter See PhysicalComponentName for referenced physical component @@ -1925,7 +1932,7 @@ class AcDcConverterVariableName(str, Enum): tripped = "Tripped" -class AcPhaseSelectorVariableName(str, Enum): +class AcPhaseSelectorVariableName(StrEnum): """ Variable names where the component type is AcPhaseSelector See PhysicalComponentName for referenced physical component @@ -1937,7 +1944,7 @@ class AcPhaseSelectorVariableName(str, Enum): problem = "Problem" -class ActuatorVariableName(str, Enum): +class ActuatorVariableName(StrEnum): """ Variable names where the component type is Actuator See PhysicalComponentName for referenced physical component @@ -1949,7 +1956,7 @@ class ActuatorVariableName(str, Enum): state = "State" -class AirCoolingSystemVariableName(str, Enum): +class AirCoolingSystemVariableName(StrEnum): """ Variable names where the component type is AirCoolingSystem See PhysicalComponentName for referenced physical component @@ -1961,7 +1968,7 @@ class AirCoolingSystemVariableName(str, Enum): fan_speed = "FanSpeed" -class AreaVentilationVariableName(str, Enum): +class AreaVentilationVariableName(StrEnum): """ Variable names where the component type is AreaVentilation See PhysicalComponentName for referenced physical component @@ -1973,7 +1980,7 @@ class AreaVentilationVariableName(str, Enum): fan_speed = "FanSpeed" -class BayOccupancySensorVariableName(str, Enum): +class BayOccupancySensorVariableName(StrEnum): """ Variable names where the component type is BayOccupancySensor See PhysicalComponentName for referenced physical component @@ -1984,7 +1991,7 @@ class BayOccupancySensorVariableName(str, Enum): percent = "Percent" -class BeaconLightingVariableName(str, Enum): +class BeaconLightingVariableName(StrEnum): """ Variable names where the component type is BeaconLighting See PhysicalComponentName for referenced physical component @@ -2000,7 +2007,7 @@ class BeaconLightingVariableName(str, Enum): problem = "Problem" -class CableBreakawaySensorVariableName(str, Enum): +class CableBreakawaySensorVariableName(StrEnum): """ Variable names where the component type is CableBreakawaySensor See PhysicalComponentName for referenced physical component @@ -2011,7 +2018,7 @@ class CableBreakawaySensorVariableName(str, Enum): tripped = "Tripped" -class CaseAccessSensorVariableName(str, Enum): +class CaseAccessSensorVariableName(StrEnum): """ Variable names where the component type is CaseAccessSensor See PhysicalComponentName for referenced physical component @@ -2024,7 +2031,7 @@ class CaseAccessSensorVariableName(str, Enum): tripped = "Tripped" -class ChargingStationVariableName(str, Enum): +class ChargingStationVariableName(StrEnum): """ Variable names where the component type is ChargingStation See PhysicalComponentName for referenced physical component @@ -2056,7 +2063,7 @@ class ChargingStationVariableName(str, Enum): voltage_imbalance = "VoltageImbalance" -class ChargingStatusIndicatorVariableName(str, Enum): +class ChargingStatusIndicatorVariableName(StrEnum): """ Variable names where the component type is ChargingStatusIndicator See PhysicalComponentName for referenced physical component @@ -2066,7 +2073,7 @@ class ChargingStatusIndicatorVariableName(str, Enum): color = "Color" -class ConnectedEVVariableName(str, Enum): +class ConnectedEVVariableName(StrEnum): """ Variable names where the component type is ConnectedEV See PhysicalComponentName for referenced physical component @@ -2093,7 +2100,7 @@ class ConnectedEVVariableName(str, Enum): charging_complete_full = "ChargingCompleteFull" -class ChargingStateVariableName(str, Enum): +class ChargingStateVariableName(StrEnum): """ Variable names where the component type is ChargingState """ @@ -2111,7 +2118,7 @@ class ChargingStateVariableName(str, Enum): charger_connector_lock_fault = "ChargerConnectorLockFault" -class ConnectorVariableName(str, Enum): +class ConnectorVariableName(StrEnum): """ Variable names where the component type is Connector See PhysicalComponentName for referenced physical component @@ -2129,7 +2136,7 @@ class ConnectorVariableName(str, Enum): tripped = "Tripped" -class ConnectorHolsterReleaseVariableName(str, Enum): +class ConnectorHolsterReleaseVariableName(StrEnum): """ Variable names where the component type is ConnectorHolsterRelease See PhysicalComponentName for referenced physical component @@ -2141,7 +2148,7 @@ class ConnectorHolsterReleaseVariableName(str, Enum): state = "State" -class ConnectorHolsterSensorVariableName(str, Enum): +class ConnectorHolsterSensorVariableName(StrEnum): """ Variable names where the component type is ConnectorHolsterSensor See PhysicalComponentName for referenced physical component @@ -2152,7 +2159,7 @@ class ConnectorHolsterSensorVariableName(str, Enum): problem = "Problem" -class ConnectorPlugRetentionLockVariableName(str, Enum): +class ConnectorPlugRetentionLockVariableName(StrEnum): """ Variable names where the component type is ConnectorPlugRetentionLock See PhysicalComponentName for referenced physical component @@ -2167,7 +2174,7 @@ class ConnectorPlugRetentionLockVariableName(str, Enum): tries_max_limit = "Tries(MaxLimit)" -class ConnectorProtectionReleaseVariableName(str, Enum): +class ConnectorProtectionReleaseVariableName(StrEnum): """ Variable names where the component type is ConnectorProtectionRelease See PhysicalComponentName for referenced physical component @@ -2179,7 +2186,7 @@ class ConnectorProtectionReleaseVariableName(str, Enum): tripped = "Tripped" -class ControllerVariableName(str, Enum): +class ControllerVariableName(StrEnum): """ Variable names where the component type is Controller See PhysicalComponentName for referenced physical component @@ -2200,7 +2207,7 @@ class ControllerVariableName(str, Enum): version_number = "VersionNumber" -class ControlMeteringVariableName(str, Enum): +class ControlMeteringVariableName(StrEnum): """ Variable names where the component type is ControlMetering See PhysicalComponentName for referenced physical component @@ -2212,7 +2219,7 @@ class ControlMeteringVariableName(str, Enum): dc_voltage = "DCVoltage" -class CPPWMControllerVariableName(str, Enum): +class CPPWMControllerVariableName(StrEnum): """ Variable names where the component type is CPPWMController See PhysicalComponentName for referenced physical component @@ -2228,7 +2235,7 @@ class CPPWMControllerVariableName(str, Enum): state = "State" -class DataLinkVariableName(str, Enum): +class DataLinkVariableName(StrEnum): """ Variable names where the component type is DataLink See PhysicalComponentName for referenced physical component @@ -2245,7 +2252,7 @@ class DataLinkVariableName(str, Enum): signal_strength = "SignalStrength" -class DisplayVariableName(str, Enum): +class DisplayVariableName(StrEnum): """ Variable names where the component type is Display See PhysicalComponentName for referenced physical component @@ -2260,7 +2267,7 @@ class DisplayVariableName(str, Enum): state = "State" -class DistributionPanelVariableName(str, Enum): +class DistributionPanelVariableName(StrEnum): """ Variable names where the component type is DistributionPanel See PhysicalComponentName for referenced physical component @@ -2272,7 +2279,7 @@ class DistributionPanelVariableName(str, Enum): instance_name = "InstanceName" -class ElectricalFeedVariableName(str, Enum): +class ElectricalFeedVariableName(StrEnum): """ Variable names where the component type is ElectricalFeed See PhysicalComponentName for referenced physical component @@ -2290,7 +2297,7 @@ class ElectricalFeedVariableName(str, Enum): supply_phases = "SupplyPhases" -class ELVSupplyVariableName(str, Enum): +class ELVSupplyVariableName(StrEnum): """ Variable names where the component type is ELVSupply See PhysicalComponentName for referenced physical component @@ -2305,7 +2312,7 @@ class ELVSupplyVariableName(str, Enum): time = "Time" -class EmergencyStopSensorVariableName(str, Enum): +class EmergencyStopSensorVariableName(StrEnum): """ Variable names where the component type is EmergencyStopSensor See PhysicalComponentName for referenced physical component @@ -2316,7 +2323,7 @@ class EmergencyStopSensorVariableName(str, Enum): tripped = "Tripped" -class EnvironmentalLightingVariableName(str, Enum): +class EnvironmentalLightingVariableName(StrEnum): """ Variable names where the component type is EnvironmentalLighting See PhysicalComponentName for referenced physical component @@ -2332,7 +2339,7 @@ class EnvironmentalLightingVariableName(str, Enum): problem = "Problem" -class EVRetentionLockVariableName(str, Enum): +class EVRetentionLockVariableName(StrEnum): """ Variable names where the component type is EVRetentionLock See PhysicalComponentName for referenced physical component @@ -2344,7 +2351,7 @@ class EVRetentionLockVariableName(str, Enum): problem = "Problem" -class EVSEVariableName(str, Enum): +class EVSEVariableName(StrEnum): """ Variable names where the component type is EVSE See PhysicalComponentName for referenced physical component @@ -2375,7 +2382,7 @@ class EVSEVariableName(str, Enum): voltage_imbalance = "VoltageImbalance" -class ExternalTemperatureSensorVariableName(str, Enum): +class ExternalTemperatureSensorVariableName(StrEnum): """ Variable names where the component type is ExternalTemperatureSensor See PhysicalComponentName for referenced physical component @@ -2386,7 +2393,7 @@ class ExternalTemperatureSensorVariableName(str, Enum): temperature = "Temperature" -class FiscalMeteringVariableName(str, Enum): +class FiscalMeteringVariableName(StrEnum): """ Variable names where the component type is FiscalMetering See PhysicalComponentName for referenced physical component @@ -2409,7 +2416,7 @@ class FiscalMeteringVariableName(str, Enum): serial_number_meter = "SerialNumber[Meter]" -class FloodSensorVariableName(str, Enum): +class FloodSensorVariableName(StrEnum): """ Variable names where the component type is FloodSensor See PhysicalComponentName for referenced physical component @@ -2422,7 +2429,7 @@ class FloodSensorVariableName(str, Enum): tripped = "Tripped" -class GroundIsolationProtectionVariableName(str, Enum): +class GroundIsolationProtectionVariableName(StrEnum): """ Variable names where the component type is GroundIsolationProtection See PhysicalComponentName for referenced physical component @@ -2435,7 +2442,7 @@ class GroundIsolationProtectionVariableName(str, Enum): problem = "Problem" -class HeaterVariableName(str, Enum): +class HeaterVariableName(StrEnum): """ Variable names where the component type is Heater See PhysicalComponentName for referenced physical component @@ -2452,7 +2459,7 @@ class HeaterVariableName(str, Enum): temperature_max_set = "Temperature(MaxSet)" -class HumiditySensorVariableName(str, Enum): +class HumiditySensorVariableName(StrEnum): """ Variable names where the component type is HumiditySensor See PhysicalComponentName for referenced physical component @@ -2463,7 +2470,7 @@ class HumiditySensorVariableName(str, Enum): problem = "Problem" -class LightSensorVariableName(str, Enum): +class LightSensorVariableName(StrEnum): """ Variable names where the component type is LightSensor See PhysicalComponentName for referenced physical component @@ -2474,7 +2481,7 @@ class LightSensorVariableName(str, Enum): problem = "Problem" -class LiquidCoolingSystemVariableName(str, Enum): +class LiquidCoolingSystemVariableName(StrEnum): """ Variable names where the component type is LiquidCoolingSystem See PhysicalComponentName for referenced physical component @@ -2486,7 +2493,7 @@ class LiquidCoolingSystemVariableName(str, Enum): temperature = "Temperature" -class LocalAvailabilitySensorVariableName(str, Enum): +class LocalAvailabilitySensorVariableName(StrEnum): """ Variable names where the component type is LocalAvailabilitySensor See PhysicalComponentName for referenced physical component @@ -2497,7 +2504,7 @@ class LocalAvailabilitySensorVariableName(str, Enum): problem = "Problem" -class LocalControllerVariableName(str, Enum): +class LocalControllerVariableName(StrEnum): """ Variable names where the component type is LocalController See PhysicalComponentName for referenced physical component @@ -2515,7 +2522,7 @@ class LocalControllerVariableName(str, Enum): tripped = "Tripped" -class LocalEnergyStorageVariableName(str, Enum): +class LocalEnergyStorageVariableName(StrEnum): """ Variable names where the component type is LocalEnergyStorage See PhysicalComponentName for referenced physical component @@ -2526,7 +2533,7 @@ class LocalEnergyStorageVariableName(str, Enum): identity = "Identity" -class OverCurrentProtectionVariableName(str, Enum): +class OverCurrentProtectionVariableName(StrEnum): """ Variable names where the component type is OverCurrentProtection See PhysicalComponentName for referenced physical component @@ -2537,7 +2544,7 @@ class OverCurrentProtectionVariableName(str, Enum): operated = "Operated" -class OverCurrentProtectionRecloserVariableName(str, Enum): +class OverCurrentProtectionRecloserVariableName(StrEnum): """ Variable names where the component type is OverCurrentProtectionRecloser See PhysicalComponentName for referenced physical component @@ -2554,7 +2561,7 @@ class OverCurrentProtectionRecloserVariableName(str, Enum): tries_max_limit = "Tries(MaxLimit)" -class PowerContactorVariableName(str, Enum): +class PowerContactorVariableName(StrEnum): """ Variable names where the component type is PowerContactor See PhysicalComponentName for referenced physical component @@ -2565,7 +2572,7 @@ class PowerContactorVariableName(str, Enum): tripped = "Tripped" -class RCDVariableName(str, Enum): +class RCDVariableName(StrEnum): """ Variable names where the component type is RCD See PhysicalComponentName for referenced physical component @@ -2575,7 +2582,7 @@ class RCDVariableName(str, Enum): tripped = "Tripped" -class RCDRecloserVariableName(str, Enum): +class RCDRecloserVariableName(StrEnum): """ Variable names where the component type is RCDRecloser See PhysicalComponentName for referenced physical component @@ -2591,7 +2598,7 @@ class RCDRecloserVariableName(str, Enum): tries_set_limit = "Tries(SetLimit)" -class RealTimeClockVariableName(str, Enum): +class RealTimeClockVariableName(StrEnum): """ Variable names where the component type is RealTimeClock See PhysicalComponentName for referenced physical component @@ -2604,7 +2611,7 @@ class RealTimeClockVariableName(str, Enum): problem = "Problem" -class ShockSensorVariableName(str, Enum): +class ShockSensorVariableName(StrEnum): """ Variable names where the component type is ShockSensor See PhysicalComponentName for referenced physical component @@ -2615,7 +2622,7 @@ class ShockSensorVariableName(str, Enum): force = "Force" -class SpacesCountSignageVariableName(str, Enum): +class SpacesCountSignageVariableName(StrEnum): """ Variable names where the component type is SpacesCountSignage See PhysicalComponentName for referenced physical component @@ -2626,7 +2633,7 @@ class SpacesCountSignageVariableName(str, Enum): enabled = "Enabled" -class SwitchVariableName(str, Enum): +class SwitchVariableName(StrEnum): """ Variable names where the component type is Switch See PhysicalComponentName for referenced physical component @@ -2637,7 +2644,7 @@ class SwitchVariableName(str, Enum): state = "State" -class TemperatureSensorVariableName(str, Enum): +class TemperatureSensorVariableName(StrEnum): """ Variable names where the component type is TemperatureSensor See PhysicalComponentName for referenced physical component @@ -2648,7 +2655,7 @@ class TemperatureSensorVariableName(str, Enum): temperature = "Temperature" -class TiltSensorVariableName(str, Enum): +class TiltSensorVariableName(StrEnum): """ Variable names where the component type is TiltSensor See PhysicalComponentName for referenced physical component @@ -2659,7 +2666,7 @@ class TiltSensorVariableName(str, Enum): angle = "Angle" -class TokenReaderVariableName(str, Enum): +class TokenReaderVariableName(StrEnum): """ Variable names where the component type is TokenReader See PhysicalComponentName for referenced physical component @@ -2673,7 +2680,7 @@ class TokenReaderVariableName(str, Enum): token_type = "TokenType" -class UIInputVariableName(str, Enum): +class UIInputVariableName(StrEnum): """ Variable names where the component type is UIInput See PhysicalComponentName for referenced physical component @@ -2684,7 +2691,7 @@ class UIInputVariableName(str, Enum): operated = "Operated" -class UpstreamProtectionTriggerVariableName(str, Enum): +class UpstreamProtectionTriggerVariableName(StrEnum): """ Variable names where the component type is UpstreamProtectionTrigger See PhysicalComponentName for referenced physical component @@ -2696,7 +2703,7 @@ class UpstreamProtectionTriggerVariableName(str, Enum): tripped = "Tripped" -class VehicleIdSensorVariableName(str, Enum): +class VehicleIdSensorVariableName(StrEnum): """ Variable names where the component type is VehicleIdSensor See PhysicalComponentName for referenced physical component From 6a6c7aeb54cb53626f5434b6f32cb214582d0333 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:12:46 +0100 Subject: [PATCH 19/39] Update project dependencies as of 22-12-2023 (#560) Update project dependencies as of 22-12-2023 See https://github.com/mobilityhouse/ocpp/issues/559 for packages updated --- CHANGELOG.md | 2 + poetry.lock | 633 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 387 insertions(+), 248 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1afefabc..824eb74b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change log + +- [#559](https://github.com/mobilityhouse/ocpp/issues/559) Update project dependencies as of 22-12-2023 - [#447](https://github.com/mobilityhouse/ocpp/issues/447) Make formatting of enums in py3.11 consistent with earlier Python versions - [#421](https://github.com/mobilityhouse/ocpp/issues/421) Type of v16.datatypes.SampledValue.context is incorrect diff --git a/poetry.lock b/poetry.lock index 1d0d78257..b11664c88 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,14 +2,14 @@ [[package]] name = "alabaster" -version = "0.7.12" +version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] [[package]] @@ -26,37 +26,44 @@ files = [ [[package]] name = "attrs" -version = "22.2.0" +version = "23.2.0" description = "Classes Without Boilerplate" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "babel" -version = "2.11.0" +version = "2.14.0" description = "Internationalization utilities" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"}, - {file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] [package.dependencies] -pytz = ">=2015.7" +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "black" @@ -97,41 +104,126 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] -[package.extras] -unicode-backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -152,63 +244,72 @@ files = [ [[package]] name = "coverage" -version = "7.0.0" +version = "7.2.7" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "coverage-7.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2569682d6ea9628da8d6ba38579a48b1e53081226ec7a6c82b5024b3ce5009f"}, - {file = "coverage-7.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ec256a592b497f26054195f7d7148892aca8c4cdcc064a7cc66ef7a0455b811"}, - {file = "coverage-7.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5885a4ceb6dde34271bb0adafa4a248a7f589c89821e9da3110c39f92f41e21b"}, - {file = "coverage-7.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d43d406a4d73aa7f855fa44fa77ff47e739b565b2af3844600cdc016d01e46b9"}, - {file = "coverage-7.0.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18df11efa615b79b9ecc13035a712957ff6283f7b244e57684e1c092869f541"}, - {file = "coverage-7.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f6a4bf5bdee93f6817797beba7086292c2ebde6df0d5822e0c33f8b05415c339"}, - {file = "coverage-7.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:33efe89cd0efef016db19d8d05aa46631f76793de90a61b6717acb202b36fe60"}, - {file = "coverage-7.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96b5b1f1079e48f56bfccf103bcf44d48b9eb5163f1ea523fad580f15d3fe5e0"}, - {file = "coverage-7.0.0-cp310-cp310-win32.whl", hash = "sha256:fb85b7a7a4b204bd59d6d0b0c8d87d9ffa820da225e691dfaffc3137dc05b5f6"}, - {file = "coverage-7.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:793dcd9d42035746fc7637df4336f7581df19d33c5c5253cf988c99d8e93a8ba"}, - {file = "coverage-7.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d564142a03d3bc8913499a458e931b52ddfe952f69b6cd4b24d810fd2959044a"}, - {file = "coverage-7.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a8b0e86bede874bf5da566b02194fbb12dd14ce3585cabd58452007f272ba81"}, - {file = "coverage-7.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e645c73cbfc4577d93747d3f793115acf6f907a7eb9208fa807fdcf2da1964a4"}, - {file = "coverage-7.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de06e7585abe88c6d38c1b73ce4c3cb4c1a79fbb0da0d0f8e8689ef5729ec60d"}, - {file = "coverage-7.0.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a30b646fbdd5bc52f506e149fa4fbdef82432baf6b81774e61ec4e3b43b9cbde"}, - {file = "coverage-7.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:db8141856dc9be0917413df7200f53accf1d84c8b156868e6af058a1ea8e903a"}, - {file = "coverage-7.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:59e71912c7fc78d08a567ee65656123878f49ca1b5672e660ea70bf8dfbebf8f"}, - {file = "coverage-7.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b8f7cd942dda3795fc9eadf303cc53a422ac057e3b70c2ad6d4276ec6a83a541"}, - {file = "coverage-7.0.0-cp311-cp311-win32.whl", hash = "sha256:bf437a04b9790d3c9cd5b48e9ce9aa84229040e3ae7d6c670a55118906113c5a"}, - {file = "coverage-7.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a7e1bb36b4e57a2d304322021b35d4e4a25fa0d501ba56e8e51efaebf4480556"}, - {file = "coverage-7.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:215f40ef86f1958a1151fa7fad2b4f2f99534c4e10a34a1e065eba3f19ef8868"}, - {file = "coverage-7.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae088eb1cbdad8206931b1bf3f11dee644e038a9300be84d3e705e29356e5b1d"}, - {file = "coverage-7.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9071e197faa24837b967bc9aa0b9ef961f805a75f1ee3ea1f3367f55cd46c3c"}, - {file = "coverage-7.0.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f1e6d9c70d45a960d3f3d781ea62b167fdf2e0e1f6bb282b96feea653adb923"}, - {file = "coverage-7.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9fadd15f9fcfd7b16d9cccce9f5e6ec6f9b8df860633ad9aa62c2b14c259560f"}, - {file = "coverage-7.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:10b6246cae61896ab4c7568e498e492cbb73a2dfa4c3af79141c43cf806f929a"}, - {file = "coverage-7.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a8785791c2120af114ea7a06137f7778632e568a5aa2bbfc3b46c573b702af74"}, - {file = "coverage-7.0.0-cp37-cp37m-win32.whl", hash = "sha256:30220518dd89c4878908d73f5f3d1269f86e9e045354436534587a18c7b9da85"}, - {file = "coverage-7.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bc904aa96105d73357de03de76336b1e3db28e2b12067d36625fd9646ab043fd"}, - {file = "coverage-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2331b7bd84a1be79bd17ca8e103ce38db8cbf7cb354dc56e651ba489cf849212"}, - {file = "coverage-7.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e907db8bdd0ad1253a33c20fdc5f0f6209d271114a9c6f1fcdf96617343f7ca0"}, - {file = "coverage-7.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0deee68e0dae1d6e3fe6943c76d7e66fbeb6519bd08e4e5366bcc28a8a9aca"}, - {file = "coverage-7.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fff0f08bc5ffd0d78db821971472b4adc2ee876b86f743e46d634fb8e3c22f"}, - {file = "coverage-7.0.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a290b7921c1c05787b953e5854d394e887df40696f21381cc33c4e2179bf50ac"}, - {file = "coverage-7.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:100546219af59d2ad82d4575de03a303eb27b75ea36ffbd1677371924d50bcbc"}, - {file = "coverage-7.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c1ba6e63b831112b9484ff5905370d89e43d4316bac76d403031f60d61597466"}, - {file = "coverage-7.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c685fc17d6f4f1a3833e9dac27d0b931f7ccb52be6c30d269374203c7d0204a2"}, - {file = "coverage-7.0.0-cp38-cp38-win32.whl", hash = "sha256:8938f3a10f45019b502020ba9567b97b6ecc8c76b664b421705c5406d4f92fe8"}, - {file = "coverage-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:c4b63888bef2928d0eca12cbce0760cfb696acb4fe226eb55178b6a2a039328a"}, - {file = "coverage-7.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cda63459eb20652b22e038729a8f5063862c189a3963cb042a764b753172f75e"}, - {file = "coverage-7.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e06abac1a4aec1ff989131e43ca917fc7bd296f34bf0cfe86cbf74343b21566d"}, - {file = "coverage-7.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b94ad926e933976627f040f96dd1d9b0ac91f8d27e868c30a28253b9b6ac2d"}, - {file = "coverage-7.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6b4af31fb49a2ae8de1cd505fa66c403bfcc5066e845ac19d8904dcfc9d40da"}, - {file = "coverage-7.0.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36b62f0220459e528ad5806cc7dede71aa716e067d2cb10cb4a09686b8791fba"}, - {file = "coverage-7.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:43ec1935c6d6caab4f3bc126d20bd709c0002a175d62208ebe745be37a826a41"}, - {file = "coverage-7.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8593c9baf1f0f273afa22f5b45508b76adc7b8e94e17e7d98fbe1e3cd5812af2"}, - {file = "coverage-7.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fee283cd36c3f14422d9c1b51da24ddbb5e1eed89ad2480f6a9f115df38b5df8"}, - {file = "coverage-7.0.0-cp39-cp39-win32.whl", hash = "sha256:97c0b001ff15b8e8882995fc07ac0a08c8baf8b13c1145f3f12e0587bbb0e335"}, - {file = "coverage-7.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:8dbf83a4611c591b5de65069b6fd4dd3889200ed270cd2f7f5ac765d3842889f"}, - {file = "coverage-7.0.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:bcaf18e46668057051a312c714a4548b81f7e8fb3454116ad97be7562d2a99e4"}, - {file = "coverage-7.0.0.tar.gz", hash = "sha256:9a175da2a7320e18fc3ee1d147639a2b3a8f037e508c96aa2da160294eb50e17"}, + {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, + {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, + {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, + {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, + {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, + {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, + {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, + {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, + {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, + {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, + {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, + {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, + {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, + {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, + {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, + {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, + {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, + {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, ] [package.dependencies] @@ -231,14 +332,14 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.0" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, - {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -264,14 +365,14 @@ pyflakes = ">=2.5.0,<2.6.0" [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] @@ -308,63 +409,63 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", [[package]] name = "importlib-resources" -version = "5.10.1" +version = "5.12.0" description = "Read resources from Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_resources-5.10.1-py3-none-any.whl", hash = "sha256:c09b067d82e72c66f4f8eb12332f5efbebc9b007c0b6c40818108c9870adc363"}, - {file = "importlib_resources-5.10.1.tar.gz", hash = "sha256:32bb095bda29741f6ef0e5278c42df98d135391bee5f932841efc0041f748dc3"}, + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] name = "isort" -version = "5.11.4" +version = "5.11.5" description = "A Python utility / library to sort Python imports." category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "isort-5.11.4-py3-none-any.whl", hash = "sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b"}, - {file = "isort-5.11.4.tar.gz", hash = "sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6"}, + {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, + {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, ] [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile-deprecated-finder = ["pipreqs", "requirementslib"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -399,52 +500,62 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] @@ -461,38 +572,38 @@ files = [ [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] name = "packaging" -version = "22.0" +version = "23.2" description = "Core utilities for Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"}, - {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] name = "pathspec" -version = "0.10.3" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.10.3-py3-none-any.whl", hash = "sha256:3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6"}, - {file = "pathspec-0.10.3.tar.gz", hash = "sha256:56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] @@ -509,30 +620,33 @@ files = [ [[package]] name = "platformdirs" -version = "2.6.0" +version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-2.6.0-py3-none-any.whl", hash = "sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca"}, - {file = "platformdirs-2.6.0.tar.gz", hash = "sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e"}, + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} + [package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] [package.dependencies] @@ -568,65 +682,70 @@ files = [ [[package]] name = "pygments" -version = "2.13.0" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyrsistent" -version = "0.19.2" +version = "0.19.3" description = "Persistent/Functional/Immutable data structures" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pyrsistent-0.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a"}, - {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a"}, - {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed"}, - {file = "pyrsistent-0.19.2-cp310-cp310-win32.whl", hash = "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41"}, - {file = "pyrsistent-0.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-win32.whl", hash = "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2"}, - {file = "pyrsistent-0.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73"}, - {file = "pyrsistent-0.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308"}, - {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584"}, - {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb"}, - {file = "pyrsistent-0.19.2-cp38-cp38-win32.whl", hash = "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a"}, - {file = "pyrsistent-0.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab"}, - {file = "pyrsistent-0.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770"}, - {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95"}, - {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e"}, - {file = "pyrsistent-0.19.2-cp39-cp39-win32.whl", hash = "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b"}, - {file = "pyrsistent-0.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291"}, - {file = "pyrsistent-0.19.2-py3-none-any.whl", hash = "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0"}, - {file = "pyrsistent-0.19.2.tar.gz", hash = "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2"}, + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, ] [[package]] name = "pytest" -version = "7.2.0" +version = "7.4.4" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -636,7 +755,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" @@ -660,14 +779,14 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy [[package]] name = "pytest-cov" -version = "4.0.0" +version = "4.1.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, - {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, ] [package.dependencies] @@ -679,14 +798,14 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytz" -version = "2022.7" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" category = "dev" optional = false python-versions = "*" files = [ - {file = "pytz-2022.7-py2.py3-none-any.whl", hash = "sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd"}, - {file = "pytz-2022.7.tar.gz", hash = "sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] [[package]] @@ -713,14 +832,14 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "setuptools" -version = "67.8.0" +version = "68.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, - {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, ] [package.extras] @@ -884,82 +1003,100 @@ files = [ [[package]] name = "typed-ast" -version = "1.5.4" +version = "1.5.5" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, - {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, - {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, - {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, - {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, - {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, - {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, - {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, - {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, - {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, + {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, + {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, + {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, + {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, + {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, + {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, + {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, + {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, + {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, ] [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] name = "urllib3" -version = "1.26.13" +version = "2.0.7" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.13-py2.py3-none-any.whl", hash = "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc"}, - {file = "urllib3-1.26.13.tar.gz", hash = "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8"}, + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "zipp" -version = "3.11.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, - {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "2.0" From f32a86d31e3bc6937b8ff55bf5869d87d95218e2 Mon Sep 17 00:00:00 2001 From: Wafa Yahyaoui <143813203+wafa-yah@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:21:40 +0100 Subject: [PATCH 20/39] Add call unique id to handler kwargs (#545) Issue Link: https://github.com/mobilityhouse/ocpp/issues/544 The `call_unique_id` is passed to the `on` and `after` handlers only if it is explicitly set in the handler signature. --- CHANGELOG.md | 1 + ocpp/charge_point.py | 19 +++++- tests/test_charge_point.py | 115 +++++++++++++++++++++++++++++++++++-- 3 files changed, 126 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 824eb74b6..30df6c189 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Change log +- [#544](https://github.com/mobilityhouse/ocpp/issues/544) Pass `Call.unique_id` to the `on` and `after` routing handlers. - [#559](https://github.com/mobilityhouse/ocpp/issues/559) Update project dependencies as of 22-12-2023 - [#447](https://github.com/mobilityhouse/ocpp/issues/447) Make formatting of enums in py3.11 consistent with earlier Python versions - [#421](https://github.com/mobilityhouse/ocpp/issues/421) Type of v16.datatypes.SampledValue.context is incorrect diff --git a/ocpp/charge_point.py b/ocpp/charge_point.py index 997943de7..4d7cb9676 100644 --- a/ocpp/charge_point.py +++ b/ocpp/charge_point.py @@ -225,9 +225,15 @@ async def _handle_call(self, msg): handler = handlers["_on_action"] except KeyError: _raise_key_error(msg.action, self._ocpp_version) - + handler_signature = inspect.signature(handler) + call_unique_id_required = "call_unique_id" in handler_signature.parameters try: - response = handler(**snake_case_payload) + # call_unique_id should be passed as kwarg only if is defined explicitly + # in the handler signature + if call_unique_id_required: + response = handler(**snake_case_payload, call_unique_id=msg.unique_id) + else: + response = handler(**snake_case_payload) if inspect.isawaitable(response): response = await response except Exception as e: @@ -259,9 +265,16 @@ async def _handle_call(self, msg): try: handler = handlers["_after_action"] + handler_signature = inspect.signature(handler) + call_unique_id_required = "call_unique_id" in handler_signature.parameters + # call_unique_id should be passed as kwarg only if is defined explicitly + # in the handler signature + if call_unique_id_required: + response = handler(**snake_case_payload, call_unique_id=msg.unique_id) + else: + response = handler(**snake_case_payload) # Create task to avoid blocking when making a call inside the # after handler - response = handler(**snake_case_payload) if inspect.isawaitable(response): asyncio.ensure_future(response) except KeyError: diff --git a/tests/test_charge_point.py b/tests/test_charge_point.py index e6b320ef0..897fabc2b 100644 --- a/tests/test_charge_point.py +++ b/tests/test_charge_point.py @@ -3,22 +3,27 @@ import pytest from ocpp.charge_point import camel_to_snake_case, remove_nones, snake_to_camel_case -from ocpp.routing import create_route_map, on +from ocpp.messages import Call +from ocpp.routing import after, create_route_map, on +from ocpp.v16 import ChargePoint as cp_16 from ocpp.v16.call import ( BootNotificationPayload, GetConfigurationPayload, MeterValuesPayload, ) +from ocpp.v16.call_result import ( + BootNotificationPayload as BootNotificationResultPayload, +) from ocpp.v16.datatypes import MeterValue, SampledValue -from ocpp.v16.enums import Action -from ocpp.v20 import ChargePoint as cp +from ocpp.v16.enums import Action, RegistrationStatus +from ocpp.v20 import ChargePoint as cp_20 from ocpp.v201.call import SetNetworkProfilePayload from ocpp.v201.datatypes import NetworkConnectionProfileType from ocpp.v201.enums import OCPPInterfaceType, OCPPTransportType, OCPPVersionType def test_getters_should_not_be_called_during_routemap_setup(): - class ChargePoint(cp): + class ChargePoint(cp_20): @property def foo(self): raise RuntimeError("this will be raised") @@ -31,12 +36,12 @@ def foo(self): def test_multiple_classes_with_same_name_for_handler(): - class ChargerA(cp): + class ChargerA(cp_20): @on(Action.Heartbeat) def heartbeat(self, **kwargs): pass - class ChargerB(cp): + class ChargerB(cp_20): @on(Action.Heartbeat) def heartbeat(self, **kwargs): pass @@ -232,3 +237,101 @@ def test_remove_nones_with_list_of_strings(): assert remove_nones(payload) == { "key": ["ClockAlignedDataInterval", "ConnectionTimeOut"] } + + +@pytest.mark.asyncio +async def test_call_unique_id_added_to_handler_args_correctly(connection): + """ + This test ensures that the `call_unique_id` is getting passed to the + `on` and `after` handlers only if it is explicitly set in the handler signature. + + To cover all possible cases, we define two chargers: + + ChargerA: + `call_unique_id` not required on `on` handler but required on `after` handler. + + ChargerB: + `call_unique_id` required on `on` handler but not required on `after` handler. + + Each handler verifies a set of asserts to verify that the `call_unique_id` + is passed correctly. + To confirm that the handlers are actually being called and hence the asserts + are being ran, we introduce a set of counters that increase each time a specific + handler runs. + """ + charger_a_test_call_unique_id = "charger_a_1234" + charger_b_test_call_unique_id = "charger_b_5678" + payload_a = {"chargePointVendor": "foo_a", "chargePointModel": "bar_a"} + payload_b = {"chargePointVendor": "foo_b", "chargePointModel": "bar_b"} + + class ChargerA(cp_16): + on_boot_notification_call_count = 0 + after_boot_notification_call_count = 0 + + @on(Action.BootNotification) + def on_boot_notification(self, *args, **kwargs): + # call_unique_id should not be passed as arg nor kwarg + assert kwargs == camel_to_snake_case(payload_a) + assert args == () + ChargerA.on_boot_notification_call_count += 1 + return BootNotificationResultPayload( + current_time="foo", interval=1, status=RegistrationStatus.accepted + ) + + @after(Action.BootNotification) + def after_boot_notification(self, call_unique_id, *args, **kwargs): + assert call_unique_id == charger_a_test_call_unique_id + assert kwargs == camel_to_snake_case(payload_a) + # call_unique_id should not be passed as arg + assert args == () + ChargerA.after_boot_notification_call_count += 1 + return BootNotificationResultPayload( + current_time="foo", interval=1, status=RegistrationStatus.accepted + ) + + class ChargerB(cp_16): + on_boot_notification_call_count = 0 + after_boot_notification_call_count = 0 + + @on(Action.BootNotification) + def on_boot_notification(self, call_unique_id, *args, **kwargs): + assert call_unique_id == charger_b_test_call_unique_id + assert kwargs == camel_to_snake_case(payload_b) + # call_unique_id should not be passed as arg + assert args == () + ChargerB.on_boot_notification_call_count += 1 + return BootNotificationResultPayload( + current_time="foo", interval=1, status=RegistrationStatus.accepted + ) + + @after(Action.BootNotification) + def after_boot_notification(self, *args, **kwargs): + # call_unique_id should not be passed as arg nor kwarg + assert kwargs == camel_to_snake_case(payload_b) + assert args == () + ChargerB.after_boot_notification_call_count += 1 + return BootNotificationResultPayload( + current_time="foo", interval=1, status=RegistrationStatus.accepted + ) + + charger_a = ChargerA("charger_a_id", connection) + charger_b = ChargerB("charger_b_id", connection) + + msg_a = Call( + unique_id=charger_a_test_call_unique_id, + action=Action.BootNotification.value, + payload=payload_a, + ) + await charger_a._handle_call(msg_a) + + msg_b = Call( + unique_id=charger_b_test_call_unique_id, + action=Action.BootNotification.value, + payload=payload_b, + ) + await charger_b._handle_call(msg_b) + + assert ChargerA.on_boot_notification_call_count == 1 + assert ChargerA.after_boot_notification_call_count == 1 + assert ChargerB.on_boot_notification_call_count == 1 + assert ChargerB.after_boot_notification_call_count == 1 From 9f1ab29a4827b2a7ae4ed8a953ea0741b2e00442 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 17 Jan 2024 14:04:23 +0100 Subject: [PATCH 21/39] Bump 0.26.0 (#572) - [#544](https://github.com/mobilityhouse/ocpp/issues/544) Pass `Call.unique_id` to the `on` and `after` routing handlers. - [#559](https://github.com/mobilityhouse/ocpp/issues/559) Update project dependencies as of 22-12-2023 - [#447](https://github.com/mobilityhouse/ocpp/issues/447) Make formatting of enums in py3.11 consistent with earlier Python versions - [#421](https://github.com/mobilityhouse/ocpp/issues/421) Type of v16.datatypes.SampledValue.context is incorrect --- CHANGELOG.md | 5 +++-- docs/source/conf.py | 2 +- pyproject.toml | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30df6c189..06e14504c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,10 @@ # Change log +## 0.26.0 (2024-01-17) -- [#544](https://github.com/mobilityhouse/ocpp/issues/544) Pass `Call.unique_id` to the `on` and `after` routing handlers. +- [#544](https://github.com/mobilityhouse/ocpp/issues/544) ocpp/charge_point.py - Pass `Call.unique_id` to the `on` and `after` routing handlers. - [#559](https://github.com/mobilityhouse/ocpp/issues/559) Update project dependencies as of 22-12-2023 -- [#447](https://github.com/mobilityhouse/ocpp/issues/447) Make formatting of enums in py3.11 consistent with earlier Python versions +- [#447](https://github.com/mobilityhouse/ocpp/issues/447) v16, v201 - Make formatting of enums in py3.11 consistent with earlier Python versions - [#421](https://github.com/mobilityhouse/ocpp/issues/421) Type of v16.datatypes.SampledValue.context is incorrect ## 0.25.0 (2024-01-08) diff --git a/docs/source/conf.py b/docs/source/conf.py index 592b903c2..603c4e017 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -23,7 +23,7 @@ author = "Auke Willem Oosterhoff" # The full version, including alpha/beta/rc tags -release = "0.25.0" +release = "0.26.0" # -- General configuration --------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index fa17c9d27..92d56c745 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "ocpp" -version = "0.25.0" +version = "0.26.0" description = "Python package implementing the JSON version of the Open Charge Point Protocol (OCPP)." authors = [ "André Duarte ", From 30b69d3cd8b65b9e9d794bd8caa124def7aaf7ff Mon Sep 17 00:00:00 2001 From: Jared Newell Date: Wed, 17 Jan 2024 16:28:17 +0100 Subject: [PATCH 22/39] Enums Updates + change log --- CHANGELOG.md | 2 + ocpp/v201/enums.py | 128 ++++++++++++++++++++++----------------------- 2 files changed, 66 insertions(+), 64 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06e14504c..87ccd19c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change log +- [#579](https://github.com/mobilityhouse/ocpp/issues/579) v2.0.1 Action enums corrected + ## 0.26.0 (2024-01-17) - [#544](https://github.com/mobilityhouse/ocpp/issues/544) ocpp/charge_point.py - Pass `Call.unique_id` to the `on` and `after` routing handlers. diff --git a/ocpp/v201/enums.py b/ocpp/v201/enums.py index 60b2fb533..758234318 100644 --- a/ocpp/v201/enums.py +++ b/ocpp/v201/enums.py @@ -11,70 +11,70 @@ class StrEnum(str, Enum): # pragma: no cover class Action(StrEnum): """An Action is a required part of a Call message.""" - Authorize = "Authorize" - BootNotification = "BootNotification" - CancelReservation = "CancelReservation" - CertificateSigned = "CertificateSigned" - ChangeAvailability = "ChangeAvailability" - ClearCache = "ClearCache" - ClearChargingProfile = "ClearChargingProfile" - ClearDisplayMessage = "ClearDisplayMessage" - ClearedChargingLimit = "ClearedChargingLimit" - ClearVariableMonitoring = "ClearVariableMonitoring" - CostUpdate = "CostUpdate" - CustomerInformation = "CustomerInformation" - DataTransfer = "DataTransfer" - DeleteCertificate = "DeleteCertificate" - FirmwareStatusNotification = "FirmwareStatusNotification" - Get15118EVCertificate = "Get15118EVCertificate" - GetBaseReport = "GetBaseReport" - GetCertificateStatus = "GetCertificateStatus" - GetChargingProfiles = "GetChargingProfiles" - GetCompositeSchedule = "GetCompositeSchedule" - GetDisplayMessages = "GetDisplayMessages" - GetInstalledCertificateIds = "GetInstalledCertificateIds" - GetLocalListVersion = "GetLocalListVersion" - GetLog = "GetLog" - GetMonitoringReport = "GetMonitoringReport" - GetReport = "GetReport" - GetTransactionStatus = "GetTransactionStatus" - GetVariables = "GetVariables" - Heartbeat = "Heartbeat" - InstallCertificate = "InstallCertificate" - LogStatusNotification = "LogStatusNotification" - MeterValues = "MeterValues" - NotifyChargingLimit = "NotifyChargingLimit" - NotifyCustomerInformation = "NotifyCustomerInformation" - NotifyDisplayMessages = "NotifyDisplayMessages" - NotifyEVChargingNeeds = "NotifyEVChargingNeeds" - NotifyEVChargingSchedule = "NotifyEVChargingSchedule" - NotifyEvent = "NotifyEvent" - NotifyMonitoringReport = "NotifyMonitoringReport" - NotifyReport = "NotifyReport" - PublishFirmware = "PublishFirmware" - PublishFirmwareStatusNotification = "PublishFirmwareStatusNotification" - ReportChargingProfiles = "ReportChargingProfiles" - RequestStartTransaction = "RequestStartTransaction" - RequestStopTransaction = "RequestStopTransaction" - ReservationStatusUpdate = "ReservationStatusUpdate" - ReserveNow = "ReserveNow" - Reset = "Reset" - SecurityEventNotification = "SecurityEventNotification" - SendLocalList = "SendLocalList" - SetChargingProfile = "SetChargingProfile" - SetDisplayMessage = "SetDisplayMessage" - SetMonitoringBase = "SetMonitoringBase" - SetMonitoringLevel = "SetMonitoringLevel" - SetNetworkProfile = "SetNetworkProfile" - SetVariableMonitoring = "SetVariableMonitoring" - SetVariables = "SetVariables" - SignCertificate = "SignCertificate" - StatusNotification = "StatusNotification" - TransactionEvent = "TransactionEvent" - TriggerMessage = "TriggerMessage" - UnlockConnector = "UnlockConnector" - UnpublishFirmware = "UnpublishFirmware" - UpdateFirmware = "UpdateFirmware" + authorize = "Authorize" + boot_notification = "BootNotification" + cancel_reservation = "CancelReservation" + certificate_signed = "CertificateSigned" + change_availability = "ChangeAvailability" + clear_cache = "ClearCache" + clear_charging_profile = "ClearChargingProfile" + clear_display_message = "ClearDisplayMessage" + cleared_charging_limit = "ClearedChargingLimit" + clear_variable_monitoring = "ClearVariableMonitoring" + cost_update = "CostUpdate" + customer_information = "CustomerInformation" + data_transfer = "DataTransfer" + delete_certificate = "DeleteCertificate" + firmware_status_notification = "FirmwareStatusNotification" + get_15118_ev_certificate = "Get15118EVCertificate" + get_base_report = "GetBaseReport" + get_certificate_status = "GetCertificateStatus" + get_charging_profiles = "GetChargingProfiles" + get_composite_schedule = "GetCompositeSchedule" + get_display_messages = "GetDisplayMessages" + get_installed_certificate_ids = "GetInstalledCertificateIds" + get_local_list_version = "GetLocalListVersion" + get_log = "GetLog" + get_monitoring_report = "GetMonitoringReport" + get_report = "GetReport" + get_transaction_status = "GetTransactionStatus" + get_variables = "GetVariables" + heartbeat = "Heartbeat" + install_certificate = "InstallCertificate" + log_status_notification = "LogStatusNotification" + meter_values = "MeterValues" + notify_charging_limit = "NotifyChargingLimit" + notify_customer_information = "NotifyCustomerInformation" + notify_display_messages = "NotifyDisplayMessages" + notify_ev_charging_needs = "NotifyEVChargingNeeds" + notify_ev_charging_schedule = "NotifyEVChargingSchedule" + notify_event = "NotifyEvent" + notify_monitoring_report = "NotifyMonitoringReport" + notify_report = "NotifyReport" + publish_firmware = "PublishFirmware" + publish_firmware_status_notification = "PublishFirmwareStatusNotification" + report_charging_profiles = "ReportChargingProfiles" + request_start_transaction = "RequestStartTransaction" + request_stop_transaction = "RequestStopTransaction" + reservation_status_update = "ReservationStatusUpdate" + reserve_now = "ReserveNow" + reset = "Reset" + security_event_notification = "SecurityEventNotification" + send_local_list = "SendLocalList" + set_charging_profile = "SetChargingProfile" + set_display_message = "SetDisplayMessage" + set_monitoring_base = "SetMonitoringBase" + set_monitoring_level = "SetMonitoringLevel" + set_network_profile = "SetNetworkProfile" + set_variable_monitoring = "SetVariableMonitoring" + set_variables = "SetVariables" + sign_certificate = "SignCertificate" + status_notification = "StatusNotification" + transaction_event = "TransactionEvent" + trigger_message = "TriggerMessage" + unlock_connector = "UnlockConnector" + unpublish_firmware = "UnpublishFirmware" + update_firmware = "UpdateFirmware" # Enums From 020188cb1d4d87478d2c69d8837e1c68568ddbc2 Mon Sep 17 00:00:00 2001 From: Jared Newell Date: Wed, 17 Jan 2024 16:31:34 +0100 Subject: [PATCH 23/39] Revert "Enums Updates + change log" This reverts commit 30b69d3cd8b65b9e9d794bd8caa124def7aaf7ff. --- CHANGELOG.md | 2 - ocpp/v201/enums.py | 128 ++++++++++++++++++++++----------------------- 2 files changed, 64 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87ccd19c6..06e14504c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,5 @@ # Change log -- [#579](https://github.com/mobilityhouse/ocpp/issues/579) v2.0.1 Action enums corrected - ## 0.26.0 (2024-01-17) - [#544](https://github.com/mobilityhouse/ocpp/issues/544) ocpp/charge_point.py - Pass `Call.unique_id` to the `on` and `after` routing handlers. diff --git a/ocpp/v201/enums.py b/ocpp/v201/enums.py index 758234318..60b2fb533 100644 --- a/ocpp/v201/enums.py +++ b/ocpp/v201/enums.py @@ -11,70 +11,70 @@ class StrEnum(str, Enum): # pragma: no cover class Action(StrEnum): """An Action is a required part of a Call message.""" - authorize = "Authorize" - boot_notification = "BootNotification" - cancel_reservation = "CancelReservation" - certificate_signed = "CertificateSigned" - change_availability = "ChangeAvailability" - clear_cache = "ClearCache" - clear_charging_profile = "ClearChargingProfile" - clear_display_message = "ClearDisplayMessage" - cleared_charging_limit = "ClearedChargingLimit" - clear_variable_monitoring = "ClearVariableMonitoring" - cost_update = "CostUpdate" - customer_information = "CustomerInformation" - data_transfer = "DataTransfer" - delete_certificate = "DeleteCertificate" - firmware_status_notification = "FirmwareStatusNotification" - get_15118_ev_certificate = "Get15118EVCertificate" - get_base_report = "GetBaseReport" - get_certificate_status = "GetCertificateStatus" - get_charging_profiles = "GetChargingProfiles" - get_composite_schedule = "GetCompositeSchedule" - get_display_messages = "GetDisplayMessages" - get_installed_certificate_ids = "GetInstalledCertificateIds" - get_local_list_version = "GetLocalListVersion" - get_log = "GetLog" - get_monitoring_report = "GetMonitoringReport" - get_report = "GetReport" - get_transaction_status = "GetTransactionStatus" - get_variables = "GetVariables" - heartbeat = "Heartbeat" - install_certificate = "InstallCertificate" - log_status_notification = "LogStatusNotification" - meter_values = "MeterValues" - notify_charging_limit = "NotifyChargingLimit" - notify_customer_information = "NotifyCustomerInformation" - notify_display_messages = "NotifyDisplayMessages" - notify_ev_charging_needs = "NotifyEVChargingNeeds" - notify_ev_charging_schedule = "NotifyEVChargingSchedule" - notify_event = "NotifyEvent" - notify_monitoring_report = "NotifyMonitoringReport" - notify_report = "NotifyReport" - publish_firmware = "PublishFirmware" - publish_firmware_status_notification = "PublishFirmwareStatusNotification" - report_charging_profiles = "ReportChargingProfiles" - request_start_transaction = "RequestStartTransaction" - request_stop_transaction = "RequestStopTransaction" - reservation_status_update = "ReservationStatusUpdate" - reserve_now = "ReserveNow" - reset = "Reset" - security_event_notification = "SecurityEventNotification" - send_local_list = "SendLocalList" - set_charging_profile = "SetChargingProfile" - set_display_message = "SetDisplayMessage" - set_monitoring_base = "SetMonitoringBase" - set_monitoring_level = "SetMonitoringLevel" - set_network_profile = "SetNetworkProfile" - set_variable_monitoring = "SetVariableMonitoring" - set_variables = "SetVariables" - sign_certificate = "SignCertificate" - status_notification = "StatusNotification" - transaction_event = "TransactionEvent" - trigger_message = "TriggerMessage" - unlock_connector = "UnlockConnector" - unpublish_firmware = "UnpublishFirmware" - update_firmware = "UpdateFirmware" + Authorize = "Authorize" + BootNotification = "BootNotification" + CancelReservation = "CancelReservation" + CertificateSigned = "CertificateSigned" + ChangeAvailability = "ChangeAvailability" + ClearCache = "ClearCache" + ClearChargingProfile = "ClearChargingProfile" + ClearDisplayMessage = "ClearDisplayMessage" + ClearedChargingLimit = "ClearedChargingLimit" + ClearVariableMonitoring = "ClearVariableMonitoring" + CostUpdate = "CostUpdate" + CustomerInformation = "CustomerInformation" + DataTransfer = "DataTransfer" + DeleteCertificate = "DeleteCertificate" + FirmwareStatusNotification = "FirmwareStatusNotification" + Get15118EVCertificate = "Get15118EVCertificate" + GetBaseReport = "GetBaseReport" + GetCertificateStatus = "GetCertificateStatus" + GetChargingProfiles = "GetChargingProfiles" + GetCompositeSchedule = "GetCompositeSchedule" + GetDisplayMessages = "GetDisplayMessages" + GetInstalledCertificateIds = "GetInstalledCertificateIds" + GetLocalListVersion = "GetLocalListVersion" + GetLog = "GetLog" + GetMonitoringReport = "GetMonitoringReport" + GetReport = "GetReport" + GetTransactionStatus = "GetTransactionStatus" + GetVariables = "GetVariables" + Heartbeat = "Heartbeat" + InstallCertificate = "InstallCertificate" + LogStatusNotification = "LogStatusNotification" + MeterValues = "MeterValues" + NotifyChargingLimit = "NotifyChargingLimit" + NotifyCustomerInformation = "NotifyCustomerInformation" + NotifyDisplayMessages = "NotifyDisplayMessages" + NotifyEVChargingNeeds = "NotifyEVChargingNeeds" + NotifyEVChargingSchedule = "NotifyEVChargingSchedule" + NotifyEvent = "NotifyEvent" + NotifyMonitoringReport = "NotifyMonitoringReport" + NotifyReport = "NotifyReport" + PublishFirmware = "PublishFirmware" + PublishFirmwareStatusNotification = "PublishFirmwareStatusNotification" + ReportChargingProfiles = "ReportChargingProfiles" + RequestStartTransaction = "RequestStartTransaction" + RequestStopTransaction = "RequestStopTransaction" + ReservationStatusUpdate = "ReservationStatusUpdate" + ReserveNow = "ReserveNow" + Reset = "Reset" + SecurityEventNotification = "SecurityEventNotification" + SendLocalList = "SendLocalList" + SetChargingProfile = "SetChargingProfile" + SetDisplayMessage = "SetDisplayMessage" + SetMonitoringBase = "SetMonitoringBase" + SetMonitoringLevel = "SetMonitoringLevel" + SetNetworkProfile = "SetNetworkProfile" + SetVariableMonitoring = "SetVariableMonitoring" + SetVariables = "SetVariables" + SignCertificate = "SignCertificate" + StatusNotification = "StatusNotification" + TransactionEvent = "TransactionEvent" + TriggerMessage = "TriggerMessage" + UnlockConnector = "UnlockConnector" + UnpublishFirmware = "UnpublishFirmware" + UpdateFirmware = "UpdateFirmware" # Enums From 3052b5cc3849c8e233e6a950054200232d02a70d Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Fri, 2 Feb 2024 15:17:18 +0100 Subject: [PATCH 24/39] OCPP v1.6/v2.0.1 deprecate dataclasses from calls and call results with the suffix 'Payload' (#584) Fixes #583 --- CHANGELOG.md | 2 + ocpp/v16/call.py | 596 ++++++++++++++++++++++-- ocpp/v16/call_result.py | 594 ++++++++++++++++++++++-- ocpp/v201/call.py | 961 ++++++++++++++++++++++++++++++++++++--- ocpp/v201/call_result.py | 961 ++++++++++++++++++++++++++++++++++++--- 5 files changed, 2907 insertions(+), 207 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06e14504c..e05bb06d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Change log +- [#583](https://github.com/mobilityhouse/ocpp/issues/583) OCPP v1.6/v2.0.1 deprecate dataclasses from calls and call results with the suffix 'Payload' + ## 0.26.0 (2024-01-17) - [#544](https://github.com/mobilityhouse/ocpp/issues/544) ocpp/charge_point.py - Pass `Call.unique_id` to the `on` and `after` routing handlers. diff --git a/ocpp/v16/call.py b/ocpp/v16/call.py index fe07e7d6d..46e167b1a 100644 --- a/ocpp/v16/call.py +++ b/ocpp/v16/call.py @@ -1,3 +1,4 @@ +import warnings from dataclasses import dataclass, field from typing import Dict, List, Optional @@ -37,34 +38,34 @@ @dataclass -class CancelReservationPayload: +class CancelReservation: reservation_id: int @dataclass -class CertificateSignedPayload: +class CertificateSigned: certificate_chain: str @dataclass -class ChangeAvailabilityPayload: +class ChangeAvailability: connector_id: int type: AvailabilityType @dataclass -class ChangeConfigurationPayload: +class ChangeConfiguration: key: str value: str @dataclass -class ClearCachePayload: +class ClearCache: pass @dataclass -class ClearChargingProfilePayload: +class ClearChargingProfile: id: Optional[int] = None connector_id: Optional[int] = None charging_profile_purpose: Optional[ChargingProfilePurposeType] = None @@ -72,30 +73,30 @@ class ClearChargingProfilePayload: @dataclass -class DeleteCertificatePayload: +class DeleteCertificate: certificate_hash_data: Dict @dataclass -class ExtendedTriggerMessagePayload: +class ExtendedTriggerMessage: requested_message: MessageTrigger connector_id: Optional[int] = None @dataclass -class GetCompositeSchedulePayload: +class GetCompositeSchedule: connector_id: int duration: int charging_rate_unit: Optional[ChargingRateUnitType] = None @dataclass -class GetConfigurationPayload: +class GetConfiguration: key: Optional[List] = None @dataclass -class GetDiagnosticsPayload: +class GetDiagnostics: location: str retries: Optional[int] = None retry_interval: Optional[int] = None @@ -104,17 +105,17 @@ class GetDiagnosticsPayload: @dataclass -class GetInstalledCertificateIdsPayload: +class GetInstalledCertificateIds: certificate_type: CertificateUse @dataclass -class GetLocalListVersionPayload: +class GetLocalListVersion: pass @dataclass -class GetLogPayload: +class GetLog: log: Dict log_type: Log request_id: int @@ -123,25 +124,25 @@ class GetLogPayload: @dataclass -class InstallCertificatePayload: +class InstallCertificate: certificate_type: CertificateUse certificate: str @dataclass -class RemoteStartTransactionPayload: +class RemoteStartTransaction: id_tag: str connector_id: Optional[int] = None charging_profile: Optional[Dict] = None @dataclass -class RemoteStopTransactionPayload: +class RemoteStopTransaction: transaction_id: int @dataclass -class ReserveNowPayload: +class ReserveNow: connector_id: int expiry_date: str id_tag: str @@ -150,25 +151,25 @@ class ReserveNowPayload: @dataclass -class ResetPayload: +class Reset: type: ResetType @dataclass -class SendLocalListPayload: +class SendLocalList: list_version: int update_type: UpdateType local_authorization_list: List = field(default_factory=list) @dataclass -class SetChargingProfilePayload: +class SetChargingProfile: connector_id: int cs_charging_profiles: Dict @dataclass -class SignedUpdateFirmwarePayload: +class SignedUpdateFirmware: request_id: int firmware: Dict retries: Optional[int] = None @@ -176,18 +177,18 @@ class SignedUpdateFirmwarePayload: @dataclass -class TriggerMessagePayload: +class TriggerMessage: requested_message: MessageTrigger connector_id: Optional[int] = None @dataclass -class UnlockConnectorPayload: +class UnlockConnector: connector_id: int @dataclass -class UpdateFirmwarePayload: +class UpdateFirmware: location: str retrieve_date: str retries: Optional[int] = None @@ -199,12 +200,12 @@ class UpdateFirmwarePayload: @dataclass -class AuthorizePayload: +class Authorize: id_tag: str @dataclass -class BootNotificationPayload: +class BootNotification: charge_point_model: str charge_point_vendor: str charge_box_serial_number: Optional[str] = None @@ -217,53 +218,53 @@ class BootNotificationPayload: @dataclass -class DiagnosticsStatusNotificationPayload: +class DiagnosticsStatusNotification: status: DiagnosticsStatus @dataclass -class FirmwareStatusNotificationPayload: +class FirmwareStatusNotification: status: FirmwareStatus @dataclass -class HeartbeatPayload: +class Heartbeat: pass @dataclass -class LogStatusNotificationPayload: +class LogStatusNotification: status: UploadLogStatus request_id: int @dataclass -class MeterValuesPayload: +class MeterValues: connector_id: int meter_value: List = field(default_factory=list) transaction_id: Optional[int] = None @dataclass -class SecurityEventNotificationPayload: +class SecurityEventNotification: type: str timestamp: str tech_info: Optional[str] @dataclass -class SignCertificatePayload: +class SignCertificate: csr: str @dataclass -class SignedFirmwareStatusNotificationPayload: +class SignedFirmwareStatusNotification: status: FirmwareStatus request_id: int @dataclass -class StartTransactionPayload: +class StartTransaction: connector_id: int id_tag: str meter_start: int @@ -272,7 +273,7 @@ class StartTransactionPayload: @dataclass -class StopTransactionPayload: +class StopTransaction: meter_stop: int timestamp: str transaction_id: int @@ -282,7 +283,7 @@ class StopTransactionPayload: @dataclass -class StatusNotificationPayload: +class StatusNotification: connector_id: int error_code: ChargePointErrorCode status: ChargePointStatus @@ -292,12 +293,527 @@ class StatusNotificationPayload: vendor_error_code: Optional[str] = None -# The DataTransfer CALL can be send both from Central System as well as from a +# The DataTransfer CALL can be sent both from Central System as well as from a # Charge Point. @dataclass -class DataTransferPayload: +class DataTransfer: vendor_id: str message_id: Optional[str] = None data: Optional[str] = None + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CancelReservationPayload(CancelReservation): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CertificateSignedPayload(CertificateSigned): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ChangeAvailabilityPayload(ChangeAvailability): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ChangeConfigurationPayload(ChangeConfiguration): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearCachePayload(ClearCache): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearChargingProfilePayload(ClearChargingProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DeleteCertificatePayload(DeleteCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ExtendedTriggerMessagePayload(ExtendedTriggerMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetCompositeSchedulePayload(GetCompositeSchedule): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetConfigurationPayload(GetConfiguration): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetDiagnosticsPayload(GetDiagnostics): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetInstalledCertificateIdsPayload(GetInstalledCertificateIds): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetLocalListVersionPayload(GetLocalListVersion): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetLogPayload(GetLog): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class InstallCertificatePayload(InstallCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class RemoteStartTransactionPayload(RemoteStartTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class RemoteStopTransactionPayload(RemoteStopTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ReserveNowPayload(ReserveNow): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ResetPayload(Reset): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SendLocalListPayload(SendLocalList): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetChargingProfilePayload(SetChargingProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SignedUpdateFirmwarePayload(SignedUpdateFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class TriggerMessagePayload(TriggerMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UnlockConnectorPayload(UnlockConnector): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UpdateFirmwarePayload(UpdateFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# The CALL messages that flow from Charge Point to Central System are listed +# in the bottom part of this module. + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class AuthorizePayload(Authorize): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class BootNotificationPayload(BootNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DiagnosticsStatusNotificationPayload(DiagnosticsStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class FirmwareStatusNotificationPayload(FirmwareStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class HeartbeatPayload(Heartbeat): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class LogStatusNotificationPayload(LogStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class MeterValuesPayload(MeterValues): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SecurityEventNotificationPayload(SecurityEventNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SignCertificatePayload(SignCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SignedFirmwareStatusNotificationPayload(SignedFirmwareStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class StartTransactionPayload(StartTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class StopTransactionPayload(StopTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class StatusNotificationPayload(StatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# The DataTransfer CALL can be send both from Central System as well as from a +# Charge Point. + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DataTransferPayload(DataTransfer): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) diff --git a/ocpp/v16/call_result.py b/ocpp/v16/call_result.py index 4e105d33b..cb76ec16a 100644 --- a/ocpp/v16/call_result.py +++ b/ocpp/v16/call_result.py @@ -1,3 +1,4 @@ +import warnings from dataclasses import dataclass from typing import Dict, List, Optional @@ -46,65 +47,65 @@ @dataclass -class AuthorizePayload: +class Authorize: id_tag_info: IdTagInfo @dataclass -class BootNotificationPayload: +class BootNotification: current_time: str interval: int status: RegistrationStatus @dataclass -class DiagnosticsStatusNotificationPayload: +class DiagnosticsStatusNotification: pass @dataclass -class FirmwareStatusNotificationPayload: +class FirmwareStatusNotification: pass @dataclass -class HeartbeatPayload: +class Heartbeat: current_time: str @dataclass -class LogStatusNotificationPayload: +class LogStatusNotification: pass @dataclass -class SecurityEventNotificationPayload: +class SecurityEventNotification: pass @dataclass -class SignCertificatePayload: +class SignCertificate: status: GenericStatus @dataclass -class MeterValuesPayload: +class MeterValues: pass @dataclass -class StartTransactionPayload: +class StartTransaction: transaction_id: int id_tag_info: IdTagInfo @dataclass -class StatusNotificationPayload: +class StatusNotification: pass @dataclass -class StopTransactionPayload: +class StopTransaction: id_tag_info: Optional[IdTagInfo] = None @@ -113,53 +114,53 @@ class StopTransactionPayload: @dataclass -class CancelReservationPayload: +class CancelReservation: status: CancelReservationStatus @dataclass -class CertificateSignedPayload: +class CertificateSigned: status: CertificateSignedStatus @dataclass -class ChangeAvailabilityPayload: +class ChangeAvailability: status: AvailabilityStatus @dataclass -class ChangeConfigurationPayload: +class ChangeConfiguration: status: ConfigurationStatus @dataclass -class ClearCachePayload: +class ClearCache: status: ClearCacheStatus @dataclass -class ClearChargingProfilePayload: +class ClearChargingProfile: status: ClearChargingProfileStatus @dataclass -class DeleteCertificatePayload: +class DeleteCertificate: status: DeleteCertificateStatus @dataclass -class ExtendedTriggerMessagePayload: +class ExtendedTriggerMessage: status: TriggerMessageStatus @dataclass -class GetInstalledCertificateIdsPayload: +class GetInstalledCertificateIds: status: GetInstalledCertificateStatus certificate_hash_data: Optional[List] = None @dataclass -class GetCompositeSchedulePayload: +class GetCompositeSchedule: status: GetCompositeScheduleStatus connector_id: Optional[int] = None schedule_start: Optional[str] = None @@ -167,84 +168,84 @@ class GetCompositeSchedulePayload: @dataclass -class GetConfigurationPayload: +class GetConfiguration: configuration_key: Optional[List] = None unknown_key: Optional[List] = None @dataclass -class GetDiagnosticsPayload: +class GetDiagnostics: file_name: Optional[str] = None @dataclass -class GetLocalListVersionPayload: +class GetLocalListVersion: list_version: int @dataclass -class GetLogPayload: +class GetLog: status: LogStatus filename: Optional[str] = None @dataclass -class InstallCertificatePayload: +class InstallCertificate: status: CertificateStatus @dataclass -class RemoteStartTransactionPayload: +class RemoteStartTransaction: status: RemoteStartStopStatus @dataclass -class RemoteStopTransactionPayload: +class RemoteStopTransaction: status: RemoteStartStopStatus @dataclass -class ReserveNowPayload: +class ReserveNow: status: ReservationStatus @dataclass -class ResetPayload: +class Reset: status: ResetStatus @dataclass -class SendLocalListPayload: +class SendLocalList: status: UpdateStatus @dataclass -class SetChargingProfilePayload: +class SetChargingProfile: status: ChargingProfileStatus @dataclass -class SignedFirmwareStatusNotificationPayload: +class SignedFirmwareStatusNotification: pass @dataclass -class SignedUpdateFirmwarePayload: +class SignedUpdateFirmware: status: UpdateFirmwareStatus @dataclass -class TriggerMessagePayload: +class TriggerMessage: status: TriggerMessageStatus @dataclass -class UnlockConnectorPayload: +class UnlockConnector: status: UnlockStatus @dataclass -class UpdateFirmwarePayload: +class UpdateFirmware: pass @@ -253,6 +254,521 @@ class UpdateFirmwarePayload: @dataclass -class DataTransferPayload: +class DataTransfer: status: DataTransferStatus data: Optional[str] = None + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class AuthorizePayload(Authorize): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class BootNotificationPayload(BootNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DiagnosticsStatusNotificationPayload(DiagnosticsStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class FirmwareStatusNotificationPayload(FirmwareStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class HeartbeatPayload(Heartbeat): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class LogStatusNotificationPayload(LogStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SecurityEventNotificationPayload(SecurityEventNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SignCertificatePayload(SignCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class MeterValuesPayload(MeterValues): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class StartTransactionPayload(StartTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class StatusNotificationPayload(StatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class StopTransactionPayload(StopTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# The CALLRESULT messages that flow from Charge Point to Central System are +# listed in the bottom part of this module. + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CancelReservationPayload(CancelReservation): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CertificateSignedPayload(CertificateSigned): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ChangeAvailabilityPayload(ChangeAvailability): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ChangeConfigurationPayload(ChangeConfiguration): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearCachePayload(ClearCache): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearChargingProfilePayload(ClearChargingProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DeleteCertificatePayload(DeleteCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ExtendedTriggerMessagePayload(ExtendedTriggerMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetInstalledCertificateIdsPayload(GetInstalledCertificateIds): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetCompositeSchedulePayload(GetCompositeSchedule): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetConfigurationPayload(GetConfiguration): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetDiagnosticsPayload(GetDiagnostics): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetLocalListVersionPayload(GetLocalListVersion): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetLogPayload(GetLog): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class InstallCertificatePayload(InstallCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class RemoteStartTransactionPayload(RemoteStartTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class RemoteStopTransactionPayload(RemoteStopTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ReserveNowPayload(ReserveNow): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ResetPayload(Reset): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SendLocalListPayload(SendLocalList): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetChargingProfilePayload(SetChargingProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SignedFirmwareStatusNotificationPayload(SignedFirmwareStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SignedUpdateFirmwarePayload(SignedUpdateFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class TriggerMessagePayload(TriggerMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UnlockConnectorPayload(UnlockConnector): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UpdateFirmwarePayload(UpdateFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# The DataTransfer CALLRESULT can be send both from Central System as well as +# from a Charge Point. + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DataTransferPayload(DataTransfer): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) diff --git a/ocpp/v201/call.py b/ocpp/v201/call.py index bff98238b..461f37365 100644 --- a/ocpp/v201/call.py +++ b/ocpp/v201/call.py @@ -1,9 +1,10 @@ +import warnings from dataclasses import dataclass from typing import Any, Dict, List, Optional @dataclass -class AuthorizePayload: +class Authorize: id_token: Dict certificate: Optional[str] = None iso15118_certificate_hash_data: Optional[List] = None @@ -11,72 +12,72 @@ class AuthorizePayload: @dataclass -class BootNotificationPayload: +class BootNotification: charging_station: Dict reason: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class CancelReservationPayload: +class CancelReservation: reservation_id: int custom_data: Optional[Dict[str, Any]] = None @dataclass -class CertificateSignedPayload: +class CertificateSigned: certificate_chain: str certificate_type: Optional[str] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ChangeAvailabilityPayload: +class ChangeAvailability: operational_status: str evse: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearCachePayload: +class ClearCache: custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearChargingProfilePayload: +class ClearChargingProfile: charging_profile_id: Optional[int] = None charging_profile_criteria: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearDisplayMessagePayload: +class ClearDisplayMessage: id: int custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearVariableMonitoringPayload: +class ClearVariableMonitoring: id: List custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearedChargingLimitPayload: +class ClearedChargingLimit: charging_limit_source: str evse_id: Optional[int] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class CostUpdatedPayload: +class CostUpdated: total_cost: int transaction_id: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class CustomerInformationPayload: +class CustomerInformation: request_id: int report: bool clear: bool @@ -87,7 +88,7 @@ class CustomerInformationPayload: @dataclass -class DataTransferPayload: +class DataTransfer: vendor_id: str message_id: Optional[str] = None data: Optional[Any] = None @@ -95,20 +96,20 @@ class DataTransferPayload: @dataclass -class DeleteCertificatePayload: +class DeleteCertificate: certificate_hash_data: Dict custom_data: Optional[Dict[str, Any]] = None @dataclass -class FirmwareStatusNotificationPayload: +class FirmwareStatusNotification: status: str request_id: Optional[int] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class Get15118EVCertificatePayload: +class Get15118EVCertificate: iso15118_schema_version: str action: str exi_request: str @@ -116,20 +117,20 @@ class Get15118EVCertificatePayload: @dataclass -class GetBaseReportPayload: +class GetBaseReport: request_id: int report_base: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetCertificateStatusPayload: +class GetCertificateStatus: ocsp_request_data: Dict custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetChargingProfilesPayload: +class GetChargingProfiles: request_id: int charging_profile: Dict evse_id: Optional[int] = None @@ -137,7 +138,7 @@ class GetChargingProfilesPayload: @dataclass -class GetCompositeSchedulePayload: +class GetCompositeSchedule: duration: int evse_id: int charging_rate_unit: Optional[str] = None @@ -145,7 +146,7 @@ class GetCompositeSchedulePayload: @dataclass -class GetDisplayMessagesPayload: +class GetDisplayMessages: request_id: int id: Optional[List] = None priority: Optional[str] = None @@ -154,18 +155,18 @@ class GetDisplayMessagesPayload: @dataclass -class GetInstalledCertificateIdsPayload: +class GetInstalledCertificateIds: certificate_type: Optional[List] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetLocalListVersionPayload: +class GetLocalListVersion: custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetLogPayload: +class GetLog: log: Dict log_type: str request_id: int @@ -175,7 +176,7 @@ class GetLogPayload: @dataclass -class GetMonitoringReportPayload: +class GetMonitoringReport: request_id: int component_variable: Optional[List] = None monitoring_criteria: Optional[List] = None @@ -183,7 +184,7 @@ class GetMonitoringReportPayload: @dataclass -class GetReportPayload: +class GetReport: request_id: int component_variable: Optional[List] = None component_criteria: Optional[List] = None @@ -191,45 +192,45 @@ class GetReportPayload: @dataclass -class GetTransactionStatusPayload: +class GetTransactionStatus: transaction_id: Optional[str] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetVariablesPayload: +class GetVariables: get_variable_data: List custom_data: Optional[Dict[str, Any]] = None @dataclass -class HeartbeatPayload: +class Heartbeat: custom_data: Optional[Dict[str, Any]] = None @dataclass -class InstallCertificatePayload: +class InstallCertificate: certificate_type: str certificate: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class LogStatusNotificationPayload: +class LogStatusNotification: status: str request_id: Optional[int] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class MeterValuesPayload: +class MeterValues: evse_id: int meter_value: List custom_data: Optional[Dict[str, Any]] = None @dataclass -class NotifyChargingLimitPayload: +class NotifyChargingLimit: charging_limit: Dict charging_schedule: Optional[List] = None evse_id: Optional[int] = None @@ -237,7 +238,7 @@ class NotifyChargingLimitPayload: @dataclass -class NotifyCustomerInformationPayload: +class NotifyCustomerInformation: data: str seq_no: int generated_at: str @@ -247,7 +248,7 @@ class NotifyCustomerInformationPayload: @dataclass -class NotifyDisplayMessagesPayload: +class NotifyDisplayMessages: request_id: int message_info: Optional[List] = None tbc: Optional[bool] = None @@ -255,7 +256,7 @@ class NotifyDisplayMessagesPayload: @dataclass -class NotifyEVChargingNeedsPayload: +class NotifyEVChargingNeeds: charging_needs: Dict evse_id: int max_schedule_tuples: Optional[int] = None @@ -263,7 +264,7 @@ class NotifyEVChargingNeedsPayload: @dataclass -class NotifyEVChargingSchedulePayload: +class NotifyEVChargingSchedule: time_base: str charging_schedule: Dict evse_id: int @@ -271,7 +272,7 @@ class NotifyEVChargingSchedulePayload: @dataclass -class NotifyEventPayload: +class NotifyEvent: generated_at: str seq_no: int event_data: List @@ -280,7 +281,7 @@ class NotifyEventPayload: @dataclass -class NotifyMonitoringReportPayload: +class NotifyMonitoringReport: request_id: int seq_no: int generated_at: str @@ -290,7 +291,7 @@ class NotifyMonitoringReportPayload: @dataclass -class NotifyReportPayload: +class NotifyReport: request_id: int generated_at: str seq_no: int @@ -300,7 +301,7 @@ class NotifyReportPayload: @dataclass -class PublishFirmwarePayload: +class PublishFirmware: location: str checksum: str request_id: int @@ -310,7 +311,7 @@ class PublishFirmwarePayload: @dataclass -class PublishFirmwareStatusNotificationPayload: +class PublishFirmwareStatusNotification: status: str location: Optional[List] = None request_id: Optional[int] = None @@ -318,7 +319,7 @@ class PublishFirmwareStatusNotificationPayload: @dataclass -class ReportChargingProfilesPayload: +class ReportChargingProfiles: request_id: int charging_limit_source: str charging_profile: List @@ -328,7 +329,7 @@ class ReportChargingProfilesPayload: @dataclass -class RequestStartTransactionPayload: +class RequestStartTransaction: id_token: Dict remote_start_id: int evse_id: Optional[int] = None @@ -338,20 +339,20 @@ class RequestStartTransactionPayload: @dataclass -class RequestStopTransactionPayload: +class RequestStopTransaction: transaction_id: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class ReservationStatusUpdatePayload: +class ReservationStatusUpdate: reservation_id: int reservation_update_status: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class ReserveNowPayload: +class ReserveNow: id: int expiry_date_time: str id_token: Dict @@ -362,14 +363,14 @@ class ReserveNowPayload: @dataclass -class ResetPayload: +class Reset: type: str evse_id: Optional[int] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class SecurityEventNotificationPayload: +class SecurityEventNotification: type: str timestamp: str tech_info: Optional[str] = None @@ -377,7 +378,7 @@ class SecurityEventNotificationPayload: @dataclass -class SendLocalListPayload: +class SendLocalList: version_number: int update_type: str local_authorization_list: Optional[List] = None @@ -385,58 +386,58 @@ class SendLocalListPayload: @dataclass -class SetChargingProfilePayload: +class SetChargingProfile: evse_id: int charging_profile: Dict custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetDisplayMessagePayload: +class SetDisplayMessage: message: Dict custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetMonitoringBasePayload: +class SetMonitoringBase: monitoring_base: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetMonitoringLevelPayload: +class SetMonitoringLevel: severity: int custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetNetworkProfilePayload: +class SetNetworkProfile: configuration_slot: int connection_data: Dict custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetVariableMonitoringPayload: +class SetVariableMonitoring: set_monitoring_data: List custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetVariablesPayload: +class SetVariables: set_variable_data: List custom_data: Optional[Dict[str, Any]] = None @dataclass -class SignCertificatePayload: +class SignCertificate: csr: str certificate_type: Optional[str] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class StatusNotificationPayload: +class StatusNotification: timestamp: str connector_status: str evse_id: int @@ -445,7 +446,7 @@ class StatusNotificationPayload: @dataclass -class TransactionEventPayload: +class TransactionEvent: event_type: str timestamp: str trigger_reason: str @@ -462,29 +463,861 @@ class TransactionEventPayload: @dataclass -class TriggerMessagePayload: +class TriggerMessage: requested_message: str evse: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class UnlockConnectorPayload: +class UnlockConnector: evse_id: int connector_id: int custom_data: Optional[Dict[str, Any]] = None @dataclass -class UnpublishFirmwarePayload: +class UnpublishFirmware: checksum: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class UpdateFirmwarePayload: +class UpdateFirmware: request_id: int firmware: Dict retries: Optional[int] = None retry_interval: Optional[int] = None custom_data: Optional[Dict[str, Any]] = None + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class AuthorizePayload(Authorize): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class BootNotificationPayload(BootNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CancelReservationPayload(CancelReservation): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CertificateSignedPayload(CertificateSigned): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ChangeAvailabilityPayload(ChangeAvailability): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearCachePayload(ClearCache): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearChargingProfilePayload(ClearChargingProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearDisplayMessagePayload(ClearDisplayMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearVariableMonitoringPayload(ClearVariableMonitoring): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearedChargingLimitPayload(ClearedChargingLimit): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CostUpdatedPayload(CostUpdated): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CustomerInformationPayload(CustomerInformation): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DataTransferPayload(DataTransfer): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DeleteCertificatePayload(DeleteCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class FirmwareStatusNotificationPayload(FirmwareStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class Get15118EVCertificatePayload(Get15118EVCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetBaseReportPayload(GetBaseReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetCertificateStatusPayload(GetCertificateStatus): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetChargingProfilesPayload(GetChargingProfiles): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetCompositeSchedulePayload(GetCompositeSchedule): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetDisplayMessagesPayload(GetDisplayMessages): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetInstalledCertificateIdsPayload(GetInstalledCertificateIds): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetLocalListVersionPayload(GetLocalListVersion): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetLogPayload(GetLog): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetMonitoringReportPayload(GetMonitoringReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetReportPayload(GetReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetTransactionStatusPayload(GetTransactionStatus): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetVariablesPayload(GetVariables): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class HeartbeatPayload(Heartbeat): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class InstallCertificatePayload(InstallCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class LogStatusNotificationPayload(LogStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class MeterValuesPayload(MeterValues): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyChargingLimitPayload(NotifyChargingLimit): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyCustomerInformationPayload(NotifyCustomerInformation): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyDisplayMessagesPayload(NotifyDisplayMessages): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyEVChargingNeedsPayload(NotifyEVChargingNeeds): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyEVChargingSchedulePayload(NotifyEVChargingSchedule): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyEventPayload(NotifyEvent): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyMonitoringReportPayload(NotifyMonitoringReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyReportPayload(NotifyReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class PublishFirmwarePayload(PublishFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class PublishFirmwareStatusNotificationPayload(PublishFirmwareStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ReportChargingProfilesPayload(ReportChargingProfiles): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class RequestStartTransactionPayload(RequestStartTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class RequestStopTransactionPayload(RequestStopTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ReservationStatusUpdatePayload(ReservationStatusUpdate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ReserveNowPayload(ReserveNow): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ResetPayload(Reset): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SecurityEventNotificationPayload(SecurityEventNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SendLocalListPayload(SendLocalList): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetChargingProfilePayload(SetChargingProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetDisplayMessagePayload(SetDisplayMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetMonitoringBasePayload(SetMonitoringBase): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetMonitoringLevelPayload(SetMonitoringLevel): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetNetworkProfilePayload(SetNetworkProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetVariableMonitoringPayload(SetVariableMonitoring): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetVariablesPayload(SetVariables): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SignCertificatePayload(SignCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class StatusNotificationPayload(StatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class TransactionEventPayload(TransactionEvent): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class TriggerMessagePayload(TriggerMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UnlockConnectorPayload(UnlockConnector): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UnpublishFirmwarePayload(UnpublishFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UpdateFirmwarePayload(UpdateFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) diff --git a/ocpp/v201/call_result.py b/ocpp/v201/call_result.py index 3a59b07a2..520537ce0 100644 --- a/ocpp/v201/call_result.py +++ b/ocpp/v201/call_result.py @@ -1,16 +1,17 @@ +import warnings from dataclasses import dataclass from typing import Any, Dict, List, Optional @dataclass -class AuthorizePayload: +class Authorize: id_token_info: Dict certificate_status: Optional[str] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class BootNotificationPayload: +class BootNotification: current_time: str interval: int status: str @@ -19,72 +20,72 @@ class BootNotificationPayload: @dataclass -class CancelReservationPayload: +class CancelReservation: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class CertificateSignedPayload: +class CertificateSigned: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ChangeAvailabilityPayload: +class ChangeAvailability: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearCachePayload: +class ClearCache: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearChargingProfilePayload: +class ClearChargingProfile: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearDisplayMessagePayload: +class ClearDisplayMessage: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearVariableMonitoringPayload: +class ClearVariableMonitoring: clear_monitoring_result: List custom_data: Optional[Dict[str, Any]] = None @dataclass -class ClearedChargingLimitPayload: +class ClearedChargingLimit: custom_data: Optional[Dict[str, Any]] = None @dataclass -class CostUpdatedPayload: +class CostUpdated: custom_data: Optional[Dict[str, Any]] = None @dataclass -class CustomerInformationPayload: +class CustomerInformation: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class DataTransferPayload: +class DataTransfer: status: str status_info: Optional[Dict] = None data: Optional[Any] = None @@ -92,19 +93,19 @@ class DataTransferPayload: @dataclass -class DeleteCertificatePayload: +class DeleteCertificate: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class FirmwareStatusNotificationPayload: +class FirmwareStatusNotification: custom_data: Optional[Dict[str, Any]] = None @dataclass -class Get15118EVCertificatePayload: +class Get15118EVCertificate: status: str exi_response: str status_info: Optional[Dict] = None @@ -112,14 +113,14 @@ class Get15118EVCertificatePayload: @dataclass -class GetBaseReportPayload: +class GetBaseReport: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetCertificateStatusPayload: +class GetCertificateStatus: status: str status_info: Optional[Dict] = None ocsp_result: Optional[str] = None @@ -127,14 +128,14 @@ class GetCertificateStatusPayload: @dataclass -class GetChargingProfilesPayload: +class GetChargingProfiles: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetCompositeSchedulePayload: +class GetCompositeSchedule: status: str status_info: Optional[Dict] = None schedule: Optional[Dict] = None @@ -142,14 +143,14 @@ class GetCompositeSchedulePayload: @dataclass -class GetDisplayMessagesPayload: +class GetDisplayMessages: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetInstalledCertificateIdsPayload: +class GetInstalledCertificateIds: status: str status_info: Optional[Dict] = None certificate_hash_data_chain: Optional[List] = None @@ -157,13 +158,13 @@ class GetInstalledCertificateIdsPayload: @dataclass -class GetLocalListVersionPayload: +class GetLocalListVersion: version_number: int custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetLogPayload: +class GetLog: status: str status_info: Optional[Dict] = None filename: Optional[str] = None @@ -171,118 +172,118 @@ class GetLogPayload: @dataclass -class GetMonitoringReportPayload: +class GetMonitoringReport: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetReportPayload: +class GetReport: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetTransactionStatusPayload: +class GetTransactionStatus: messages_in_queue: bool ongoing_indicator: Optional[bool] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class GetVariablesPayload: +class GetVariables: get_variable_result: List custom_data: Optional[Dict[str, Any]] = None @dataclass -class HeartbeatPayload: +class Heartbeat: current_time: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class InstallCertificatePayload: +class InstallCertificate: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class LogStatusNotificationPayload: +class LogStatusNotification: custom_data: Optional[Dict[str, Any]] = None @dataclass -class MeterValuesPayload: +class MeterValues: custom_data: Optional[Dict[str, Any]] = None @dataclass -class NotifyChargingLimitPayload: +class NotifyChargingLimit: custom_data: Optional[Dict[str, Any]] = None @dataclass -class NotifyCustomerInformationPayload: +class NotifyCustomerInformation: custom_data: Optional[Dict[str, Any]] = None @dataclass -class NotifyDisplayMessagesPayload: +class NotifyDisplayMessages: custom_data: Optional[Dict[str, Any]] = None @dataclass -class NotifyEVChargingNeedsPayload: +class NotifyEVChargingNeeds: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class NotifyEVChargingSchedulePayload: +class NotifyEVChargingSchedule: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class NotifyEventPayload: +class NotifyEvent: custom_data: Optional[Dict[str, Any]] = None @dataclass -class NotifyMonitoringReportPayload: +class NotifyMonitoringReport: custom_data: Optional[Dict[str, Any]] = None @dataclass -class NotifyReportPayload: +class NotifyReport: custom_data: Optional[Dict[str, Any]] = None @dataclass -class PublishFirmwarePayload: +class PublishFirmware: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class PublishFirmwareStatusNotificationPayload: +class PublishFirmwareStatusNotification: custom_data: Optional[Dict[str, Any]] = None @dataclass -class ReportChargingProfilesPayload: +class ReportChargingProfiles: custom_data: Optional[Dict[str, Any]] = None @dataclass -class RequestStartTransactionPayload: +class RequestStartTransaction: status: str status_info: Optional[Dict] = None transaction_id: Optional[str] = None @@ -290,104 +291,104 @@ class RequestStartTransactionPayload: @dataclass -class RequestStopTransactionPayload: +class RequestStopTransaction: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ReservationStatusUpdatePayload: +class ReservationStatusUpdate: custom_data: Optional[Dict[str, Any]] = None @dataclass -class ReserveNowPayload: +class ReserveNow: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class ResetPayload: +class Reset: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class SecurityEventNotificationPayload: +class SecurityEventNotification: custom_data: Optional[Dict[str, Any]] = None @dataclass -class SendLocalListPayload: +class SendLocalList: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetChargingProfilePayload: +class SetChargingProfile: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetDisplayMessagePayload: +class SetDisplayMessage: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetMonitoringBasePayload: +class SetMonitoringBase: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetMonitoringLevelPayload: +class SetMonitoringLevel: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetNetworkProfilePayload: +class SetNetworkProfile: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetVariableMonitoringPayload: +class SetVariableMonitoring: set_monitoring_result: List custom_data: Optional[Dict[str, Any]] = None @dataclass -class SetVariablesPayload: +class SetVariables: set_variable_result: List custom_data: Optional[Dict[str, Any]] = None @dataclass -class SignCertificatePayload: +class SignCertificate: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class StatusNotificationPayload: +class StatusNotification: custom_data: Optional[Dict[str, Any]] = None @dataclass -class TransactionEventPayload: +class TransactionEvent: total_cost: Optional[int] = None charging_priority: Optional[int] = None id_token_info: Optional[Dict] = None @@ -396,27 +397,859 @@ class TransactionEventPayload: @dataclass -class TriggerMessagePayload: +class TriggerMessage: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class UnlockConnectorPayload: +class UnlockConnector: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None @dataclass -class UnpublishFirmwarePayload: +class UnpublishFirmware: status: str custom_data: Optional[Dict[str, Any]] = None @dataclass -class UpdateFirmwarePayload: +class UpdateFirmware: status: str status_info: Optional[Dict] = None custom_data: Optional[Dict[str, Any]] = None + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class AuthorizePayload(Authorize): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class BootNotificationPayload(BootNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CancelReservationPayload(CancelReservation): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CertificateSignedPayload(CertificateSigned): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ChangeAvailabilityPayload(ChangeAvailability): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearCachePayload(ClearCache): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearChargingProfilePayload(ClearChargingProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearDisplayMessagePayload(ClearDisplayMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearVariableMonitoringPayload(ClearVariableMonitoring): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ClearedChargingLimitPayload(ClearedChargingLimit): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CostUpdatedPayload(CostUpdated): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class CustomerInformationPayload(CustomerInformation): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DataTransferPayload(DataTransfer): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class DeleteCertificatePayload(DeleteCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class FirmwareStatusNotificationPayload(FirmwareStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class Get15118EVCertificatePayload(Get15118EVCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetBaseReportPayload(GetBaseReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetCertificateStatusPayload(GetCertificateStatus): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetChargingProfilesPayload(GetChargingProfiles): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetCompositeSchedulePayload(GetCompositeSchedule): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetDisplayMessagesPayload(GetDisplayMessages): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetInstalledCertificateIdsPayload(GetInstalledCertificateIds): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetLocalListVersionPayload(GetLocalListVersion): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetLogPayload(GetLog): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetMonitoringReportPayload(GetMonitoringReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetReportPayload(GetReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetTransactionStatusPayload(GetTransactionStatus): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class GetVariablesPayload(GetVariables): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class HeartbeatPayload(Heartbeat): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class InstallCertificatePayload(InstallCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class LogStatusNotificationPayload(LogStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class MeterValuesPayload(MeterValues): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyChargingLimitPayload(NotifyChargingLimit): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyCustomerInformationPayload(NotifyCustomerInformation): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyDisplayMessagesPayload(NotifyDisplayMessages): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyEVChargingNeedsPayload(NotifyEVChargingNeeds): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyEVChargingSchedulePayload(NotifyEVChargingSchedule): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyEventPayload(NotifyEvent): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyMonitoringReportPayload(NotifyMonitoringReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class NotifyReportPayload(NotifyReport): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class PublishFirmwarePayload(PublishFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class PublishFirmwareStatusNotificationPayload(PublishFirmwareStatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ReportChargingProfilesPayload(ReportChargingProfiles): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class RequestStartTransactionPayload(RequestStartTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class RequestStopTransactionPayload(RequestStopTransaction): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ReservationStatusUpdatePayload(ReservationStatusUpdate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ReserveNowPayload(ReserveNow): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class ResetPayload(Reset): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SecurityEventNotificationPayload(SecurityEventNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SendLocalListPayload(SendLocalList): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetChargingProfilePayload(SetChargingProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetDisplayMessagePayload(SetDisplayMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetMonitoringBasePayload(SetMonitoringBase): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetMonitoringLevelPayload(SetMonitoringLevel): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetNetworkProfilePayload(SetNetworkProfile): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetVariableMonitoringPayload(SetVariableMonitoring): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SetVariablesPayload(SetVariables): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class SignCertificatePayload(SignCertificate): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class StatusNotificationPayload(StatusNotification): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class TransactionEventPayload(TransactionEvent): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class TriggerMessagePayload(TriggerMessage): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UnlockConnectorPayload(UnlockConnector): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UnpublishFirmwarePayload(UnpublishFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) + + +# Dataclass soon to be deprecated use equal class name without the suffix 'Payload' +@dataclass +class UpdateFirmwarePayload(UpdateFirmware): + def __post_init__(self): + warnings.warn( + ( + __class__.__name__ + + " is deprecated, use instead " + + __class__.__mro__[1].__name__ + ) + ) From c2141c04c8021874264d3fc78d35ff56f0bfe13d Mon Sep 17 00:00:00 2001 From: Jared Newell Date: Mon, 5 Feb 2024 13:26:30 +0100 Subject: [PATCH 25/39] v2x corrected --- CHANGELOG.md | 1 + ocpp/charge_point.py | 1 + tests/test_charge_point.py | 2 ++ 3 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e05bb06d0..2b5c238d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Change log - [#583](https://github.com/mobilityhouse/ocpp/issues/583) OCPP v1.6/v2.0.1 deprecate dataclasses from calls and call results with the suffix 'Payload' +- [#591](https://github.com/mobilityhouse/ocpp/issues/591) Camel_to_snake_case doesn't handle v2x correctly ## 0.26.0 (2024-01-17) diff --git a/ocpp/charge_point.py b/ocpp/charge_point.py index 4d7cb9676..e23fbf50d 100644 --- a/ocpp/charge_point.py +++ b/ocpp/charge_point.py @@ -25,6 +25,7 @@ def camel_to_snake_case(data): if isinstance(data, dict): snake_case_dict = {} for key, value in data.items(): + key = key.replace("V2X", "_v2x") s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", key) key = re.sub("([a-z0-9])([A-Z])(?=\\S)", r"\1_\2", s1).lower() diff --git a/tests/test_charge_point.py b/tests/test_charge_point.py index 897fabc2b..e8d71c3fd 100644 --- a/tests/test_charge_point.py +++ b/tests/test_charge_point.py @@ -58,6 +58,8 @@ def heartbeat(self, **kwargs): [ ({"transactionId": "74563478"}, {"transaction_id": "74563478"}), ({"fullSoC": 100}, {"full_soc": 100}), + ({"evMinV2XEnergyRequest": 200}, {"ev_min_v2x_energy_request": 200}), + ({"v2xChargingCtrlr": 200}, {"v2x_charging_ctrlr": 200}), ], ) def test_camel_to_snake_case(test_input, expected): From c587d236613ae0eb8cc739d34d4c6cfa71918c71 Mon Sep 17 00:00:00 2001 From: Jared Newell Date: Mon, 5 Feb 2024 13:28:31 +0100 Subject: [PATCH 26/39] Revert "v2x corrected" This reverts commit c2141c04c8021874264d3fc78d35ff56f0bfe13d. --- CHANGELOG.md | 1 - ocpp/charge_point.py | 1 - tests/test_charge_point.py | 2 -- 3 files changed, 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b5c238d1..e05bb06d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,6 @@ # Change log - [#583](https://github.com/mobilityhouse/ocpp/issues/583) OCPP v1.6/v2.0.1 deprecate dataclasses from calls and call results with the suffix 'Payload' -- [#591](https://github.com/mobilityhouse/ocpp/issues/591) Camel_to_snake_case doesn't handle v2x correctly ## 0.26.0 (2024-01-17) diff --git a/ocpp/charge_point.py b/ocpp/charge_point.py index e23fbf50d..4d7cb9676 100644 --- a/ocpp/charge_point.py +++ b/ocpp/charge_point.py @@ -25,7 +25,6 @@ def camel_to_snake_case(data): if isinstance(data, dict): snake_case_dict = {} for key, value in data.items(): - key = key.replace("V2X", "_v2x") s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", key) key = re.sub("([a-z0-9])([A-Z])(?=\\S)", r"\1_\2", s1).lower() diff --git a/tests/test_charge_point.py b/tests/test_charge_point.py index e8d71c3fd..897fabc2b 100644 --- a/tests/test_charge_point.py +++ b/tests/test_charge_point.py @@ -58,8 +58,6 @@ def heartbeat(self, **kwargs): [ ({"transactionId": "74563478"}, {"transaction_id": "74563478"}), ({"fullSoC": 100}, {"full_soc": 100}), - ({"evMinV2XEnergyRequest": 200}, {"ev_min_v2x_energy_request": 200}), - ({"v2xChargingCtrlr": 200}, {"v2x_charging_ctrlr": 200}), ], ) def test_camel_to_snake_case(test_input, expected): From f1cf457265e4d72db01933d847f7492d2d8062cb Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:44:11 +0100 Subject: [PATCH 27/39] Validate project against Python 3.11 and Python 3.112 . (#589) --- .github/workflows/pull-request.yml | 2 ++ CHANGELOG.md | 2 +- ocpp/exceptions.py | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 4a69f851a..e37b46c43 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -15,6 +15,8 @@ jobs: - "3.8" - "3.9" - "3.10" + - "3.11" + - "3.12" steps: - uses: actions/checkout@master - name: Set up Python ${{ matrix.version }} diff --git a/CHANGELOG.md b/CHANGELOG.md index e05bb06d0..149f2876b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ # Change log - +- [#564](https://github.com/mobilityhouse/ocpp/issues/564) Add support For Python 3.11 and 3.12 - [#583](https://github.com/mobilityhouse/ocpp/issues/583) OCPP v1.6/v2.0.1 deprecate dataclasses from calls and call results with the suffix 'Payload' ## 0.26.0 (2024-01-17) diff --git a/ocpp/exceptions.py b/ocpp/exceptions.py index cefba9549..867b6a793 100644 --- a/ocpp/exceptions.py +++ b/ocpp/exceptions.py @@ -25,12 +25,12 @@ def __eq__(self, other): def __repr__(self): return ( - f"<{self.__class__.__name__} - description={self.description}," + f"<{self.__class__.__name__} - description={self.description}, " f" details={self.details}>" ) def __str__(self): - return f"{self.__class__.__name__}: {self.description}," f" {self.details}" + return f"{self.__class__.__name__}: {self.description}, " f" {self.details}" class NotImplementedError(OCPPError): From ae02ede445ea56375505d21bd498a88fce937862 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:51:17 +0100 Subject: [PATCH 28/39] Drop support for Python 3.7 --- .github/workflows/pull-request.yml | 1 - poetry.lock | 115 ++++------------------------- pyproject.toml | 4 +- tests/conftest.py | 7 +- tests/v16/conftest.py | 7 +- tests/v201/conftest.py | 7 +- 6 files changed, 17 insertions(+), 124 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index e37b46c43..52a5985de 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -11,7 +11,6 @@ jobs: strategy: matrix: version: - - "3.7" - "3.8" - "3.9" - "3.10" diff --git a/poetry.lock b/poetry.lock index b11664c88..34926ea37 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,18 +12,6 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] -[[package]] -name = "asynctest" -version = "0.13.0" -description = "Enhance the standard unittest package with features for testing asyncio libraries" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"}, - {file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"}, -] - [[package]] name = "attrs" version = "23.2.0" @@ -36,9 +24,6 @@ files = [ {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} - [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[tests]", "pre-commit"] @@ -93,7 +78,6 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -228,7 +212,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" @@ -358,7 +341,6 @@ files = [ ] [package.dependencies] -importlib-metadata = {version = ">=1.1.0,<4.3", markers = "python_version < \"3.8\""} mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.9.0,<2.10.0" pyflakes = ">=2.5.0,<2.6.0" @@ -387,26 +369,6 @@ files = [ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] -[[package]] -name = "importlib-metadata" -version = "4.2.0" -description = "Read metadata from Python packages" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, - {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, -] - -[package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} -zipp = ">=0.5" - -[package.extras] -docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] - [[package]] name = "importlib-resources" version = "5.12.0" @@ -488,11 +450,9 @@ files = [ [package.dependencies] attrs = ">=17.4.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] @@ -526,6 +486,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -630,9 +600,6 @@ files = [ {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} - [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] @@ -649,9 +616,6 @@ files = [ {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] @@ -748,7 +712,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" @@ -771,7 +734,6 @@ files = [ [package.dependencies] pytest = ">=6.1.0" -typing-extensions = {version = ">=3.7.2", markers = "python_version < \"3.8\""} [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] @@ -1001,62 +963,11 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -[[package]] -name = "typed-ast" -version = "1.5.5" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, - {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, - {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, - {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, - {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, - {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, - {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, - {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, - {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, - {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, - {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, -] - [[package]] name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1100,5 +1011,5 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" -python-versions = "^3.7" -content-hash = "21d1add46de6767e4784710ad659f8881d8eeaf99e0c60b3e1e80d0201600194" +python-versions = "^3.8" +content-hash = "ff5acd04841119c203edb825e4905c233389b9168d15fe345611757b93c11af9" diff --git a/pyproject.toml b/pyproject.toml index 92d56c745..704249463 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,16 +27,14 @@ classifiers = [ 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.7' ] [tool.poetry.dependencies] -python = "^3.7" +python = "^3.8" jsonschema = "^4.4.0" [tool.poetry.dev-dependencies] # Starting from Python 3.8, asynctest is replaced with a unittest.mock.AsyncMock in standard library. -asynctest = { version = "0.13.0", python = "~3.7" } pytest = "^7" pytest-asyncio = "^0.20.3" pytest-cov = "^4.0.0" diff --git a/tests/conftest.py b/tests/conftest.py index 69e0561c0..51c17e22b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,9 +1,4 @@ -try: - from unittest.mock import AsyncMock -except ImportError: - # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, - # we need to resolve to a package on pypi. - from asynctest import CoroutineMock as AsyncMock +from unittest.mock import AsyncMock import pytest diff --git a/tests/v16/conftest.py b/tests/v16/conftest.py index a8dfc365f..67dea686f 100644 --- a/tests/v16/conftest.py +++ b/tests/v16/conftest.py @@ -1,9 +1,4 @@ -try: - from unittest.mock import AsyncMock -except ImportError: - # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, - # we need to resolve to a package on pypi. - from asynctest import CoroutineMock as AsyncMock +from unittest.mock import AsyncMock import pytest diff --git a/tests/v201/conftest.py b/tests/v201/conftest.py index ca71fc5b3..97dd2b9dd 100644 --- a/tests/v201/conftest.py +++ b/tests/v201/conftest.py @@ -1,9 +1,4 @@ -try: - from unittest.mock import AsyncMock -except ImportError: - # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, - # we need to resolve to a package on pypi. - from asynctest import CoroutineMock as AsyncMock +from unittest.mock import AsyncMock import pytest From 1fcc49d51185282bba9b7362b6beef302f109770 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:31:38 +0100 Subject: [PATCH 29/39] Update Code Owners (#588) see issue https://github.com/mobilityhouse/ocpp/issues/587 --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ff8ee0574..9cd57fd8f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @OrangeTux @tropxy +* @OrangeTux @tropxy @Jared-Newell-Mobility From 3963e7a5b46c2c2a5598dbcda57b8cc13a3efe14 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:34:09 +0100 Subject: [PATCH 30/39] Revert "drop support for python 3.7" (#597) Reverts mobilityhouse/ocpp#585 As this is breaking should be included in release 1.0.0 --- .github/workflows/pull-request.yml | 1 + poetry.lock | 115 +++++++++++++++++++++++++---- pyproject.toml | 4 +- tests/conftest.py | 7 +- tests/v16/conftest.py | 7 +- tests/v201/conftest.py | 7 +- 6 files changed, 124 insertions(+), 17 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 52a5985de..e37b46c43 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -11,6 +11,7 @@ jobs: strategy: matrix: version: + - "3.7" - "3.8" - "3.9" - "3.10" diff --git a/poetry.lock b/poetry.lock index 34926ea37..b11664c88 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,6 +12,18 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] +[[package]] +name = "asynctest" +version = "0.13.0" +description = "Enhance the standard unittest package with features for testing asyncio libraries" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"}, + {file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"}, +] + [[package]] name = "attrs" version = "23.2.0" @@ -24,6 +36,9 @@ files = [ {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[tests]", "pre-commit"] @@ -78,6 +93,7 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -212,6 +228,7 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" @@ -341,6 +358,7 @@ files = [ ] [package.dependencies] +importlib-metadata = {version = ">=1.1.0,<4.3", markers = "python_version < \"3.8\""} mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.9.0,<2.10.0" pyflakes = ">=2.5.0,<2.6.0" @@ -369,6 +387,26 @@ files = [ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] +[[package]] +name = "importlib-metadata" +version = "4.2.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, + {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, +] + +[package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +zipp = ">=0.5" + +[package.extras] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] + [[package]] name = "importlib-resources" version = "5.12.0" @@ -450,9 +488,11 @@ files = [ [package.dependencies] attrs = ">=17.4.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] @@ -486,16 +526,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -600,6 +630,9 @@ files = [ {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} + [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] @@ -616,6 +649,9 @@ files = [ {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] @@ -712,6 +748,7 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" @@ -734,6 +771,7 @@ files = [ [package.dependencies] pytest = ">=6.1.0" +typing-extensions = {version = ">=3.7.2", markers = "python_version < \"3.8\""} [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] @@ -963,11 +1001,62 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "typed-ast" +version = "1.5.5" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, + {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, + {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, + {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, + {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, + {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, + {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, + {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, + {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, + {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, +] + [[package]] name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1011,5 +1100,5 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" -python-versions = "^3.8" -content-hash = "ff5acd04841119c203edb825e4905c233389b9168d15fe345611757b93c11af9" +python-versions = "^3.7" +content-hash = "21d1add46de6767e4784710ad659f8881d8eeaf99e0c60b3e1e80d0201600194" diff --git a/pyproject.toml b/pyproject.toml index 704249463..92d56c745 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,14 +27,16 @@ classifiers = [ 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.7' ] [tool.poetry.dependencies] -python = "^3.8" +python = "^3.7" jsonschema = "^4.4.0" [tool.poetry.dev-dependencies] # Starting from Python 3.8, asynctest is replaced with a unittest.mock.AsyncMock in standard library. +asynctest = { version = "0.13.0", python = "~3.7" } pytest = "^7" pytest-asyncio = "^0.20.3" pytest-cov = "^4.0.0" diff --git a/tests/conftest.py b/tests/conftest.py index 51c17e22b..69e0561c0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,9 @@ -from unittest.mock import AsyncMock +try: + from unittest.mock import AsyncMock +except ImportError: + # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, + # we need to resolve to a package on pypi. + from asynctest import CoroutineMock as AsyncMock import pytest diff --git a/tests/v16/conftest.py b/tests/v16/conftest.py index 67dea686f..a8dfc365f 100644 --- a/tests/v16/conftest.py +++ b/tests/v16/conftest.py @@ -1,4 +1,9 @@ -from unittest.mock import AsyncMock +try: + from unittest.mock import AsyncMock +except ImportError: + # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, + # we need to resolve to a package on pypi. + from asynctest import CoroutineMock as AsyncMock import pytest diff --git a/tests/v201/conftest.py b/tests/v201/conftest.py index 97dd2b9dd..ca71fc5b3 100644 --- a/tests/v201/conftest.py +++ b/tests/v201/conftest.py @@ -1,4 +1,9 @@ -from unittest.mock import AsyncMock +try: + from unittest.mock import AsyncMock +except ImportError: + # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, + # we need to resolve to a package on pypi. + from asynctest import CoroutineMock as AsyncMock import pytest From c4d96d9e876d630fee80153a8ef3c3ddaed8d8dd Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 7 Feb 2024 13:51:26 +0100 Subject: [PATCH 31/39] OCPP 2.0.1 Wrong data type in CostUpdated total_cost (#596) see issue https://github.com/mobilityhouse/ocpp/issues/557 --- CHANGELOG.md | 1 + ocpp/v201/call.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 149f2876b..4a476590a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ # Change log +- [#557](https://github.com/mobilityhouse/ocpp/issues/557) OCPP 2.0.1 Wrong data type in CostUpdated total_cost - [#564](https://github.com/mobilityhouse/ocpp/issues/564) Add support For Python 3.11 and 3.12 - [#583](https://github.com/mobilityhouse/ocpp/issues/583) OCPP v1.6/v2.0.1 deprecate dataclasses from calls and call results with the suffix 'Payload' diff --git a/ocpp/v201/call.py b/ocpp/v201/call.py index 461f37365..ddc681606 100644 --- a/ocpp/v201/call.py +++ b/ocpp/v201/call.py @@ -71,7 +71,7 @@ class ClearedChargingLimit: @dataclass class CostUpdated: - total_cost: int + total_cost: float transaction_id: str custom_data: Optional[Dict[str, Any]] = None From ea5f8c1451f5d15907b40dba8efc7cba16a48d74 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 7 Feb 2024 13:54:34 +0100 Subject: [PATCH 32/39] Update tests to use Call and CallResult without the suffix Payload (#595) See issue https://github.com/mobilityhouse/ocpp/issues/593 --- CHANGELOG.md | 1 + ocpp/charge_point.py | 7 ++++++- tests/test_charge_point.py | 30 ++++++++++------------------ tests/v16/conftest.py | 2 +- tests/v16/test_v16_charge_point.py | 14 ++++++------- tests/v201/conftest.py | 2 +- tests/v201/test_v201_charge_point.py | 2 +- 7 files changed, 28 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a476590a..a56837bca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - [#557](https://github.com/mobilityhouse/ocpp/issues/557) OCPP 2.0.1 Wrong data type in CostUpdated total_cost - [#564](https://github.com/mobilityhouse/ocpp/issues/564) Add support For Python 3.11 and 3.12 - [#583](https://github.com/mobilityhouse/ocpp/issues/583) OCPP v1.6/v2.0.1 deprecate dataclasses from calls and call results with the suffix 'Payload' +- [#593](https://github.com/mobilityhouse/ocpp/issues/593) Update tests to use Call and CallResult without the suffix Payload ## 0.26.0 (2024-01-17) diff --git a/ocpp/charge_point.py b/ocpp/charge_point.py index 4d7cb9676..0e9337558 100644 --- a/ocpp/charge_point.py +++ b/ocpp/charge_point.py @@ -311,9 +311,14 @@ async def call(self, payload, suppress=True, unique_id=None): unique_id if unique_id is not None else str(self._unique_id_generator()) ) + action_name = payload.__class__.__name__ + # Due to deprecated call and callresults, remove in the future. + if "Payload" in payload.__class__.__name__: + action_name = payload.__class__.__name__[:-7] + call = Call( unique_id=unique_id, - action=payload.__class__.__name__[:-7], + action=action_name, payload=remove_nones(camel_case_payload), ) diff --git a/tests/test_charge_point.py b/tests/test_charge_point.py index 897fabc2b..cefcb1860 100644 --- a/tests/test_charge_point.py +++ b/tests/test_charge_point.py @@ -6,18 +6,12 @@ from ocpp.messages import Call from ocpp.routing import after, create_route_map, on from ocpp.v16 import ChargePoint as cp_16 -from ocpp.v16.call import ( - BootNotificationPayload, - GetConfigurationPayload, - MeterValuesPayload, -) -from ocpp.v16.call_result import ( - BootNotificationPayload as BootNotificationResultPayload, -) +from ocpp.v16.call import BootNotification, GetConfiguration, MeterValues +from ocpp.v16.call_result import BootNotification as BootNotificationResult from ocpp.v16.datatypes import MeterValue, SampledValue from ocpp.v16.enums import Action, RegistrationStatus from ocpp.v20 import ChargePoint as cp_20 -from ocpp.v201.call import SetNetworkProfilePayload +from ocpp.v201.call import SetNetworkProfile from ocpp.v201.datatypes import NetworkConnectionProfileType from ocpp.v201.enums import OCPPInterfaceType, OCPPTransportType, OCPPVersionType @@ -82,7 +76,7 @@ def test_snake_to_camel_case(test_input, expected): def test_remove_nones(): expected_payload = {"charge_point_model": "foo", "charge_point_vendor": "bar"} - payload = BootNotificationPayload( + payload = BootNotification( charge_point_model="foo", charge_point_vendor="bar", charge_box_serial_number=None, @@ -116,9 +110,7 @@ def test_nested_remove_nones(): apn=None, ) - payload = SetNetworkProfilePayload( - configuration_slot=1, connection_data=connection_data - ) + payload = SetNetworkProfile(configuration_slot=1, connection_data=connection_data) payload = asdict(payload) assert expected_payload == remove_nones(payload) @@ -168,7 +160,7 @@ def test_nested_list_remove_nones(): "transaction_id": 5, } - payload = MeterValuesPayload( + payload = MeterValues( connector_id=3, meter_value=[ MeterValue( @@ -231,7 +223,7 @@ def test_remove_nones_with_list_of_strings(): https://github.com/mobilityhouse/ocpp/issues/289. """ payload = asdict( - GetConfigurationPayload(key=["ClockAlignedDataInterval", "ConnectionTimeOut"]) + GetConfiguration(key=["ClockAlignedDataInterval", "ConnectionTimeOut"]) ) assert remove_nones(payload) == { @@ -274,7 +266,7 @@ def on_boot_notification(self, *args, **kwargs): assert kwargs == camel_to_snake_case(payload_a) assert args == () ChargerA.on_boot_notification_call_count += 1 - return BootNotificationResultPayload( + return BootNotificationResult( current_time="foo", interval=1, status=RegistrationStatus.accepted ) @@ -285,7 +277,7 @@ def after_boot_notification(self, call_unique_id, *args, **kwargs): # call_unique_id should not be passed as arg assert args == () ChargerA.after_boot_notification_call_count += 1 - return BootNotificationResultPayload( + return BootNotificationResult( current_time="foo", interval=1, status=RegistrationStatus.accepted ) @@ -300,7 +292,7 @@ def on_boot_notification(self, call_unique_id, *args, **kwargs): # call_unique_id should not be passed as arg assert args == () ChargerB.on_boot_notification_call_count += 1 - return BootNotificationResultPayload( + return BootNotificationResult( current_time="foo", interval=1, status=RegistrationStatus.accepted ) @@ -310,7 +302,7 @@ def after_boot_notification(self, *args, **kwargs): assert kwargs == camel_to_snake_case(payload_b) assert args == () ChargerB.after_boot_notification_call_count += 1 - return BootNotificationResultPayload( + return BootNotificationResult( current_time="foo", interval=1, status=RegistrationStatus.accepted ) diff --git a/tests/v16/conftest.py b/tests/v16/conftest.py index a8dfc365f..b70711ce3 100644 --- a/tests/v16/conftest.py +++ b/tests/v16/conftest.py @@ -49,7 +49,7 @@ def base_central_system(connection): @pytest.fixture def mock_boot_request(): - return call.BootNotificationPayload( + return call.BootNotification( charge_point_vendor="dummy_vendor", charge_point_model="dummy_model", ) diff --git a/tests/v16/test_v16_charge_point.py b/tests/v16/test_v16_charge_point.py index 9d07acf23..37d8d8e3c 100644 --- a/tests/v16/test_v16_charge_point.py +++ b/tests/v16/test_v16_charge_point.py @@ -26,7 +26,7 @@ def on_boot_notification(charge_point_model, charge_point_vendor, **kwargs): # assert charge_point_model == "ICU Eve Mini" assert kwargs["firmware_version"] == "#1:3.4.0-2990#N:217H;1.0-223" - return call_result.BootNotificationPayload( + return call_result.BootNotification( current_time="2018-05-29T17:37:05.495259", interval=350, status="Accepted", @@ -66,7 +66,7 @@ async def test_route_message_without_validation(base_central_system): def on_boot_notification(**kwargs): # noqa assert kwargs["firmware_version"] == "#1:3.4.0-2990#N:217H;1.0-223" - return call_result.BootNotificationPayload( + return call_result.BootNotification( current_time="2018-05-29T17:37:05.495259", interval=350, # 'Yolo' is not a valid value for for field status. @@ -120,7 +120,7 @@ async def test_route_message_not_supported(base_central_system, not_supported_ca def on_boot_notification(**kwargs): # noqa assert kwargs["firmware_version"] == "#1:3.4.0-2990#N:217H;1.0-223" - return call_result.BootNotificationPayload( + return call_result.BootNotification( current_time="2018-05-29T17:37:05.495259", interval=350, # 'Yolo' is not a valid value for for field status. @@ -174,7 +174,7 @@ async def test_route_message_with_no_route(base_central_system, heartbeat_call): async def test_send_call_with_timeout(connection): cs = ChargePoint(id=1234, connection=connection, response_timeout=0.1) - payload = call.ResetPayload(type="Hard") + payload = call.Reset(type="Hard") with pytest.raises(asyncio.TimeoutError): await cs.call(payload) @@ -187,7 +187,7 @@ async def test_send_call_with_timeout(connection): @pytest.mark.asyncio async def test_send_invalid_call(base_central_system): - payload = call.ResetPayload(type="Medium") + payload = call.Reset(type="Medium") with pytest.raises(FormatViolationError): await base_central_system.call(payload) @@ -207,7 +207,7 @@ async def test_raise_call_error(base_central_system): ) await base_central_system.route_message(call_error.to_json()) - payload = call.ClearCachePayload() + payload = call.ClearCache() with pytest.raises(GenericError): await base_central_system.call(payload, suppress=False) @@ -226,7 +226,7 @@ async def test_suppress_call_error(base_central_system): ) await base_central_system.route_message(call_error.to_json()) - payload = call.ClearCachePayload() + payload = call.ClearCache() await base_central_system.call(payload) diff --git a/tests/v201/conftest.py b/tests/v201/conftest.py index ca71fc5b3..42fc4ae86 100644 --- a/tests/v201/conftest.py +++ b/tests/v201/conftest.py @@ -48,7 +48,7 @@ def base_central_system(connection): @pytest.fixture def mock_boot_request(): - return call.BootNotificationPayload( + return call.BootNotification( reason="PowerUp", charging_station=chargingStation, ) diff --git a/tests/v201/test_v201_charge_point.py b/tests/v201/test_v201_charge_point.py index ddbd33808..ba32e7f24 100644 --- a/tests/v201/test_v201_charge_point.py +++ b/tests/v201/test_v201_charge_point.py @@ -24,7 +24,7 @@ def on_boot_notification(reason, charging_station, **kwargs): "model": "ICU Eve Mini", } - return call_result.BootNotificationPayload( + return call_result.BootNotification( current_time="2018-05-29T17:37:05.495259", interval=350, status="Accepted", From 324abdd711f6d1272ff0e5b090892a1254796a7c Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:01:56 +0100 Subject: [PATCH 33/39] Fix camel_to_snake_case for "v2x" (#594) see issue https://github.com/mobilityhouse/ocpp/issues/591 --- CHANGELOG.md | 1 + ocpp/charge_point.py | 1 + tests/test_charge_point.py | 2 ++ 3 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a56837bca..bdbdd26d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - [#557](https://github.com/mobilityhouse/ocpp/issues/557) OCPP 2.0.1 Wrong data type in CostUpdated total_cost - [#564](https://github.com/mobilityhouse/ocpp/issues/564) Add support For Python 3.11 and 3.12 - [#583](https://github.com/mobilityhouse/ocpp/issues/583) OCPP v1.6/v2.0.1 deprecate dataclasses from calls and call results with the suffix 'Payload' +- [#591](https://github.com/mobilityhouse/ocpp/issues/591) Camel_to_snake_case doesn't handle v2x correctly - [#593](https://github.com/mobilityhouse/ocpp/issues/593) Update tests to use Call and CallResult without the suffix Payload ## 0.26.0 (2024-01-17) diff --git a/ocpp/charge_point.py b/ocpp/charge_point.py index 0e9337558..3b985df0d 100644 --- a/ocpp/charge_point.py +++ b/ocpp/charge_point.py @@ -25,6 +25,7 @@ def camel_to_snake_case(data): if isinstance(data, dict): snake_case_dict = {} for key, value in data.items(): + key = key.replace("V2X", "_v2x") s1 = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", key) key = re.sub("([a-z0-9])([A-Z])(?=\\S)", r"\1_\2", s1).lower() diff --git a/tests/test_charge_point.py b/tests/test_charge_point.py index cefcb1860..87052b1e9 100644 --- a/tests/test_charge_point.py +++ b/tests/test_charge_point.py @@ -52,6 +52,8 @@ def heartbeat(self, **kwargs): [ ({"transactionId": "74563478"}, {"transaction_id": "74563478"}), ({"fullSoC": 100}, {"full_soc": 100}), + ({"evMinV2XEnergyRequest": 200}, {"ev_min_v2x_energy_request": 200}), + ({"v2xChargingCtrlr": 200}, {"v2x_charging_ctrlr": 200}), ], ) def test_camel_to_snake_case(test_input, expected): From 6f3594acc9b7aae701d17b1da95afbad45264fdb Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:16:34 +0100 Subject: [PATCH 34/39] Correct naming of members of `v201.enums.AttributeType` (#578) See issue https://github.com/mobilityhouse/ocpp/issues/577 --- CHANGELOG.md | 2 ++ ocpp/v201/enums.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdbdd26d6..cf2de4c2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - [#591](https://github.com/mobilityhouse/ocpp/issues/591) Camel_to_snake_case doesn't handle v2x correctly - [#593](https://github.com/mobilityhouse/ocpp/issues/593) Update tests to use Call and CallResult without the suffix Payload +- [#577](https://github.com/mobilityhouse/ocpp/issues/577) v2.0.1 AttributeType Enum Corrections + ## 0.26.0 (2024-01-17) - [#544](https://github.com/mobilityhouse/ocpp/issues/544) ocpp/charge_point.py - Pass `Call.unique_id` to the `on` and `after` routing handlers. diff --git a/ocpp/v201/enums.py b/ocpp/v201/enums.py index 60b2fb533..99ae9e286 100644 --- a/ocpp/v201/enums.py +++ b/ocpp/v201/enums.py @@ -104,8 +104,8 @@ class AttributeType(StrEnum): actual = "Actual" target = "Target" - minSet = "MinSet" - maxSet = "MaxSet" + min_set = "MinSet" + max_set = "MaxSet" class AuthorizationStatusType(StrEnum): From 74e94d43457d7bd97f2f214b1c269d6370711448 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:19:44 +0100 Subject: [PATCH 35/39] Drop support for python 3.7 (#598) see issue https://github.com/mobilityhouse/ocpp/pull/598 --- .github/workflows/pull-request.yml | 1 - poetry.lock | 115 ++++------------------------- pyproject.toml | 4 +- tests/conftest.py | 7 +- tests/v16/conftest.py | 7 +- tests/v201/conftest.py | 7 +- 6 files changed, 17 insertions(+), 124 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index e37b46c43..52a5985de 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -11,7 +11,6 @@ jobs: strategy: matrix: version: - - "3.7" - "3.8" - "3.9" - "3.10" diff --git a/poetry.lock b/poetry.lock index b11664c88..34926ea37 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,18 +12,6 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] -[[package]] -name = "asynctest" -version = "0.13.0" -description = "Enhance the standard unittest package with features for testing asyncio libraries" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"}, - {file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"}, -] - [[package]] name = "attrs" version = "23.2.0" @@ -36,9 +24,6 @@ files = [ {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} - [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] dev = ["attrs[tests]", "pre-commit"] @@ -93,7 +78,6 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -228,7 +212,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" @@ -358,7 +341,6 @@ files = [ ] [package.dependencies] -importlib-metadata = {version = ">=1.1.0,<4.3", markers = "python_version < \"3.8\""} mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.9.0,<2.10.0" pyflakes = ">=2.5.0,<2.6.0" @@ -387,26 +369,6 @@ files = [ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] -[[package]] -name = "importlib-metadata" -version = "4.2.0" -description = "Read metadata from Python packages" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, - {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, -] - -[package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} -zipp = ">=0.5" - -[package.extras] -docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] - [[package]] name = "importlib-resources" version = "5.12.0" @@ -488,11 +450,9 @@ files = [ [package.dependencies] attrs = ">=17.4.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] @@ -526,6 +486,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -630,9 +600,6 @@ files = [ {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} - [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] @@ -649,9 +616,6 @@ files = [ {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] @@ -748,7 +712,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" @@ -771,7 +734,6 @@ files = [ [package.dependencies] pytest = ">=6.1.0" -typing-extensions = {version = ">=3.7.2", markers = "python_version < \"3.8\""} [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] @@ -1001,62 +963,11 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -[[package]] -name = "typed-ast" -version = "1.5.5" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, - {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, - {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, - {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, - {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, - {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, - {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, - {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, - {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, - {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, - {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, -] - [[package]] name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1100,5 +1011,5 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" -python-versions = "^3.7" -content-hash = "21d1add46de6767e4784710ad659f8881d8eeaf99e0c60b3e1e80d0201600194" +python-versions = "^3.8" +content-hash = "ff5acd04841119c203edb825e4905c233389b9168d15fe345611757b93c11af9" diff --git a/pyproject.toml b/pyproject.toml index 92d56c745..704249463 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,16 +27,14 @@ classifiers = [ 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.7' ] [tool.poetry.dependencies] -python = "^3.7" +python = "^3.8" jsonschema = "^4.4.0" [tool.poetry.dev-dependencies] # Starting from Python 3.8, asynctest is replaced with a unittest.mock.AsyncMock in standard library. -asynctest = { version = "0.13.0", python = "~3.7" } pytest = "^7" pytest-asyncio = "^0.20.3" pytest-cov = "^4.0.0" diff --git a/tests/conftest.py b/tests/conftest.py index 69e0561c0..51c17e22b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,9 +1,4 @@ -try: - from unittest.mock import AsyncMock -except ImportError: - # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, - # we need to resolve to a package on pypi. - from asynctest import CoroutineMock as AsyncMock +from unittest.mock import AsyncMock import pytest diff --git a/tests/v16/conftest.py b/tests/v16/conftest.py index b70711ce3..73e4b5de8 100644 --- a/tests/v16/conftest.py +++ b/tests/v16/conftest.py @@ -1,9 +1,4 @@ -try: - from unittest.mock import AsyncMock -except ImportError: - # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, - # we need to resolve to a package on pypi. - from asynctest import CoroutineMock as AsyncMock +from unittest.mock import AsyncMock import pytest diff --git a/tests/v201/conftest.py b/tests/v201/conftest.py index 42fc4ae86..c9b269192 100644 --- a/tests/v201/conftest.py +++ b/tests/v201/conftest.py @@ -1,9 +1,4 @@ -try: - from unittest.mock import AsyncMock -except ImportError: - # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, - # we need to resolve to a package on pypi. - from asynctest import CoroutineMock as AsyncMock +from unittest.mock import AsyncMock import pytest From b3d08ed018ec39d1bc2513878ed374211898e7eb Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:23:35 +0100 Subject: [PATCH 36/39] Remove v1.6 deprecated enum variants (#575) See issue https://github.com/mobilityhouse/ocpp/issues/574 --- CHANGELOG.md | 3 ++ ocpp/v16/enums.py | 109 ---------------------------------------------- 2 files changed, 3 insertions(+), 109 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf2de4c2e..37f8953bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ - [#577](https://github.com/mobilityhouse/ocpp/issues/577) v2.0.1 AttributeType Enum Corrections +## BREAKING ## +- [#574](https://github.com/mobilityhouse/ocpp/issues/574) Remove v1.6 deprecated enum members - IMPORTANT see upgrade path [#574](https://github.com/mobilityhouse/ocpp/issues/574) + ## 0.26.0 (2024-01-17) - [#544](https://github.com/mobilityhouse/ocpp/issues/544) ocpp/charge_point.py - Pass `Call.unique_id` to the `on` and `after` routing handlers. diff --git a/ocpp/v16/enums.py b/ocpp/v16/enums.py index 1d84ba10b..e413c4ec5 100644 --- a/ocpp/v16/enums.py +++ b/ocpp/v16/enums.py @@ -143,24 +143,6 @@ class ChargePointErrorCode(StrEnum): under_voltage = "UnderVoltage" weak_signal = "WeakSignal" - # Soon to be deprecated enums - connectorLockFailure = "ConnectorLockFailure" - evCommunicationError = "EVCommunicationError" - groundFailure = "GroundFailure" - highTemperature = "HighTemperature" - internalError = "InternalError" - localListConflict = "LocalListConflict" - noError = "NoError" - otherError = "OtherError" - overCurrentFailure = "OverCurrentFailure" - overVoltage = "OverVoltage" - powerMeterFailure = "PowerMeterFailure" - powerSwitchFailure = "PowerSwitchFailure" - readerFailure = "ReaderFailure" - resetFailure = "ResetFailure" - underVoltage = "UnderVoltage" - weakSignal = "WeakSignal" - class ChargePointStatus(StrEnum): """ @@ -184,10 +166,6 @@ class ChargePointStatus(StrEnum): unavailable = "Unavailable" faulted = "Faulted" - # Soon to be deprecated enums - suspendedevse = "SuspendedEVSE" - suspendedev = "SuspendedEV" - class ChargingProfileKindType(StrEnum): """ @@ -243,11 +221,6 @@ class ChargingProfilePurposeType(StrEnum): tx_default_profile = "TxDefaultProfile" tx_profile = "TxProfile" - # Soon to be deprecated enums - chargepointmaxprofile = "ChargePointMaxProfile" - txdefaultprofile = "TxDefaultProfile" - txprofile = "TxProfile" - class ChargingProfileStatus(StrEnum): """ @@ -257,8 +230,6 @@ class ChargingProfileStatus(StrEnum): accepted = "Accepted" rejected = "Rejected" not_supported = "NotSupported" - # Soon to be deprecated enums - notSupported = "NotSupported" class ChargingRateUnitType(StrEnum): @@ -311,10 +282,6 @@ class ConfigurationStatus(StrEnum): reboot_required = "RebootRequired" not_supported = "NotSupported" - # Soon to be deprecated enums - rebootRequired = "RebootRequired" - notSupported = "NotSupported" - class ConfigurationKey(StrEnum): """ @@ -400,10 +367,6 @@ class DataTransferStatus(StrEnum): unknown_message_id = "UnknownMessageId" unknown_vendor_id = "UnknownVendorId" - # Soon to be deprecated enums - unknownMessageId = "UnknownMessageId" - unknownVendorId = "UnknownVendorId" - class DeleteCertificateStatus(StrEnum): """ @@ -425,9 +388,6 @@ class DiagnosticsStatus(StrEnum): upload_failed = "UploadFailed" uploading = "Uploading" - # Soon to be deprecated enums - uploadFailed = "UploadFailed" - class FirmwareStatus(StrEnum): """ @@ -453,10 +413,6 @@ class FirmwareStatus(StrEnum): invalid_signature = "InvalidSignature" signature_verified = "SignatureVerified" - # Soon to be deprecated enums - downloadFailed = "DownloadFailed" - installationFailed = "InstallationFailed" - class GenericStatus(StrEnum): """ @@ -558,25 +514,6 @@ class Measurand(StrEnum): temperature = "Temperature" voltage = "Voltage" - # Soon to be deprecated enums - currentExport = "Current.Export" - currentImport = "Current.Import" - currentOffered = "Current.Offered" - energyActiveExportRegister = "Energy.Active.Export.Register" - energyActiveImportRegister = "Energy.Active.Import.Register" - energyReactiveExportRegister = "Energy.Reactive.Export.Register" - energyReactiveImportRegister = "Energy.Reactive.Import.Register" - energyActiveExportInterval = "Energy.Active.Export.Interval" - energyActiveImportInterval = "Energy.Active.Import.Interval" - energyReactiveExportInterval = "Energy.Reactive.Export.Interval" - energyReactiveImportInterval = "Energy.Reactive.Import.Interval" - powerActiveExport = "Power.Active.Export" - powerActiveImport = "Power.Active.Import" - powerFactor = "Power.Factor" - powerOffered = "Power.Offered" - powerReactiveExport = "Power.Reactive.Export" - powerReactiveImport = "Power.Reactive.Import" - class MessageTrigger(StrEnum): """ @@ -597,13 +534,6 @@ class MessageTrigger(StrEnum): log_status_notification = "LogStatusNotification" sign_charge_point_certificate = "SignChargePointCertificate" - # Soon to be deprecated enums - bootNotification = "BootNotification" - diagnosticsStatusNotification = "DiagnosticsStatusNotification" - firmwareStatusNotification = "FirmwareStatusNotification" - meterValues = "MeterValues" - statusNotification = "StatusNotification" - class Phase(StrEnum): """ @@ -623,14 +553,6 @@ class Phase(StrEnum): l2_l3 = "L2-L3" l3_l1 = "L3-L1" - # Soon to be deprecated enums - l1n = "L1-N" - l2n = "L2-N" - l3n = "L3-N" - l1l2 = "L1-L2" - l2l3 = "L2-L3" - l3l1 = "L3-L1" - class ReadingContext(StrEnum): """ @@ -646,14 +568,6 @@ class ReadingContext(StrEnum): transaction_end = "Transaction.End" trigger = "Trigger" - # Soon to be deprecated enums - interruptionBegin = "Interruption.Begin" - interruptionEnd = "Interruption.End" - sampleClock = "Sample.Clock" - samplePeriodic = "Sample.Periodic" - transactionBegin = "Transaction.Begin" - transactionEnd = "Transaction.End" - class Reason(StrEnum): """ @@ -672,15 +586,6 @@ class Reason(StrEnum): unlock_command = "UnlockCommand" de_authorized = "DeAuthorized" - # Soon to be deprecated enums - emergencyStop = "EmergencyStop" - evDisconnected = "EVDisconnected" - hardReset = "HardReset" - powerLoss = "PowerLoss" - softReset = "SoftReset" - unlockCommand = "UnlockCommand" - deAuthorized = "DeAuthorized" - class RecurrencyKind(StrEnum): """ @@ -752,9 +657,6 @@ class TriggerMessageStatus(StrEnum): rejected = "Rejected" not_implemented = "NotImplemented" - # Soon to be deprecated enums - notImplemented = "NotImplemented" - class UnitOfMeasure(StrEnum): """ @@ -791,10 +693,6 @@ class UnlockStatus(StrEnum): unlock_failed = "UnlockFailed" not_supported = "NotSupported" - # Soon to be deprecated enums - unlockFailed = "UnlockFailed" - notSupported = "NotSupported" - class UpdateFirmwareStatus(StrEnum): """ @@ -832,10 +730,6 @@ class UpdateStatus(StrEnum): not_supported = "NotSupported" version_mismatch = "VersionMismatch" - # Soon to be deprecated enums - notSupported = "NotSupported" - versionMismatch = "VersionMismatch" - class UpdateType(StrEnum): """ @@ -854,6 +748,3 @@ class ValueFormat(StrEnum): raw = "Raw" signed_data = "SignedData" - - # Soon to be deprecated enums - signedData = "SignedData" From c257f171ad0a2567d4f79dfd020b23da4b5e9621 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:28:40 +0100 Subject: [PATCH 37/39] Typo in CostUpdated Action #435 (#491) see issue https://github.com/mobilityhouse/ocpp/issues/435 --- CHANGELOG.md | 2 +- ocpp/v201/enums.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37f8953bc..c26deac2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ - [#583](https://github.com/mobilityhouse/ocpp/issues/583) OCPP v1.6/v2.0.1 deprecate dataclasses from calls and call results with the suffix 'Payload' - [#591](https://github.com/mobilityhouse/ocpp/issues/591) Camel_to_snake_case doesn't handle v2x correctly - [#593](https://github.com/mobilityhouse/ocpp/issues/593) Update tests to use Call and CallResult without the suffix Payload - +- [#435](https://github.com/mobilityhouse/ocpp/issues/435) Typo in CostUpdated Action - [#577](https://github.com/mobilityhouse/ocpp/issues/577) v2.0.1 AttributeType Enum Corrections ## BREAKING ## diff --git a/ocpp/v201/enums.py b/ocpp/v201/enums.py index 99ae9e286..6d0dbb7b3 100644 --- a/ocpp/v201/enums.py +++ b/ocpp/v201/enums.py @@ -21,7 +21,7 @@ class Action(StrEnum): ClearDisplayMessage = "ClearDisplayMessage" ClearedChargingLimit = "ClearedChargingLimit" ClearVariableMonitoring = "ClearVariableMonitoring" - CostUpdate = "CostUpdate" + CostUpdated = "CostUpdated" CustomerInformation = "CustomerInformation" DataTransfer = "DataTransfer" DeleteCertificate = "DeleteCertificate" From 16b78a0d2052a4836a2a20af78d813da85421d79 Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:37:13 +0100 Subject: [PATCH 38/39] Remove support for ocpp 2.0 (#576) see issue https://github.com/mobilityhouse/ocpp/issues/498 --- CHANGELOG.md | 3 + README.rst | 27 +- docs/v201/Changelog OCPP 2.0 - 2.0.1.pdf | Bin 299121 -> 0 bytes examples/v20/central_system.py | 78 ---- examples/v20/charge_point.py | 53 --- ocpp/v20/__init__.py | 8 - ocpp/v20/call.py | 436 ------------------ ocpp/v20/call_result.py | 356 -------------- ocpp/v20/schemas/AuthorizeRequest_v1p0.json | 132 ------ ocpp/v20/schemas/AuthorizeResponse_v1p0.json | 153 ------ .../schemas/BootNotificationRequest_v1p0.json | 80 ---- .../BootNotificationResponse_v1p0.json | 29 -- .../CancelReservationRequest_v1p0.json | 14 - .../CancelReservationResponse_v1p0.json | 19 - .../CertificateSignedRequest_v1p0.json | 28 -- .../CertificateSignedResponse_v1p0.json | 19 - .../ChangeAvailabilityRequest_v1p0.json | 23 - .../ChangeAvailabilityResponse_v1p0.json | 20 - ocpp/v20/schemas/ClearCacheRequest_v1p0.json | 6 - ocpp/v20/schemas/ClearCacheResponse_v1p0.json | 19 - .../ClearChargingProfileRequest_v1p0.json | 42 -- .../ClearChargingProfileResponse_v1p0.json | 19 - .../ClearDisplayMessageRequest_v1p0.json | 14 - .../ClearDisplayMessageResponse_v1p0.json | 19 - .../ClearVariableMonitoringRequest_v1p0.json | 19 - .../ClearVariableMonitoringResponse_v1p0.json | 47 -- .../ClearedChargingLimitRequest_v1p0.json | 24 - .../ClearedChargingLimitResponse_v1p0.json | 6 - ocpp/v20/schemas/CostUpdatedRequest_v1p0.json | 19 - .../v20/schemas/CostUpdatedResponse_v1p0.json | 6 - .../CustomerInformationRequest_v1p0.json | 129 ------ .../CustomerInformationResponse_v1p0.json | 20 - .../v20/schemas/DataTransferRequest_v1p0.json | 20 - .../schemas/DataTransferResponse_v1p0.json | 22 - .../DeleteCertificateRequest_v1p0.json | 53 --- .../DeleteCertificateResponse_v1p0.json | 20 - ...irmwareStatusNotificationRequest_v1p0.json | 39 -- ...rmwareStatusNotificationResponse_v1p0.json | 6 - .../Get15118EVCertificateRequest_v1p0.json | 20 - .../Get15118EVCertificateResponse_v1p0.json | 61 --- .../schemas/GetBaseReportRequest_v1p0.json | 24 - .../schemas/GetBaseReportResponse_v1p0.json | 20 - .../GetCertificateStatusRequest_v1p0.json | 57 --- .../GetCertificateStatusResponse_v1p0.json | 23 - .../GetChargingProfilesRequest_v1p0.json | 72 --- .../GetChargingProfilesResponse_v1p0.json | 19 - .../GetCompositeScheduleRequest_v1p0.json | 26 -- .../GetCompositeScheduleResponse_v1p0.json | 107 ----- .../GetDisplayMessagesRequest_v1p0.json | 41 -- .../GetDisplayMessagesResponse_v1p0.json | 19 - ...etInstalledCertificateIdsRequest_v1p0.json | 23 - ...tInstalledCertificateIdsResponse_v1p0.json | 69 --- .../GetLocalListVersionRequest_v1p0.json | 6 - .../GetLocalListVersionResponse_v1p0.json | 14 - ocpp/v20/schemas/GetLogRequest_v1p0.json | 60 --- ocpp/v20/schemas/GetLogResponse_v1p0.json | 24 - .../GetMonitoringReportRequest_v1p0.json | 111 ----- .../GetMonitoringReportResponse_v1p0.json | 20 - ocpp/v20/schemas/GetReportRequest_v1p0.json | 112 ----- ocpp/v20/schemas/GetReportResponse_v1p0.json | 20 - .../GetTransactionStatusRequest_v1p0.json | 12 - .../GetTransactionStatusResponse_v1p0.json | 17 - .../v20/schemas/GetVariablesRequest_v1p0.json | 107 ----- .../schemas/GetVariablesResponse_v1p0.json | 126 ----- ocpp/v20/schemas/HeartbeatRequest_v1p0.json | 6 - ocpp/v20/schemas/HeartbeatResponse_v1p0.json | 15 - .../InstallCertificateRequest_v1p0.json | 28 -- .../InstallCertificateResponse_v1p0.json | 24 - .../LogStatusNotificationRequest_v1p0.json | 28 -- .../LogStatusNotificationResponse_v1p0.json | 6 - ocpp/v20/schemas/MeterValuesRequest_v1p0.json | 211 --------- .../v20/schemas/MeterValuesResponse_v1p0.json | 6 - ...otifyCentralChargingNeedsRequest_v1p0.json | 190 -------- ...tifyCentralChargingNeedsResponse_v1p0.json | 19 - .../NotifyChargingLimitRequest_v1p0.json | 116 ----- .../NotifyChargingLimitResponse_v1p0.json | 6 - ...NotifyCustomerInformationRequest_v1p0.json | 31 -- ...otifyCustomerInformationResponse_v1p0.json | 6 - .../NotifyDisplayMessagesRequest_v1p0.json | 156 ------- .../NotifyDisplayMessagesResponse_v1p0.json | 6 - .../NotifyEVChargingNeedsRequest_v1p0.json | 124 ----- .../NotifyEVChargingNeedsResponse_v1p0.json | 20 - .../NotifyEVChargingScheduleRequest_v1p0.json | 87 ---- ...NotifyEVChargingScheduleResponse_v1p0.json | 19 - ocpp/v20/schemas/NotifyEventRequest_v1p0.json | 192 -------- .../v20/schemas/NotifyEventResponse_v1p0.json | 6 - .../NotifyMonitoringReportRequest_v1p0.json | 159 ------- .../NotifyMonitoringReportResponse_v1p0.json | 6 - .../v20/schemas/NotifyReportRequest_v1p0.json | 215 --------- .../schemas/NotifyReportResponse_v1p0.json | 6 - .../schemas/PublishFirmwareRequest_v1p0.json | 23 - .../schemas/PublishFirmwareResponse_v1p0.json | 19 - ...irmwareStatusNotificationRequest_v1p0.json | 30 -- ...rmwareStatusNotificationResponse_v1p0.json | 6 - .../Renegotiate15118ScheduleRequest_v1p0.json | 32 -- ...Renegotiate15118ScheduleResponse_v1p0.json | 19 - .../ReportChargingProfilesRequest_v1p0.json | 182 -------- .../ReportChargingProfilesResponse_v1p0.json | 6 - .../RequestStartTransactionRequest_v1p0.json | 221 --------- .../RequestStartTransactionResponse_v1p0.json | 23 - .../RequestStopTransactionRequest_v1p0.json | 15 - .../RequestStopTransactionResponse_v1p0.json | 19 - .../ReservationStatusUpdateRequest_v1p0.json | 23 - .../ReservationStatusUpdateResponse_v1p0.json | 6 - ocpp/v20/schemas/ReserveNowRequest_v1p0.json | 150 ------ ocpp/v20/schemas/ReserveNowResponse_v1p0.json | 22 - ocpp/v20/schemas/ResetRequest_v1p0.json | 19 - ocpp/v20/schemas/ResetResponse_v1p0.json | 20 - ...SecurityEventNotificationRequest_v1p0.json | 40 -- ...ecurityEventNotificationResponse_v1p0.json | 6 - .../schemas/SendLocalListRequest_v1p0.json | 210 --------- .../schemas/SendLocalListResponse_v1p0.json | 20 - .../SetChargingProfileRequest_v1p0.json | 157 ------- .../SetChargingProfileResponse_v1p0.json | 19 - .../SetDisplayMessageRequest_v1p0.json | 143 ------ .../SetDisplayMessageResponse_v1p0.json | 23 - .../SetMonitoringBaseRequest_v1p0.json | 20 - .../SetMonitoringBaseResponse_v1p0.json | 20 - .../SetMonitoringLevelRequest_v1p0.json | 15 - .../SetMonitoringLevelResponse_v1p0.json | 20 - .../SetNetworkProfileRequest_v1p0.json | 181 -------- .../SetNetworkProfileResponse_v1p0.json | 20 - .../SetVariableMonitoringRequest_v1p0.json | 122 ----- .../SetVariableMonitoringResponse_v1p0.json | 132 ------ .../v20/schemas/SetVariablesRequest_v1p0.json | 112 ----- .../schemas/SetVariablesResponse_v1p0.json | 125 ----- .../schemas/SignCertificateRequest_v1p0.json | 23 - .../schemas/SignCertificateResponse_v1p0.json | 19 - .../StatusNotificationRequest_v1p0.json | 35 -- .../StatusNotificationResponse_v1p0.json | 6 - .../schemas/TransactionEventRequest_v1p0.json | 414 ----------------- .../TransactionEventResponse_v1p0.json | 135 ------ .../schemas/TriggerMessageRequest_v1p0.json | 50 -- .../schemas/TriggerMessageResponse_v1p0.json | 20 - .../schemas/UnlockConnectorRequest_v1p0.json | 18 - .../schemas/UnlockConnectorResponse_v1p0.json | 19 - .../UnpublishFirmwareRequest_v1p0.json | 15 - .../UnpublishFirmwareResponse_v1p0.json | 20 - .../Update15118EVCertificateRequest_v1p0.json | 20 - ...Update15118EVCertificateResponse_v1p0.json | 23 - .../schemas/UpdateFirmwareRequest_v1p0.json | 57 --- .../schemas/UpdateFirmwareResponse_v1p0.json | 20 - tests/test_charge_point.py | 8 +- tests/test_messages.py | 2 +- tests/v20/conftest.py | 75 --- tests/v20/test_v20_charge_point.py | 120 ----- 146 files changed, 28 insertions(+), 8216 deletions(-) delete mode 100755 docs/v201/Changelog OCPP 2.0 - 2.0.1.pdf delete mode 100644 examples/v20/central_system.py delete mode 100644 examples/v20/charge_point.py delete mode 100644 ocpp/v20/__init__.py delete mode 100644 ocpp/v20/call.py delete mode 100644 ocpp/v20/call_result.py delete mode 100644 ocpp/v20/schemas/AuthorizeRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/AuthorizeResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/BootNotificationRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/BootNotificationResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/CancelReservationRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/CancelReservationResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/CertificateSignedRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/CertificateSignedResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ChangeAvailabilityRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ChangeAvailabilityResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearCacheRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearCacheResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearChargingProfileRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearChargingProfileResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearDisplayMessageRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearDisplayMessageResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearVariableMonitoringRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearVariableMonitoringResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearedChargingLimitRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ClearedChargingLimitResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/CostUpdatedRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/CostUpdatedResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/CustomerInformationRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/CustomerInformationResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/DataTransferRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/DataTransferResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/DeleteCertificateRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/DeleteCertificateResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/FirmwareStatusNotificationRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/FirmwareStatusNotificationResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/Get15118EVCertificateRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/Get15118EVCertificateResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetBaseReportRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetBaseReportResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetCertificateStatusRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetCertificateStatusResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetChargingProfilesRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetChargingProfilesResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetCompositeScheduleRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetCompositeScheduleResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetDisplayMessagesRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetDisplayMessagesResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetInstalledCertificateIdsRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetInstalledCertificateIdsResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetLocalListVersionRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetLocalListVersionResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetLogRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetLogResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetMonitoringReportRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetMonitoringReportResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetReportRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetReportResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetTransactionStatusRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetTransactionStatusResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/GetVariablesRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/GetVariablesResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/HeartbeatRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/HeartbeatResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/InstallCertificateRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/InstallCertificateResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/LogStatusNotificationRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/LogStatusNotificationResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/MeterValuesRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/MeterValuesResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyCentralChargingNeedsRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyCentralChargingNeedsResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyChargingLimitRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyChargingLimitResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyCustomerInformationRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyCustomerInformationResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyDisplayMessagesRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyDisplayMessagesResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyEVChargingNeedsRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyEVChargingNeedsResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyEVChargingScheduleRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyEVChargingScheduleResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyEventRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyEventResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyMonitoringReportRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyMonitoringReportResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyReportRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/NotifyReportResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/PublishFirmwareRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/PublishFirmwareResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/PublishFirmwareStatusNotificationRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/PublishFirmwareStatusNotificationResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/Renegotiate15118ScheduleRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/Renegotiate15118ScheduleResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ReportChargingProfilesRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ReportChargingProfilesResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/RequestStartTransactionRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/RequestStartTransactionResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/RequestStopTransactionRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/RequestStopTransactionResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ReservationStatusUpdateRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ReservationStatusUpdateResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ReserveNowRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ReserveNowResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/ResetRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/ResetResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SecurityEventNotificationRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SecurityEventNotificationResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SendLocalListRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SendLocalListResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SetChargingProfileRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SetChargingProfileResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SetDisplayMessageRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SetDisplayMessageResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SetMonitoringBaseRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SetMonitoringBaseResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SetMonitoringLevelRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SetMonitoringLevelResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SetNetworkProfileRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SetNetworkProfileResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SetVariableMonitoringRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SetVariableMonitoringResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SetVariablesRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SetVariablesResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/SignCertificateRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/SignCertificateResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/StatusNotificationRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/StatusNotificationResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/TransactionEventRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/TransactionEventResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/TriggerMessageRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/TriggerMessageResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/UnlockConnectorRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/UnlockConnectorResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/UnpublishFirmwareRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/UnpublishFirmwareResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/Update15118EVCertificateRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/Update15118EVCertificateResponse_v1p0.json delete mode 100644 ocpp/v20/schemas/UpdateFirmwareRequest_v1p0.json delete mode 100644 ocpp/v20/schemas/UpdateFirmwareResponse_v1p0.json delete mode 100644 tests/v20/conftest.py delete mode 100644 tests/v20/test_v20_charge_point.py diff --git a/CHANGELOG.md b/CHANGELOG.md index c26deac2b..48f2b4eda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ ## BREAKING ## - [#574](https://github.com/mobilityhouse/ocpp/issues/574) Remove v1.6 deprecated enum members - IMPORTANT see upgrade path [#574](https://github.com/mobilityhouse/ocpp/issues/574) +## BREAKING ## +- [#498](https://github.com/mobilityhouse/ocpp/issues/498) Remove support for OCPP 2.0 - IMPORTANT SEE UPGRADE PATH [#498](https://github.com/mobilityhouse/ocpp/issues/498) + ## 0.26.0 (2024-01-17) - [#544](https://github.com/mobilityhouse/ocpp/issues/544) ocpp/charge_point.py - Pass `Call.unique_id` to the `on` and `after` routing handlers. diff --git a/README.rst b/README.rst index 0df940525..4b32be07d 100644 --- a/README.rst +++ b/README.rst @@ -11,11 +11,23 @@ OCPP ---- Python package implementing the JSON version of the Open Charge Point Protocol -(OCPP). Currently OCPP 1.6 (errata v4), OCPP 2.0 and OCPP 2.0.1 (Final Version) +(OCPP). Currently OCPP 1.6 (errata v4), OCPP 2.0.1 (Edition 2 FINAL, 2022-12-15) are supported. You can find the documentation on `rtd`_. +The purpose of this library is to provide the building blocks to construct a +charging station/charge point and/or charging station management system +(CSMS)/central system. The library does not provide a completed solution, as any +implementation is specific for its intended use. The documents in this library +should be inspected, as these documents provided guidance on how best to +build a complete solution. + +Note: "OCPP 2.0.1 contains fixes for all the known issues, to date, not only +the fixes to the messages. This version replaces OCPP 2.0. OCA advises +implementers of OCPP to no longer implement OCPP 2.0 and only use version +2.0.1 going forward." + Installation ------------ @@ -34,8 +46,9 @@ Or clone the project and install it manually using: Quick start ----------- -Below you can find examples on how to create a simple OCPP 2.0 central system as -well as an OCPP 2.0 charge point. +Below you can find examples on how to create a simple OCPP 1.6 or 2.0.1 Central +System/CSMS as well as the respective OCPP 1.6 or 2.0.1 +Charging Station/Charge Point. .. note:: @@ -45,11 +58,11 @@ well as an OCPP 2.0 charge point. $ pip install websockets -Central system +Charging Station Management System (CSMS) / Central System ~~~~~~~~~~~~~~ -The code snippet below creates a simple OCPP 2.0 central system which is able -to handle BootNotification calls. You can find a detailed explanation of the +The code snippet below creates a simple OCPP 2.0.1 CSMS which +is able to handle BootNotification calls. You can find a detailed explanation of the code in the `Central System documentation`_. @@ -121,7 +134,7 @@ code in the `Central System documentation`_. if __name__ == '__main__': asyncio.run(main()) -Charge point +Charging Station / Charge point ~~~~~~~~~~~~ .. code-block:: python diff --git a/docs/v201/Changelog OCPP 2.0 - 2.0.1.pdf b/docs/v201/Changelog OCPP 2.0 - 2.0.1.pdf deleted file mode 100755 index 0470a6cddb16ca7fb5021ac831b49781d582bf82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299121 zcmdSBc|4VC_c*-MbfQQZGK-4HHqTSVMoBUkZ4xqM%r=WUWvFdP8A7OSPLi2zDvBt> zHipnnGH!&-!*AVN=Xsv*@BKZW_w#<<_n)^jIPU9S>so7FYr582_c?w^T|-11Ek%2L z3;xiG^NR7hTz8;VQsNagw8uHx@CxdxUAn|8ffnNxLH>;vSKw8%vvjt#adfdgNh^BB z183)Qi&s$N+{H5&PVq{JNr;JvNs35{!0;}u6sqa{!A zUbl3&vF3Gg=Dl>w(#sjJ!(RY)>6VMNhn3BLL8{|ot!{|}y3`er&BUa{#KmRAWW{BL z#Uup8#037?*WShX|K>dv6{Hd zC-_BNX8Si?51gaDGx9*{&pPt*1LY!7q+uqv!pIyZf-t~b6>JN$S-z22Bf0L*F zklbFA+$K{>jQUV&`%NjTEO@06z0v2D-iDKwqy8qd{ff-?Lz!)G*==NU+W>NZext5o z|APzU`9EA-uyMA<+3`vs%kDVPDJNPtTIA^d{PO1zk!}6~G5i*ASPxc|DQ=HiS40^ND3 zvY-{!w{dszxb@G0gE3ec*x-20L=nRgHMH@@@rs^v0!2If=cn4ApXaFZ`?n$>C-aXy z{)kXoLi&FQQB>W=)85KPU-K-ll{>8%*!VyHxLY~X{>Q4C!T(q_P`gMAXCNUXj+Ozc z|GMpc;{{s!O$v?ozPb%88hO|;* z@@UXRI2&m(d0s=qwl66mVIv7YC9MDT-!_usD!hgc zv=~F${|oB>-0FYd`hWlZU!=%Opk;s;Szrw;no5f}&;s^CrA1OkPDWhDMn+afTE!KlG3vO-W`O32tr0mUdl#FT*^wq3K4)L^&bgq_$dkhmi&Jp z3cde>Js~#vkN*7s(w_df>Hin@B&q?nN%gx_1*Ez|P)4c(P~9M6O`?}|uRGXSZNCR< zPIZ3B!uH>Pyc6>De@gQY7_F#*$8{XlUs27PR#eNz-qsGsD<>yID{5kI4X#gILJHjW zS$mxOC7WAnE>5m4&WKBsL!7#!%Pj*}ODl*k|1xG;Q5{S7o7)}^Art!o12{;gdtnI0RTU`3jb`TE#D={8U&Jg<$ za#d8Q{^*a7_I@@sFcWFib6a+5&Bfnby~>KosNi^7lfF>ev6n(;SL=iNFYvv6ulwp< zDW906rK{tOuQVFT_6Iu|ICW1`gesLH{>(;UoQVqj?PZxP_+d4c3h4P5!#An6C8SaTaEWZhuyXKfbJ3 zLv`~+ij$LHs+n9_Wz~-A`K|R5KhL7C6c^Rs6S;MBvn{D(dWRSp8M7sbSz0_#*gKz} z&qe3XWW_ZsB_Ei%8*@IyIj6#0A)lC9=8%h!)(?c?#9C9TzL-lJh_*}OC5}XNZh3u` zU-uriU-$~B7#o?ehH2f7%qEnB#jTOK+zi*WQH(1dSvNrWPUl zU02IH&l6;wVEPU{jJkSS5lAz>z~fzqK@!t-S1ylP!-;R^L!+(c>VcO)7HOgYXxi8< zt=s%$LNE(pNOC zv|qcf{ZEGEGaf63fbB#mT1Y}aTK7xWw;i3@0>&nB-Ngm~!p4m?{88-VJxcmkVm5O4 zL~0T+{c#eQUiWH$FxUOJ8d>01+qwRkso!6-ft!?6{Q03LEx{e~`S_HBHl9P@uNfU< zy$JmHGGh%_pT27@rP~{4yZAXMC3I*10q04sQ(x8)IhO{3!W1Fz9NIW6B<=mZQ@ILw z;=-eaur0&knX3Z0Fb7bj_V6)6d$CgBV(olN8_!E*&vX(doxj{~{)_@o(m?5vfE)XF z^}WnUmS$#TJgG#?GJJ-69p551@Hbs$`=ZUGS8c+4eEOz1y=+nRU7Evk)k{t5F9K?CcNFLY8`G?)o-Q#m|QVPama7nB!i1J~3uLKW#gf4uUwW&Kh&UXLBlO zB=k;8hc*aQBMdE+J6b>IlvsdLPK$$c*$-%(My8whYHQ}D8RXA)oVnv_R@F(=1o(R( zHrICh?va&A?!CLcxh8)Bfa3(A{n}SNo!IN#4ebvxy~<#0Z=}$ty0K4ARaBOkyg!qGxh>%|cd z2Xya#JNbFqtWqg(;DbJxGMboGsnC6#CJT=TS?HVK^j3Jz*^0rTIXCRiN)P~Xq^*w; z=0=qUy?uQ)iCu0xh(DGG3*#=n8YFs(u11D|NL%2A6p>D~7pMW5FNK|4m4N9Yj$}Rx z0^_FLJ(k#e8$bPxnK5d1jG!FOLVHKi8>4Gr3p>C(Rwdd+5`t*n z52N7WGw={slWVvG`gWj14PX~* zZyd?g-D<^iRgx#*%C4n3itU}m2HeZW7MDqYc4M^OgzbYhh95R9X`Gvl}e zj`aOI{5B=_g`r*uG#2|1ZEAd#e)pZDuWlXVYmXlzq`x1zggSyp(t)MuS2!SB+Sk^Aktt>^!`@Vo;xk>$kTih#$8}TzUTrY z%KGOZmNBZGfWM)$Dtu(K;RtHgaeRz$KWW;lWR5+ z2e-MB}av;2Y( z-(yLlT}64mzvB9gFiMO78anP$dOSj1T|%AJNu2xO?mO(@GPDEVQ+Dz5wSx?e5z>S1 zeIf^*-*Lyj3{ZdV=R=JhiaUo%B3|i*MM~m7o`(@9G z)gmy0_hW=7>WsTl8nSR$bL$?H91lVrBhd<;2r>z9WnZgScvr7#sHcHS4r3V886ql+ zXUV#%{kH-Z`#f(75BXR528L8ja)kT8ulAeUSlpUw+{s!Ox##ro*D_(gf^2*QGbXyv zDdw|#!|Q3mSe=;0j5*4Nz_>>+kNBO%GB*=-Uv4a}Q;=Y2*(RgQT~=1*5Zf*3)f}fi z88Rft6(F`_&UN^8=z=71OiNGwWb1wf-CJP*IY0u2-TV-VZ0vjoxgGK zr_c14u9))T&SqfX_Cg4+fqnN0BNvV!l2)HJ?!${3--n*8n7vIRepvQetqOZ?fJ z^0Qod9BY>G*SDC9l$vjP`cx~jyrSTHd_D5ufcuZ!AVZbCamuNq-u_?X=-%XjHu^>z zsuNkU3&ncs_HEbVS_aKm{IU8+8F<+5nC@S^^Gh&06nBC+mXjJPkzVKWOvUHh^$Alh za|gSoXYxPxc;7kajUZseE-+KIvUR_7yQ=1AFWu_EEsAb!1Ko262=B`0h4_p#SqIoK z(Qe}@R>!%r_+3QqN3x%m{Ssq{c=}aUB;lD=6*43PFY;bf6MapxB=?enG(LxPzB}~? zSY+pbl1^sqLd}zhW1o}DXH^BF9bNY=^sng>Y;VS_+_G2p-?c;G^LGs-9FSB6Zo3H+ zD%;7j7gOYmDof_VkGp0*;G=yM{vljF?co?QMU-dewV4JIHtvLt6i8}lTIVBfZNkwj5vzaF^s#%gu)Hg`?Mp8W9f%;$QEN#=;BKZLG?GB zMiOW3QKxgH^cn5>Z;um7Uk}i2ac5q+r))~FH6C*Jx;+fGP$#ex#byWE?C49vD4*yP zH?=#uvbcE|=ygFLg{sB~+=nS)41ue?h(a7bzbQGSys`;8vM=Qj>VBIR#(EW3gZI5q z#Gy}DeA-#>9RDE|VN_^()WeTblpW5xUd$GITn1FI5!OI1>a=Z$pidF=pj;2I}% zw}?FZ^rGv7GXeDj2M!G~!PKqQ2U^{@7uyn|i|&zMueZmKbUy`;8?4KXT0J4%ULnh) zzIA{p>caS0RwPf~>}nKFQgS6-FPEn3Pvg$hF56}|uJ&?C#Eir#4^;S2uP%)^rK#9Orw1v zah=W6@?4(HOeq&F9sKfs_Z^zvRZQBG>@qx(7_KKqakX$&uq%sN&-wdpJ*aTsA=q(E zvVBZ7hOgb)fkKdB6499uv*_b|HRr$F(ON5T2({mGk~IpQ-i`JhfA6qddelsx@%J4& ziklZ2Rs3|I)b0f~iaxCg?Vv^?RD$@q59TUQx9ondz|zN@t!(6}r_B;G{P~3qrf6rr zCmIz~(DquZDmxEvT9CzQEHt6fZCt%CMH?lS|E@p-0YS%jARu+;F#{jL&3eH$T#wkZ zZNk+j&f8#-By842LEqzw*~$rDw3a0JQitU*nmZYnyS35?ot+pS7p0_LN!CrS9{1SK z6#Z)RDjt(KL%z-pdEPPPCv9;y57i# z^8Ez+j->sKCK8LdH;cQ>9@+_5!SmJ6@H{AO0lm83OSe|0uBWaTFS=2-6SejGV0Mxg z=DL9|Yn4)<@_Nq86eiNedLZRZ5E2>q4|#r2_R_3Tg~~p@zo-A5L$( zRN3E;U>T18-0~F79SO*%Dj?xnbt%@W(RXIOUHMCD-7GtViA3L^f<}owyKSLmON|RDW>EoKX&KS&+g@_d_&p>x zG8F#^#S>5m`I0&`Qg(+LKG8>LVEgheU3CRaI;d3^HI@lUO<%B~bu<$R<8o?jLyQAA$Y0GzKED{5J-HX<2nlOTf(DwnSz%A_-gs!Gv2QRen=vH)HJ>u9d3Lz`7?mfgY=W{Ag8nMB<=icY#*oDubr zHwvN=eO(Q`!W2ZhUr+7w9tW>c!zDLL?CT$cy8WH^P|8O%+-`lBz0R1VU;Hjksvd!e zKKo!VD$I`jt$;4AeO}#D&#b(t!HS^#nHm`YfkI-nR_ozzOvhf)_4y$qh_9AZC-4h( zXWy3vjBnx_w1aS5toMbY6nV(@mcQ;qoscZFb?(w}YOi^Z`v+fG?p08&tGqGQ$20JK zP3gyl-ESVVcv~;{73z7U+0rJC*eVYAbCIV zQiZjRvqyNRy97!Qcch8 z9{9BPweM^|Tn~SY5ys~aZpKgT(PnAP;K1#;Gr&3Iw+KlIY4j9dMcQw~{o-eJt!(|r zvvE|=1gI6J>YAwsr~lse^`mb%PF*>c=-jp&RWDxQ@{63LNg5U9%ey#_nk1G;R>v9TH{;5Qahm9Z{$|<4DATta~`-jCEl+S^+5zNWz;^BM{u{&F*Q{ zVHY5eoQyM>pplW2b&bygOlOBO2738g+htsSHG5u39iT* zxQaqO?|+pi9G=#Qc8~@B$L@h6%y_c3C+Gfxn2x7jML7y}IuKB1oO^=pbOsr;3ByeT z9-Pp&!b<79o7Dxz9`#ODW0oeHcGg{{SCBBM`cr+2WaDEw=M{3X8lCPY;DTq2AV@`iEoV8} z^lhu$J}g%bi}?Ew3|q(jAJU+TCgAWjn!*f|02rJv*`Qnj95S+RbIm+vnQ1r5t{=+U z;R|fpvK^izq?pw@OkAH34P+hk6zp{gShrt3wHx*E8t8jh*y=O;3cKa~uUpm?E$)|c zoo7LaE0BlMIOJ*UCuQ`p850Ei!TY*H6IAkC6qzQGb3)j=2nM30(${*S3j0AW zqi~a}cFpGK>=jznqamP9N18MHxWRU=Y3oE?7hv#4aiGSs4bcFb1F(@Z${Z>-li&AX zgZ)}H_!WDMWv+#h_3#mz%R><16t{dE-{mnVicE+=!elQENPPbr(2O5BsWjef+y`%%O>{ zuJZnW8^1q5oN_=^Nk9m7T0Sv}F^~4l` z1~rIPV)@WHz89-i7*O{w#vA6e_N*hKrkra>8!!IoHhD5p=1BLo5^Y#4-!tk5cR zg-7RzW6)kBKgnaMS^YE=6vx@*_4}&{*&Vn-v-IRDKfzJ$*VbI*=g;kqJkO@~ z@>PJ3P%!lXoDgOHO7Sed40bsqAKl6a?(=YAk9K-|8op&Jo-W0;_%Bg;!*|H@j!T+1 zKYzh4tQ4}64RTp{Hm3?_AFDB+BG944j{8*^#^qOJVQ>x0N?)3TNcUTfP>EM;f){kC(|acD?gAK+@Tr8q{AQ`AVU290gl@HP$u?-ThPA#n8zycR8=MSo z2kPUE@v)d#hnNeGei5?{U^U19V2c1e>m=QhFlRlGqF_|EOs=^v%jsZ=JpbHDIxC^U zTKwWu=q9D9CIp`U%Bfk$E{6e4i4c^axnh@R(l@9qk{x{!p;!N?)Hyr1fIEhsyuJ20BNWQ8_^w`qc;aT<~Zijin zfCvg@)=7Fs!X#Rg`Rb|sd^y9_9IIC`Hqq|8TqJ1WUHSq|mSjQQiOWv)k#L}-dq<(VE)!UO>1 zfnehL&xVv>&&iHahQLA)W?S(J4O*H#?xAOY(_gb0~rSU^g34b`qtANp%XrgOw3 zaHV3_hYt02?8cG^RDKAQ;O>+$LNjRkFfBq>m^PP_7{3QKENWJ{vXE@9k`c=GWu@xa zq-|dn95@Yiyf~He5bpynMBVs*lpqbgKg~fp)&b~wUA|A(!V}bz3 z)p?OCNdk62!bc>o(Q&M{EH+@Hl{^o-oD|`_>Rj>0Lyl;-^AzDzS^KknDW#C#xB!|G zMKcpgeQGkVQh&Sy!xo38MYXX_j9If~`degS z4>ayev4aXM*rFZe55W^-aEJp)C#!!WSG%{0nun`o9bZ%3T1%b1uI7Pgn*Rh1Bt#y# zg{eQmfpEO=1>NDl5Za24F=y?^yxvK|WTxXK?jpiHtqna$Whm>Z#pNgy$BKZkUA3bi z6pEgvX5;kswb1H{1UA}jgPOGr0{WMbLcxLXsio$~R(O%1pkKGQz#4H*aNbvymyDJx zccY#=!G))bbQCs=@x>r~5y38W(-ab3bQ-Z^ai&DU;dVIvRjB{P?5}zaHq=2YDr2b0 z3Unh@Q1y}Kx6>6YuusknW)EsLgG|4( z)W*YulzqRH-GNEPWd};I1Mbpmg%MF`g_v1mwQwr-4^WLd8_a$AEOe^={bnzex7l7^ zgU;!HJiN-&E#8jFJT&N#rMFypyap*#zlF<;8QiB;iO{{t-5Q2yw0Em`b_r9Ko9zKT zom{rZH$Gi16z)}#Y~?iNUYCu8D$VAe9lkjXlSjr0PpIL$vg=anY__%^Qh+-{=8V1z z*EhE6hMKA^>zr2^2?^$E%WluFWFK}eZiahtyKCl|R8a94moZ( zdqCxaywj31od59Hx`GCA>_@=-ux_2%0cqM4qLf|R!Ro7~tpa6V)Ywy^vi~*eK(n+db8R~0+@{)NT)i^gxI}tFh}qAr zcA&F@_EAI_b|D{{?9}3YZ9k+M7>qH(|Vrh2(4=Bp8mrF}c0r z{xwba(#x-UtWJcX+qc>LC8HPJjTT_y!zP0NaAL3I64H<@a!?@(zP)%a=Q%d_x#;Nh zYJItti88M9rSsNnao=`pMJVTwit>_X%DzK)pynCJS}KFahm#JR@%2;HAEtAy((p9v zrII1B6>j{~*5_gO<+*_ebSmUz8#Ws zl0h~ZT-jDR9|^RFwvIPDT+t@pTp{>)-rr^y`;uKqGkN^y>X_Elj23o`Y1KAFjSpO| z=2DJK2t(5@^g&?mNWdFMOVz1ytAqs%VYNHu z+C$OGa>PGghH^p z%3t}~{rfx=Rl3e*hM`TZ+OtO1&xQt6B_3AY}Xn|3=_UF!1axd{TRgc)C@g_RQjaHLW%9gRIy)e3P z;&$H8UJ;qqa8IS)`luVt(`I4GiX9rPyA@j4F-||A#_GGaD|<+qJrZr|(O!Bcm?x7k zWV7_dmec+#*fz=C_T?Dibljf?iG+Xrq9hP~fam+OtMpDMiFTAm*C)0MW>c82ugtQM z%1LWdV=A5|$>V2R!K8^(rYapf0-H>Id2d0U*o)~t39mM|FZu(2E<#NTOO3Q(^l-E-A@=^ z`2;QU`uv^tR-BFBkTQ|GZ5VLfv9?b&166kgn~`N$Rq&cG0VXV#+LsyhNiJEL*&87r z0u*2f17lVRNATNmNdKCC5?#uX!>?J+l$99HgVzZc z5PxW=g(F?e=uPA&4Cw?K%;=z%y`Ua5RxYWJ(|dk>re>oNS|qKr*ppAFHQI9$3SPdN z7*>iklw2J+6(8Mbh;oE@Z{(Iajo3o?Z0f$*g7Yq!7cvJL!4!8Q1xs?f&)aW-^2@5- zT~)%S#{4{M^XZY7d9)d4ww3oT@L2z-HXu(JNR?O}Sdd+0&+Vyw zN9)YlUxm-O&(n0B%V+-c3d8Gnm)nc>r4R=$eK2~3lSwhRosb{DT9d7q)E;Qtrq>Zz zzAj__K|y2OTZ1R_++(4yO<()2c@`7je|-KbBO+n5TqfXPHW8n}rjj*H?hD8~oc1n- z&=-(h@22IjaxN+^CNT3gM6}_+-@hhS%*0})oN6Jn&3?^;y@7mkrBuw*1DaTm>?P0RNcKUj953fd zqACn2rAES|(_e8HT>}RsLu@`4`(mXM*JWv>id$W`5r(f}3J1VD#gBdtg+v*- zLI&)@L#m3#;$G^0ohmM=Ve!&Ya6#u9g!9e*e4WeWA!E?8d$D;d!O$a#R(C2!w|bl) zpPu)3No3=q)bA`yD&9y<4aMi56+JX3s6|Jf>gyuaUecBQmsqj5>tt<~^uVf#PsVz( zUQW950{%f)ujz`WPMnj@r%XDI6XI`O z-zS3M-t!|~j9-H_DHh#Sh9m7$$1>?)it1SNXeRBx>4jGbny&FTNIUpln52mHqO)^z z{jDJX8YzPYV(T-u<8XC?+iqQ?Y5t7>Db_)!EIeA_?jyP@18BldJr60@GXrn&1jNU$ zuo*os2`L_=pTGE;xstt{nLuH+=k(H977>wx^8Z!&{_u!SjBIX_v?28-F;;dKZT2taKuseC0^!R%FnzI zxY*tr>42M`6INn|AfweadVKgi*U2q?jiZs=BSX9a2QgBY`tOfNH3WhS2B@l9;&}G(<6`BeVy~x4iho}SjBW}Hs*jq8eiKT{ z+U}nZ8@(FZq^Kg7-djJKCCT$8Eb%U!6d(7GHAT85KT{~&C6xTz+WY#rNBUY@=1=*h z;@LHun5sjg(0wSgFp1YvwzZ>9%o0O}_WU#J4NCo~)2e3#-p5Lfo)>#dUBQcItT69vP%^*-eqP%grQLZC9uh=)W(L9K; z{~yr5&tpXE)_rU=CSt6!F8X zWzfBV$=f3RM6uX;9`9$4thV$brAr@5m7Of2b4*Lj%v!l_{_2T;ChNC`O+D?z;7j2; z(c178)cED2z`!`Dg^6f{yve1rf)TzL${v!j*(FNB24CAm3%b|S{a1xXd>{8xpW=n& zktW23XrZTK{Zy-8QiB!i6zKEdWzau%XzNHWP(C#gkxHI>Hk1~ap5Bu(Z>gvIFgBaw zmPf4nQO;Zwm15tw?UTxL1tex>kn-P$G1s_&wT9VXHB7CoV`G7G_Lqr~GUtz;cNGr! za^$J@*AcQW0_hi=7;bj~=~WEjuNZn3@lp{L^$LN?ZZI0Nzr$V_1OXXh5Kq!$YD^fs z6gA6cR^YhtF6dQDBqq7|xNPCng*xj#?p1IqFq7rPlhPcl!sS$>HC%Sn|I=^H7VT8P zp;P*R!R92k{?>Y)3Y5$~GBFY7QzLMyhbs=0=)`aq{N3Jp+s*@+5n!6@nuJ zcPUOU4x-WOZ_lTW+V7=r^_=b(ZI_#7_X=ESf-pY+Ip-H~4DM&-kPK_`@8E}2N@s;y&q}xjKA#f}iN*nKd?^s=lH~Sqn9PgKTzsbJDZQR#e5}>! zTDYo5ye;D?_iR@u-8&NspP^aYz9?=#yxcjb5YCT%Ol}|Z-Y(+rO}B2?nivLU6Ty*s z8asHDzRAWa2`GmT?TjT$yCi6TxamjJ=@AhCC5YbX2~Nb@zwBO2CxJjSoUp+OE2OJX zH0C2qmcTa*)xkB*6V^wf>v_I6&nCz=r++V2-Z3#D*6aC|EA5@)mwsw)tMs7F*2#jM zs{-HGZBr(k62Ls@nuS@$i5PGU;S_Jd+|9a^u|R9K?mbbtR=&&K^MV%r?#~JIPe%7m zQ0!eNUzJ$AbmKf^_WbwN9FXTUp~Qo28i`vR^u=;>KjT552}&Hq%Vl;nJ}m+4U%QX% zLW|CBr7w9WIGpv}Cq`fd1JO~>T=RdZ7~0riMM~nFTRD++wvP653wtMbT;y&2JN!U0 zeKJV4j;_R24?$ssd-{l`V=6q!sm648nOJrv?gtE*i0Hh@udwqyNe)T176>R{LO4ng z0jWs&5XX?zaLC@H{mdsZDL`jzl5Bsjb@VNaw2t=jERRU}S=sjIb<0(wo!gEh*G28a zj#KDWWRA8@uYlhrd7q11=l4_#e{K~k?Nn8!9HMr&&rkh(vdkTiOGZyO4hf7G-(LE$ zRucJE_{k=A*p74jF-#j2i8nwaC9!+|R~@9RU$eF*TAO(jI18CAy^_6Ot>YSNu5o;Y$^utgTVNl({Kh2{}VrXx(nie6VQIdZ!f(vM*acToX2 zBB8pr&Mpkc(EVVUBIN_LQ)1)CZ3g}4Mx?6yboxcV$W==ii(IdO*vOG$1&D&~Idk&V z&tbx}SZ`km-n^z3_rOL@*ufPaz2Cht7;R+d$IjGciOf0`R5nKx}}bKYzz ztV0@}x`pS6S?RctLVw0ox|G-HB%breJ!96FN9(S>Jlo&#{1Lr7D5=l1Fxzn_CC!1w zn=%oi4fC^=uYMtX=xLAB+ph3wu&Q9S4NUsS6Nws`lsKZjJLxuj;^j;>pGN-QQa$_*csWS-fiM@GD*mTFCkeQf&r@dXqUXU@`wWWs(o@Iv>VI6;f? z;J~(K`DDePEXKA#A!V#mQ6(5LfyT#!fMBstu4!- z&MhN11g*{3_5qtmo8SSUjfW#~v9EjjVS&4Gg5q_w(F=-wn`ej*41l*^5H2U~N5(bH zuoD@S9v9BN_I{k>!JubS(j!znT+?k9&uEcOVF_AM>UWpSvDLcwfRZ}6`20-{@WsJ( z;&-f61!QsOK0K%N3>o%S=M++r!H{L@Wx2AiozaPJ@EJ0k0Zg=BxOpFv3H7S2%0vr(EF4hZ!J~PP3B76R~bm5ew%H5-Toz!E~td1pGz2 z^y@QEtslM7Unw~l`yYNz-t7<0F89BRMicpocFeRXd!Vu}9UDtQic^-&T_r<7Zl5J1 za2ne<44|M8#1r&5X}M9~yYU5W$mVxL@KT!mLpSSERWDp%9bk0NrVY})x1Zxmaf0Dn zDDoagj4v_6SS+D(d(KEO+VQ8RJN1ydZ7MXXdxA9spFV~ClUZ{?ajrGxMJw^-EI!VC zTeP7OX0@ytGa*$_{^1T0?_X;`pusDK*_6 zc=cLefMPx439$`Y4d~1xi9^j+?Z%?ZmN?QejHWjv=(%FsLN+ z-9o8p(FSe5)+SBIqM}5E*xhjxgmq^bulhD4Bx(=33#K?>OFq4!f3Ybhj>TzyP8R}u z%a{>EE=P-aN13C$Gbpk)oR%~ldDo52dhmdxNmW)Lr4gooYU6 z9IBvb_RqA))mp<;K>Urf7rQVb7Dd95VG^|cMEL4Y8#)lpVsSXqA7Y_`=(L8pm;&W{ zn3{Kjn_%S>^uQ0dHf9sEM(~~^QFgP6<~y{I@=@%FVVIr z^|ZP!x@Om8)7J!0(^-WMM=1p($hG}Rem*mC?hjVi90p&%5i#Y?G zn44{joUmu*6Pta%_910V`6c&~jT_WjfPMntP&_WYP%z^FeF~!WB^(Kq5X8*Dm;L)Q850JIKK`W*BDNyMO;}e-09XC`be{pJ3hl z5y;2#u=bMC#pm@6qLP*0bRv0J^C*Q(|PL%1C-rc?udYM;i z*KAmM_rI_nRc(vdJf${z&O;W-k?LG_CF*#Ql-7hfeQqB0#~mS1F*TR(y16Q6vXphU zzv2DAa1p_oFj6z$e)=G~l=L7uce^>RCz_uJeuu+(CE?ooxZ|2L;$oWI^~WBnllziU zIx%K|*lRfT0c{Z&#E@_m_B(9gPXK|O^#HY0Ik$3Gsl%NJBi+(O0;OhBa z?kqnH{Bqy)mF>VFGwPcypKNVegOQW#JjcG`!2Wo_OBn=qtS-DGQRLORM5n;rirulV zC?uDcbyCZCU4a~JgT133;t_43LHCA}#H2cqX;;Soz_b6;4}bd|vu=jIg*Qt!n7>M! zAQy#qiKjAr*ucyKTzA@<1hUyXRGPC6{}m3SZL;0ZTr%((@Y&>k(8$6TcF= zUtwk{{qZx{1ENaNr~DtX5W+{D%p*8bG;k0P*@CSKlR~`bPo=MchpY>E&|~kn!11g! z_3I&tGUr%d?ICVo*@#PcaFm)`W76H!vFgClku}QDCRM$t#;2|QD0AK08mI2V%`)IP zn*9mRUP*KlnsH?Q55mRD3kN(O^b8!D12UzabO_|P);wp^%=&Oyu|ldF`6%H4U`#}= z1)#4;Dy*UnD!)R2{$}ma4dyweQ+@5}9~?1#PQ(umeq$U{V)w>45%ewczS&g0$g zv!`E|`>vUnk50G+-=HA6K~;b9i_4I#JkH#@U(+m<7W>rl6uX7G7jOR@#<@cTib*rv z+QWZMiLJJvVfZmJEaJOY;1~4Vt!lYLd)ZmyD)``bz{yZTl0}eTWMg zT{!Ko#j;7Udd4qDi)$HGegD9JOtgi0!4K3ZY*2LYfHO(vm~+Q~(ca|J&u=hoydu~> zoAXYQ74%k|ceyl%dea-x6Hz3_jSl#7qeU&Be&a*->`Bv5rMSW=vT?1TV@dfdx8$2s z_r5%S0c8gw0u~1Y3U<+v=1;J=4*t|sw?woW^#+n@cXUokVxqd~=$zy0!rnR0JfGM3 z4A!LbZX+oGv@sLv_**&i=-C!@Y@IDG_*Sw zL)U1;Bi??}@V71^Z%+q%nFk>*Y|uxrL$%ogCK*S{Dym6SUY){LjqxT;B@Uz;Ydwbw z2OO0`Gd1w-i>`=Bz0>tP*__J$7y{@T43Qp~QDXWuhcPS2RTw^H9Rgn?wv;&N1^1^F zVy$@I=W#%RtL(Pl5zTKg8of3}E8E}WDCX71=+@A}fM+8DI&k8p(iBqRPv%cS+LmN4 z8^1-5gJwOksg(R~%P{`g^Qlu3eg3RfP)Jx-%=^0^=aWP&2DY}|`cbaq)$!n?jJ)VW z=btZ~d}3?+&MVw0p%YT?x1!|K$FW{bZ$bzzFMQA!UdBfnpq^6`V0$1FdAkJO3rMWVv<>%Cwdta(bb~!~BAo|b)|FeU4vytY)SX|e`#nhF7p+H7+ zKfxy>_>wi>-vJy$hN7bt0z>_r68$=)dq4bNOUyeE6St&OUuAQ=rsz@mR)8)%!`4`F zI|dob-)zbGCWAF^n8Wms__ybc;*X46EwGauK0q`B*LrM}4kre~e}VHxpk8?k)W*uQk&l(p7hPsLoBh3}Zwzwa_DaN2&L|xIYIko0{Lon1vV^NyY;~S_yt(pER{d5&_tWO}iu%Q@ z)T4de#)x&O?YF4T%0(wgAS2q%Cgjq`ZCL?LQMcvKr!Gwm z#Ee&#w;RM7RvG{7rePSk;lok7M@77X-`*U)K@?xVWBp`sYLO=frx(VL`|>CqXEs9^ zAEFQ3I^A&JBoxPvHO%bmf)Ch^U)_0Xmgd?NrAhIz(3Mi%&>@)FfzTJ137=cJ-KXa$ zh<2Xb9?f53zfc;t7tfB0EpKw3kPIqnJM*w=uk^aan(#aX zaf3kNt%eBXqswur@8ccfO|2S4!Fom_1-=_F30N?lA)Ey5sT)#lQ@)EoQuPcckwmoE z*RxU5eeZ$Fu`Pc4H?@(U4`K$gEBMEYlN3FRWAzg*j&=Mm_O1gkin3`RD56opLQ$kd z6s4HU-QHe9qzDNTq$hwxKu7|i1qcZpf(22L7C@w9AOca~10cljfA(u8)u ziKP!G5_R{X5qVMe@gv7sAtEzr*7%h4=gL)@U#i%Yx`SGMlisy(E}>6{K0It;)r;RZYw&*aqXBEz9&5hyNanWVDbLhD zo{pT#w-;tlnm_W(Ijx=;T4LD3w2o&cf1A3kk+3;6J1Ydvd-Kh5o6FKAPQL=jcv7u_*H+ELy{FHgJ$z2eKcBR#UvBfW(%YMYLN6vF zEstAx6)y0WMdktaa+OmaI2oJHE@Smo{YgvP!1o9CJ9@k}!@3Q72wk%&BRiJ;;$qA8 zi32}dHgZ*?(i{HFKD}&O`#9l^t|b!B{4N9}iglTY97J1xaMGnEec3ry_U|k9sotmC z*`JY^`*qEb`XfJ~=d-0+3Oh(B+H{MR&UzOnydC;}t{eJUh&`+KJp6mLEt}%|vFNV& zgTGdY``<5P2{Bweq5RpKaaGud&Y`UxXTql@P?B+d;p4@vtz44{&@*4DrHV!3=DXrC{l&L{hjsbDF(H#Rd%QS!qI1KSKl9hxW(eA{ZZFe z&1o}n)5NLq>r=)xW+FVK7eu&Rg*E?!`677UM>~%EwKX_iAebeepyd)k{@ergks*o5TvwORwGHQYGsy`wA7AG|#1@A(_o+Fma@VP{B-(SV2y zZF=&LZIv4kdTjB_jmxk2?b^?C?2(0l>^t70O1bQVAV`%3t2}`<~1ldsZc+h8G!SuADkOCpGF~=8Ph*)fz-oH9oGsqeo^PGW9Q1 zUC7#trEfoaZs7-8*B%TzRt>g!V!Pd8!LP2lN`U$bq3I3BS6#Mj%PZ6WfgUb;bLrUe zH_{LFe7@(>i%@m7d&6T7o&9w0E))7C9glDMKS)61RDDFo57p`o9Ps|F6HmpK-1f-d z=sV1OyUn8GS4P*l_U3kKm;CP3%thNT@7oP`$&m6?2E%TwPpzIg^v0FLZ9i(=w{Mk3 z)r&NF`H%O%ihTFg0doqQR=gO|soFblpUCdttzF4&jWP5~-1_~*tu%L|Lh9kYH3KOe z2o3LuTvFEYdP8%*`uT9;N40UB_G$0EKPY%S^_89&)S^|>qLaQz4xY4Yds6oP#b2GM zu&u_Riiw%xe#lALHy3>WX6)rZvUffBT=qia)h@F?+51TCjRD9Jk*1n*a)lUn^~LBi zNPSIje764FuEMJC&jr5pj4q_gHzV78A1mlbUEV(^y8Tq4+a%b{;uDrQSnKSFz6^A+)Gk zzlmV=NuhHu6D-mEagBrUqRwA?NLPC%k_yKYH!u8Fe{$RLOYBOzJ@xD~Dk4NbpqsVz zLowqzTq|4=Nk|Xt-lFUb8}ZeikH1x~-_mUo!lc8314WZ=cIn@u;`>yDoC!$lrR`{9 ztJ}5hL{>dU1M&}Jx}Pa^uFzi@@>R>S zD(iI5)9|x7+js5_XKBKnFWkkxRTtkHaPi#WCo%N^ z&?o4VwU4%4*LFv0R%qD)7vJpvR!R>`8Q>Q_3k%QsKrX>Oao>OiO2Kq&}=R{x#Qf9h8mBjZ+yd!OicvhR#hp@i1L z^pu4W3$KG{u`Tw`-zS}cU{@I}SDwrudOhBIZrrgwu_b`{0&uwBnci)Wr|3sn*5S~X zzi*#ZrsjG=;i7nQX78V?z=+My6sxuWK(9YuZg_a&$Dg(S{$bs)$3h3RPFQLJYZGL= z=$hvk@fv;eV?ZcSEIlTS2(f1DkRJZ=1LuFPuz5tQm)dkJ@`6sc*RpAC%G9NmS z>!+_O*NI+jW2RTjVI;&TODqA|BA@Q@zxSR5%H`R=J7jGhohWPL%;$(b)?HcnVdV}+XsjvZe2 z@lS8jZG46?jU9jdW7qdYt@n%F`u#6b=&N7Nvav6(z!RHYdU-ME5Sl_V;tNyvzqd7D z$-reG(dWR`)bH8jz-bmI6t6q!w?9$`ef`dZy4rt+?%y0UHV)sTVov>(hWOrV=k|<& z&>RIEyzkeWcI{!wC>js*XV$ayU`qv;Gv#b4O#?`VZFy#hbyA(`FdZn~7OyZyzj$54 zE30p;-Ok>PTakF?VCx|ZerDXe{=o3x=H=Y5<~-4EX6)F_0Kvrmhn zm9w`QN#?ATr=T4vVrm8~!k>q>55%^KyR)@SJ#uLLxH`{(Fo**qhGxymEv4mxey z`>drO3|g6|_s`1MGhV+6nz7Vxy}xNV^xEue=byz%M!l4QlhkUv_+^g4sDP4DE=%*~f zOqiP8r$?8YU949Zh}V;i(ia?WdHuJL768b7IOgq_-&#MfFVhDjF*e|k_*JRLw{4e- zBj2BTkxo6%y7dD(Xh6RKx2{h}{dz9kvx=b$8YJ$h9vabyj@h=+(ym#7H!+9H*mY}g zlDKGe%QFWm%qTV!xZ)DsHbsnl=tR%bjcE4S;1U@pclXSxxw@%w@%UPqPt+WalkS>8 zCp`t7-8Hk%*>uvT{pWVQ~ksGC2L>#Dl&KybV~nJsKU@y ztq*~p2+F;7PsC?C7ffjg{dC#@P$Vjdqe>XtUaD2vNNw|1XZ4Lpo6U4_n{^L1&W^5v zu}He6Bnnfjc3gEl>8HN47cBWYE_K_ya@pT+Jb�pqjrtv?-?As^c@466E>qS5Fg_ zrB-`PEu{@ifX+t8Zt{0s|U=IeKGz|Q~V^gK7T-5(orYK+dA z`0f)Q)P5)S;dcv-sQuaRKeYSynfG3NWB+%bCXY4$R&VLE-JgnnV8|1}mmAc1u+D>P zVvD^V_+J0`Zu7p#99^czzO;e6$E+W}zDMSW=MQwvOi!z|bI)T*iKjNVXqUDj6-xK1 zrBMy{oDGh=RAIpW*n>5Wq{h>g{NDbp_9b3h7P9r9oBN9QJ9+fX&7_;{uYUVSD7_iG zV*akzkN){{sn=$%A9Zwd-TKwm<4D6kj64_D`Pn*-}bSj#iurxT~L;YU8dTY zktuW2kEfP9UG~GwgUgP6F?%Nh3SI4}BfXnl+EMD}TW5C!4YRiiqDLk+ZCpB}Nsp{* z@pIz}CELr?T>Q*fdMuAmK(}Ix$V;C9Iq_-E&`X(ztBowQQUt`Y^0l^fsf)HuU$xFq z|EnM9T0%FTOF2G2XkZT<`9ph~lI+O!7P2FE>oYg5!@=zJ$IgGTZW+6uj~47)^Y+}& zf(8ybyQ7FsS0<)!_bTV6$BZmC;nl=K&~LvT_-*T;=shV9B>u0D%_x+<^&uuPY=|tx z4)^`3M9bPkPveyVul{C#<(&?DQmnB!Kz5HpnBg#U%U@x}i61e((vP1X@FUb))5MMQs$AHRGBo}8f;Q*kMr0=9 zYag~eKQ82E_pE)pCcphi(iOb&*cVq{7x1UPzBUI&&S;brGqTgn;L*72BjF!r^x57$ z>-0tT?GM7@`^8NOn$qxF8}5HXqXuWUG+G*RvFnw}gCjDpLvEV= zFk;2DpGyUa$DWz^Mf~Ds}G2 z`^670dKCt9;>G9ncp?wPk8U==_V)63iWv**HtYjCUHaqM%8_Cq4!G&Z4b!%N`pKp1 zS#!^qE~lHdFuC}0F#1RBYCI4#@}~)_YfXy^FTeHNntoH7jaz-KkS@OYtwkSSUK+A? z?}6WnC(Yebz#~`R{kvANlv`v)!-${J5@Z@gqr7j<4&Ub+yy_&weAYK~~KZ12StPzqm{JzX|*>y+m@kNoLaYbujwb$s)dP~lda2Xx^F2KIY( z;P%JH2etX6>{pSEzpXiC`SK>2D_WG+{cZsZWp(Scp?lU6dSth19FUMKv@@B91g zNvQ-CAGYP@ssW^RzT5d_{nFKjw9A5yxX|~1ePTy{Hu*;4#oy^bGbeWq+R^Ew8GBPI z_3Rf_E4$p*lKU4;wf6(4`|Y%ciXNK*<{4DJdYhqVcW?fT6rw(D&l6C%)tW6@`s}S; z$GSfKLZ6;91{Z7Jd)Z++-qNn;ADlFDPs+{>b?g7!GkZ(Mp`@Fp!RvOuPv5;haQf!s z_T+}?u`xpZY8@_28c?)M%pYS8)!6m0ZdT1Ey;go6)FzdlU(z!xc3m8Fu5BBJx3m%y)flqjccc$ z4A#|tTI@_ToVW#6ugTzN_nxXh^N02|b;I5^ccs@OdUi_;&hGr-bG_e9h-LhN_oj(G z=sj~RsjcyA8?CHe{lPK)3+cMPaxJ{VYp;B=rPPADM`KIozC8cky0DiE8Xb)dSy_8v zi}HVCT)>;A5wLV^=KhlPN&LH)zAU?^h;Bz{6nkyyFIgw!-%aSXvDSq8t93f_uYVEs zb}fQUx>~&CT3ku5%$)0;ubwKR>-F5@6=0)dgG}|SomqD?{n0t^f1VvvGkaZO-7}-v zx6FOM+4j@9)q`#xZ*ldvYMD&GwASgYF&{yXE`zOK_3^lsByQ){2n}xy8Qi;sZeFRn z-^>hZbL^L_GW~aA4A|h9qa$bQY7c)V1v1fXhP}-LTf|jUNWD*d=OeJ$f~2FdudRku zPY$j1Cw+3`vni#QhCDaU-ljMthx9?s?63__*T-y!M;@(;0;;Z7$WL>CxEfD`Kvsv|2Fy{BEQqwmz|@dgM26 z4Vivoc+Q*2C6}LWcj=FzuV#ZkuTFZtdhPVsKgl5GL?=JL{Pc`}E}xjxxnJkC?SbV# z3^953D&sTjUB7&y zG+EJ47VmF2^48n!*K}_-z5MC2Q)ZiY{S`c}`uc};mA`|6yZ-c$N=rljX>~Mqjrm%G zIa{F5FN`1j!9mdR)+_CIc5ikQryVrvwOt$NUdksI-&(%nz^QmSgXAr1-T9ea<9GfN zH7YyjE#0v0l`2flOuF&p&1-A+?n${`|7dL87x#5P+WY0f6-ymGvpsn9&LX-c!mH^3 znk?U1YUj1&nP2@iw_5hg(+Z0xXSF?sNOto1)1Q64BqVXb#;vWdZndwA-BR)9pVr;k zg@#3*NVLqZHFx*Rk>RyAm+dj(!y4DuEncPjuGdSUM{8tM+Sk2V+XzxVQB694CAWHJU5A5te?%M$u_R#5eP79yVEq&fYXKpO7Q2w>OZzi^# zGvh*GUG^_OZrH!;WV=g6&rj(*^5jG1Dop=;_Na)TLr%7CtNT6WucsG{|0G~Tshy)P zem&`>uMSn5PR6=@NnPbJ*Zy7@{86d#L1`VxC&-x+*mTJo?Q32=e{|!q^OYt)(qup( zUGt4|_a865_wh}oc8(pe>(P(*zOoH|!Qq_Gb+rTAKM_I3F8h!dp#K3Vc^|=HFJD(J)oAu6&z%mnq()Jzg)ppCk zq33RrZW?i?~J3Bb>ffV-M$~Pa`B#& zO<$8|*DoM7`O{T!U#j(6k;SZElcKu6y7uk9amdQU_|TFCJ71goZ0}}AidhE|v)3x4 z8~b$exGD|O=LuW7gc8->9{z1u^?%MsUCn$(H+I2a+c%v3Y3QY6F*m0NrJa7YX7$PC zA_H>T*0sY)y8-v<<3-8e4nF^U_RL3h8$P)a|MO=-X{+O>JlU$@X9s`zv+>p6#rlP2 zJ+gmN$ka?Zr(TZcfE(NOb$vL46i(4%9FdpdhQQ8_HhPT zilOI*T&?w_&hP=A$Bp=gQ-jj>HynCvdZ!4{wtds3=a zZeJm$*VeOJ8o!p^I_=`9UvT`f5Qq1tuRXpsbJa_c;p>i^n!P`KzJC0a*}A5WwC_Cd z?9U78rOyjE^UkqeX_!6n+$UYDY>nAAdHwXiUp@CjP95E_h64u2E?W{3kuam?re8Pp zn!E#B2jb)3Y<6TxNXhNwER-%)vgFX?bTO%ae4g@2r;$~^27Sj2I&5jTzi0i|rqUOZ zKQG@l`_`HImx@L{4yM|W+`er2D?bEPntC2S+(sMGrwg3(teKt7gVX1|2MYhaqO>rs zd~b~Rp(kAL?;W3&i5{6&VnM&<2NpGKnS5m%IO7w0zuh?aA1lkY8PmPl#MJkv*S&Ho zdBLROHM8Nm;A=a60%IKcbuYeIZ)N*QHAr#M5jPU6y!p~>I>x?U_HQ5n zX`w%#S$4ktNO4n8@#;eTLhn2b9lB;qr%Oefl$;Qhw&|OU#kF9Fa!NMXK4*5qN5>}M zdG&e$5it3zw>HfG15YG%^q9s7O%7*P?(*d&;Cd?z8F=H;NV*`|p)0{qZ?(T}`Tr5amMeIJj5W`=tJW zvm7oPTW>y0)~$$chsPW$6}%-Ydj3l}yU*vmuB-g<$K&i{x{nJ=>)P*seU8_DA?*0N zo0nHk?GL_w!#?|sF6r~C9{M|Lg^xj8MHKH=a0#Urs~HQ);-p_V{{yRqMPqFo`{Fthoah?st6IrMh_p@b>0%3VK&5i z8tIE=#dJ-FPTyFv{o@fI?n&9!Wzo_TUj*xPwM?(3le>O%T%*LFOHI7Bscw4=&p~D) zq4v1=O?Y9tX_OAyc0|RZC8~h^PE^1J*|tBdi(LXg2Kw%L-N`3s232jl?MlyD)4DvU z6GuhGM?|O3yR>~*#=b3LVcnGP0wVs#86zrXj?3I~>4%&e7|*zVZJQFw_}0wzxQ%7e z!>bx1!^?=vPve&k!>iVa3}02JF+8-iEddb?mV~4}cWgpi-K2~>NGNJdDoR|jy9a5tKH?TFRJ!PpO>%?Y)Y|hQWu?WOIXdB z6x$>A>%2W6VkbWQURbFUlwfEdtedqex#X&Y2S(p&`a;b3psFR?T)48fPKNHg zMw>?m;pvAYjUBh-mr@f8$N!4)r?a;FwTYDfh|*PV;4;3vG^_2%61o-P7oPtav+xkK)yS|Y=uf)vynL1rgyg07RXF*jbR>E6lx(!`@s^J%1+oaD6U-(LMU2L)T z0TJVIMM9@>g=?>Aw5-&?>5b%UHF83 zy;B?Ft5sw0x#6~QtyY0S+Q;Bo|NVh4NG^quv?!Utk;d5QZ5os zV*RAhv1#Lisz#8Dbma1skO1Ag$+dn2SvQzy0vU54V(>*frvUWDrI? zt2?=Qc+(S?anQ#bN+dkgMK`ZP>DN=?5~c1<&saP&d(C4xQyRNAO#l#g)>K=wJU*%G)S#;7d4Cm8TRTek zdjQlRf@U&Uwe~i@iCcXsec7sGU(M0=+LhgZ_ZRh=kHdxZfk<77Xs#<0H!xxG?mY>W z$A!ae?6?F@gB6L}Uu0IZZGCzl7+I|d$ap>DpR?)D^(!=Q`K42{wyc}DX>3r{6BSnW zEOhYxXAAcl{@2!e z7uNrA_4td|n|wA0W}#Ba3HYE50r*1G$|cKIb;cLK%;5=e8n+xM68rU~S5lCTJ6@}P z@_S1|Dh*!-@;;iXd)x>Ic;u{PDBiGuvsaJ*SURjw*D7ls-Cep)rM3{&`LCqTP8gVA z%wGGnZuz+Em#)-n+F&<6Tea$aQz7+WOp~4d zR(Q_bCsr0|)x128ls3Itz}N*y({+xI>6W-PXhm}TX57yBU5I^ z5upB@OfW~onrjDG9%~u|qYPVqVAPPU?Z<^fQ#H6=|HRS`W!FABp~b+93xbov((0to zd-3KsmtHyuFRpFCgJHo#;})DC2PL%m}L5VDiKngZ`?~?)Q|Xe{MImdhx^# zd~O=u!hzqK)a>`t%$f%_J^J{L%rm>LPM8CoQEC21#rhU&D-0jluz1-E)0;FX1Bpy7 z99A>!a`mYj*SFkWqH0>w)-wb9?d!5US%gpcVv*gMQ+F47qiLs&7ZUcgNEX0FbG98x ztMWm^q1Ue$f9vlaO&V+hPbY6`my_}3=sNFBo3`fYi4P+iRE3|JT(xD+jDvs8?sK6~ z_3XMe!ha6$_WZT)uT|fU9CX`@6XtveI;9QXIHJp`68fE)zpq@jYEt&+^>Y3fmV9eE z?#=vlX5#~U8rGdNckh>n&cA&w?$vg0ByWO|YtX35wS*aiLz@&oop^1+$&-hoPj#L9 zVgx*Zy@jOedhhUBDm8W`52 z;t*l()Gn18EC;{5xNg$Hn}hl;x}2Fd<&E^FSId7j^VSciXEvA`*8bs1VxWPOP59+GzS$V6eS|v6C&PTJxSAdnWV@dc9|NtcuOurWuaa z$h5ZLHBd9Y}z%_3%9>gON`BKk5aC*c}(ZT?j7QNx>%dMM>^D(i)E{p zT`yMJD(rNz&MUr^ouEd8%|thpyIvWKK=ZyC7%O~D7A(oN+OaMi%b;^N_!{wVEUq<+ z*qJL}U#?j&U}vsHFo-7njIoN?qKm(+rhB?YSGpF9NpCW`@6Z)3cB{!^!o?UZc1yIy zY!&Y5$!!L`-C#Chfw0H(3o%$(esrQh>Cxy3!k68tB9x{ZoWlCeL!hJy6N7ka!Eu?R!AiTnzqu@ zB5>tY#F}P<#b_0*BDS#`rM2`Teus6j!OD#+mh2W_mnda)B(}J6ZDi!MVzT`oZK|4%7#fnNtgYN)Yu%yXYndCY2lrk{p;# z;B)XlOoj!2Opp^T%!kor)SK*Ng*{(h0ngt%p7({8d6WzF!^^i^s1GR1h3ND3`J!;m zWDcxGBVrztC%KT_C@Tdy6lahe+|vuN+x0LlV1Ccn;L8Im_zWKb@%g#C8VvP=&9`8v z52&4BSnM{v(I|Kn41w5AWKo9M#M~q%9&ncKu}fq$=?x}Gh?k2g;C?>b?~TrRlM1(o znO~`JJD`SAVKeIuR-;F$V6K$NWW#KLx#(nt>x5(#i@Nc5jK%6R!F;h_xz3Zt^F?`k zY6Y)rBQ-uhTo)VR_VDs84W7BdWcK;`d|^K3JXsL38a(?>B5|20iG&d`w1}9x6Zufq z4w}UhX1(1;#=_%O6>z;aT*4sSBoo-* zWM+aOi36pL5K3F3kY@5C5@HnD4C}p(baGQm7S9*z=@}NhmN$9vnY&zhU;SY6&HU;E z%G_`B`TBh4ei4dSl*@)rDOTcs3*&w!17;EG--wz7NkDEj;vUxy9X^rgiz?viym572 z>E<)Hxk`ij;pJNz)Cbg18cYHz$Zmye6G?-WNduD!GcrFYUw5K1gHlbWn86a|Gs%1r zP@`zjo2krc@qAf%eXa%HyE{4Z`JuYXf%>84TMpC*l;z;wrfsCyz-ZUoEbg^wk^>u) z14$Z;h?1$5gBm(0#Y+CqJi|CqSyhq_ZAxzfu7t|X7SES-uby$iaeSApJj#Rm0p?pC)Cbf~ z9?W)=-fHt$mNpqptj$bhazQ~X)8{Mn#Yt!Wk{O++R?%}Z6;UmbQS89} zrlwa!4NMyDc}+nu>Zw^U(97lI;PL$N_?_sNM;TB*tbEIW`hdAI zVD$M4eYXf`D2Mm&F;*~AJ_!~fiv3M>X2B9|wKD!kv#JQ0fQMwXQ1cS(1$Bbo(+fn@ zuD1b)5lCI{9xn1u&$HnDJIjmD56o5Xs~Wk?Dc}6BK432Y-&;15_}?JtMZ4!3u~DiLo2A?* zWj*o7sdvIcPL9t+^NI6OBQ~P=7Kn3tx~u|D)!q{L{6Jl$K>fh-Ed}ZWYAFSx&8`>C zo-4%U&{KR%xz1dDZ#4-~cukfGsuB}O4X-kACJq&Y)Fm4Uz@&!tUEgD`Dc9Baa`6SS z;#pSm#@}v4&M$wv9Z)0wX3%31ITF$6Uh8FHtP}KDhFqd2)WATOsBDqHPn_*D*?iLT zsQ8*hcsO1ztblht^R8BO@%iDp=zO<_mv5Qy!lrPQVyWH#sJ9@`2fzb|^e$O0aA=i$4hNgjD# z{Xp`~^Xda?%JVew!tS2nC!S{&EexLU!t-Y8grg21c^28d_KqO>1`AmO&zE?&Pq*On zx0jGSa=-fFp} z^gB>RSAds9NV1NI5zzaF_c02OWl3|Zy^aVN?^+QT+YwdV+f6uMCbjH}urXAvAFy&L8f7vJ|x=V-Gd-e~E zq-mRGyIC*T0&OU^+3altg6qcj?B(^%*Sp8WM0iD$U1(5*Km%s**HotTrIQN)DIR zVxt*(9Z-NX2`1{fFbIZd{9(W06__fTi-$l2|8lh9QSSx7&IIXUVGL4QWD}&<1R9Yc zADc`VenY|we+cqGLC(D$R4Lso)%xA-FM7*q;2+sh4ERH(J=cnoWo55ZKNajJes{$y zv6;B|Jmu_g>9`F#7Cz^*5%48-A{a0!%5Dy{I$uBBRe6}9&;dRx;RzX1gviGpLnq|I zfiNV*EfF1_0wHki7J*^US$15A7SUkhL_8Ih);SQyV zCU~?oLJ@aQvw@MZ#3$KLVg!1Wg69FMd7U+CHd^&iL{3Bq2@i0YTAJ4*OU!`^I3BNB z5`?@UrtK8hyUt8yFDbJgO?I5hj;VJZPf6m2{|r`>se{l-AdYl-y72s*pDp!>2pD=n zV<}nQSfW0jdM7+DRh#bCVk2bktV^U3Y^<^})s7Z(hm-yZ{+AJU+iB*kTcaf#i# zx21@WKEix_*XPx^Lywp~0oXOrhoUIvThj@ZFVG9h7aDenM$`ivM}D`Jx!W!mLJqmF z7eWV7jw>;ada*=|)oSl3DC-&;By{NBCCayL4bn{n`?Rfr-HhwD1{PO1(SVU$xz^Wv z#z)7*O98L}F=HL}45d4$6P3`VXB@6EFgT)lg8=#~uySldLa#p6gM*{uV>%>s=^GQ( zvqz7faeeeX<2wiAj$-2a#PkX7I3Or4IvA;!;O;SZQQD2gJa7>WI4;T+3qvZ#UHQN>rx!=;WMLNrQKAe8!6E*V)=(Fy)7 z94HDhS(K&ZO6fHs2{fX7>nP|_EQ6SYbq29_>CEZ}1A^gIn!qAmv(q))1=;f9k_lX0 zGQamwMXuyn%!7s_Zke zgfNjjQce-y#vx@%W99KEDOtg0=IE11Z5fL3(Ryo0KoEv^1%^l6F^|ETVvth8nfT4OBBZ4ndSrISw?O{uj6x8=kB zS-YIjc3PGzwWK&_0+mcHHM=O8KmqOuN4Hz*40X8Oe3z8TX)h5o9%SGGwfrDGP6a+T z*H@a(MM=K9Ules$Zjo7b@&)t*xF;($b@Dx*5*|IvSR#Kwjyjxr5W)9RGkLmsBT%ZS zTd6u$G`)Gxr_8;1>Kx&7^A_~cA@9rc=DnOU_vR__diOW)>=StM8FKT@826~RDvw(& zcq|^z=OU`S@E~%`7*FQbE21S2dO0QFU`|?x%|oNLrBXi+0teQiLvzI`5|_G_DC$Oj zhC)GnSDp@a7a_x45loJzEk<;@C_4i91acS?s)sRDsRFn#BMyM;{4Kt}qZ} z+zlq{ffSrHi>zct8#D`7rVwoww5YiE>btr$Bp-15IGP(+UAdPnaL z?X}du&XW}Aj=}62p7J5W!Wr(UC}^x2S3;N|wW90~aN-G=4o1c6LFd%}Gvf@Ju zwCEv|a7U&PcxejR7ZEG~ZQ0$fOG{tG%PBp37>a*^L@cuTEVX(!69Mz$T?n*1MoE@& zVh)UjGaK&YshVL@so#pDoR}cLN-l~MDUfkPVdf5kLhBAV#k7i`ApK=WYlF(ZX(}k5 zPw7oikQjmEP92i?10J#ZjBKQ97;xt6K}wrU_*fV8K}&OMfN=Jz8sq;GS~om zR?<;?$Y4Z`hrs13R`fsyX-OcDegv#(KzQ%w{%I*5UQX#vJlHl-3u?e<2UbdSnzrp4 z(a6j-9cUy_n)}`u6<=5(9^ebP?9E1MX9cE@hCV7(@Wkc{zF7J?Mg5QvoM=gump{WJ|{vu?aXfuoWkEVwB zSS;3-6OB+9N+OJtj-oLoZVrtzg^6D7&x2a0@MIWz5wkyXOX+B?q4^!sfE*8f8+eBS zKN(wFsK*1xpwG*bXdv}?GVERHb=4e2hR4W#R!Ui4{e(4rN_J>aB`e73A)$_CQqUc$ z@C@C2a(9T7yvVhtkQJLq^HV@wS$bSQ$z}yXDhQx~EFGkRp-kOAOF$0!sk*%<2pTyr zvNwmSm03YlIBr}^jpX@^?gGF_p|p11r9$#%`q%&*hv*R8h#m{tp-9bPykfLj+k`Eq zirSToAs^O8TGWO)Zz>mw<*La=R(ijX%Y=rYJY_C_YbxV#34mLXE{hK#;1d|AOV@ST z7SL3r44JW#vHBuQ{7ZpzMh$&MnQVcB7CRspN{GcrL4g{my||~>q!|DHg}2zTfX+6qkPC8MM4MZrf6oKl zTtCMb%$}^VEf!4CFmVm{vAabNIZ^8d=F0#;oNK}<`Npq~Y=P-QrirIhheWd8j>-Qj zCFw>8zD^x7acCIh>fNFo3aFjuYN0bn@OA1eMu@F4XPlGLG@= z5Lj7#@u7nmW0nBH@<;~oR zg5?moHkE2Bcb_@GE5|}EUzst70@ho7MVc~;=TkCnfu_jy_mOvEM8Ioz^2({A&g!&O zk&*e!6-}TmCt;t6RoP6;N%dlch8aU3)tp2FQ_$H5EIDgRU@a>6m!`Kb+M#chtQVi# z7m?e;)I7J_r%)P8adHKT!x$CWL#I8$Xit%@h!YWz*R#7TdRdShL?FjhV{M`k0a^vv ze6B=*v4euRBPVcBsR|K9h^Dd?i4!M?fJ|Vym|7dC#ettACJGQxSw1<@01I*~n0k9B z8gTH#6h<&WK9%emCn6ZpW{pD5orplq-*>MPd`Vca>0Tz%Ov+NK#Tc zo@f3ZO##^K$2I99z$Gy$XjPRQITL~~v>IC#MUF5|!mNNs9ap5O9CPY=dT}~PkLDnorjFB+8&pFdl zvv@fr;{-YR50D4_kH*0uKS{wKbOkLLqX94y%!!7>uyLw)O7&{1TQKdys@P0EULLAr zNaVVCy2xi!Mw^yU&@u{T5uGPI6GuIR2^fk)%85FdfMHcIu?{uk6@6jD93j55Fkp?0 zd}p;8fnBz{&uRn0jMkoDath0%z^P>wHRMzTj#QEL5Uhh+CQeHwD+laCG+o4 z&83DRTHA3S{5$^v6cJNcoEl%K%FQn@^rPjTYC`b!bo~cZq^3jOUERFYO_4-F@tA9x z-wUuv))Goal8qoiN`)5nXgaY-&Pw_Zq{odAobU>=-SC30(b8^sIVB?m)Pl3!kcTTF zTfl~UQ7Q#BcujMSegx?uU14=H9{*WLkD3s$qC9nl|3G@wgy3sE{0P#cCIlyETecql z1L<+41J4#LKZ5kAiNLP~%MARd!N#?H#0#cJO#^-%Sbl`pQ4@h*3zi?@b%+SC3odRH zZOWt?R3{5f!6f)N4_C_UKlmGoD2`}@182y#!jDimY9esNUic3RM@19*1i+^Ul;7<;Fg5PElMOF?9?U-Gn(HKdl_0v~$R##Wybo-M=2`_X znQfSb%(c%06Zp|i?y1p(g-z7@vSC zZe|5TsuD)WS^(bjPz5toge;Go*b3=8s{$jv4IL=W&c|sHV4@7lBpOacz`Py10wcW* z5hSVL0c;fnNV_uph7%EBo;(a{Aji!i5M0vha*!ine45GR=1OX5oxGfqStl9O$x??N ztP@n_{kKa-JMhrT@EJaAW5jGXvjQJ=$j<)@yM)b0dYdxFh7&oFCWM=#HuJK7s06v32mvjCJ=}LB1SMVgg$+g#I!V!zoCpEqgk?}33E>P9&fDOWytGgm z1&F*dLxmF&1R$jq9H~Rg$cot^7W~{4qXB}d%(LM{1Qe4{cfTViIpg+6$nEp&CvnV%3&K#zU#o|TC-%aHldm9HF(C?Xz4U~KBH(tc36&RDTo4DC{DEl zS&Gyke)CEmc}AWR-3stG?V|4;U-`iQ6l^JS!T%I&DY~!tA4>uLCjg@z9FUTK<(487 zfnxj&|8o~xifG3YTPDPwL@xdZ$v6wbbJtx$&KsrPjEU=<5F2PTi3Y=e1^y#hJcl#J zx5nc~yM)w);2W&@5A?^C4v+<|P0M}+{ZSKwisSr{9{vOUQPY8M7rP%pf7FEF7q|Km z>_<(6yv40~$zb@=4j)${prwdgp~a72K58P6=fJ1h)H;KxV1?<$vJXAf(8*M-9OZv|3HJ(bl}@- zJVjHuBv8uffe<|M!zFl^Ipf>A8I#ixLe!+IR_JQzfbjMg;N z^dnpkafveq4my)#WZ_4+9yKBO#+rVF>roSeZ}H2Ia6M{5P>8{=Q_%!VA}E`n`ShoG z!}homg4)S7&+f{JO)sDsElr7+Q^J<88)vq}MCcoupMU!{FcHhck;Ei&p&9HBpJm`D z^nU+mkUA1U9T7ZVJ>x$}9W@>JHbnaoT1QO?4#_=5&3J^)XsTsAo{=dTC>4g9q}dEm zF>Lm%M}(y8*ybt@3pht}*A?!e9-gw)!_3Dlc?0zjzc@G0^L1VQ2dX1;jYE_2bzS`k zWTWN?z9z+wKsIVZ@UR0zN#)@YaujHflnkRKSA}vVk>vM!sliVZEG^DNE=D z=Etj-hutPeL`WDZKZMZ*Af6Znq&=Bl;PY<>1;OX+G`CLEe3A`NJFYwWFr~+4a9hJ9 z)AoKDB7i-O%H$e8o(Ygt24$z46R3@3&3Q>5zsxJdO~Lg!u18BL^LRqW2k_qSR>mMv z)KE&h={n*MW?rzUS@UcxP$xe|hJ0PRl*FjqQIPL^K{%&!n&u7sebOOAv-Q=QZ_;Lw*YYY&(e zOoHS(c+tx#nf8zi+R7qT7u_Le$6-0ySS3uc)o{X;f?_cv{ie7!d=h?UGX}YP7_yk( zj9*@`(`J)dZ{a%>(QLx_b`L`lNkmi?e2z}F*$BDiI~36@81)z+<~9LNO$fdfd@~G( zk?&AMvq99`Jq$%u6M`)0-2=&eb_~&118X5a54B?mCl%fea}PcH^;-GtvKq&{Ib^oN zqp=*_;XZ5W0(v~5Xm)l0@7$AwvJEW`VQO3}0_6futk9}ldy&AO*gouLT4f?RJU=q_ z{L%v=CM{z`AAoIA;ueJvMr;nxivZ`vu9+~%7`xhe62WB0C{4kA*sq!h z9Kflv&M;Z+dK*Tzanu@KPRT?fFTITNY6GN2qEHG(;)E4}El4K_nm1CIFiqcRlP9$D zaScrt)GtK$@xa7G&b|>}jbg&kV&Hskww zVAqQl_YuLa+`u!SHlcOP#+L?0L2t3TcNeK?z#*WP89{()F`&fAv??F9AYdz*O`*HP z{ZmN;mvK|FX#q%5@9z0%>5qCoBO`&_!DsfhNgh2!X4)OwkusR@>iL)x0i;9qm@D5{ z1gshI?4UaLr134}3FvsTh+G|10b4rF2G0(vGa)z?uoO)KjJ(av)kzfu8#V-ac2XUL z;DYK?hyasfuyAcy6|gDIF1Y!{vMzBr7nFFp`+P%Q!WAQWXyMTE)D1@16jZULQ>tu= zGbiLN>5?ZRV8Nwml(ub%(Ex~rS!F2?RC8I>1|QBK8)!Kn1mQw6JpOiRyw|if-iU2vTpc$f z)@52Pp1oHTnQ5`E5QEr`uK_l~?f?j`RDeI_yY5U2MfWWu6X=JD+lrh=pUg}E5uM!5yGxavy$ZE6a1iA#bopB!#Z~- z@~x6!$0f>>JSB)$Tq;dpDgkmP11VH~xn^tR1Vo*A`Zo>^Qx_NA;$_IR;VDXR(e57FU(0zrE*b3ky0ixgpW%yUZM;I96U%Pln zG|BXjWKSY@@er`XdJ}>@m(4>6N98R=t{)b$4%T2+eb(&sU=@st(Pk0;D;O0j1324# ze!Yc$gilcufnP1ef3PX8G~hY&){k&0Y9jEP&E^>(qGdGg`HU=@_8E!6u|3I;))f(# zI4~Dd&V^sd=tnDy)P&&Ip5#X>i_}Em&`}|0;4El%L9$p~fzVQEcsV808o2S>rMi*S zmS?=66$uuWrM{`X(IBP1<+;HwwPj5+aelPyh9?w1=FNVh;?LyG!-V#r)0te0b#;K^&r+{0e&!AW0=c!k=mv0*!!!9S4DHg%9IN4Ei0YAR^{vjU0OOEsT6k89Hx?1IWq`D~{ zGEeO@^tU{(1_cQVw&T!~Wjnk&S)#OgHZt3L0h4IS_FhhjMm=(?95%#`!Y5jg*<9dg z`~<2OB7j%4A&A^g;YTwEqt{}zB^x{f2rXeAABL365Qtd}L7&Q^{rU~=XQ{_iE7&Q?%q-tg5 z>jjjerSkQ1N~V0}o+_V}?;ZN6G}R=2gn=RcakL5<*y0I(L8c#JVAOvkZS{vzQ90kB73qm={m$C3ni9)D3)Z-^r zIXCSi5y4;tgpq4*7W6r8HRpz_r?S_vEYogfUKgC zl;hX|m@&Pg^*iqpEGAP(lLD74ksJH; z!vh2al>$(cfksSA#4G`|NT4X+32T0QFCjW#q^FZQzpuUt_2<>UD;I4xS`d0!y_C^G2y`zFsM)Eq0(0jPA z!kUX4U<)k*gImAV1}~XyMhq^ps(=GFFCR8o^frJkToDO$vGimkF|`8}QjRRx42UNz zt{*l#uPRX>2?Ej){}o7r+F9ZoR{9YvK}`t0VWs~-6V!Cz+a2jg@B}p>C{52V&wwnv zpRCPrrGqrKivu0x5`mW;7Ft%ry_}K-REQ1|!6S-jEKe&W^ul~EM zw5-e(7T9vpJ@nU-E4-YNafRHVmRmcaYKC)_giV`K>K;Bju6IQkg)eC00O$0BXJAAw zG4fPMaw-$$P7Z;%sTYaw(c}>SHy-02%mJOaZ?^V1Gv%@WV?2Qi2+xT$tcf62gR74E1rJJEhhP{F=_- z7otGOb?B5C6Q~iH+>sMFbe+k5DmHDQQs-8p($Y`$a!RHWpbuGtlZ+2wT{ri~PZcpj z)ULF>@DULaBSfvr?j%R~`2U%oid9vpKXNU+i5N?2_o9IBUkkJd5k#?1QU;tjj0RXM zTbUdjCX1fK8uRs2u^$pMTDkhEA_iDv%Zf)u?935-{ZtWyM6o@aV@X=X{Aw&*ydxd* z?x#AJ-n^C8Ojs)zXd>;WJQ8&mF!jt(A290%hAV-go~&O}a+##HnFzjVh=5jmkz|93 zZc$8I=V~y$oKmzqkcZeFYLnn{4D5}St3)8mJ21Q~HMYjUzot|mCiSCrn*E#5heR?E z)@ZR1)R=vm6GLGqV6SeIrTWR@N z0~6ZzFm1z4_$9t_5Q48YFrjZxRQA7eA_V&O1gm?Cvzicmt$_)BdlqH?D;oL2>$Ub+rKMXpIGc)7Jka%91si~nBOi&HVnpr;DNPu5xQZ_?5D%QX}(7JFve=vYGoNJt1wLgv`=jmTYLr(_T&~c5uR^QK=b@xWb}hE=jk z$D9zRR>A=@7_nVa+YBF%{jP#e49cnUgtRVTzx(+o7_|=a*FV4`?7x8>X z=88Zc%8{9iE8^Lmkaee%1LDnP@!9dn2mYpD$%hO6reMhj1u35L<<7xNUZE_44Y(V$ zKzM`SP`14QfP;$EzZ`(Wup@p3z!3tCRv8!6BB4W%ULt-cq)l_evq=A!0Z2j zlgNe1pl*jyO$ETgXcCVfrXeCG)E8U;IM^-ac(S>e8k@=ZAHmez=ZMOWFg4^jVR|G| zH`3xrz9S0!2UDY_1K$wak1#c^gup^yu0=rq!PKbfz#*cLGjV>j*+Wf)yv;$&OUVoN z4HZeZMnNs(DleyGffW)g6j(_ZXQUu=R}hP|#eofy$EsqCeZ~eZ0}2-|$#A^lrKo|= z*_=!4J_lNNMN$QLf{mXRzT-cyx8FVn_NLO?gad!M)|uQYY7ky)4ww z(s%H3N>W<18$o^hAPp6+IM`1PHhU^-X5`#wV$PKBWVw#fD^C=a?1^8ATF)MbY zP6ti>QxQp7Xb+w(TeRW@gH+WNmu}W6E0TAunioeMK?JaqeBl6A$`ZQwJ+i0nL)#Wsk#PtIDji1q;0Uwq)}4}sS#}@1Fg|^k!v%fh}LMEd*7f+GI$TL z6fuMwjY?cq1dNRj3_-n092o*ruuXgc-6AZ7Ah^R<)sjKY2mA6HQ5v#i<^?pPr8nW_lwQ0EZTHss5w3NRNlpfO>EO677 zEdGP7A@RU^liU&{`Is!~)sz4NhG8o}A3naNH%N{8{>g%Bc>l6m@Pby+QZ0Bnr5Cl} z`|#Vm#8?7gmx9RElf?EI4@ey59XRjc<>-YmFPHo*rBDb-bv#^^jPpBum5c=fugsa@Lmt#!M1!XkrxDpa z2Z3BwjN=`KN8}K?p(dX< z09W1tDhVIZD<&|wX@|}+0r)#UCN3e604l)ZG>VDt(&6=<{R1Ouv5Of)&kzh_MU38N zZyOL?H@;^tuW!EIJtijF>$~CcU3z$Zvrc@1*Z1o7j7z`;_6cOL7(asx837L>v<@zd z!G%otoh{9AhYKnDk|NoY$b}1e+}DFaCXR=divThSw*LqMNc4aA(2r0;l$)|Tc|fi% zqVqePvX=@}!eZ3(Z3nPgL_NlJs?$WwiFT#~)%YA?sN)?9N$)nj?{jCS)dX@VlV#oK z^`IFMnFFk0z~4x+ATo+Z8zD870;F_<* z^dT%7cgt5gV@cU`r`%Gmw)}x=lAtVD;1nL4F{V}-Rq6;lW$|&u$5Ng}n%ty)a~zlx z8kuV@(qh8kYGqXEZ3sb?3x0WP3kplhFjGzpAz*H`GO5%n9i)9^oTLIZC7ZHjffEr7 z7~8B&DZLF5U|?Wjc>uS}Fddkj#{P)FZ}7@*@JuN}{q)ffEtTXyRA;DsICGRNdyp2`C&{l-&oMh+skkzcMQHHbfvp z$%zQ4O4*gY2b_rD8KtB07FeGwFCxG=7?lD0oQU8VU*kpu@)Y=Rf*+x5)QXYAhy^+J z6g|UTv@D@`IVIx+d2E}Axv+q^MEY)|`48qs zO#^<8l;}Tr8#NL5IZ}RvwNVp+pCbj-7212a_DOm{)yS4Zi7N~QIO60(_z|{7%?bP* zDL>j*qb33eN6PQeHE!a-VOEtw1pmR(xN?GoQ|1#__z#{&O#^<3H$PfBqb34Bf6;%C zHEJ60^B4VRSBy$68nJJamzN;;54J|l3H2De_yI)y}$VsJmM)t^zq{QLU zNSwR(xqWW(0)_))1Ek`vdyf~!y-_b0``d0diNK1XcMsE~@E>tDQp*?*M@z~GW=G?_ z2=~Fi`-?`a8r-m-TIvDMXB49yy~TErv-Mg}*n7aABG9@9S|Ft|Yvpj=*;f7X?MHUO3-6u1)hwNP?U1o?=e)DU7M z>uI$^z7I*Ad)?aTquZ@pzTK0 z<`@fIi-!*zvHaDBE*6)~F&5{YK)JXPo7wyy!HqaqqPb;K{0Ipmxl4+(%i897w74pm z0ng|QE!{?MfDa;s(zoHosdmN+z{S?uSM;AHGJc5|@SD{#_eX_bkt`rdJR=FK5ut>| zy&qPRocpChkmK=}#WF+)B?AQv7Rw;n@e`Y^VOm%=3gg=iG$x)*4PM8{911{Lu8Kb6 zQSmSk3cxD(9#+=SI&lQHKx5#Q+_g2*40M(UK<-M@Y!znt_{rKCmEdtiX86q_8J6yF zB(f^fEHvo_>`8m+si2#5g=G>qZ86!5Gl5=NfH)hdJNQmsierfi5Xt^ zBOw!@)vzy;W1`4nGN7B_fL|nHwSab##b!NU6ZLFoj7$Sn4Fn-)*>o zgQ1c8K1D0UQyI6xrv@!rf#dU_9?9A|j|1h`{3^og!r|em7Dbo{7|=U#0?%dyOoRd8 zlj{ruQ8eqZ2>y;l;Me^s3J_4P20|2UNG-Sz<8hS+X)Gh3Ktwb^K9!soCzXKAo=w>n z=2b6BLzMXt0Sj*QMrC(1A0n7w9DL9S{F+}eLP(EIK|Ix>3ARB{wuIe=5jdoL6kvoI zICwi(m4J>Wy{L=?yA2UIxJq(3Y7((hPTAGvxFRjXQ7@-t{vvLig`*hEL&;?%x&#p} z)16Yp>=Pba$E40EB(D*mX_`nj!M+%jgcB#Vg0z}Vv1yKH=LgZK35G`CJO9cALt{{& zj}BtEM5An>kvbd`I-z92WAKe&hw$^Ai6z*v7SF>>EOJ2{lc8Cjonsmh9iDoNk^Zc=-kEf*AtLHC7jpGP8P^iRH==QgD(tI{4fvERgn69*KLaFycjM z^%(XyH3S<`9>fF+rq9tDtd%yG%_7W@r|mCVnnf?C6k{N(2$L8Rz^x9;I{nE&()MTz zE!So{&52-IS5Ey1Hba&l1!XIx+N8mLA{D4X5=yt^jgRwE=gSyoM?})PA&@ zMiLrF5*B)$qk;1y2#hNs82p1LA^ZjgqoxBt#IgVEoKe$&1L9aVr=B*uXlYA5osSt( zr6*F3FELgcW)e+T7={h8kSzuY2)ZoridI9WWrgW4J7oN_BT~esDl^yYjORTvGT%6C ziBuTR%K+hgz=#Sq%DBLY3O35zUl@_807evG5oBZvVQ>DGFd_z*`PXigvCzsMh74j) zA{Ry^p!R4*al;iEL|ba;!}PEeWRM9-h5raL$jypTorPay>_-?O@`9abRq{>wVWWwk z?1WL%fyQibWC+xqtTq{b!6yfdA`mtZxOHB-Nd~{}6u$xesA#~mIR%S){RR5tDiL`d zm64akp#^msQJHJNM;g2!jodhaU!uf+pg3+s;E*X%QUd-1#!-s{hxQaXUE~EBqh-d( z%PAQrC@47Uh6fQmCyhh_7&d%D(4|4Fj&YH)JJCrRL&4px@*^k>af);6 zBE_g2EQrD_p201ea*O9vGH!vGFm9n4n5+*RVHz7%qTQlsIbioAObu~_W0yDU8symP z<3G3>H6190#X&M;hVUb7jhYaY!Qn^<|H0R&3Bf5@p>PD|*jX)Z3J?DttHr<2=!Q{eSGe z2_Tf+_c%_eq(zGsg{C5Fn0-`Kl%$dJ?zMuc^{k$LX%=651&pG$pbIv{YENyH0v?hY!d~`&}l_cUt6a+*B z@O3~Zk~T$5S`$G4K016kP+)=LQc6HX0OdfWw<(O-%5KEkw+P5vOC-Sp#p|jFhzL+# z3>pk~$q9lB9V4p40>$g92#5$!S`3bryC4FItS&IWJp{zU z3%DR^4npD4qIpX#XwSSVh1905c~7zgloxAfM2rj|5HY_zo^J=vQ7nTWihm;}`P+%> zeM`Zu5+^CieffD6< zI4%v}-L>DNs3&dtj@lxz!R-Va`_>^@lz-Zw|DVsELS$-QGk?8S#9t!BzowZH2oHWj z2xt$?^OMs4O<7d@gb-{D4h_<5p?azy&rdqeq~a%pVD;+1DszgT5Q5dK|Dt9@t!2bt z^PYFR;3Soy4oS8=e{tJ_lMqV_?kHQl;3U>)3$;@Rs36Q3xvijjGZdlhp$tEs%BNDH zGI!h4$DUOA9Slja#R?^GUAlPcBRF)M3Bykou!^t(ln|p0C7Xd%(3KwkMV;w;z8EEy zOjV@`_K1{9hVtR<9FevtMoDQ~jIxIfN1pzp5~0w)U=K^FBqH=zXnR=7XITS$}2oxBa z*v?@p;*^%nAOE`T+-;QrU5}yND(`T+txAAkdXQ#d&tp?W1W870A={u4DxK6bNxVGn zr9cxylDc5ea@rpfYG*e$lm;>&Qt%0Sj2IBI1cel_e;KGtEQL%ZQ*5X`TX>%WK}*oQ zTA&;Zso)eMukl>-!5@!ExU9nn_7~&ryUoF5Flr!?k&As>4rXAy%V)ko175Dk!6p%k z;%K0bqNpt|2~2Vd74$ah2Z@ew(G!^N{u4r|`;b$iD-om3*)^0w!DJ!~jqwl$N|Wt{ zbq_|}g1KFY`H~qBS~O_%fH;rKhb@VZeG}_jh`*T*K1XET@s9x4$ZUZn4}FZ050nbE z#84YnHf(IDG)Us^_LA>DDIn$(&r@%~PB1AvT)3-=1*^#xN}{V{^*Z4*fE)=)8cY&O zdx9y%R4X@O4!#S}ssom&yeT-X;Jaih5@%TbE99ntK!xsO^EZxK|0`a}chve{@k+EZ zJgi;BTCNad9fMA(@Cb|n%(WpbZ2_GCG`lHr;Qrj`~uP=)`qU2ISpN(gSp zi&vtVXewSw)nKTSH5jdmSEBKoidWh@+k1Kt%oUhSmW%aDj{9U!j;kU;fw_|D&h}ut zd$T<4IWCG8Vrm8~XLj2Mp*biTPl3r|da$j%-0eO66baClhWnuv)772hZSMiEuy?V8 z8~D@KOqQ1?jArl8eLsPWFhK9I=D2vebDW&m?(nCxE60WH;_0DCfEH`q`!-A`jy21P z@9R$X9-fK>a7=O^VKY75SuP$dYXmxcmx2)y-faswIdeSOyfNSoms$!;J0{DUW$(nY zvUkET0G|o>U3P32w!6JGfKKFn!cQ0iG$Dg0Em}+lT^&AYOJ94YC(GU5))we&1E_f* ztQ2hQJ*=Hr_Ref~J`%V0EOb2Qf@F^fWaEWlr$~UZMcj`an9giZfECf1iht{?F@v5Z(``ceP^b<2Zu?d5{V3^HQU|O z-qzll<;njr4PlBV4LHLCUg5#CVR^DV{aoQMwu={Fh0QLSJ{))#rj0$z&IQo7w}#KL zs;lS?9QfSB)rsYYzYFf+bKuH-Et*qXAQXX)PlYR>#w0RX?$#^qVOBl802yFkjuXcY zxR8XSiakbRvRqwZx!7B?5j;2}^6q)KvaPuoB5o&;am29O6sCg*$A!u92A=d`TX}G- z9oe29OnYZnCyZ(sl1w`}Jb+|Q{A`Sq*PYEm@3iLFAaI~<5BE#> z8e+1&d3=u};o%8f{*aiTNCRsM2YwEmpb(FOxXikz z9J6?Q0knsMwI@iQBMluZfbG86My#c90)I3E`RtI00y2QWM1m4@Ch!b8T4?D4qfxpo zHvbfF;D=7A>kgFS#~>6?{slTp!1Z*q#BN0t&=;`WxXK!nmDmE}^BwjKVemsJIuX)p z+ayl)AWqQwA|kT`IaHxrGE!qUpujqNE4XH1Wj4LLXBmu4hiu(8uJj&du=a;+ zW-uTaT47LfQy>x?N2Zhx3 zhonI83brn&6dQElfKR@_NI_xHRiW2>>uKr9wa~$kVBcB;FOX?g&1C2qF5oF(3Jt^n ziDx1RMgddkaQq0pc3N2_6lCn9V=AsC0{=p!4D6J72UP7#(>CAX%2y% znatbp3y5@7G93D~l^?tvE`~gdmoAA^50D2HzeGDa0#mHXs(2P6zqQweWeNx@ZRgi;-u{P#`)K_{#>1c7;U? z8*y}=iH@I8bgN+YibOcbgiUK}OnOqbbuc6*gPPP2(&9bJHAKkB1=~Q7Tmv!9;L2#@ zR{+l}S}rJ37#S$&Hx{_iByj}D4WQ}Z%w3?|(EgBIZs6B#J*vdh?0E(gk|5&GH2ay69 z7W~imsIY)ii)4~OkF-E_;PcW#Qc(UBmEdW?P>E;ALj)38qm513lcq)cBewM~_VB)` zV}EAP?wlZ6j;7wmD(y*vw?87Beb~~hkgeO~zWXzqfWMK?^k3;nzI>+tN=G7ZRC|H0 zExlAIva{uN>*rfv!&$lnwZ&{-PlDQ9XGq=9=Ka>;{hkXMKe~{LgMEz`Obrmz?Ky zP!+RB3DQ9!P7N$45~7f}2i<~QIPF)%>`^kbKV)+XS|{mk0$MC6g%z*1*nGa!qeN+c zND4~O0{MZ9R)O+H2lX#|k_;UT3A-PN!Gz@jq`+c{px-QJ&suTCDqdMmu;f9htAf?X zl=g=NEG&)@aixGz<#4T33|uLFOLfB1~b!U+@_g1}soT4HE-p*9Gd??O;fLa`9We?fGK<8K1pyePi`9{+>@Kn4u<64frHdxfD07#8F{0Kn{#1LjYtFR@zFivIXkrfq^DSdkIoh z+Z&SW6vb>J*jR9{S_@u*l7rzjf1%eJYvniCqr4?sMe@pi32)` zNEN7^4JmW&4GF|SiMwbY#yx*(T2Qd*_-iTcf933w2u)PTG=W;u9SjKsLFwVVx@Q6u zu~5)O6?S`qlqDSu$-k!pQUF+jT^>*bkIoRNr3=O8+Zz%V1zHerJc{WXLHlfo>O@ry zJkL%rYPW+Sk(dOv+nl1pUtvZtwks;kD#-QG-gsCLSRW8kB-=TZy12&Di!w zY(o|l1cHv_(B=;*-ljq+0u-sJY-`)P13gKc_D96s3$Td({%+@Q%ab0 z|F`*G^#Ag`#2}fwxnS{Wq4tobm(lO-nKS;PinCahHO$}EKH*dcFWvB8dHyw;r~8!3g-bD z1!`Og)b^#fKP2z~o~-_NQm2|0Nq2Ina3VnAF`8hj!^0tcdqZMJL%eMAPdDe$V9pY>0TOJe3mtN1)dgE7zJno~$boi*$a5rkV!$2?4xt4a z?9#!IC{+<6*P&A8-*&2YM=Wq#OF<1@BIs!>Vxe_eOh~QdbvZ*PCCJMOJ5gR$M-8J{}20RaEsU-DoOP%hZK!Qqr@M;3BB^D^T9#SVDUlrTB^T>#2_58y`1S&xODTN<` zX3rN!5#+E2T7Y8#PJy_TgU?|)fqv+7Sc7;*EeLS)&heEn0n4^|e&%zll8`hsH25~we|JC4Eyd7LpH^zCKCPfgNT@d! z3w2wdAT@*4h(;cNf^*3W-$p$F5brm&>H(r-Z)pAgo+kajWCM&E zI-^Ym#@Emr4Y(P?B!JXFV&FzBSd^}Thz%r0cY$;m$)H{_JjDxgZ$b7R=GcGDRv9B4 zYNZQY3$^lz6l?eomOd|#pS|w8@LjY7gg$q-_40P7~#2m zkCj5@h0jAFakv8+`5;z!a=JY@dYFql*g5y40O?>zGHUgWmN!c80)c>+Er3t4vIRhX zEc6-iH8wd|jdqNa(f$i-6oPR!dK#%cRFfO60BlOQyD@kgYwz3cINj&_|4ux?Lc=!^ zi^Tp0IsQBG#L3v%-mB;KVjBPL#l)b?VzaIPzquDfyOn?J#Ixo0i*H}n)n1GUMJ&<2 z79hcjT9VoIg9P#Nl>t{ z_po+i**mk{6=7&ED^EXHHbHH^y^ABN`e_YCKA~*`D)y%ih2&7dL+Ft}hg3kggm-YK ze5Q*F#}jSu*e*6`m#ERQF6Cbx7V>hS)FH8HY$}`_LC|`aW4AnmZ+~p2y^E(i$HvRr z)1Kqf8P*hZSW6>lzySqR`~)?KE<45=KYd1iiN7&&6XLw#am2eCzU6s#2gAFv+&!5@ zCd=J=rM)Liu9rKT>B({BIC1R!IwJ%bYGi;901P-NeMq1~zX-VOm=G-;H2)wZO@!fr zgA=AJa8R*W++WlgI3%WrE8E)M*4~=c6=y&uxdsIa&ypZw56VKI<2AVMm?AA*BL4sg zO_bolfm5O@Fj`9M4#2QuyRhButvlidII^XyLuo3g^ah~}RLEeXLzhvw>=<`kUUjl8 zx*8N01-y}Qbh{e4Yw5>iF+JGUUheju9r8b5OoL7h3>wrOM(vhB{zA0`bloA!MD?x( zV0T95p^XoZquu4`-4KCROjmb~x4j2QKzkRvPG%dq_!v-&jR>8&V50!EfZE9Wlz@I5=N`08nQJ`q!d5oN(PS0kG4FE;Mj= zhsPNmmqXQCfYGs-Yk13mX*Cz7y1Ac54cD`CW09NHEh7OjjlT(KsRJ!H%G_u z=YfFZ-z5aykclgS13cL7-d##WP(V~DnMQ;`k%dk}Edl8r+k-@C2;QXy*1f@T?0FF2 z*mns)H)Ntc)05?HZ)?kBx!5qRIUb&!$p9*7K{!hy5Ghdb9}Ga6x;nbNmmqXQ{y8yi?cJSySgSoEbDH0UwSAfePud zaNP-~bVFQrZ*UxU9t1e@T>{VzNy!21JzSkwejqVDJYcTqIQl#YaP+%`pc_JyH}xJ|DuDCUgUNRB0(UBAMRm3)D4;XpPz{6x z_!mi30t7aq>rM#L4e|L`!QoK|hlxj_u0iUCAjO=HBqqz%72L!2&_k-DWde?7sHmq( zgqmeU5~x<#Z9`=#blnL}x*<8c4FDCV0uKtD3S9!x4N-}^nV4*E(5fBM0M-eFai|hO zBM_k_EI3{$;B1G>PDs!VS=rsuaRTr_zzNVL2;GpD9-d%Wv)pa${n^OAc6Q~sbVUf{ z0Eg0Ia591s0y)4Lo!FRAB(h5_`e&iQ3Bm&fCrFo|bVG3Rf#MB&50;fv$BP3o1_(}d zNE{;4K#;;(fxQP@cFY)*ZV1pn2?S0K9waz9x`d<~f)rb&6sCg*$A!u9X1g$|^Rl<;P}w3W0(wmy;`T{!WCW39KsY$QQt!kt1)_GzIsX)V zO+tnTBu>LFVQeXCx#w;Ry*!=lUDzICYC0S*XtGDrfT&MqpT%?1DtJ1H)>Ts+jp)C^EhLDY{O z!vZ_1G)F?F{o~G-h_#f(e27sgFem~BFu;HSU=T7GFtC9~e`7!+-~eDcdL9AH`x}xY zx&|1@Vj#PrJKMW?61d<)ADHgI-%^_M!B0W(XaHP@u;>R765#`%(O^OltaMU0V8rOy z1S21bF;7j`G;S&G`Cvp0fEWd%C4vj59ilm+E8sv!GzIuE`l4qrdUpeEB;K28%cC@x zwxsUSwxxpLha2F-;Rf(9xM!TE)U8^RNN27aS= zka#?X@gd+0>w$}V(}IA{G`c|tq+6Qlz?)4T9kAJKx6ftEHPTW$@zVid@01RJ2!;z! z08kOG2oK(zV!Q}=V!z=Y;?Hi*^JF5UNqSL{=4z5&5O{!Hab*IHpAC3dJoGWrbcH_l z_I70-nTI|f8{={dSed)TaP(SE6>m;j$uCga8076i$KP1A#q3~T>Kr^Y3-~H)vEtBd z;4{(0eLT+O=d2FE<*Esu^ui~hJ>WsGtI`2bZs31Q;L$5O2cAb`#6}Rs*@OsMcGz-3 zOM}Nkn5b(K5j?u1dEnC>9U#L~DO^#^KNH}&g?YjGgbW)m4cLgaMTSr1wp5Z$i~?)E zX(n1ChWH+>eC2qKkLL3ITA>D(?z(0i}dO_Ru< ziqeuJJ2VKICJ_l{d^xos020*Lq#=aiKE{pcZwz=YB3$K#?sWqhKI4GOo6h!-p+I7b zI<=h%?9e!9!Ud#N6D}?Af`kpOXh4PnVn)Q6fNN`m2Va3S>u%t~lgqrx;WH$lSY!)^ zq(bop8Uzoth5qKPGVJ=#$UZ)`0#)Q&2<}$M zKvz|C?AaEXj?D|6XdnYXO~|xB44)m0!_blfByi+9R-YY+3Es!NS>eqQkIVRGg#)J0W7eErQr9x<(LyZJI5#tHEUiZfx_`P!pmEv2JK48qX@=A;6n2 z?hNrGK!O8iG90h9nIY^IT_XS_ZUWk>`ESflKu7?B7^?vyEw^hJLdfhv>#Dm*@!1ae z9PyCivr0P@1`uJ@9k%1GC5(Mw(KjK8*bFUrxPi7q5GdM&Ad+<0^E{+6q!25jXW$;b zeZr)CH`Ef1&$htllZPzEkT?tSmmX@NmatcJJ%ebSv|ziYzX4G+i)gcs5W_a!fC%;* z5F;bug0C-JpdfZdGs+_rws%1sz+>Zolt6s83O2D|&bLP(A{6syKrl&L7Vp|vL5QN6 z#R-IdlL4SE;3xy@YyC&(9uSF$aHOlAY_n~ z#1TL*YM9T%qJJ0YEjIEJu0g}WSlAl^q5WNa#4g)V|50w6d5)lju3igU{AVMHEU2?BU_%#u`O~x-t*d+zOBx9FU z{E~uQ((p?vc1g!CY1kzLzocWA8u%pxyM!279$XsS>n6a6>f8^SA>)EZY=Vu*1rD6| zyjKvp;1QePBXR+Rm{t4K&nxT@wl>F?n~X+<^a{xA;tFFp&g9h$fgEJ?Y7b9$Hp>|j zW&cje5F)`xOr4+)KMrENf<`Fw7NRbETE17u7(Qe`CnU(wZTSl&kzy4`7_j$;&Mg`Q zXEENnUDGE{V#Z>N;6IcE$Ag)d4hQjZEx7PMs&JD8x%rL%7_ZR(b-V&+nww z{y}G)!e@D6shEFb{rvxgCN0fRu55sqQzDH>Y7!ODmyCi;LnjDaCYY<~I0Bbwp2K1Zn!$XEIj`1BgwU{j}C60eTlheyTO`9>RPGz#fwLb938l1 zo36rl$-S4Z*|;=lKQlf#R`kI-;egoa=xZ~^o-!OSAwFvJKJ)YE_b=XgSja%+HEoi- z2D^0Bs;j-H4a?j2YKhl3XOBfg?>H?qXWxBWkb5gOpm*NFp%YfIt{FD32%nL;T(VkKEQwHd@yL-eg`2L=zAs5?%3 z%15Q=xsBH+4X;b9>Sd&`#9^DsD2a1E3)M&K%s*6JE@d}eMRUD4}; zTa`t{=iNK^uDv1uo?k#9HdCx@j`hZKz=^d;8L-*L!0F(XZq zNV7`Yo_Rj1^mCcc;8U5*PdQ6}Xyz+Cxc^Dwe$G^p6CRRg&#hz!L}jLay<#(kuwngW zi;*|PHY}3e+~?W3$gi5luM7M`N56XX<=q$y(HP-5SNgFA2#t&#E8356ki{`HAMHOr z-{B9>hx^wquRpUfw?_6r=}gn>Ltphhlla4I$Dxy!pCsMf>~Fp>Hdgsyc;ZFGq1_IK z%gU?7=Iq(~I%43t#d~!oFF#G4sCm=$;PEY1de1&I-dlLC;=)8(V;HM${7oGE{+hnA^K>-qHvY|V&YdPIEb)>)2bvt zN!p*$Usq86jMzK1VzlXt1=c^+EIk{KpRL&IU|KNpVq}2$FY1JySJpO&KKxFZn*Dj2 zu94dlHFY1qoS>?HwW`sxEo2Qw$yR(WW)v!)s=RqH|HE)~c^ALNyzzCJ>j&?q*^P4TQ_RlnzfXJN^H9d{6f5a3 zo9ds7fBIBO_tr|>q9uQ`u^?u~H&sKeM8X=2YpElIM&%o9nbB)v@WS1U!&*bP4|;r7 zE&9PpckegzeRiG6_!Ut-@6?L&yP{S1g8M}o9>%9i*_UHBy*+?I(6z)>Ra`kRVNZ39J}uwxYUuMWwvv=oF*P@_7w1m2EoX$K@XnX(-3INAjs7}5&h0j9XTj>w557-N zZ`%I+lHJh0XSUqFGxM@=MAcT(fafWp3r=RUvrm0YJ$7Nmvd+CIppqL{k`GXp0HsL)>SZnRo$r#yKa1o z^>e@Q#r?uEMxh}Y=Lav2=oh@FziEwXvRpyt;@K0Q%Q=jdi_}(5)b$&7{7#vAi1pSK zZzsCa^#q?U(a+LMLmv&4DhwDYuD)w8^JBkjKMuTI75i=N>wV95he-7mnv`*R{>9g2 zmKrPW2(5bFzb|30*}(Ie3nxZ0_KrU_fA@sdp&>@JTPs3sss`;>*+nXxIGJ>8QusTk zlHdp9?^xNsbgS~-^59<33HJt(xD7Qko*w-9@X3HQ=fJ$gdOxWXhYn1QadP{1@SI+? zVqN2u2KCSvhqI_^ia|l2UKV)$n7o>xdC={u=ts$kNgGritvRXx$KIvuw~h!|pELYX zU)O#XkMc^+$;wqfFZK}KdPE_}nK)HK?8FWcoB5?9hK1iuaBHMA?;LFTI_E(xwParVanHj>6C39_lLYs z;r9hKBd7I!@o9kni*eD%XDCY74lvUlxO)5yl}F_Y>c*jzskym+TLTUJHHQ0Hir!is zI^BKfw96^h%M3?Ftld5L=(}*qXGi-IlXkr;eEUmmou;Y)aX%EOKV_WB zZsyg9#<}EA&rY1EI}sF^?YU)&a?PnFCQlDq%23(At|=OO7gfz=PxU|9=$KKT8|bq# z<9)=TsgK`lt-A3om+atZ`ytCDj6A$VqS!!Hx%akxFTFz-iWux&GrTVB!O(k^S4PkB znsZ^INbrz{!ds?@e3-m0n(#E2qBAfowV&{-sD@7>n&a(N<0Y-AV|N~z|72r6;aIfa zqrwR40r7^UvR@N-9Aa+%6z*BEQzdC-PF_Lf=TG4=C1H1$ENv)X9}_d~1l@a2X3D3h zD*~k5kNjAFQuX!a^15{c4)yYn*cq~*chsT~AIYr&U+(LK99--7VssxNG2I>e?@ZZkWiC!-cT#*OhL2!n+uqGGk6*SgKEdUD*cin(n;lQkl;g5v z5_HY?)g;6Pr@ZJ(i~BJ?_Jw(Ny#nD{;f%S_W6EiVSD9KJkCJo>a5`JIMk+@AfrFHh zM$AvGpY?~oPI|~5pmoYL&EmAVzxI&n8q05Ks#ZtJ$r}v4xK~vnt$w3p!4C<8zN?}{ zOkPbWiOg0Vc4bE7_wDy}9EW_{=DJ6_*NYtnjXOtYKce)_c2>;_+aGf7J40g-F)?$e zx$aNa*kjW(f5@bqq?^0NtG|i1$gC_HZgX$vm>RR+4;eCiP?!?o9YuSio5kDsv{0Klj^ba)r-d#)>UE>`2BA^c=f;nP8ya3I zl&Y!BHX7bIxNt?i@|*IHIXh@>tD*+55~NB>oi1Hb`NLqt+0bC`*M^&-FZonGTqa$1 z+%aA@Y)$5c1zy53eJn>uJ(e>1@nN^>2R!yEczQCKQ+ZSE zx0|0?!;VqaLDv|Ui&fm+3|$`$lgeHrLKRy1#qf+!_F3wqXXXVP5-dKPER|=h4EGr4 zoV>|q^zv6}bNXZ`?#eh{KRh^j{Ph=QzebHX>8KH~ak6lD{>?b&J=e{jQ;*p6U;IRQ zQ*hax(y^hv9;l?O;%Mt_&%ZBMlGPwG!tRG+pK#j&Rx$bcYNcvXDu*?L;x_19IKOA` zwg^MR^FHxHON@n&e15L;L}o2(jg6g(;xsKYMGyJjNu;ac`RVEfGIzYLJHlI||HDFiMR$7rUUzk3P{S_jn2JeHmdO|1FI~Zi^OAVN{(UG* zIH%XFyrGwN=!p}QZyqd|U>R3$v90fQcQY#M<-YU14;+yjGi_W}Vc(y#B`hi>Ek-}+ zW$?uBz4s~=%Y}{E)#GmM@R%0+ZH2t&E@%JfweP-_NuMzmy4_nM(=lk4Yt$UkLofP~ z*WX+4vDeRQxv@L?zfFwYIX%JFtzYr-f{V|kRo)7@an9dQERf+0(HT4Syr&xH&V8NU zzw~F#aGw=0$*H$pY2560GiQ8k6#see7X9Oo^t@AUB5`+yF3fx={rh!N?~2zK{l-qJ zH+bQ5|DA8%rlayzJA)d-Z+#oln4dLo)Ot#8lDqKr!aHW!fjSuqa~*e!D-*Q(Tqo|% z&d|z_@H{AW+)H@yu9_c*{z3xWX7@ZkL z$0Mm*FJu?&h+VF6J*=10)m58k_VfF$wBoJga4GNHhHLcIdyb8z&MTRG!{BM!ypY<$ zP4Zf0Jm<%63KLI! zBQJ8RTF3nn`GG>HMClH%_-lJ>89w^7~JyEhF!Gfu&WVdv%a~#J%@A$lH2Ws?9X8S(Ky6bBb@FA&TN7B`CKgJT-uDPGo z=4<|(wBR-Aq3_p2GMwr5^T!RmY$6=nAR+o`k%&^*{9RF!fs?$Cts#h4YUpP&NzCVp zHgQj$McEtey}j@Jr6gau%$X(^#bkE|=CjVrq))&4)$ZriKYsm6 z4eEc>VDrOK>H8YkU(P>X{eU4;b28^z&cc535iV~euapw=sClVl*JRyQ7?^bWit)Aj zX>0pgDu=BubKc>;V(Umo6JbU;@s;4CFdEhauhX9wHz!(LRmpI$ z_Na)yRVF4QF9lE{SxXdN=Wo}Xth!y|m;UYLjhTfdZw^|AWGyM%f9uxo>w6|emR4Cu zD@dgL8hKs1aKlj*#{ll+BJH+pvE=iL+P zA1^v%xM9Q(ivaJtKKqoFufB{`dDD2f^tDz{TJIk=?@ccT-+!O1IWpbl`nASc#ao9K z9FwE&qh7O%@z0FY{>92yR?&)>VUrmeHTt>w+`>4~fvLC7+g6L~_{fggC>poJc!&)tiU6#tpl_dA(-x zLc>gvOd>L7#v(7nBYD&3jlSt) zO+KVQDu2%>OO?py^bx1OeLKoH@ZC%6{;mGPW7HH36CL7=ry9MpNxiJTJ$0}0?$9)E z-2t+e-$zJ)JUdK?EtE6ATy&@KaG^=!dG(D)BE;YHxh~AA9XEO1g|81EZ+$vK?Oipk zu4wz7n9{-H##z*_s~w|B_xyZTV*Y^*C6iN+JPY`6%xkKTO#M@h&3c)WRK2_>tU9@H zZ+TJe{5q#YpJbo2XK93~-hWB75RQH{%m4fyon0}>MmKJ4sEaDP=5}>y!`IX&xD7uLSM<^c}C~`2wP@eLI=(;ZW=Kh|A!xk?|(+c>odZEbO_dYtd9=*PApKW|%6 zUofmz*5kNDxxa+4>nm^$7nxnxI$vajDCr>lPS zn!Nw&6PqY?(SmZ{{&f$`vmY-gPhuELy#4s|&9m*Ae&gh3HlEsY?g(A|IQ^op(uVPu zl39gIFH;MSb8f!68MNc|CgYXI3$B-}o%z)^yry33X2hv`Zc36b)>7Rs3oE|})s(z* zks4UCP*`}$!x)`C%JO|KJ{dGY`hL_>jin)%bFb7Pa`$pfxF%V*qj z(dbob^(cIotEj*9A53Wn&)~S*D_wTw5Hf)V@z|8@7N_=H z@Ornauy*{#Q^lfw*&6%OJ-5rbdp*h+I&F6`(NH_ETJ(-8;mVKN0sTK&us7aT77~dd zgw|4&i)w}l_5U%{;MDPCvHcb0hZ%tfuMDu*My@orah&&3bHT|>h8%fE#god>gWYQ- zDh-d%{Frw7)!qJ4_a_z%o*Q!b)d2l{!^^&^Zd=`(QW!Mcy41Zadi?Tywc8tu)@_Nu z(P(Zb^~>OxiBw3%-O?2%qS<=43Vymxz1wg8huq;i&(CKZRac&*B(v!4;**LgidhQN zmslFVi&=K^r+&Ginkh45t^In(t1Ab+SynzY$|AwQM|GwC^O~8bLMMh+41PcKSIn*W zz?fUvJDp#ztbKEu_(Ae8HL$;@R>)@cKCzFqbt)?!-CcKFKP+^2&4G-8*SzmiN5`pL zBjqWrixG{x^`#_yt(l(UtRqXb$9+6?Y{@VEYqrA6H=G=h_*{uJRP(OdEQ@u9qYrO1 zQS3i$)zG+ptVWCH$%((@BA)&3>)}7~#IZpdwfQTD1dTgeFg!yjaKv(rl?oagrqqmO zy|-GdeJo>np!(Sm@9PC(PtAMzYKqq6NxS#YOZ(_@ag_b*<(6AQ)^Zlfrcc~1E}Uw$ zHe$r$4Lfh-dyDTsX<684r=H6k=NB#hCRk-9W!T&FP%|UF#VZaRIrWQHJ$Ty8Wc^g}IF8E2_~5vxyE+fIO7;>Sc|~J{=w2=J>+6Iz9=1!boj+6L zPTzQsxP+X?uYbFG)s9+w^{&d(n4{CB$NP*6wOHu$qrcHnlF#AZ`VQ|_%lveFw^~^4 zSjpS3iiV;;Uu(wAGW)nSFGNL?7CDKhLI7a3VmEc!fj(RHu2Wo6xax}aAW4Vk_A1%eT zjmz^aHa$(4vh;$4$=L|MJKt@Vk`Jk$o0EJ=d-RzIKVuP(4>ND;9lGbLxXUkRT(qH3 z&2q!MshiYa5amagl;%I1A2INDpX&Ij=L*eZraq1DlN2uO@taz@!bVolldxFr_@cpY z!{0hu?O`q6R&Sp?aP{He$3!E~d2fi9OuTfp>gz{p!Yan?#qoXS3?`X~R|H}S>PONS=VraV2()+`SG z>awVM?AfP9sx1FMj8DnmShfGmL{g$xh)me!F>+=0Pb^Kw(DXhJU0W)St2JHRmg}GfFfaTpoUv9V-9EDf>j|tZC%A zvYRG+v0XUq`mCH4yS7MA)5_Xq=XjnvP}$-9psSG*5}N|fy-f}+Sf6BbV57VHynL}ne3ti3U7{N$bH$A;^;g`<2r}EX1em*cx^}dqFd{ZT|XRCGhtRg6&Lfw z+~6eZt&fk)B081_j@=)Yn6kd_?4)&0u;Qx24C!A7yb(_GrR?9d>R8tEey96S?(<;4 z3GyNZzcDAXca3ykV;Cq+3f?ey$=dPcz@d^O`kBpN5%jxXfd#v=z4K+ha3$>2P#3Cr zK^Tp-yS=L?#~seb;M#!Y45eK)SVUU}TiJ+X#qs1!*5)|baPPwD85?qop)vy&ScSg8 zJ))lsCE5v-Nf5z8Btm6ZqB<4TD1b9II}ZY!x*2=2olOW3r7_o&1S7VE9!GYsdD2V zSpn~)uZADa&Hd8w?b9^X`VAZ2<^L$Zmr!56`geYcw_*caXPK8KWY)2N=cg}B&nYcY z%PM6yTsd4(U-+fUE%)c^zCSgXL8ycyS7{5W5 z6XWkX7Eyh-CH0Npm6b=W9+RYN+3C$KS&tp7mibM#RE~e(SbW7dHfdyhWLCkI>SakL zmYv?*kd<0mImJ)fQa=7(X_1$2RMO!1@T`2V>M2PEmYv?*k@cjs%HL1ZQY}8EwD_Cv z%_N!lJz0g{s{NBJEjzpUKA8S!Y-L}+-tP&VJ7bFm`GzJ5b9U16237Y>n%Viyjr7N3 zt91P)zE|MfPi%PQQsZS>m#aE_?yyMNFj=L!vU3-Q>4lw^-6gwd?u5C=!e)idlG`M^ zNq<=D2R6yhojYu9SQvau4!-p{Ao)Pi0^jhY{+uv+{(|aBNps(?rKcXKoa8tBy)1|S zrmF8Kzfnm`*7xDOx9X ze4lpTck1v$__P2%<^F8GUQk|e&Np#bJod9;r}F#p_cr^8UN4Z=j`Q7M1wZi78sUl| z?hmHs_-Q(_WO-_ ze@sG>V^UxJ;mYm-lM7?FZb|qQJR!cg(deYi;xXI6gQp&T?2N zF*!N$*eE}X$fJ)OudkL!GFvd&cfg6CrH@QL`0q@3+W6SqOni2s35@+Jo4Hzegc?0d zDc(#j=5su|Fg7#BO}XLSlppU@hZo$Y@6#{b@+fEaQMFBEGX=AKN;5Z__BZ8Q(O2`QD0t1VK3X~Jf(1+IRk^L=h-eM{*s2eTCpan+G85k{f4xj=!8Y+FM{}0H zb}%$99JET$xUgiw*%6Un9TGPtgsrl5jM#eKZ%+OuXLEn0*%cnF(sx>;Hc$GJ8I$?* ztAm_Z(%Uan2b>`FvfLT<(6sM8^H;fP$#K=*Kg~znN^c~6DT}}8_0v4^*d@dLQ?g5v zO`aY-^=h5gz@!E1?`qqV2CCjaxhduC$Cn$%$LCks05w*uPui`?c{*U1o9X*V9~*sL zg^2mYQM7)P_e+jsDDLxBpZzmX_;b~==|Zf6r1DL**VW#jh5 zq`mlkTexI>&BAtcMN^Mza}ovWt3cv?>mO(q(dIMs3<+uqkRj}j1WEv1L$`@;{j`36 z%WLTP0p%kZP(u@S353E>5Kj+nI0-ZW6B<##SWq{J3ilynlL|Rk3<#w{pF=z$JP$Q< z01oW?5c@`h*fs1LN>no-5Uu4n9sLb`pSWW}p%p4b_CxSFfehn893+gZL4d|3TwGy% z^fz=qg6H5K_M3#=BcpOoFg_WQFwu9YkhuqK3c25dDil<8E?gbK@ZaZcdGP-Mnpoh~ z@=+nj<{;Ik04Inr2kVMw^gxaPR@&B{g*FZk~6*J?J7I#1B3bsv(^hgln^ls ze@c1auFN!jzSz)^I84PjvO{$;RZ&iwTrv%qM+5 zRBM(z9r%>MS$$hP@W-Lz_ZmNf4%Gx*^-xO|9Y0QDgUDrTD@&8Rv9Awuj+7{AFP-l9 z=Iz}4)O@=mjmp|lfrocbCpzAZE>KxJC3o#ArISS?(m%;aj@e+iXH@^ z6NYXMl#ZKI#D1nosCl${Wsrz-&82%*g+58wgXAv<1$*1h3|!>qA@f*Q;e);ZYJU^U z?Tsn&)kie@j5iu|kDXhZkTU8hW8(6KstQjP72aRCA^axvNJDXSNUC3W#k7QeM_r=w z>M9l-T;jC-V{Glq7IzeYMFL}$wS_4_90n@9|mWS4#w)w}O@bDrn?tk>6Es`_u5o2t0Od*SMHDTSJc zKfbC@)mr_#F+c7$h4HiD-GYS|YBGQSSY#2@E0UfycgWBU5_*Hes&vS*oLGZX6{`M@ zvllN+7xOl`bZMdHutm#m=vjsS2;X@~^4yvuYc6Y&We*W*PslRFP8>J9V0HUp{q~~r zk5#O7dY9{0->kUrb!n;RNP`U*278P=xOVb#`BmcX6U-XTv_fujh8gT8UdZWFb+gqR~t5 z>AaMfXXhn4`C4V#<>%gmPpwPKuy=j?;_f1mk5dd^j$fuY(D6pJxoV%>)SW7<`6dpr zFJn)T;|`1`YRD-mDH1itYu(8`ZK&ktZWOY}{^A=6F-PCELk@>TiUnB<*-=i&%FD~? zn%x_rLC$^TUwuDr^Ki+!^uk-Ka|4bxF8d=mGkp4n?4S#QhmxLEe^Ac9WczJfx(tOf zJpR!LyR>CBFVlW}pFA&@@zu<)5kj02zl_q{_x;(OUdyFxlMBq$JaXA_k|XJ7?GA4Z zI8sfzPR>5Kic1We7Y`XQx#z86j(+ihNO|j7p@=G{4$l5z1K7ZC% zIivBzLzYDN-j!RTuRCi|PMC4nuo-8cc%)QS7(~Qt-i$7Lc16QWVv%hBiCRU3^V%DN zj}7xSAMP~w;*fC~Lw?UlR?2@*eHN5w_EBnuxVNir|EGpVwnL77GgaJ_>eT<<@jpD( z0?IBVe=&2r>Hom1JbSqAbGlmo<@r7X)wR!Uu)Oa@HgijEESJ6HaBIT){ktaQo$2fQ zxp#W$7vE!jUH-VX^zqEl<0`LK%2^C>*_Elk=F6q$!yFm;VV8fd^}Tub;ojpfC3_Dm z2sie9c4fVJR-NPY2H$NlW;cEoKd@nEKW0m%hVOVRKjXr%F9q*w7uAIXJT6I5Q?(3N zqrR;zoAlJ0ekV~ys@H(L`*K1O`K)5yUMHrEQ+A8}B`;MjB7ODq+UQ3j?sXfN>wcB4 z^HBDQI;l(=IbKWH)>%7L+S-xDDA%z*uuOjbXE_7MV+&t^z2$h@MA<)UUgMfXd(ZoT*J@+*46mUYShK6G8_)yTuwf7CUq z6{!^soI#Jfz9v!pC^zDnhe_7!>C;x#uRG(hn=;Wa>}^1_)!phn32|zL1*z5ATTRk@OB0oUlPx!I zA2#Yx?T;&=vriPy8@YSP3g)nL_lD%1?OS)OvHZ23%$R9W$|f}u%G)FLN~7=eUJ?6o ziP{+n%csGY4k-8r#iX4Ly`pz#WK@{BrK!*TL-QUle8WtZ?_C+IU*|lHvZFrs%+xcb zBGvB)P8rf$VahR;etie-c%V9Pe(mDk=S>RCVb6G1Vi(Co%%NN&V&>)H(Xlb7lvgoUK33pJ)l;g|iRuSryH5Ut-e)a*I=bY!yl zGoe4mC8i5$*yU9iNGRTq>epz}C*EnzmawqP3SqsAzx(V8UPb$5L?(@lYRt=-o^~kw zK&8U8vR}2*toUb9xBX+!2aOG?cxY6YW=Ai|b>q|<`%1@+EbFswV!g~Ye_!j_gY<&b zT?xaY<7ZTrf7CD++idathBCuliSf|HVP>6P{n+0+r2S*A%}dS{A3R{q0YdPMK7>)s zlf@%nKDctVQT@nmM^9baW3>Zs4nI!rd&8#pAa`>k)knJ5i|q!u`@b}y4sEz%bS?4x zLH%B75&qdDnNQ?&*D3E!a%FsruSz9cU4N|qx+nWf({q?gPnA|OEbEPnclV1d-J|lJ zkeg8D8W5?1j*v-cfRPNBn!yq>EA<`igJ%AMKS9vu*YfVy^>3 z*`aC7Eh3J?mTuBhuQCYjw@WAer73xoR8++8xv3}WFDl#~!K(kVu&(4n&V;ic(sIu4 zSJ5BaSgWrt6$AcQSSO#X zAMJGO$%yf>2jm7uZy)$Uy4O*wIV-jgE1NU@rGxtN8e7Zs5iG?cM~`S5)~t<{6+P+| zNj(>S!+NlktlWr{)eiB?{5H?3m_U>-53N%BQMsksNc6}0odlynWoP@o-+d=@^&%lL zor!NQNW}(<5Y1VeBY!O$cc$9#qP+#9uccl>USSiz<@b8~Jibr>0S&ERag&*KlQ;tzc? zKNKwzXN-k|Cf7+KR&^UBGYh`mynKwQc_QR}=p^a4=6PBQn!YiTpTdTH%lo=BbxfbF zgvLf)%>lxyeV)(*ceCrBE<2a~qxWEnbVa4@gM5!u(bB85E3+%cx{Wtb{XJU#*7%&; zt5(JQax6T1xMJ%IK)34ubTWME5t=IdJ+SlWiDmOh`NO)Q9uw3E6*}HRw zBq+`}ICr)fB~woHY~lCHH_P1187jHHGcVtsFQynY_^v%|%af^%voAh=sDI~@qhr2F z?UG^lLk`b)CGO>%a*1p@w@R3C*Ft#ZkZ2FaggMuCC;Lfrruo$UcoVtBEtu*dYAtGoG-y#bqZs_v@vvCle9T6TVEgkjLzd32#|y2csP7H_8M2nC6pd8q%+ zUhnLX)2qwbdM00uw=SM<^wdbjbg_cB(qN^R*1|Di{l!g2na@2hl5AcT+Mq-FmRq!K zOt$ERtrNd}uUjzc;IbjT^!mK~6n|Ohdd(J+rtm^Jqs+5~Iaf7`#0nMGlS-p9wlCM* zeKJzyx#3KmVh3NHdk5B?+GuA!V7qpxl-ue3vUidO<}Da#SYTSUB;Z?MtmR;)n)#sf zx3;BM#fMIvJ3f1x#;-~B-u3%NI&F=0py(x!IXk0VMXdJ=ReOui{UwiE-wPcPv2^cd z$*Bqsnt=xcR&PE0d}*HC%7^*Zw7T~6w>Wg@~ekKNwjRwXKV_tBKE z`|5gGR&cDdkA|JOtTo#(epkh&RmIb@!o6NQR%n%7`LMJhBedk&0O}mAe7$e8>uTd1 z-ZnUW@%vSD$f53aiHOH*W@A-)$=KqtuhX|5v^=`Icu-%;(ifx6Do-9gGumOq%$y-c z)diLJPVV#g;T(Ku*+X9$l5|YwlQ$}igx#LCed<$vDjvULSl5)s$L~%ETRgS)#8f-2 zdY2rS$^`ddhfznS++(n{&BBH}dO@D4-1p^g3)h0p&*fq#GBW%{F6kz= zBQ$@*41AMYY$An;NLLp|7-6npsMP&w&^Yb>69+1lQe>WsI-)%bceKrbPIxj zq|zWEpdcO6NS8{7NJ%3d|K`2ddtcAFcYJqz|3AL*e`CC74BW?g=H6?rwbz=fp7l(z z-C`e+s*+M)*Ld$>f~qE#u+RL7qwSMC_1znU{H5A~T(cohEBQ^2%@c!c({+!&8?y$! zz9zfFZP|0%=cNPB#{#DB`&nWiyO~O;G>I(+sFFisLHtBddxxpPyS(o(`m3WJJR+y| zJj8Qf#jV*$s?UX zt(KQdOoh_|c?>^eF#^kPt1)!6vIM&7SVFB-#X=p>aM_XNZkzigUYQ9?#;U*{9#_6qMwo&5@OZH0$NyjcLlEV0h7;X zIspn43+%B%^^5iA-|bJ`ms5_U^dIY0S_hPkQVZAA`ExZ%bw$SlhMBK#lidNO z?srbt%tUL|4CWbD*G*QH%u{NWWNC5`d+*p?P?O^|T9lf4gaHL(+W!ci(_LKd;U#nZ!_M+9aAYm8B(0LBaB?Rn{Gyr*|ws$M3v* zt@FCIIZD3gy1RKt?3AFl3$x#pRC9429~wB~{Ax3*xvuN!Q0}?1>;CCY%(E`;9^W;_ zgjIRNBp+y=jaIbp$;7HEnNj154RcJiC*!DQcTZj$McjXT9scqychwj=R@Hp6MI&1Q z>^pe_yz{^(RpaBgRgvO(2wOB}T%Q;Hq`byjLBRI+)XG;B1@528=Z0y)>zWKSLJQ3m zgtG3+jb(0)XkR6H@2k-6U(9-n<4#E(`W@N zXDd}1&ojj5REOA)hV4l7;2UMjp$fUfKre05Q^oqdGd1}g!c0&T23J(f3mrExq zJiF6|Ox(>(XyuF__$BIjin_OVR*q-8zEE96U3$x8EJ=<*N<@%%div>;iYT#cr1>@7mVFXHPYv-WMD}y5s~m6!cK{fgy?G|r)PV+ooE*lqj1VJM= zw0?W+E~Wis$(d*_nIftAi>@Sm$m*SfH*H~jO`%QJhJ3S$8-ea=bi1Y}@Y2m!>pog` zsEzwixyHE8j3H!fO(^R4hF^GZP2)1G*q=@G$Mn$F#dq@&=B6fuc+Fk!lP|f0Yx}q> z$Au)!UdOk|V&M67L&jhmdvwP3`QcQ?*s+7(>mrq9B~HC*5E^R+SIjqG>~MFfYnI{U z4Ai%m$dsl9y{H&QB((zDSG_C(lew@R?%CRWYI6p~fRuJEJ{Nedtw`r>hjzVKxCgT3 z>WybpHOPHG%)NK8qkg=$cDig~;K%#;VCH(laV6uKN6w@6#!MEsw0_ds zD9Zkv;W9G?`8nG=xhygQLDRG15^dO7*TFyMXqnM>6)4GICwQTaEiEk8))I=z2P@el zYDXG$6eI7JR~W=etR&cp+o-q29LS~YUUCiY>`Ke_FN@oH8T(H|C{~`RUV05lY7XOV zW`>TF+TV4?pr@P6FlEB(nHA5lRQmCCGB)l7fp*;SXvf8_{0ZS3iPocR81D%#7QQCN zx8^52E2nG8_QrMvb*gx_w5FclBe)asPx7;>zCNNKmU^>Nf9CkcLow6pK83n=Ragx9 z=h1s@m(|QMEtLF=lHYsoUN5jZvrXeWEK5S0C_(WILaXeqm6_y?7hVrZc%2BB^KSQL*r)Ih(W~0;iN~8i=@;Fz8^e>#^Vng5RxYUD zt*R}${uHf&23=L|#_L^~mV%gX^ut5PiL-MV;7Zr0n>U}i&&HTK)JVJFcneLJ%Mnp7 zdvid|FFqGFeXOm4j_W7*!FSD%-=vQ%@wi``bgR*j;5pR*CoUeb|McfEOiygAy~V-= zk0&NgFaGj4}UOjkGuNpXqGn89! zCq=<**&h4JXS%tL`eeF~b}IJeEE294y0w&wChxPiO;hNLrYlThmfU=LnVo(V5vbm8 zx|8V;`JSP|X%dV(6p`q4@>MSAG>b#-_IvNl`D8}XnMT+Qg|lhM**WdN%oq2gIu`!> zU0i7q=Z8e6ndUq4!q!0*AE$z0wsU0+t&yR;qGv53(jz0U) z#5V@G`v*NDyfE;;^s_w8n=YOVbhdlPjEl>l1HB-8(!}3Xt(dXr%W^2Y$YqTwxE2uW zi27!RQ=L@XcBub|;q1W3_q335_tAGbM{*i|4x&U?bxtf9G|AVEauPbsvkr3CcMDrz zLG5h6GuVi=vq5}5=0o(qiJ(`>8*REi?ZYRu!6yH7I@#y-P(ojtCh;dX9cF03Y3wLo zXB8_%MZVt&g$s4|{AZkA@ZL=ck8RBU_@bL}KGnUxpDwP?a7ro{w_#YKee+Mlu{>kq zzV#!u%uT8sXV65)(lN*z^T71*1^WJ|zrVI!6)RZ|8K~l@X7z;_Z21kC&sWd>h-EiG zl4gI88|1bZf$rt0ngyn?EU-cWm^(+2?0}Z+_p&WDoAEAwBb@OLb&# zgqetDk zqXN(FkARcy8ao)IXiBg|yund+A`A26y1Hrtljx-Jm2t@qHMvEa6+4^#F@4P=BqEaV zFwmOk;~)vH=d#+Zo>})s_GN(0A+dm3p=qSXm4_e|~IPT?qaRRiaZp`4|PyZGD`$ znb0&S& zrdr22j!)V;{!O_c6dGvd@n+;{`KnJTF;|hPp}2X=B|TlltB&{`Z@u7IwxG7>!QY6I zK0a{v+tqB0OTr8k(D?F}gdCkbH$vBpV@YF4XvsJs=1r<~=30Sn5ks~_4(?}y;rim^ z=1+6r!F3sjNcZwX&sUogW{m+`D6{R27Uwt4y^c3_PSq#1>h9)`{~QVT%G!GSsz}mq z8%!Ylf_er*6ng2@QPaHT{34o`d7&xBx$B7~^)b%vdDjA#JGY**QkBeOF^e~$TyH6- zeOB%m70817tk01**hGL1)6sO%aL9RHmHZ<#%bFRtk0L{A%o|QO@>)OWJ1({gI9xjP zsF3r{T;?UUMu}yB%^*MTt#=p>E2p>{3o)6@XI!KA!(^5MaDzETUw0mhfZ`aVcaM$> z(qd!=cJ2;(TsVOe)8xco^T)pm=-F|wyxutG9d#JI3w{5fJ5$I*6W)XsZQR5ozt~-; zl9D+UGU|Pkd%lz%};jUmS9OlMTa6PhNXjjUHo-1*%zIEAN@ zIEmN=i)oB&RTqRt;^>3cUCSXXEuPa!Ar@_61)YmWW*&rk(jU#4Q47ewbJjezB$eKm z_&n>HW5p1_i=Sz2Y&aot`a>P3>oY;}o2Wt7CG&t@9EbeRM;g*WA<4c%KaO1YG){c% z>ii^Dz}5JB)&(&#T{@j}2_5it3=(D6aVvJQPMzh<#!($g6_D;?+AFk2QHN>gip?JV zI$A6a#gE4uVz0Toj5qijPN%st?$a?W6`y9!AJLCuFJ+^FD6ePffvE3Gw+p=WAP=o= zX`&X#)Y{ARqv`S2^aIh~m(|Z4r}fH{hQD9Zx?P-rZblRZ#_#{?xU6#Y69X18|5}Sf zCPb9*eMMPc!uW~8!RZYuC}W0PxeF$UNNoR18^5vbTbg{G`>QWzmKQ;13uiAg;qewq zpLXfK5VWco={SP%!>5J=TXtCcCC&qvT;}+q_^#(uBdlx=p zp*E*MLVm%;`1zV*&!=4-^Wb{@jxT$)7PMVf*=Mf&JH-cGjP5KPt{}YEMdo2{6eaQ zTkZo{(^~Ct#l(c5QY79elkvQdvK|XgVd5?`@jJtQEBMHWDJfL*J zkv!MdioEtFRN-VK#_bW<-ttvj7mDs;C*kH$E_w-W_s~53ndN;!6WgXEBVF~<^mDy8 z3F8|0?8K`KvNmh;R^6)Xx+A?kbT6l#kJl%fN-kCpoK|Rvlw+41Q@Kiz5KH%ckgw;H zm2XkdjV5hQ8Tr19b&#;IU#&nI?MU;et$p~07q`Gda-1Q~{!*w>Ej5|AiU#qW*_fSA z)S*s$LQYnl=hpUT)l}EyQ~RuHd~T;vv&30mbFXR((|cd@s_XUvZHj%LKvK%xQ;VdO z)8u?pvq*1Np7~o!R&vEUvaQ39=f%XPZyfaC*cW~`HO=V=6Qd8YXnkScjG~^7e$NcO zd22&3i$r{o*I89&`11M9n`^YZ2WzRDHT^`9Ll* zqF*qpNAP2rOSx8An2_RKdcLCDdK$VkdU(Q)l{Vs&q0F|{BSW7W&{<>MsQ76G5y0Fx<4K`e~FUI--?m-3A9mRJ(QV^q6%xT%Di1b z{$thRwa38gAxq32j08ni@n+u)lr@^Ad#0=pW0T)8@rQ{-pK;4J?LoNFo=eVzyF}=& z-6uIQbS!d;`d65iKeIgjjbG>A;~ybrFgV=g7yePr%)-^y`0oJ8ze6DZ*pCP3D*p_D z1aKmMhd_dWAYT8I5Xe8%VEzSx{0jp47XmHeJ~+1f&bTf@1>TVOJ4v z0ek*{NdA$37yx|)eg|w2zOoVc4Fm%Luz%nR2jG){y?`t z9nw#K_Ch9tiQ;W=Zr$3OSL@{q)}Qrb&ZV@1?=>x_=h&fLOq~zU_MVDu_15pDT`qg( ziG5)PD5S#vrKIlWt~qDH3C9vXJWH0i#!R_w zX*)fYm%DDE@D-=s5dEySwst~s(O^V%PSl?f_QBbTCHY<+>MUXXa$a|hXUs-?(=ASE z?6atjkl_2`2?bb3BECKbOH&i74!#Fy+cwv3a2VI5FmC!#++@4|G``76+RkLeq~sFA zmu;J|*ES98J|4X4D6>ltTb}LZ6mK!dx#NJ7%iiL8K_I6m85AWIu_Afl$atG1iy-R8 z4X#}*`eE85s@5b>vI)Oo^P|eI^ql>xXz666(|0)GY-5Y(1N@C=(7DUYF27^4>W0+^ z0a2Ws`Pkq`L*DI{<+^sCd*mXcYL9eA`@J@7*KP@M-%PkuS{Kb4%{xMcK~NFJt4<}o zopU1yiwm^!KC{oL{xy}1FuPrBcy6C&JT$F%*NudG={B`9;bDo-QdT z54ad!yJ_vHC@>YWCemSu>RjV|Yh>HS`?GPmQ3dOh7rKGB^!>++#0qN=-@~$u%XX&~ zzOYzSyfIp-ud$YBVeF1F%$b)vPiL*zS7pwX3AtESc^X68Z}!~PSaQYq_W6=;>`#jJuN<$Vcoh|cs&9FDH8bLTiT$+tLKe5) z^w1*5A}5mcx;`Xngt2*xUZR-g#6Ph7xRsLlj>Z;ko`EIQWWKF-mar>m=jhFBE?j$i z-7rQx1|6nsba~NvRDP*KT&V9dRx$L3wSKn5cNC;_{(;ra2k+o10Scdi46bFwEwX8! zgR+3;ah@#BOhcF9TooI%&tI)o_s{nEVj0c%onm6ny*qB33T0>=DTwZ2ku# zcW#aOrWQJV$NPE_ubm$v;g92*hleZBrd6O6oT`ZZthRv|D>zZHjxoFkJa`$?| z<3$#v2I9Mr{;u8jww{L=)I4i89G!(6V-Es07SO5IB_zGKo-I>%Mmo)z7H2x{@`s@V zxX)!1H;@PUX1gB81lEhEr6<8J!yEwyKr4f8{JUSeH*@Yj3G8&+2Ua86!!C+62hkH=Uc*OV9!qEIQIdONzU{5R-`xl{S(+@)3ExX)#ajnSX8GU!6; zUQL}fC%0!E6>+4vHSF{sdL=exX?B=9ttXB-l$5JFo#vTH8f-WYerI&&Z3V-Y#@RbY zn|z@UH&mK<{UYo|e@d84j!C-3teu77eu*BM=A<)OuB3XGO?y3%<(bW+IfdYpzR@CF zEUd?=?JB)nk>R~+8JtyJvZ%s%o+#G6N$lUO6p}*nHQh0Gmi-!xDhszVv@{aK8AVZinTN-|wYy?9Hb9)C@DIOhT{hC-TIEzS$n$-KS+PJ4`Cx z-rBV@x2~rXfehw0qld6!wV!?9O!T!Z?`+%iY{~LC1&5b&u3k&=7zxE}BQWsC`d*iH zEmbk=u3}&tu_*ybi)xO37V(CSkF-TIuAitmNJC?4#u{GGw6#BVPG6pjCP)TeucH5K zI(7L&I=hhylDM7lCc&zy|h*qfcc9CagxR_C!N%pvRWz^0i@MrWEb;!7do@ z`(sg@xn$WeGGDYLByom{NS^nX&-X2*U$;7SymvZvYA|)2_B40da+>~>a$4+>@_9BJ ztMA(rA7Qf+_ef3;XBHF21~u5Do zOl}`4do57(jAvmG%fM=pg*os^+dY&5bksgoC%V<@Nm(OD_oeF-_H?0`bZ)7ISo5H;z?u9E2*lQ*Vg@-wz^|4>?q*OX?7{J z3;fDutm)%a97_za3>QfFRO!oXfl@|Na`_b{{r7K!TpZ)_XkrAqi&npp-p1P`Wt!YR zhDyG}9oK(V`sFY#Ls770-L^JyRgVR7+PfOAFfW zNv!lbr}|BOQcr`WTTYVLKG0zOa}t+a-iF&aGd#4lO!4Ft<$~Rz6Zg;iVPDdZ&X9ye1pE&=&PJuULt4Ic_E(% zpQnlCcU{HJ>r-zii(1vuIUy@P1ka0qHQ$A64I)Lx&FvCV5fh=HT@>!xh;Xc>*nUy=B^G#1}_>~C^oU7;d`pKQdqg=$C*gGRrjUekyE@`R*{UWyWz&Y^Ze%xyfoXS1W(RYwd$biECG(yo;V^nb?nEd z>-Yp4MXUSu*-QHlBG%lKf=_zNPdNEkAJq*CJoy}8^?AeKaa7xus-L#>*WJ0pkC$_1 z&)LrB=VEB7eI&_+zu7@BsWXN1*dH7A>J@&xo{k6V`Z9%`H7FD8=0lC{Vd)sYr}wRm zZ(yw0ddp*`!7<;R%15DTU5(iEV0u!Uw_X&xHayUlR8f8`LU{2_qq{ttsgOXouFcEh zN)o}^Z;m<<(bndtJmm|x({Z+{SaQttw&!TRd|@)_*WN$9*)L5ZUAN*4+e`O#=B>(I zv`OFJ@=;DV##ZpL@*Mh!rM~x`(mi5f`1A7R0onMB#>0kd`QYyuiU!u=vRy+ZN8gi! z2>KbcGLi+3o?})%bjbQPN+f2-P!nyjw36|*iz1T*t{S}H(tc=F$ZYa9k;sUyA&Qzx z_=CWBV@#$V6Zyp368M@7W+lpCm)kS&3x{*&YrA`BaVzNQKN_VP>9HRxvAOi;%ciUl zzLby75blI+d3@ZV%Tzfp1ZzKENwfT7&LXNAJ6)nJ(`OZ1$QAp}tx;>_fU3Z6k`a@> z;oj(HR8fHgl5g^;3Mu0W=yRcJ3F;ENp-)8I#Y`Qn4Ovx;Zw+;yRBq4@%#;U|OENOc z2R8N4fU1Hbl+`-hwWLcupE?-&>)oi8laAY5<}2Lb@k+i>#zGs*5{~wZeSLgnRe$2K zy_onRfvI70p{R`g_5*Q4Jj0foLxl95jxL6lt905-`R+2;QP^JxKVp(c@0vm{2PNDh zGwZ^&6fK`Z?=lkHF70`pfXNe1Fcc)At3YJzJn9hNp?IESap~W9P#qTbDSlr@d$H|CxN^5;`9{(cnK-VaI5)wNWH; zfNHF4-||7@T16p8yZfRBH@&i0(S^d7&ZE+#exn;@%A=L5Z|75Hg@+3_SI-)1PhERO zc0d=H)ub0yuPsz5U;2vsMt)Hs^9=Tu<)XiRIK1`6`JhHX_o!rr;xKGhLBc9$wA7^5 zdRnL9&TO&YY^?c9(!do>jld@CORY>%1tLWzCrhf-@U=O|7G|7q@d5msqpTjPsCVQS zwNb9)5PuXz=QEytjRv7vdZ+uMhjfTaGp6I6iw1!h`u?5vOWB$;lG)o_Pqzzgaht~X zZhB%_qW3VT4q2|e%O4uC%vh0maQ3bNBoDrk<9^{1U8^lA9lDLLYS`d2k?+GefurNc zL;8{Nq_5uiBR;dQU=}Zy!#6{eVEG_#h1$_Uh08E=(wuWirn6HFYA<%?EpaJp#si1y z)jZlGFLCK>g*bgL7?=lV=H!pT5WQIco#sXI&1w{R@ym;gcamgYXqzAJ5xc-|8PmwH zaT1SUtegnkSG}Q2mq$HF+xq@##h|e9x$HM7Kca!V1tdPyc|W_tu!C2rzBOM6*vYOQ zeKwv5%3JIZu#;2YwgS2Sm8nvi+jY}kL0~Wr$qP&M4KwVZzG8XF0J1MyW?L0DXh|Yn! z{Zn6<`&zrq-Bz?E?FF;W-&T2F(edfzPOcr51E*-z6U}a(_{shESz-@6bQqL(e%zoQ z=t{hk7=`Wm&Mak#nq}m@AX{#ukaA?cncn?Ki>Un43ORGD2^>o6hds{XLMeJ8wEgOe z4bH~NbuqJm}{;0qc-@>do8v)T{K(Itxj@=Q|~T)zwtp&TjTqI zmw5Yb_?_I{@EadK6!Si$I5pi5av9G_s4#U>sVc@V5vb9)>GG+dIG3&MxZe5k-N-sj z(8`js>>j}H>76CujK-_tO$AjRE(M*|+e^&vozycK>!?;0570=~yr+`g4+sn4^)zy- zqKjwCZ!zk%{?u$E&KG|-h8*ptCgXT!rMhAaa9FjjyqE9P$Z24rm0}dySqU=h4z?kF zGB`S11=9E?5io4&uBro}33AIc9}P&%`oO%!o>gc`n1V_Tei0=_A9fitnb|KzRDteU zK-n(!dBJG?Ii|oYb4NC;o>HfstiFe7-%k`E=J{7!zQ}`_isEk zzmeX+{vH0^N;_7|KQC5HaroozjXhT zD+J(*xzfAZsD%KV%!v000h_?TWME)Z^$*>v&0SzK7y?9b`}Ny@_X-xi;@JVXYOXf1 zuQqf4;LiD5p1{HY?+w6%^Xu7H-+}l_e{kbmaq;}h_f<4TumHe&bH$wl+ynZ9bLXFS z|GNKw;}r^ofcxKQ_x}Q$|GDW4a5y3J-UtbU0eZh*KsQ0C;D5sPH}>GZE$wY`-*;7H zop(l_rcvOI(G0)AvwN2cvyxKf1_LMP^|0F?XyA@k9F)2zeW@GYtPKyYW^!Utdl(U0 z?Kmf|z(hpnwV=XGME4w}l2Vpf55`17susjFKe@x|6v%8bo|5hZ?EcQAI?P0cUsH{c z6pF6foCL%S~pO2 z-)C;J6zzw4ney0vw1{~3n=(q{y``+g>66`P*DsJCNoxiq7e_7l10OH&4yubj_ZohB zTm11Np0k`#WU+kga2E$Nm3@fn_VEo0iMo}+P_EE{<5!Y+m_J-|$!(;_exTiTPp1>{ z@qOeh_T)_aux&M7Mn7=XWbx~r+2|mztJ(4myC2P4t6iSPo}T_U)vTZ7C&)Of z*Yt!poVNO89p$#^-}ArYobS%9v09+cYaNwaU%Q$}GxmmBZUt9!;?o105|)|33z}kz zen$}qTR-Q0hr4>2_9xm4ct1xhNMnX@YdLnP?hhT3#;8ZoCwZg||KJMeSm6}q-@!1` zR$9;pl_fod5(*mjujbL!vFxxCR$!AV4^tn!YkR_3@}pxd(|D=4O+AO}c6k0u%5F;A z6RvEr7asigc_yFa^OB{;c`)AZELA+iDJ&NymAu8@(HQF?nI3MzI-{($5c$raVO2Dd ze)q?Ub|Sw=#slzi+(XUddzC#}S(#7YzVu(66(CG7@6HwhcXNdDR&ceAn>)dy=liTs zvl+Izlgkpja)ke!s&-kgXIeH^}os~y84kk4OSXu($=dL{YG*i6WH6D*?q}NH-n}l`1 z=gm8M5_!**wnOe0Jz{EBA%7-Aa6RtcT#@vF>;bh5v|lbNKt)9q^|R;7dWg=*Ie7EI zM1lkUDo&=$dy;D|VWtt7NAIzETko7u4qawOGD+yg1a88G9eI;N^9Dv>OtR^@Fe@r_n$vq zE7_CS3IfZFVKb=TU3b)5b}h$Gr%=nVva&;VmA<;5bB;R_jx1-|?Izb6$Z^Q`?@Z(M zzR7+Os!Xj{3cD9FIz$4dUNypZH78N-tWW$|FaT%5wt>-(IZo2JKKEZcPSmtByJmTu z`?cnllRaxs)}GhTssiqpK9+B!#|~CdW5w_s62Ge)->#R}9crI`mRRd}srmijXZA=F zPs1IjXrH~#P-3?yXS1pUniZ_}50B3X{T*J${fikZz-0GNZ}(q;ltDsJQ)5#eC4iz; z-OSm_{I}WaAAa+9e6kSGk6%%%0<%OA1emRYp#Pv~1-$9MoUHztqE%4fYEFB_7kfq6 z$|nRD`kkW{0{s7<9IbHJpE+9L$n0fILPGx$R!2X!#lDq^AY@A{IA$aBhV+CIj@8;t zxNUmk1}e@=aw}BXE@lTwnIff$mPEhvi@}&}O{tx&wHhzBpMSE2tLM0dBicy!oa`^h~0cetNYhKf0e;s_292&@c+gY{9~By;cR9O#Jv`TgYbZ|{rl$% zX)Fw8GH3dS3_$Px@f(xZz(Zdh2D~tgcNp^FeotbN6>={Ae9RkE(ipj{#_3u z2m)f3Bg$X^Q7)1Uj#$nRApxX!4g~?JAlwTD!I8=UpngXx13(54=Kh{8fE5=&v=0VE zR!5eBkZgv*KmfY^x91580QCjIK0pRV%m*NYA*L%R2&}gtlnWq(AifV^IbIO49sn{R zBM7ztG62>8yM2HRj*vG&kiZp!{&zi)0B}|fNd^aqm=X2hFeE)e0f2<~cRjE$6sXAv zG9VEoJ>YNy;`0FdWnh8l_j@5w0bmS+D7!*~BgtTh?+6Nq0VK=6>%jzsfbkHL45! z7c7XZhvc(`fU1G$$AP0FfYU*E9w0;X8^CHT6j((3JzWq)0IBRjK)`o|`T{VR3nJMJ zoHaqLe}Ens(N6-hD)<_5M@APK$3xglSGJmS0|JZWl&%- z7*Pg8^u3PBe$nRHJ z5OJ&mq$-R!W&mW!{s0(PA>J;>EG`Rem)9C4KkAw>TIETbc}Bf#$>)l)DC$xi|T zVdOdqx+0%PNEd|U6M=i7h`tz*!GP0S2=@Y&99braT=rmLBwq&xgAjeT5YRJ15&a7w zLh{AHwgZyi1*rCs(}f5MAUzLqwSj?<51J`wzA-y*U^eQaP)#sn@5&}mY zHwl5Ef{1-GAQMLHqW~GuD@4LF^M_&lWXl@M?q6v-bzgoKgmF5txx=RLr^K&OnD2GBeZ+YvCr z1WsTg*dmNv45a8L7?geI1NbMIc3^YuHG~ghC zKlckR&c;A6EN471F(!U>D=)J@CeQq84h}9%KnXAbORsnA%^jEk>w)hQ5_peYjGbNn Um}d*Yfk8YRkB#lNvK-$30Yl_B>i_@% diff --git a/examples/v20/central_system.py b/examples/v20/central_system.py deleted file mode 100644 index e2823423a..000000000 --- a/examples/v20/central_system.py +++ /dev/null @@ -1,78 +0,0 @@ -import asyncio -import logging -from datetime import datetime - -try: - import websockets -except ModuleNotFoundError: - print("This example relies on the 'websockets' package.") - print("Please install it by running: ") - print() - print(" $ pip install websockets") - import sys - - sys.exit(1) - -from ocpp.routing import on -from ocpp.v20 import ChargePoint as cp -from ocpp.v20 import call_result - -logging.basicConfig(level=logging.INFO) - - -class ChargePoint(cp): - @on("BootNotification") - def on_boot_notification(self, charging_station, reason, **kwargs): - return call_result.BootNotificationPayload( - current_time=datetime.utcnow().isoformat(), interval=10, status="Accepted" - ) - - @on("Heartbeat") - def on_heartbeat(self): - print("Got a Heartbeat!") - return call_result.HeartbeatPayload( - current_time=datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S") + "Z" - ) - - -async def on_connect(websocket, path): - """For every new charge point that connects, create a ChargePoint - instance and start listening for messages. - """ - try: - requested_protocols = websocket.request_headers["Sec-WebSocket-Protocol"] - except KeyError: - logging.error("Client hasn't requested any Subprotocol. Closing Connection") - return await websocket.close() - if websocket.subprotocol: - logging.info("Protocols Matched: %s", websocket.subprotocol) - else: - # In the websockets lib if no subprotocols are supported by the - # client and the server, it proceeds without a subprotocol, - # so we have to manually close the connection. - logging.warning( - "Protocols Mismatched | Expected Subprotocols: %s," - " but client supports %s | Closing connection", - websocket.available_subprotocols, - requested_protocols, - ) - return await websocket.close() - - charge_point_id = path.strip("/") - cp = ChargePoint(charge_point_id, websocket) - - await cp.start() - - -async def main(): - server = await websockets.serve( - on_connect, "0.0.0.0", 9000, subprotocols=["ocpp2.0"] - ) - - logging.info("Server Started listening to new connections...") - await server.wait_closed() - - -if __name__ == "__main__": - # asyncio.run() is used when running this example with Python >= 3.7v - asyncio.run(main()) diff --git a/examples/v20/charge_point.py b/examples/v20/charge_point.py deleted file mode 100644 index a897597c9..000000000 --- a/examples/v20/charge_point.py +++ /dev/null @@ -1,53 +0,0 @@ -import asyncio -import logging - -try: - import websockets -except ModuleNotFoundError: - print("This example relies on the 'websockets' package.") - print("Please install it by running: ") - print() - print(" $ pip install websockets") - import sys - - sys.exit(1) - - -from ocpp.v20 import ChargePoint as cp -from ocpp.v20 import call - -logging.basicConfig(level=logging.INFO) - - -class ChargePoint(cp): - async def send_heartbeat(self, interval): - request = call.HeartbeatPayload() - while True: - await self.call(request) - await asyncio.sleep(interval) - - async def send_boot_notification(self): - request = call.BootNotificationPayload( - charging_station={"model": "Wallbox XYZ", "vendor_name": "anewone"}, - reason="PowerUp", - ) - response = await self.call(request) - - if response.status == "Accepted": - print("Connected to central system.") - await self.send_heartbeat(response.interval) - - -async def main(): - async with websockets.connect( - "ws://localhost:9000/CP_1", subprotocols=["ocpp2.0"] - ) as ws: - - cp = ChargePoint("CP_1", ws) - - await asyncio.gather(cp.start(), cp.send_boot_notification()) - - -if __name__ == "__main__": - # asyncio.run() is used when running this example with Python >= 3.7v - asyncio.run(main()) diff --git a/ocpp/v20/__init__.py b/ocpp/v20/__init__.py deleted file mode 100644 index f054fc49f..000000000 --- a/ocpp/v20/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from ocpp.charge_point import ChargePoint as cp -from ocpp.v20 import call, call_result - - -class ChargePoint(cp): - _call = call - _call_result = call_result - _ocpp_version = "2.0" diff --git a/ocpp/v20/call.py b/ocpp/v20/call.py deleted file mode 100644 index 13ba974cb..000000000 --- a/ocpp/v20/call.py +++ /dev/null @@ -1,436 +0,0 @@ -from dataclasses import dataclass -from typing import Any, Dict, List, Optional - - -@dataclass -class AuthorizePayload: - id_token: Dict - _15118_certificate_hash_data: Optional[List] = None - evse_id: Optional[List] = None - - -@dataclass -class BootNotificationPayload: - charging_station: Dict - reason: str - - -@dataclass -class CancelReservationPayload: - reservation_id: int - - -@dataclass -class CertificateSignedPayload: - cert: List - type_of_certificate: Optional[str] = None - - -@dataclass -class ChangeAvailabilityPayload: - evse_id: int - operational_status: str - - -@dataclass -class ClearCachePayload: - pass - - -@dataclass -class ClearChargingProfilePayload: - evse_id: Optional[int] = None - charging_profile: Optional[Dict] = None - - -@dataclass -class ClearDisplayMessagePayload: - id: int - - -@dataclass -class ClearVariableMonitoringPayload: - id: List - - -@dataclass -class ClearedChargingLimitPayload: - charging_limit_source: str - evse_id: Optional[int] = None - - -@dataclass -class CostUpdatedPayload: - total_cost: int - transaction_id: str - - -@dataclass -class CustomerInformationPayload: - request_id: int - report: bool - clear: bool - customer_certificate: Optional[Dict] = None - id_token: Optional[Dict] = None - customer_identifier: Optional[str] = None - - -@dataclass -class DataTransferPayload: - vendor_id: str - message_id: Optional[str] = None - data: Any = None - - -@dataclass -class DeleteCertificatePayload: - certificate_hash_data: Dict - - -@dataclass -class FirmwareStatusNotificationPayload: - status: str - request_id: int - - -@dataclass -class Get15118EVCertificatePayload: - _15118_schema_version: str - exi_request: str - - -@dataclass -class GetBaseReportPayload: - request_id: int - report_base: str - - -@dataclass -class GetCertificateStatusPayload: - ocsp_request_data: Dict - - -@dataclass -class GetChargingProfilesPayload: - charging_profile: Dict - request_id: Optional[int] = None - evse_id: Optional[int] = None - - -@dataclass -class GetCompositeSchedulePayload: - duration: int - evse_id: int - charging_rate_unit: Optional[str] = None - - -@dataclass -class GetDisplayMessagesPayload: - request_id: int - priority: Optional[str] = None - state: Optional[str] = None - id: Optional[List] = None - - -@dataclass -class GetInstalledCertificateIdsPayload: - type_of_certificate: str - - -@dataclass -class GetLocalListVersionPayload: - pass - - -@dataclass -class GetLogPayload: - log: Dict - log_type: str - request_id: int - retries: Optional[int] = None - retry_interval: Optional[int] = None - - -@dataclass -class GetMonitoringReportPayload: - component_variable: Optional[List] = None - request_id: Optional[int] = None - monitoring_criteria: Optional[List] = None - - -@dataclass -class GetReportPayload: - component_variable: Optional[List] = None - request_id: Optional[int] = None - component_criteria: Optional[List] = None - - -@dataclass -class GetTransactionStatusPayload: - transaction_id: Optional[str] = None - - -@dataclass -class GetVariablesPayload: - get_variable_data: List - - -@dataclass -class HeartbeatPayload: - pass - - -@dataclass -class InstallCertificatePayload: - certificate_type: str - certificate: str - - -@dataclass -class LogStatusNotificationPayload: - status: str - request_id: int - - -@dataclass -class MeterValuesPayload: - evse_id: int - meter_value: List - - -@dataclass -class NotifyCentralChargingNeedsPayload: - evse_id: int - sa_schedule: List - - -@dataclass -class NotifyChargingLimitPayload: - charging_limit: Dict - charging_schedule: Optional[List] = None - evse_id: Optional[int] = None - - -@dataclass -class NotifyCustomerInformationPayload: - data: str - tbc: bool - seq_no: int - generated_at: str - request_id: Optional[int] = None - - -@dataclass -class NotifyDisplayMessagesPayload: - message_info: List - request_id: int - tbc: bool - - -@dataclass -class NotifyEVChargingNeedsPayload: - charging_needs: Dict - evse_id: int - max_schedule_tuples: Optional[int] = None - - -@dataclass -class NotifyEVChargingSchedulePayload: - time_base: str - charging_schedule: Dict - evse_id: int - - -@dataclass -class NotifyEventPayload: - generated_at: str - tbc: bool - seq_no: int - event_data: List - - -@dataclass -class NotifyMonitoringReportPayload: - monitor: List - tbc: bool - seq_no: int - generated_at: str - request_id: Optional[int] = None - - -@dataclass -class NotifyReportPayload: - generated_at: str - report_data: List - tbc: bool - seq_no: int - request_id: Optional[int] = None - - -@dataclass -class PublishFirmwarePayload: - location: str - checksum: str - retries: Optional[int] = None - - -@dataclass -class PublishFirmwareStatusNotificationPayload: - status: str - location: Optional[str] = None - - -@dataclass -class Renegotiate15118SchedulePayload: - evse: Dict - - -@dataclass -class ReportChargingProfilesPayload: - charging_limit_source: str - charging_profile: List - evse_id: int - request_id: Optional[int] = None - tbc: Optional[bool] = None - - -@dataclass -class RequestStartTransactionPayload: - id_token: Dict - remote_start_id: int - evse_id: Optional[int] = None - charging_profile: Optional[Dict] = None - - -@dataclass -class RequestStopTransactionPayload: - transaction_id: str - - -@dataclass -class ReservationStatusUpdatePayload: - reservation_id: int - reservation_update_status: str - - -@dataclass -class ReserveNowPayload: - id_token: Dict - reservation: Dict - group_id_token: Optional[Dict] = None - - -@dataclass -class ResetPayload: - type: str - - -@dataclass -class SecurityEventNotificationPayload: - type: str - timestamp: str - - -@dataclass -class SendLocalListPayload: - version_number: int - update_type: str - local_authorization_list: Optional[List] = None - - -@dataclass -class SetChargingProfilePayload: - evse_id: int - charging_profile: Dict - - -@dataclass -class SetDisplayMessagePayload: - message: Dict - - -@dataclass -class SetMonitoringBasePayload: - monitoring_base: str - - -@dataclass -class SetMonitoringLevelPayload: - severity: int - - -@dataclass -class SetNetworkProfilePayload: - configuration_slot: int - connection_data: Dict - - -@dataclass -class SetVariableMonitoringPayload: - set_monitoring_data: List - - -@dataclass -class SetVariablesPayload: - set_variable_data: List - - -@dataclass -class SignCertificatePayload: - csr: str - type_of_certificate: Optional[str] = None - - -@dataclass -class StatusNotificationPayload: - timestamp: str - connector_status: str - evse_id: int - connector_id: int - - -@dataclass -class TransactionEventPayload: - event_type: str - timestamp: str - trigger_reason: str - seq_no: int - transaction_data: Dict - meter_value: Optional[List] = None - offline: Optional[bool] = None - number_of_phases_used: Optional[int] = None - cable_max_current: Optional[int] = None - reservation_id: Optional[int] = None - evse: Optional[Dict] = None - id_token: Optional[Dict] = None - - -@dataclass -class TriggerMessagePayload: - requested_message: str - evse: Optional[Dict] = None - - -@dataclass -class UnlockConnectorPayload: - evse_id: int - connector_id: int - - -@dataclass -class UnpublishFirmwarePayload: - checksum: str - - -@dataclass -class Update15118EVCertificatePayload: - _15118_schema_version: str - exi_request: str - - -@dataclass -class UpdateFirmwarePayload: - request_id: int - firmware: Dict - retries: Optional[int] = None - retry_interval: Optional[int] = None diff --git a/ocpp/v20/call_result.py b/ocpp/v20/call_result.py deleted file mode 100644 index 85dbe38c6..000000000 --- a/ocpp/v20/call_result.py +++ /dev/null @@ -1,356 +0,0 @@ -from dataclasses import dataclass -from typing import Any, Dict, List, Optional - - -@dataclass -class AuthorizePayload: - id_token_info: Dict - certificate_status: Optional[str] = None - evse_id: Optional[List] = None - - -@dataclass -class BootNotificationPayload: - current_time: str - interval: int - status: str - - -@dataclass -class CancelReservationPayload: - status: str - - -@dataclass -class CertificateSignedPayload: - status: str - - -@dataclass -class ChangeAvailabilityPayload: - status: str - - -@dataclass -class ClearCachePayload: - status: str - - -@dataclass -class ClearChargingProfilePayload: - status: str - - -@dataclass -class ClearDisplayMessagePayload: - status: str - - -@dataclass -class ClearVariableMonitoringPayload: - clear_monitoring_result: List - - -@dataclass -class ClearedChargingLimitPayload: - pass - - -@dataclass -class CostUpdatedPayload: - pass - - -@dataclass -class CustomerInformationPayload: - status: str - - -@dataclass -class DataTransferPayload: - status: str - data: Any = None - - -@dataclass -class DeleteCertificatePayload: - status: str - - -@dataclass -class FirmwareStatusNotificationPayload: - pass - - -@dataclass -class Get15118EVCertificatePayload: - status: str - sa_provisioning_certificate_chain: Dict - contract_signature_certificate_chain: Dict - exi_response: str - - -@dataclass -class GetBaseReportPayload: - status: str - - -@dataclass -class GetCertificateStatusPayload: - status: str - ocsp_result: Optional[str] = None - - -@dataclass -class GetChargingProfilesPayload: - status: str - - -@dataclass -class GetCompositeSchedulePayload: - status: str - evse_id: int - schedule: Optional[Dict] = None - - -@dataclass -class GetDisplayMessagesPayload: - status: str - - -@dataclass -class GetInstalledCertificateIdsPayload: - status: str - certificate_hash_data: Optional[List] = None - - -@dataclass -class GetLocalListVersionPayload: - version_number: int - - -@dataclass -class GetLogPayload: - status: str - filename: Optional[str] = None - - -@dataclass -class GetMonitoringReportPayload: - status: str - - -@dataclass -class GetReportPayload: - status: str - - -@dataclass -class GetTransactionStatusPayload: - messages_in_queue: bool - ongoing_indicator: Optional[bool] = None - - -@dataclass -class GetVariablesPayload: - get_variable_result: List - - -@dataclass -class HeartbeatPayload: - current_time: str - - -@dataclass -class InstallCertificatePayload: - status: str - - -@dataclass -class LogStatusNotificationPayload: - pass - - -@dataclass -class MeterValuesPayload: - pass - - -@dataclass -class NotifyCentralChargingNeedsPayload: - status: str - - -@dataclass -class NotifyChargingLimitPayload: - pass - - -@dataclass -class NotifyCustomerInformationPayload: - pass - - -@dataclass -class NotifyDisplayMessagesPayload: - pass - - -@dataclass -class NotifyEVChargingNeedsPayload: - status: str - - -@dataclass -class NotifyEVChargingSchedulePayload: - status: str - - -@dataclass -class NotifyEventPayload: - pass - - -@dataclass -class NotifyMonitoringReportPayload: - pass - - -@dataclass -class NotifyReportPayload: - pass - - -@dataclass -class PublishFirmwarePayload: - status: str - - -@dataclass -class PublishFirmwareStatusNotificationPayload: - pass - - -@dataclass -class Renegotiate15118SchedulePayload: - status: str - - -@dataclass -class ReportChargingProfilesPayload: - pass - - -@dataclass -class RequestStartTransactionPayload: - status: str - transaction_id: Optional[str] = None - - -@dataclass -class RequestStopTransactionPayload: - status: str - - -@dataclass -class ReservationStatusUpdatePayload: - pass - - -@dataclass -class ReserveNowPayload: - status: str - - -@dataclass -class ResetPayload: - status: str - - -@dataclass -class SecurityEventNotificationPayload: - pass - - -@dataclass -class SendLocalListPayload: - status: str - - -@dataclass -class SetChargingProfilePayload: - status: str - - -@dataclass -class SetDisplayMessagePayload: - status: str - - -@dataclass -class SetMonitoringBasePayload: - status: str - - -@dataclass -class SetMonitoringLevelPayload: - status: str - - -@dataclass -class SetNetworkProfilePayload: - status: str - - -@dataclass -class SetVariableMonitoringPayload: - set_monitoring_result: List - - -@dataclass -class SetVariablesPayload: - set_variable_result: List - - -@dataclass -class SignCertificatePayload: - status: str - - -@dataclass -class StatusNotificationPayload: - pass - - -@dataclass -class TransactionEventPayload: - total_cost: Optional[int] = None - charging_priority: Optional[int] = None - id_token_info: Optional[Dict] = None - updated_personal_message: Optional[Dict] = None - - -@dataclass -class TriggerMessagePayload: - status: str - - -@dataclass -class UnlockConnectorPayload: - status: str - - -@dataclass -class UnpublishFirmwarePayload: - status: str - - -@dataclass -class Update15118EVCertificatePayload: - status: str - exi_response: Optional[str] = None - - -@dataclass -class UpdateFirmwarePayload: - status: str diff --git a/ocpp/v20/schemas/AuthorizeRequest_v1p0.json b/ocpp/v20/schemas/AuthorizeRequest_v1p0.json deleted file mode 100644 index 55289fcf2..000000000 --- a/ocpp/v20/schemas/AuthorizeRequest_v1p0.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "HashAlgorithmEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "SHA256", - "SHA384", - "SHA512" - ] - }, - "IdTokenEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Central", - "eMAID", - "ISO14443", - "KeyCode", - "Local", - "NoAuthorization", - "ISO15693" - ] - }, - "AdditionalInfoType": { - "javaType": "AdditionalInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalIdToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "additionalIdToken", - "type" - ] - }, - "IdTokenType": { - "javaType": "IdToken", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalInfo": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/AdditionalInfoType" - }, - "minItems": 1 - }, - "idToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "$ref": "#/definitions/IdTokenEnumType" - } - }, - "required": [ - "idToken", - "type" - ] - }, - "OCSPRequestDataType": { - "javaType": "OCSPRequestData", - "type": "object", - "additionalProperties": true, - "properties": { - "hashAlgorithm": { - "$ref": "#/definitions/HashAlgorithmEnumType" - }, - "issuerNameHash": { - "type": "string", - "maxLength": 128 - }, - "issuerKeyHash": { - "type": "string", - "maxLength": 128 - }, - "serialNumber": { - "type": "string", - "maxLength": 20 - }, - "responderURL": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "hashAlgorithm", - "issuerNameHash", - "issuerKeyHash", - "serialNumber" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "15118CertificateHashData": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/OCSPRequestDataType" - }, - "minItems": 1, - "maxItems": 4 - }, - "idToken": { - "$ref": "#/definitions/IdTokenType" - }, - "evseId": { - "type": "array", - "additionalItems": false, - "items": { - "type": "integer" - }, - "minItems": 1 - } - }, - "required": [ - "idToken" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/AuthorizeResponse_v1p0.json b/ocpp/v20/schemas/AuthorizeResponse_v1p0.json deleted file mode 100644 index 6357990ed..000000000 --- a/ocpp/v20/schemas/AuthorizeResponse_v1p0.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "AuthorizationStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Blocked", - "ConcurrentTx", - "Expired", - "Invalid", - "NoCredit", - "NotAllowedTypeEVSE", - "NotAtThisLocation", - "NotAtThisTime", - "Unknown" - ] - }, - "CertificateStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "SignatureError", - "CertificateExpired", - "CertificateRevoked", - "NoCertificateAvailable", - "CertChainError", - "ContractCancelled" - ] - }, - "IdTokenEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Central", - "eMAID", - "ISO14443", - "KeyCode", - "Local", - "NoAuthorization", - "ISO15693" - ] - }, - "MessageFormatEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ASCII", - "HTML", - "URI", - "UTF8" - ] - }, - "GroupIdTokenType": { - "javaType": "GroupIdToken", - "type": "object", - "additionalProperties": true, - "properties": { - "idToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "$ref": "#/definitions/IdTokenEnumType" - } - }, - "required": [ - "idToken", - "type" - ] - }, - "IdTokenInfoType": { - "javaType": "IdTokenInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "$ref": "#/definitions/AuthorizationStatusEnumType" - }, - "cacheExpiryDateTime": { - "type": "string", - "format": "date-time" - }, - "chargingPriority": { - "type": "integer" - }, - "groupIdToken": { - "$ref": "#/definitions/GroupIdTokenType" - }, - "language1": { - "type": "string", - "maxLength": 8 - }, - "language2": { - "type": "string", - "maxLength": 8 - }, - "personalMessage": { - "$ref": "#/definitions/MessageContentType" - } - }, - "required": [ - "status" - ] - }, - "MessageContentType": { - "javaType": "MessageContent", - "type": "object", - "additionalProperties": true, - "properties": { - "format": { - "$ref": "#/definitions/MessageFormatEnumType" - }, - "language": { - "type": "string", - "maxLength": 8 - }, - "content": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "format", - "content" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "idTokenInfo": { - "$ref": "#/definitions/IdTokenInfoType" - }, - "certificateStatus": { - "$ref": "#/definitions/CertificateStatusEnumType" - }, - "evseId": { - "type": "array", - "additionalItems": false, - "items": { - "type": "integer" - }, - "minItems": 1 - } - }, - "required": [ - "idTokenInfo" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/BootNotificationRequest_v1p0.json b/ocpp/v20/schemas/BootNotificationRequest_v1p0.json deleted file mode 100644 index 39cb2f2a5..000000000 --- a/ocpp/v20/schemas/BootNotificationRequest_v1p0.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "BootReasonEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ApplicationReset", - "FirmwareUpdate", - "LocalReset", - "PowerUp", - "RemoteReset", - "ScheduledReset", - "Triggered", - "Unknown", - "Watchdog" - ] - }, - "ChargingStationType": { - "javaType": "ChargingStation", - "type": "object", - "additionalProperties": true, - "properties": { - "serialNumber": { - "type": "string", - "maxLength": 20 - }, - "model": { - "type": "string", - "maxLength": 20 - }, - "modem": { - "$ref": "#definitions/ModemType" - }, - "vendorName": { - "type": "string", - "maxLength": 50 - }, - "firmwareVersion": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "model", - "vendorName" - ] - }, - "ModemType": { - "javaType": "Modem", - "type": "object", - "additionalProperties": true, - "properties": { - "iccid": { - "type": "string", - "maxLength": 20 - }, - "imsi": { - "type": "string", - "maxLength": 20 - } - } - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "chargingStation": { - "$ref": "#definitions/ChargingStationType" - }, - "reason": { - "$ref": "#definitions/BootReasonEnumType" - } - }, - "required": [ - "reason", - "chargingStation" - ] -} diff --git a/ocpp/v20/schemas/BootNotificationResponse_v1p0.json b/ocpp/v20/schemas/BootNotificationResponse_v1p0.json deleted file mode 100644 index 67443dedf..000000000 --- a/ocpp/v20/schemas/BootNotificationResponse_v1p0.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "currentTime": { - "type": "string", - "format": "date-time" - }, - "interval": { - "type": "integer" - }, - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Pending", - "Rejected" - ] - } - }, - "required": [ - "currentTime", - "interval", - "status" - ] -} diff --git a/ocpp/v20/schemas/CancelReservationRequest_v1p0.json b/ocpp/v20/schemas/CancelReservationRequest_v1p0.json deleted file mode 100644 index 5b14f9983..000000000 --- a/ocpp/v20/schemas/CancelReservationRequest_v1p0.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "reservationId": { - "type": "integer" - } - }, - "required": [ - "reservationId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/CancelReservationResponse_v1p0.json b/ocpp/v20/schemas/CancelReservationResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/CancelReservationResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/CertificateSignedRequest_v1p0.json b/ocpp/v20/schemas/CertificateSignedRequest_v1p0.json deleted file mode 100644 index 30b364aec..000000000 --- a/ocpp/v20/schemas/CertificateSignedRequest_v1p0.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "cert": { - "type": "array", - "additionalItems": false, - "items": { - "type": "string", - "maxLength": 800 - }, - "minItems": 1 - }, - "typeOfCertificate": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ChargingStationCertificate", - "V2GCertificate" - ] - } - }, - "required": [ - "cert" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/CertificateSignedResponse_v1p0.json b/ocpp/v20/schemas/CertificateSignedResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/CertificateSignedResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ChangeAvailabilityRequest_v1p0.json b/ocpp/v20/schemas/ChangeAvailabilityRequest_v1p0.json deleted file mode 100644 index 966cc849a..000000000 --- a/ocpp/v20/schemas/ChangeAvailabilityRequest_v1p0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "evseId": { - "type": "integer" - }, - "operationalStatus": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Inoperative", - "Operative" - ] - } - }, - "required": [ - "evseId", - "operationalStatus" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ChangeAvailabilityResponse_v1p0.json b/ocpp/v20/schemas/ChangeAvailabilityResponse_v1p0.json deleted file mode 100644 index e839d6d2d..000000000 --- a/ocpp/v20/schemas/ChangeAvailabilityResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "Scheduled" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearCacheRequest_v1p0.json b/ocpp/v20/schemas/ClearCacheRequest_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/ClearCacheRequest_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearCacheResponse_v1p0.json b/ocpp/v20/schemas/ClearCacheResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/ClearCacheResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearChargingProfileRequest_v1p0.json b/ocpp/v20/schemas/ClearChargingProfileRequest_v1p0.json deleted file mode 100644 index 8aabba8f1..000000000 --- a/ocpp/v20/schemas/ClearChargingProfileRequest_v1p0.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ChargingProfilePurposeEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ChargingStationExternalConstraints", - "ChargingStationMaxProfile", - "TxDefaultProfile", - "TxProfile" - ] - }, - "ClearChargingProfileType": { - "javaType": "ClearChargingProfile", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "chargingProfilePurpose": { - "$ref": "#/definitions/ChargingProfilePurposeEnumType" - }, - "stackLevel": { - "type": "integer" - } - } - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "evseId": { - "type": "integer" - }, - "chargingProfile": { - "$ref": "#/definitions/ClearChargingProfileType" - } - } -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearChargingProfileResponse_v1p0.json b/ocpp/v20/schemas/ClearChargingProfileResponse_v1p0.json deleted file mode 100644 index ad87cc90f..000000000 --- a/ocpp/v20/schemas/ClearChargingProfileResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Unknown" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearDisplayMessageRequest_v1p0.json b/ocpp/v20/schemas/ClearDisplayMessageRequest_v1p0.json deleted file mode 100644 index c7250726e..000000000 --- a/ocpp/v20/schemas/ClearDisplayMessageRequest_v1p0.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - } - }, - "required": [ - "id" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearDisplayMessageResponse_v1p0.json b/ocpp/v20/schemas/ClearDisplayMessageResponse_v1p0.json deleted file mode 100644 index ad87cc90f..000000000 --- a/ocpp/v20/schemas/ClearDisplayMessageResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Unknown" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearVariableMonitoringRequest_v1p0.json b/ocpp/v20/schemas/ClearVariableMonitoringRequest_v1p0.json deleted file mode 100644 index e9bb48ca0..000000000 --- a/ocpp/v20/schemas/ClearVariableMonitoringRequest_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "array", - "additionalItems": false, - "items": { - "type": "integer" - }, - "minItems": 1 - } - }, - "required": [ - "id" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearVariableMonitoringResponse_v1p0.json b/ocpp/v20/schemas/ClearVariableMonitoringResponse_v1p0.json deleted file mode 100644 index 56b783762..000000000 --- a/ocpp/v20/schemas/ClearVariableMonitoringResponse_v1p0.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ClearMonitoringStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "NotFound" - ] - }, - "ClearMonitoringResultType": { - "javaType": "ClearMonitoringResult", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "status": { - "$ref": "#/definitions/ClearMonitoringStatusEnumType" - } - }, - "required": [ - "id", - "status" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "clearMonitoringResult": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ClearMonitoringResultType" - }, - "minItems": 1 - } - }, - "required": [ - "clearMonitoringResult" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearedChargingLimitRequest_v1p0.json b/ocpp/v20/schemas/ClearedChargingLimitRequest_v1p0.json deleted file mode 100644 index cbcb5e330..000000000 --- a/ocpp/v20/schemas/ClearedChargingLimitRequest_v1p0.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "chargingLimitSource": { - "type": "string", - "additionalProperties": true, - "enum": [ - "EMS", - "Other", - "SO", - "CSO" - ] - }, - "evseId": { - "type": "integer" - } - }, - "required": [ - "chargingLimitSource" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ClearedChargingLimitResponse_v1p0.json b/ocpp/v20/schemas/ClearedChargingLimitResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/ClearedChargingLimitResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/CostUpdatedRequest_v1p0.json b/ocpp/v20/schemas/CostUpdatedRequest_v1p0.json deleted file mode 100644 index 4808f7aaf..000000000 --- a/ocpp/v20/schemas/CostUpdatedRequest_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "totalCost": { - "type": "number" - }, - "transactionId": { - "type": "string", - "maxLength": 36 - } - }, - "required": [ - "totalCost", - "transactionId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/CostUpdatedResponse_v1p0.json b/ocpp/v20/schemas/CostUpdatedResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/CostUpdatedResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/CustomerInformationRequest_v1p0.json b/ocpp/v20/schemas/CustomerInformationRequest_v1p0.json deleted file mode 100644 index c924d3365..000000000 --- a/ocpp/v20/schemas/CustomerInformationRequest_v1p0.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "HashAlgorithmEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "SHA256", - "SHA384", - "SHA512" - ] - }, - "IdTokenEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Central", - "eMAID", - "ISO14443", - "KeyCode", - "Local", - "NoAuthorization", - "ISO15693" - ] - }, - "AdditionalInfoType": { - "javaType": "AdditionalInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalIdToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "additionalIdToken", - "type" - ] - }, - "CertificateHashDataType": { - "javaType": "CertificateHashData", - "type": "object", - "additionalProperties": true, - "properties": { - "hashAlgorithm": { - "$ref": "#/definitions/HashAlgorithmEnumType" - }, - "issuerNameHash": { - "type": "string", - "maxLength": 128 - }, - "issuerKeyHash": { - "type": "string", - "maxLength": 128 - }, - "serialNumber": { - "type": "string", - "maxLength": 20 - } - }, - "required": [ - "hashAlgorithm", - "issuerNameHash", - "issuerKeyHash", - "serialNumber" - ] - }, - "IdTokenType": { - "javaType": "IdToken", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalInfo": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/AdditionalInfoType" - }, - "minItems": 1 - }, - "idToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "$ref": "#/definitions/IdTokenEnumType" - } - }, - "required": [ - "idToken", - "type" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "customerCertificate": { - "$ref": "#/definitions/CertificateHashDataType" - }, - "idToken": { - "$ref": "#/definitions/IdTokenType" - }, - "requestId": { - "type": "integer" - }, - "report": { - "type": "boolean" - }, - "clear": { - "type": "boolean" - }, - "customerIdentifier": { - "type": "string", - "maxLength": 64 - } - }, - "required": [ - "requestId", - "report", - "clear" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/CustomerInformationResponse_v1p0.json b/ocpp/v20/schemas/CustomerInformationResponse_v1p0.json deleted file mode 100644 index cad77599b..000000000 --- a/ocpp/v20/schemas/CustomerInformationResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "Invalid" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/DataTransferRequest_v1p0.json b/ocpp/v20/schemas/DataTransferRequest_v1p0.json deleted file mode 100644 index 3ed1736e5..000000000 --- a/ocpp/v20/schemas/DataTransferRequest_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "messageId": { - "type": "string", - "maxLength": 50 - }, - "data": {}, - "vendorId": { - "type": "string", - "maxLength": 255 - } - }, - "required": [ - "vendorId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/DataTransferResponse_v1p0.json b/ocpp/v20/schemas/DataTransferResponse_v1p0.json deleted file mode 100644 index d5d5cb412..000000000 --- a/ocpp/v20/schemas/DataTransferResponse_v1p0.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "UnknownMessageId", - "UnknownVendorId" - ] - }, - "data": {} - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/DeleteCertificateRequest_v1p0.json b/ocpp/v20/schemas/DeleteCertificateRequest_v1p0.json deleted file mode 100644 index 0fa6fd63a..000000000 --- a/ocpp/v20/schemas/DeleteCertificateRequest_v1p0.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "HashAlgorithmEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "SHA256", - "SHA384", - "SHA512" - ] - }, - "CertificateHashDataType": { - "javaType": "CertificateHashData", - "type": "object", - "additionalProperties": true, - "properties": { - "hashAlgorithm": { - "$ref": "#/definitions/HashAlgorithmEnumType" - }, - "issuerNameHash": { - "type": "string", - "maxLength": 128 - }, - "issuerKeyHash": { - "type": "string", - "maxLength": 128 - }, - "serialNumber": { - "type": "string", - "maxLength": 20 - } - }, - "required": [ - "hashAlgorithm", - "issuerNameHash", - "issuerKeyHash", - "serialNumber" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "certificateHashData": { - "$ref": "#/definitions/CertificateHashDataType" - } - }, - "required": [ - "certificateHashData" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/DeleteCertificateResponse_v1p0.json b/ocpp/v20/schemas/DeleteCertificateResponse_v1p0.json deleted file mode 100644 index 57dfea8c9..000000000 --- a/ocpp/v20/schemas/DeleteCertificateResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Failed", - "NotFound" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/FirmwareStatusNotificationRequest_v1p0.json b/ocpp/v20/schemas/FirmwareStatusNotificationRequest_v1p0.json deleted file mode 100644 index 665e04274..000000000 --- a/ocpp/v20/schemas/FirmwareStatusNotificationRequest_v1p0.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "CertificateVerified", - "Downloaded", - "DownloadFailed", - "Downloading", - "DownloadScheduled", - "DownloadPaused", - "Idle", - "InstallationFailed", - "Installing", - "Installed", - "InstallRebooting", - "InstallScheduled", - "InstallVerificationFailed", - "InvalidSignature", - "InvalidCertificate", - "RevokedCertificate", - "PublishFailed", - "SignatureVerified" - ] - }, - "requestId": { - "type": "integer" - } - }, - "required": [ - "status", - "requestId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/FirmwareStatusNotificationResponse_v1p0.json b/ocpp/v20/schemas/FirmwareStatusNotificationResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/FirmwareStatusNotificationResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/Get15118EVCertificateRequest_v1p0.json b/ocpp/v20/schemas/Get15118EVCertificateRequest_v1p0.json deleted file mode 100644 index 694c39fdf..000000000 --- a/ocpp/v20/schemas/Get15118EVCertificateRequest_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "15118SchemaVersion": { - "type": "string", - "maxLength": 50 - }, - "exiRequest": { - "type": "string", - "maxLength": 5500 - } - }, - "required": [ - "15118SchemaVersion", - "exiRequest" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/Get15118EVCertificateResponse_v1p0.json b/ocpp/v20/schemas/Get15118EVCertificateResponse_v1p0.json deleted file mode 100644 index ec8c444df..000000000 --- a/ocpp/v20/schemas/Get15118EVCertificateResponse_v1p0.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "15118EVCertificateStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Failed" - ] - }, - "CertificateChainType": { - "javaType": "CertificateChain", - "type": "object", - "additionalProperties": true, - "properties": { - "certificate": { - "type": "string", - "maxLength": 800 - }, - "childCertificate": { - "type": "array", - "additionalItems": false, - "items": { - "type": "string", - "maxLength": 800 - }, - "minItems": 1, - "maxItems": 4 - } - }, - "required": [ - "certificate" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "$ref": "#/definitions/15118EVCertificateStatusEnumType" - }, - "saProvisioningCertificateChain": { - "$ref": "#/definitions/CertificateChainType" - }, - "contractSignatureCertificateChain": { - "$ref": "#/definitions/CertificateChainType" - }, - "exiResponse": { - "type": "string", - "maxLength": 5500 - } - }, - "required": [ - "status", - "exiResponse", - "contractSignatureCertificateChain", - "saProvisioningCertificateChain" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetBaseReportRequest_v1p0.json b/ocpp/v20/schemas/GetBaseReportRequest_v1p0.json deleted file mode 100644 index 7c6807414..000000000 --- a/ocpp/v20/schemas/GetBaseReportRequest_v1p0.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "requestId": { - "type": "integer" - }, - "reportBase": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ConfigurationInventory", - "FullInventory", - "SummaryInventory" - ] - } - }, - "required": [ - "requestId", - "reportBase" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetBaseReportResponse_v1p0.json b/ocpp/v20/schemas/GetBaseReportResponse_v1p0.json deleted file mode 100644 index 59370c308..000000000 --- a/ocpp/v20/schemas/GetBaseReportResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "NotSupported" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetCertificateStatusRequest_v1p0.json b/ocpp/v20/schemas/GetCertificateStatusRequest_v1p0.json deleted file mode 100644 index e3b6e8349..000000000 --- a/ocpp/v20/schemas/GetCertificateStatusRequest_v1p0.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "HashAlgorithmEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "SHA256", - "SHA384", - "SHA512" - ] - }, - "OCSPRequestDataType": { - "javaType": "OCSPRequestData", - "type": "object", - "additionalProperties": true, - "properties": { - "hashAlgorithm": { - "$ref": "#/definitions/HashAlgorithmEnumType" - }, - "issuerNameHash": { - "type": "string", - "maxLength": 128 - }, - "issuerKeyHash": { - "type": "string", - "maxLength": 128 - }, - "serialNumber": { - "type": "string", - "maxLength": 20 - }, - "responderURL": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "hashAlgorithm", - "issuerNameHash", - "issuerKeyHash", - "serialNumber" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "ocspRequestData": { - "$ref": "#/definitions/OCSPRequestDataType" - } - }, - "required": [ - "ocspRequestData" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetCertificateStatusResponse_v1p0.json b/ocpp/v20/schemas/GetCertificateStatusResponse_v1p0.json deleted file mode 100644 index f2023c411..000000000 --- a/ocpp/v20/schemas/GetCertificateStatusResponse_v1p0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - }, - "ocspResult": { - "type": "string", - "maxLength": 5500 - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetChargingProfilesRequest_v1p0.json b/ocpp/v20/schemas/GetChargingProfilesRequest_v1p0.json deleted file mode 100644 index b9e695c6e..000000000 --- a/ocpp/v20/schemas/GetChargingProfilesRequest_v1p0.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ChargingLimitSourceEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "EMS", - "Other", - "SO", - "CSO" - ] - }, - "ChargingProfilePurposeEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ChargingStationExternalConstraints", - "ChargingStationMaxProfile", - "TxDefaultProfile", - "TxProfile" - ] - }, - "ChargingProfileCriterionType": { - "javaType": "ChargingProfileCriterion", - "type": "object", - "additionalProperties": true, - "properties": { - "chargingProfilePurpose": { - "$ref": "#/definitions/ChargingProfilePurposeEnumType" - }, - "stackLevel": { - "type": "integer" - }, - "chargingProfileId": { - "type": "array", - "additionalItems": false, - "items": { - "type": "integer" - }, - "minItems": 1 - }, - "chargingLimitSource": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ChargingLimitSourceEnumType" - }, - "minItems": 1, - "maxItems": 4 - } - } - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "requestId": { - "type": "integer" - }, - "evseId": { - "type": "integer" - }, - "chargingProfile": { - "$ref": "#/definitions/ChargingProfileCriterionType" - } - }, - "required": [ - "chargingProfile" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetChargingProfilesResponse_v1p0.json b/ocpp/v20/schemas/GetChargingProfilesResponse_v1p0.json deleted file mode 100644 index fc17a6a6c..000000000 --- a/ocpp/v20/schemas/GetChargingProfilesResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "NoProfiles" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetCompositeScheduleRequest_v1p0.json b/ocpp/v20/schemas/GetCompositeScheduleRequest_v1p0.json deleted file mode 100644 index 2ebb65a05..000000000 --- a/ocpp/v20/schemas/GetCompositeScheduleRequest_v1p0.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "duration": { - "type": "integer" - }, - "chargingRateUnit": { - "type": "string", - "additionalProperties": true, - "enum": [ - "W", - "A" - ] - }, - "evseId": { - "type": "integer" - } - }, - "required": [ - "duration", - "evseId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetCompositeScheduleResponse_v1p0.json b/ocpp/v20/schemas/GetCompositeScheduleResponse_v1p0.json deleted file mode 100644 index aba5a9991..000000000 --- a/ocpp/v20/schemas/GetCompositeScheduleResponse_v1p0.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ChargingRateUnitEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "W", - "A" - ] - }, - "GetCompositeScheduleStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - }, - "ChargingSchedulePeriodType": { - "javaType": "ChargingSchedulePeriod", - "type": "object", - "additionalProperties": true, - "properties": { - "startPeriod": { - "type": "integer" - }, - "limit": { - "type": "number" - }, - "numberPhases": { - "type": "integer" - }, - "phaseToUse": { - "type": "integer" - } - }, - "required": [ - "startPeriod", - "limit" - ] - }, - "ChargingScheduleType": { - "javaType": "ChargingSchedule", - "type": "object", - "additionalProperties": true, - "properties": { - "startSchedule": { - "type": "string", - "format": "date-time" - }, - "duration": { - "type": "integer" - }, - "chargingRateUnit": { - "$ref": "#/definitions/ChargingRateUnitEnumType" - }, - "chargingSchedulePeriod": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ChargingSchedulePeriodType" - }, - "minItems": 1 - }, - "minChargingRate": { - "type": "number" - } - }, - "required": [ - "chargingRateUnit" - ] - }, - "CompositeScheduleType": { - "javaType": "CompositeSchedule", - "type": "object", - "additionalProperties": true, - "properties": { - "startDateTime": { - "type": "string", - "format": "date-time" - }, - "chargingSchedule": { - "$ref": "#/definitions/ChargingScheduleType" - } - } - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "$ref": "#/definitions/GetCompositeScheduleStatusEnumType" - }, - "evseId": { - "type": "integer" - }, - "schedule": { - "$ref": "#/definitions/CompositeScheduleType" - } - }, - "required": [ - "status", - "evseId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetDisplayMessagesRequest_v1p0.json b/ocpp/v20/schemas/GetDisplayMessagesRequest_v1p0.json deleted file mode 100644 index be91864cf..000000000 --- a/ocpp/v20/schemas/GetDisplayMessagesRequest_v1p0.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "requestId": { - "type": "integer" - }, - "priority": { - "type": "string", - "additionalProperties": true, - "enum": [ - "AlwaysFront", - "InFront", - "NormalCycle" - ] - }, - "state": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Charging", - "Faulted", - "Idle", - "Unavailable" - ] - }, - "id": { - "type": "array", - "additionalItems": false, - "items": { - "type": "integer" - }, - "minItems": 1 - } - }, - "required": [ - "requestId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetDisplayMessagesResponse_v1p0.json b/ocpp/v20/schemas/GetDisplayMessagesResponse_v1p0.json deleted file mode 100644 index ad87cc90f..000000000 --- a/ocpp/v20/schemas/GetDisplayMessagesResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Unknown" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetInstalledCertificateIdsRequest_v1p0.json b/ocpp/v20/schemas/GetInstalledCertificateIdsRequest_v1p0.json deleted file mode 100644 index 648297f7f..000000000 --- a/ocpp/v20/schemas/GetInstalledCertificateIdsRequest_v1p0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "typeOfCertificate": { - "type": "string", - "additionalProperties": true, - "enum": [ - "V2GRootCertficate", - "MORootCertificate", - "CSOSubCA1", - "CSOSubCA2", - "CSMSRootCertificate", - "ManufacturerRootCertificate" - ] - } - }, - "required": [ - "typeOfCertificate" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetInstalledCertificateIdsResponse_v1p0.json b/ocpp/v20/schemas/GetInstalledCertificateIdsResponse_v1p0.json deleted file mode 100644 index 1397f9605..000000000 --- a/ocpp/v20/schemas/GetInstalledCertificateIdsResponse_v1p0.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "GetInstalledCertificateStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "NotFound" - ] - }, - "HashAlgorithmEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "SHA256", - "SHA384", - "SHA512" - ] - }, - "CertificateHashDataType": { - "javaType": "CertificateHashData", - "type": "object", - "additionalProperties": true, - "properties": { - "hashAlgorithm": { - "$ref": "#/definitions/HashAlgorithmEnumType" - }, - "issuerNameHash": { - "type": "string", - "maxLength": 128 - }, - "issuerKeyHash": { - "type": "string", - "maxLength": 128 - }, - "serialNumber": { - "type": "string", - "maxLength": 20 - } - }, - "required": [ - "hashAlgorithm", - "issuerNameHash", - "issuerKeyHash", - "serialNumber" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "certificateHashData": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/CertificateHashDataType" - }, - "minItems": 1 - }, - "status": { - "$ref": "#/definitions/GetInstalledCertificateStatusEnumType" - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetLocalListVersionRequest_v1p0.json b/ocpp/v20/schemas/GetLocalListVersionRequest_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/GetLocalListVersionRequest_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetLocalListVersionResponse_v1p0.json b/ocpp/v20/schemas/GetLocalListVersionResponse_v1p0.json deleted file mode 100644 index 29c3e8648..000000000 --- a/ocpp/v20/schemas/GetLocalListVersionResponse_v1p0.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "versionNumber": { - "type": "integer" - } - }, - "required": [ - "versionNumber" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetLogRequest_v1p0.json b/ocpp/v20/schemas/GetLogRequest_v1p0.json deleted file mode 100644 index 0d7633572..000000000 --- a/ocpp/v20/schemas/GetLogRequest_v1p0.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "LogEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "DiagnosticsLog", - "SecurityLog" - ] - }, - "LogParametersType": { - "javaType": "LogParameters", - "type": "object", - "additionalProperties": true, - "properties": { - "remoteLocation": { - "type": "string", - "maxLength": 512 - }, - "oldestTimestamp": { - "type": "string", - "format": "date-time" - }, - "latestTimestamp": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "remoteLocation" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "log": { - "$ref": "#/definitions/LogParametersType" - }, - "logType": { - "$ref": "#/definitions/LogEnumType" - }, - "requestId": { - "type": "integer" - }, - "retries": { - "type": "integer" - }, - "retryInterval": { - "type": "integer" - } - }, - "required": [ - "logType", - "requestId", - "log" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetLogResponse_v1p0.json b/ocpp/v20/schemas/GetLogResponse_v1p0.json deleted file mode 100644 index a75ceadce..000000000 --- a/ocpp/v20/schemas/GetLogResponse_v1p0.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "AcceptedCanceled" - ] - }, - "filename": { - "type": "string", - "maxLength": 255 - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetMonitoringReportRequest_v1p0.json b/ocpp/v20/schemas/GetMonitoringReportRequest_v1p0.json deleted file mode 100644 index 2e0a3dba0..000000000 --- a/ocpp/v20/schemas/GetMonitoringReportRequest_v1p0.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "MonitoringCriterionEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ThresholdMonitoring", - "DeltaMonitoring", - "PeriodicMonitoring" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "ComponentVariableType": { - "javaType": "ComponentVariable", - "type": "object", - "additionalProperties": true, - "properties": { - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - } - }, - "required": [ - "component", - "variable" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "componentVariable": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ComponentVariableType" - }, - "minItems": 1 - }, - "requestId": { - "type": "integer" - }, - "monitoringCriteria": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/MonitoringCriterionEnumType" - }, - "minItems": 1, - "maxItems": 3 - } - } -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetMonitoringReportResponse_v1p0.json b/ocpp/v20/schemas/GetMonitoringReportResponse_v1p0.json deleted file mode 100644 index 59370c308..000000000 --- a/ocpp/v20/schemas/GetMonitoringReportResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "NotSupported" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetReportRequest_v1p0.json b/ocpp/v20/schemas/GetReportRequest_v1p0.json deleted file mode 100644 index cf71d20e1..000000000 --- a/ocpp/v20/schemas/GetReportRequest_v1p0.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ComponentCriterionEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Active", - "Available", - "Enabled", - "Problem" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "ComponentVariableType": { - "javaType": "ComponentVariable", - "type": "object", - "additionalProperties": true, - "properties": { - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - } - }, - "required": [ - "component", - "variable" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "componentVariable": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ComponentVariableType" - }, - "minItems": 1 - }, - "requestId": { - "type": "integer" - }, - "componentCriteria": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ComponentCriterionEnumType" - }, - "minItems": 1, - "maxItems": 4 - } - } -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetReportResponse_v1p0.json b/ocpp/v20/schemas/GetReportResponse_v1p0.json deleted file mode 100644 index 59370c308..000000000 --- a/ocpp/v20/schemas/GetReportResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "NotSupported" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetTransactionStatusRequest_v1p0.json b/ocpp/v20/schemas/GetTransactionStatusRequest_v1p0.json deleted file mode 100644 index 0368c5043..000000000 --- a/ocpp/v20/schemas/GetTransactionStatusRequest_v1p0.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "transactionId": { - "type": "string", - "maxLength": 36 - } - } -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetTransactionStatusResponse_v1p0.json b/ocpp/v20/schemas/GetTransactionStatusResponse_v1p0.json deleted file mode 100644 index 814f585f4..000000000 --- a/ocpp/v20/schemas/GetTransactionStatusResponse_v1p0.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "ongoingIndicator": { - "type": "boolean" - }, - "messagesInQueue": { - "type": "boolean" - } - }, - "required": [ - "messagesInQueue" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetVariablesRequest_v1p0.json b/ocpp/v20/schemas/GetVariablesRequest_v1p0.json deleted file mode 100644 index 4282b4273..000000000 --- a/ocpp/v20/schemas/GetVariablesRequest_v1p0.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "AttributeEnumType": { - "type": "string", - "default": "Actual", - "additionalProperties": true, - "enum": [ - "Actual", - "Target", - "MinSet", - "MaxSet" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "GetVariableDataType": { - "javaType": "GetVariableData", - "type": "object", - "additionalProperties": true, - "properties": { - "attributeType": { - "$ref": "#/definitions/AttributeEnumType" - }, - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - } - }, - "required": [ - "component", - "variable" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "getVariableData": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/GetVariableDataType" - }, - "minItems": 1 - } - }, - "required": [ - "getVariableData" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/GetVariablesResponse_v1p0.json b/ocpp/v20/schemas/GetVariablesResponse_v1p0.json deleted file mode 100644 index e96e68eda..000000000 --- a/ocpp/v20/schemas/GetVariablesResponse_v1p0.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "AttributeEnumType": { - "type": "string", - "default": "Actual", - "additionalProperties": true, - "enum": [ - "Actual", - "Target", - "MinSet", - "MaxSet" - ] - }, - "GetVariableStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "UnknownComponent", - "UnknownVariable", - "NotSupportedAttributeType" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "GetVariableResultType": { - "javaType": "GetVariableResult", - "type": "object", - "additionalProperties": true, - "properties": { - "attributeStatus": { - "$ref": "#/definitions/GetVariableStatusEnumType" - }, - "attributeType": { - "$ref": "#/definitions/AttributeEnumType" - }, - "attributeValue": { - "type": "string", - "maxLength": 1000 - }, - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - } - }, - "required": [ - "attributeStatus", - "component", - "variable" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "getVariableResult": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/GetVariableResultType" - }, - "minItems": 1 - } - }, - "required": [ - "getVariableResult" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/HeartbeatRequest_v1p0.json b/ocpp/v20/schemas/HeartbeatRequest_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/HeartbeatRequest_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/HeartbeatResponse_v1p0.json b/ocpp/v20/schemas/HeartbeatResponse_v1p0.json deleted file mode 100644 index f303de207..000000000 --- a/ocpp/v20/schemas/HeartbeatResponse_v1p0.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "currentTime": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "currentTime" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/InstallCertificateRequest_v1p0.json b/ocpp/v20/schemas/InstallCertificateRequest_v1p0.json deleted file mode 100644 index 93f123ac8..000000000 --- a/ocpp/v20/schemas/InstallCertificateRequest_v1p0.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "certificateType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "V2GRootCertficate", - "MORootCertificate", - "CSOSubCA1", - "CSOSubCA2", - "CSMSRootCertificate", - "ManufacturerRootCertificate" - ] - }, - "certificate": { - "type": "string", - "maxLength": 800 - } - }, - "required": [ - "certificateType", - "certificate" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/InstallCertificateResponse_v1p0.json b/ocpp/v20/schemas/InstallCertificateResponse_v1p0.json deleted file mode 100644 index 89939d4ae..000000000 --- a/ocpp/v20/schemas/InstallCertificateResponse_v1p0.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "SignatureError", - "CertificateExpired", - "CertificateRevoked", - "NoCertificateAvailable", - "CertChainError", - "ContractCancelled" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/LogStatusNotificationRequest_v1p0.json b/ocpp/v20/schemas/LogStatusNotificationRequest_v1p0.json deleted file mode 100644 index b5cb62e74..000000000 --- a/ocpp/v20/schemas/LogStatusNotificationRequest_v1p0.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "BadMessage", - "Idle", - "NotSupportedOperation", - "PermissionDenied", - "Uploaded", - "UploadFailure", - "Uploading" - ] - }, - "requestId": { - "type": "integer" - } - }, - "required": [ - "status", - "requestId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/LogStatusNotificationResponse_v1p0.json b/ocpp/v20/schemas/LogStatusNotificationResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/LogStatusNotificationResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/MeterValuesRequest_v1p0.json b/ocpp/v20/schemas/MeterValuesRequest_v1p0.json deleted file mode 100644 index 9d984d534..000000000 --- a/ocpp/v20/schemas/MeterValuesRequest_v1p0.json +++ /dev/null @@ -1,211 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "EncodingMethodEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Other", - "DLMS Message", - "COSEM Protected Data", - "EDL" - ] - }, - "LocationEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Body", - "Cable", - "EV", - "Inlet", - "Outlet" - ] - }, - "MeasurandEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Current.Export", - "Current.Import", - "Current.Offered", - "Energy.Active.Export.Register", - "Energy.Active.Import.Register", - "Energy.Reactive.Export.Register", - "Energy.Reactive.Import.Register", - "Energy.Active.Export.Interval", - "Energy.Active.Import.Interval", - "Energy.Active.Net", - "Energy.Reactive.Export.Interval", - "Energy.Reactive.Import.Interval", - "Energy.Reactive.Net", - "Energy.Apparent.Net", - "Energy.Apparent.Import", - "Energy.Apparent.Export", - "Frequency", - "Power.Active.Export", - "Power.Active.Import", - "Power.Factor", - "Power.Offered", - "Power.Reactive.Export", - "Power.Reactive.Import", - "SoC", - "Voltage" - ] - }, - "PhaseEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "L1", - "L2", - "L3", - "N", - "L1-N", - "L2-N", - "L3-N", - "L1-L2", - "L2-L3", - "L3-L1" - ] - }, - "ReadingContextEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Interruption.Begin", - "Interruption.End", - "Other", - "Sample.Clock", - "Sample.Periodic", - "Transaction.Begin", - "Transaction.End", - "Trigger" - ] - }, - "SignatureMethodEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ECDSAP256SHA256", - "ECDSAP384SHA384", - "ECDSA192SHA256" - ] - }, - "MeterValueType": { - "javaType": "MeterValue", - "type": "object", - "additionalProperties": true, - "properties": { - "sampledValue": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/SampledValueType" - }, - "minItems": 1 - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "timestamp", - "sampledValue" - ] - }, - "SampledValueType": { - "javaType": "SampledValue", - "type": "object", - "additionalProperties": true, - "properties": { - "value": { - "type": "number" - }, - "context": { - "$ref": "#/definitions/ReadingContextEnumType" - }, - "measurand": { - "$ref": "#/definitions/MeasurandEnumType" - }, - "phase": { - "$ref": "#/definitions/PhaseEnumType" - }, - "location": { - "$ref": "#/definitions/LocationEnumType" - }, - "signedMeterValue": { - "$ref": "#/definitions/SignedMeterValueType" - }, - "unitOfMeasure": { - "$ref": "#/definitions/UnitOfMeasureType" - } - }, - "required": [ - "value" - ] - }, - "SignedMeterValueType": { - "javaType": "SignedMeterValue", - "type": "object", - "additionalProperties": true, - "properties": { - "meterValueSignature": { - "type": "string", - "maxLength": 2500 - }, - "signatureMethod": { - "$ref": "#/definitions/SignatureMethodEnumType" - }, - "encodingMethod": { - "$ref": "#/definitions/EncodingMethodEnumType" - }, - "encodedMeterValue": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "meterValueSignature", - "signatureMethod", - "encodingMethod", - "encodedMeterValue" - ] - }, - "UnitOfMeasureType": { - "javaType": "UnitOfMeasure", - "type": "object", - "additionalProperties": true, - "properties": { - "unit": { - "type": "string", - "maxLength": 20 - }, - "multiplier": { - "type": "integer" - } - } - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "evseId": { - "type": "integer" - }, - "meterValue": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/MeterValueType" - }, - "minItems": 1 - } - }, - "required": [ - "evseId", - "meterValue" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/MeterValuesResponse_v1p0.json b/ocpp/v20/schemas/MeterValuesResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/MeterValuesResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyCentralChargingNeedsRequest_v1p0.json b/ocpp/v20/schemas/NotifyCentralChargingNeedsRequest_v1p0.json deleted file mode 100644 index 5de029edf..000000000 --- a/ocpp/v20/schemas/NotifyCentralChargingNeedsRequest_v1p0.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "CostKindEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "CarbonDioxideEmission", - "RelativePricePercentage", - "RenewableGenerationPercentage" - ] - }, - "ConsumptionCostType": { - "javaType": "ConsumptionCost", - "type": "object", - "additionalProperties": true, - "properties": { - "startValue": { - "type": "number" - }, - "cost": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/CostType" - }, - "minItems": 1, - "maxItems": 3 - } - }, - "required": [ - "startValue", - "cost" - ] - }, - "CostType": { - "javaType": "Cost", - "type": "object", - "additionalProperties": true, - "properties": { - "costKind": { - "$ref": "#/definitions/CostKindEnumType" - }, - "amount": { - "type": "number" - }, - "amountMultiplier": { - "type": "integer" - } - }, - "required": [ - "costKind", - "amount" - ] - }, - "PMaxScheduleType": { - "javaType": "PMaxSchedule", - "type": "object", - "additionalProperties": true, - "properties": { - "relativeTimeInterval": { - "$ref": "#/definitions/RelativeTimeIntervalType" - }, - "pMax": { - "type": "number" - } - }, - "required": [ - "pMax", - "relativeTimeInterval" - ] - }, - "RelativeTimeIntervalType": { - "javaType": "RelativeTimeInterval", - "type": "object", - "additionalProperties": true, - "properties": { - "start": { - "type": "integer" - }, - "duration": { - "type": "integer" - } - }, - "required": [ - "start" - ] - }, - "SalesTariffEntryType": { - "javaType": "SalesTariffEntry", - "type": "object", - "additionalProperties": true, - "properties": { - "relativeTimeInterval": { - "$ref": "#/definitions/RelativeTimeIntervalType" - }, - "ePriceLevel": { - "type": "integer", - "minimum": 0.0 - }, - "consumptionCost": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ConsumptionCostType" - }, - "minItems": 1, - "maxItems": 3 - } - } - }, - "SalesTariffType": { - "javaType": "SalesTariff", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "salesTariffDescription": { - "type": "string", - "maxLength": 32 - }, - "numEPriceLevels": { - "type": "integer" - }, - "salesTariffEntry": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/SalesTariffEntryType" - }, - "minItems": 1, - "maxItems": 1024 - } - }, - "required": [ - "id", - "salesTariffEntry" - ] - }, - "SAScheduleType": { - "javaType": "SASchedule", - "type": "object", - "additionalProperties": true, - "properties": { - "pMaxSchedule": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/PMaxScheduleType" - }, - "minItems": 1, - "maxItems": 1024 - }, - "saScheduleTupleID": { - "type": "integer" - }, - "salesTariff": { - "$ref": "#/definitions/SalesTariffType" - } - }, - "required": [ - "saScheduleTupleID", - "pMaxSchedule" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "evseId": { - "type": "integer" - }, - "saSchedule": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/SAScheduleType" - }, - "minItems": 1, - "maxItems": 3 - } - }, - "required": [ - "evseId", - "saSchedule" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyCentralChargingNeedsResponse_v1p0.json b/ocpp/v20/schemas/NotifyCentralChargingNeedsResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/NotifyCentralChargingNeedsResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyChargingLimitRequest_v1p0.json b/ocpp/v20/schemas/NotifyChargingLimitRequest_v1p0.json deleted file mode 100644 index f96fdb2b3..000000000 --- a/ocpp/v20/schemas/NotifyChargingLimitRequest_v1p0.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ChargingLimitSourceEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "EMS", - "Other", - "SO", - "CSO" - ] - }, - "ChargingRateUnitEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "W", - "A" - ] - }, - "ChargingLimitType": { - "javaType": "ChargingLimit", - "type": "object", - "additionalProperties": true, - "properties": { - "chargingLimitSource": { - "$ref": "#/definitions/ChargingLimitSourceEnumType" - }, - "isGridCritical": { - "type": "boolean" - } - }, - "required": [ - "chargingLimitSource" - ] - }, - "ChargingSchedulePeriodType": { - "javaType": "ChargingSchedulePeriod", - "type": "object", - "additionalProperties": true, - "properties": { - "startPeriod": { - "type": "integer" - }, - "limit": { - "type": "number" - }, - "numberPhases": { - "type": "integer" - }, - "phaseToUse": { - "type": "integer" - } - }, - "required": [ - "startPeriod", - "limit" - ] - }, - "ChargingScheduleType": { - "javaType": "ChargingSchedule", - "type": "object", - "additionalProperties": true, - "properties": { - "startSchedule": { - "type": "string", - "format": "date-time" - }, - "duration": { - "type": "integer" - }, - "chargingRateUnit": { - "$ref": "#/definitions/ChargingRateUnitEnumType" - }, - "chargingSchedulePeriod": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ChargingSchedulePeriodType" - }, - "minItems": 1 - }, - "minChargingRate": { - "type": "number" - } - }, - "required": [ - "chargingRateUnit", - "chargingSchedulePeriod" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "chargingSchedule": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ChargingScheduleType" - }, - "minItems": 1 - }, - "evseId": { - "type": "integer" - }, - "chargingLimit": { - "$ref": "#/definitions/ChargingLimitType" - } - }, - "required": [ - "chargingLimit" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyChargingLimitResponse_v1p0.json b/ocpp/v20/schemas/NotifyChargingLimitResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/NotifyChargingLimitResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyCustomerInformationRequest_v1p0.json b/ocpp/v20/schemas/NotifyCustomerInformationRequest_v1p0.json deleted file mode 100644 index b9086c1d2..000000000 --- a/ocpp/v20/schemas/NotifyCustomerInformationRequest_v1p0.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "data": { - "type": "string", - "maxLength": 512 - }, - "tbc": { - "type": "boolean" - }, - "seqNo": { - "type": "integer" - }, - "generatedAt": { - "type": "string", - "format": "date-time" - }, - "requestId": { - "type": "integer" - } - }, - "required": [ - "data", - "tbc", - "seqNo", - "generatedAt" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyCustomerInformationResponse_v1p0.json b/ocpp/v20/schemas/NotifyCustomerInformationResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/NotifyCustomerInformationResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyDisplayMessagesRequest_v1p0.json b/ocpp/v20/schemas/NotifyDisplayMessagesRequest_v1p0.json deleted file mode 100644 index a404c1882..000000000 --- a/ocpp/v20/schemas/NotifyDisplayMessagesRequest_v1p0.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "MessageFormatEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ASCII", - "HTML", - "URI", - "UTF8" - ] - }, - "MessagePriorityEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "AlwaysFront", - "InFront", - "NormalCycle" - ] - }, - "MessageStateEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Charging", - "Faulted", - "Idle", - "Unavailable" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "MessageContentType": { - "javaType": "MessageContent", - "type": "object", - "additionalProperties": true, - "properties": { - "format": { - "$ref": "#/definitions/MessageFormatEnumType" - }, - "language": { - "type": "string", - "maxLength": 8 - }, - "content": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "format", - "content" - ] - }, - "MessageInfoType": { - "javaType": "MessageInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "display": { - "$ref": "#/definitions/ComponentType" - }, - "id": { - "type": "integer" - }, - "priority": { - "$ref": "#/definitions/MessagePriorityEnumType" - }, - "state": { - "$ref": "#/definitions/MessageStateEnumType" - }, - "startDateTime": { - "type": "string", - "format": "date-time" - }, - "endDateTime": { - "type": "string", - "format": "date-time" - }, - "transactionId": { - "type": "string", - "maxLength": 36 - }, - "message": { - "$ref": "#/definitions/MessageContentType" - } - }, - "required": [ - "id", - "priority", - "message" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "messageInfo": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/MessageInfoType" - }, - "minItems": 1 - }, - "requestId": { - "type": "integer" - }, - "tbc": { - "type": "boolean" - } - }, - "required": [ - "requestId", - "tbc", - "messageInfo" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyDisplayMessagesResponse_v1p0.json b/ocpp/v20/schemas/NotifyDisplayMessagesResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/NotifyDisplayMessagesResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyEVChargingNeedsRequest_v1p0.json b/ocpp/v20/schemas/NotifyEVChargingNeedsRequest_v1p0.json deleted file mode 100644 index 6515826df..000000000 --- a/ocpp/v20/schemas/NotifyEVChargingNeedsRequest_v1p0.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "EnergyTransferModeEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "AC_single_phase_core", - "AC_three_phase_core", - "DC_combo_core", - "DC_core", - "DC_extended", - "DC_unique" - ] - }, - "ACChargingParametersType": { - "javaType": "ACChargingParameters", - "type": "object", - "additionalProperties": true, - "properties": { - "energyAmount": { - "type": "integer" - }, - "evMinCurrent": { - "type": "integer" - }, - "evMaxCurrent": { - "type": "integer" - }, - "evMaxVoltage": { - "type": "integer" - } - }, - "required": [ - "energyAmount", - "evMinCurrent", - "evMaxCurrent", - "evMaxVoltage" - ] - }, - "ChargingNeedsType": { - "javaType": "ChargingNeeds", - "type": "object", - "additionalProperties": true, - "properties": { - "acChargingParameters": { - "$ref": "#/definitions/ACChargingParametersType" - }, - "dcChargingParameters": { - "$ref": "#/definitions/DCChargingParametersType" - }, - "requestedEnergyTransfer": { - "$ref": "#/definitions/EnergyTransferModeEnumType" - }, - "departureTime": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "requestedEnergyTransfer" - ] - }, - "DCChargingParametersType": { - "javaType": "DCChargingParameters", - "type": "object", - "additionalProperties": true, - "properties": { - "evMaxCurrent": { - "type": "integer" - }, - "evMaxVoltage": { - "type": "integer" - }, - "energyAmount": { - "type": "integer" - }, - "evMaxPower": { - "type": "integer" - }, - "stateOfCharge": { - "type": "integer", - "minimum": 0.0, - "maximum": 100.0 - }, - "evEnergyCapacity": { - "type": "integer" - }, - "fullSoC": { - "type": "integer", - "minimum": 0.0, - "maximum": 100.0 - }, - "bulkSoC": { - "type": "integer", - "minimum": 0.0, - "maximum": 100.0 - } - }, - "required": [ - "evMaxCurrent", - "evMaxVoltage" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "maxScheduleTuples": { - "type": "integer" - }, - "chargingNeeds": { - "$ref": "#/definitions/ChargingNeedsType" - }, - "evseId": { - "type": "integer" - } - }, - "required": [ - "evseId", - "chargingNeeds" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyEVChargingNeedsResponse_v1p0.json b/ocpp/v20/schemas/NotifyEVChargingNeedsResponse_v1p0.json deleted file mode 100644 index 268f2a526..000000000 --- a/ocpp/v20/schemas/NotifyEVChargingNeedsResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "Processing" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyEVChargingScheduleRequest_v1p0.json b/ocpp/v20/schemas/NotifyEVChargingScheduleRequest_v1p0.json deleted file mode 100644 index 1bc701127..000000000 --- a/ocpp/v20/schemas/NotifyEVChargingScheduleRequest_v1p0.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ChargingRateUnitEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "W", - "A" - ] - }, - "ChargingSchedulePeriodType": { - "javaType": "ChargingSchedulePeriod", - "type": "object", - "additionalProperties": true, - "properties": { - "startPeriod": { - "type": "integer" - }, - "limit": { - "type": "number" - }, - "numberPhases": { - "type": "integer" - }, - "phaseToUse": { - "type": "integer" - } - }, - "required": [ - "startPeriod", - "limit" - ] - }, - "ChargingScheduleType": { - "javaType": "ChargingSchedule", - "type": "object", - "additionalProperties": true, - "properties": { - "startSchedule": { - "type": "string", - "format": "date-time" - }, - "duration": { - "type": "integer" - }, - "chargingRateUnit": { - "$ref": "#/definitions/ChargingRateUnitEnumType" - }, - "chargingSchedulePeriod": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ChargingSchedulePeriodType" - }, - "minItems": 1 - }, - "minChargingRate": { - "type": "number" - } - }, - "required": [ - "chargingRateUnit" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "timeBase": { - "type": "string", - "format": "date-time" - }, - "chargingSchedule": { - "$ref": "#/definitions/ChargingScheduleType" - }, - "evseId": { - "type": "integer" - } - }, - "required": [ - "timeBase", - "evseId", - "chargingSchedule" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyEVChargingScheduleResponse_v1p0.json b/ocpp/v20/schemas/NotifyEVChargingScheduleResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/NotifyEVChargingScheduleResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyEventRequest_v1p0.json b/ocpp/v20/schemas/NotifyEventRequest_v1p0.json deleted file mode 100644 index dbb136f20..000000000 --- a/ocpp/v20/schemas/NotifyEventRequest_v1p0.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "EventTriggerEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Alerting", - "Delta", - "Periodic" - ] - }, - "MonitorEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "UpperThreshold", - "LowerThreshold", - "Delta", - "Periodic", - "PeriodicClockAligned" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EventDataType": { - "javaType": "EventData", - "type": "object", - "additionalProperties": true, - "properties": { - "eventId": { - "type": "integer" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "trigger": { - "$ref": "#/definitions/EventTriggerEnumType" - }, - "cause": { - "type": "integer" - }, - "actualValue": { - "type": "string", - "maxLength": 1000 - }, - "techCode": { - "type": "string", - "maxLength": 50 - }, - "techInfo": { - "type": "string", - "maxLength": 500 - }, - "cleared": { - "type": "boolean" - }, - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - }, - "variableMonitoringEvent": { - "$ref": "#/definitions/VariableMonitoringType" - } - }, - "required": [ - "eventId", - "timestamp", - "trigger", - "actualValue", - "cleared", - "component", - "variable" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "VariableMonitoringType": { - "javaType": "VariableMonitoring", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "value": { - "type": "number" - }, - "type": { - "$ref": "#/definitions/MonitorEnumType" - }, - "severity": { - "type": "integer" - }, - "transaction": { - "type": "boolean" - } - }, - "required": [ - "id", - "value", - "type", - "severity", - "transaction" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "generatedAt": { - "type": "string", - "format": "date-time" - }, - "tbc": { - "type": "boolean", - "default": "false" - }, - "seqNo": { - "type": "integer" - }, - "eventData": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/EventDataType" - }, - "minItems": 1 - } - }, - "required": [ - "generatedAt", - "tbc", - "seqNo", - "eventData" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyEventResponse_v1p0.json b/ocpp/v20/schemas/NotifyEventResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/NotifyEventResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyMonitoringReportRequest_v1p0.json b/ocpp/v20/schemas/NotifyMonitoringReportRequest_v1p0.json deleted file mode 100644 index ffb72d82d..000000000 --- a/ocpp/v20/schemas/NotifyMonitoringReportRequest_v1p0.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "MonitorEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "UpperThreshold", - "LowerThreshold", - "Delta", - "Periodic", - "PeriodicClockAligned" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "MonitoringDataType": { - "javaType": "MonitoringData", - "type": "object", - "additionalProperties": true, - "properties": { - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - }, - "variableMonitoring": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/VariableMonitoringType" - }, - "minItems": 1 - } - }, - "required": [ - "component", - "variable", - "variableMonitoring" - ] - }, - "VariableMonitoringType": { - "javaType": "VariableMonitoring", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "value": { - "type": "number" - }, - "type": { - "$ref": "#/definitions/MonitorEnumType" - }, - "severity": { - "type": "integer" - }, - "transaction": { - "type": "boolean" - } - }, - "required": [ - "id", - "value", - "type", - "severity", - "transaction" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "monitor": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/MonitoringDataType" - }, - "minItems": 1 - }, - "requestId": { - "type": "integer" - }, - "tbc": { - "type": "boolean", - "default": "false" - }, - "seqNo": { - "type": "integer" - }, - "generatedAt": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "tbc", - "seqNo", - "generatedAt", - "monitor" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyMonitoringReportResponse_v1p0.json b/ocpp/v20/schemas/NotifyMonitoringReportResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/NotifyMonitoringReportResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyReportRequest_v1p0.json b/ocpp/v20/schemas/NotifyReportRequest_v1p0.json deleted file mode 100644 index e374d2a3f..000000000 --- a/ocpp/v20/schemas/NotifyReportRequest_v1p0.json +++ /dev/null @@ -1,215 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "AttributeEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Actual", - "Target", - "MinSet", - "MaxSet" - ] - }, - "DataEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "string", - "decimal", - "integer", - "dateTime", - "boolean", - "OptionList", - "SequenceList", - "MemberList" - ] - }, - "MutabilityEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ReadOnly", - "WriteOnly", - "ReadWrite" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "ReportDataType": { - "javaType": "ReportData", - "type": "object", - "additionalProperties": true, - "properties": { - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - }, - "variableAttribute": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/VariableAttributeType" - }, - "minItems": 1, - "maxItems": 4 - }, - "variableCharacteristics": { - "$ref": "#/definitions/VariableCharacteristicsType" - } - }, - "required": [ - "component", - "variable", - "variableAttribute" - ] - }, - "VariableAttributeType": { - "javaType": "VariableAttribute", - "type": "object", - "additionalProperties": true, - "properties": { - "type": { - "$ref": "#/definitions/AttributeEnumType" - }, - "value": { - "type": "string", - "maxLength": 1000 - }, - "mutability": { - "$ref": "#/definitions/MutabilityEnumType" - }, - "persistence": { - "type": "boolean" - }, - "constant": { - "type": "boolean" - } - }, - "required": [ - "value", - "persistence", - "constant" - ] - }, - "VariableCharacteristicsType": { - "javaType": "VariableCharacteristics", - "type": "object", - "additionalProperties": true, - "properties": { - "unit": { - "type": "string", - "maxLength": 16 - }, - "dataType": { - "$ref": "#/definitions/DataEnumType" - }, - "minLimit": { - "type": "number" - }, - "maxLimit": { - "type": "number" - }, - "valuesList": { - "type": "string", - "maxLength": 1000 - }, - "supportsMonitoring": { - "type": "boolean" - } - }, - "required": [ - "dataType", - "supportsMonitoring" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "requestId": { - "type": "integer" - }, - "generatedAt": { - "type": "string", - "format": "date-time" - }, - "reportData": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ReportDataType" - }, - "minItems": 1 - }, - "tbc": { - "type": "boolean", - "default": "false" - }, - "seqNo": { - "type": "integer" - } - }, - "required": [ - "generatedAt", - "tbc", - "seqNo", - "reportData" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/NotifyReportResponse_v1p0.json b/ocpp/v20/schemas/NotifyReportResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/NotifyReportResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/PublishFirmwareRequest_v1p0.json b/ocpp/v20/schemas/PublishFirmwareRequest_v1p0.json deleted file mode 100644 index dae0dd788..000000000 --- a/ocpp/v20/schemas/PublishFirmwareRequest_v1p0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "location": { - "type": "string", - "maxLength": 512 - }, - "retries": { - "type": "integer" - }, - "checksum": { - "type": "string", - "maxLength": 32 - } - }, - "required": [ - "location", - "checksum" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/PublishFirmwareResponse_v1p0.json b/ocpp/v20/schemas/PublishFirmwareResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/PublishFirmwareResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/PublishFirmwareStatusNotificationRequest_v1p0.json b/ocpp/v20/schemas/PublishFirmwareStatusNotificationRequest_v1p0.json deleted file mode 100644 index ec224a7bd..000000000 --- a/ocpp/v20/schemas/PublishFirmwareStatusNotificationRequest_v1p0.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Downloaded", - "DownloadFailed", - "Downloading", - "DownloadScheduled", - "DownloadPaused", - "PublishFailed", - "Published", - "InvalidChecksum", - "ChecksumVerified" - ] - }, - "location": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "status" - ] -} diff --git a/ocpp/v20/schemas/PublishFirmwareStatusNotificationResponse_v1p0.json b/ocpp/v20/schemas/PublishFirmwareStatusNotificationResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/PublishFirmwareStatusNotificationResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/Renegotiate15118ScheduleRequest_v1p0.json b/ocpp/v20/schemas/Renegotiate15118ScheduleRequest_v1p0.json deleted file mode 100644 index 6ed92a5ac..000000000 --- a/ocpp/v20/schemas/Renegotiate15118ScheduleRequest_v1p0.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - } - }, - "required": [ - "evse" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/Renegotiate15118ScheduleResponse_v1p0.json b/ocpp/v20/schemas/Renegotiate15118ScheduleResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/Renegotiate15118ScheduleResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ReportChargingProfilesRequest_v1p0.json b/ocpp/v20/schemas/ReportChargingProfilesRequest_v1p0.json deleted file mode 100644 index f2e4eac81..000000000 --- a/ocpp/v20/schemas/ReportChargingProfilesRequest_v1p0.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ChargingLimitSourceEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "EMS", - "Other", - "SO", - "CSO" - ] - }, - "ChargingProfileKindEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Absolute", - "Recurring", - "Relative" - ] - }, - "ChargingProfilePurposeEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ChargingStationExternalConstraints", - "ChargingStationMaxProfile", - "TxDefaultProfile", - "TxProfile" - ] - }, - "ChargingRateUnitEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "W", - "A" - ] - }, - "RecurrencyKindEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Daily", - "Weekly" - ] - }, - "ChargingProfileType": { - "javaType": "ChargingProfile", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "stackLevel": { - "type": "integer" - }, - "primary": { - "type": "boolean" - }, - "chargingProfilePurpose": { - "$ref": "#/definitions/ChargingProfilePurposeEnumType" - }, - "chargingProfileKind": { - "$ref": "#/definitions/ChargingProfileKindEnumType" - }, - "recurrencyKind": { - "$ref": "#/definitions/RecurrencyKindEnumType" - }, - "validFrom": { - "type": "string", - "format": "date-time" - }, - "validTo": { - "type": "string", - "format": "date-time" - }, - "chargingSchedule": { - "$ref": "#/definitions/ChargingScheduleType" - }, - "transactionId": { - "type": "string", - "maxLength": 36 - } - }, - "required": [ - "id", - "stackLevel", - "chargingProfilePurpose", - "chargingProfileKind", - "chargingSchedule" - ] - }, - "ChargingSchedulePeriodType": { - "javaType": "ChargingSchedulePeriod", - "type": "object", - "additionalProperties": true, - "properties": { - "startPeriod": { - "type": "integer" - }, - "limit": { - "type": "number" - }, - "numberPhases": { - "type": "integer" - }, - "phaseToUse": { - "type": "integer" - } - }, - "required": [ - "startPeriod", - "limit" - ] - }, - "ChargingScheduleType": { - "javaType": "ChargingSchedule", - "type": "object", - "additionalProperties": true, - "properties": { - "startSchedule": { - "type": "string", - "format": "date-time" - }, - "duration": { - "type": "integer" - }, - "chargingRateUnit": { - "$ref": "#/definitions/ChargingRateUnitEnumType" - }, - "chargingSchedulePeriod": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ChargingSchedulePeriodType" - }, - "minItems": 1 - }, - "minChargingRate": { - "type": "number" - } - }, - "required": [ - "chargingRateUnit", - "chargingSchedulePeriod" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "requestId": { - "type": "integer" - }, - "chargingLimitSource": { - "$ref": "#/definitions/ChargingLimitSourceEnumType" - }, - "chargingProfile": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ChargingProfileType" - }, - "minItems": 1 - }, - "tbc": { - "type": "boolean" - }, - "evseId": { - "type": "integer" - } - }, - "required": [ - "chargingLimitSource", - "evseId", - "chargingProfile" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ReportChargingProfilesResponse_v1p0.json b/ocpp/v20/schemas/ReportChargingProfilesResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/ReportChargingProfilesResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/RequestStartTransactionRequest_v1p0.json b/ocpp/v20/schemas/RequestStartTransactionRequest_v1p0.json deleted file mode 100644 index 5305d28dd..000000000 --- a/ocpp/v20/schemas/RequestStartTransactionRequest_v1p0.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ChargingProfileKindEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Absolute", - "Recurring", - "Relative" - ] - }, - "ChargingProfilePurposeEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ChargingStationExternalConstraints", - "ChargingStationMaxProfile", - "TxDefaultProfile", - "TxProfile" - ] - }, - "ChargingRateUnitEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "W", - "A" - ] - }, - "IdTokenEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Central", - "eMAID", - "ISO14443", - "KeyCode", - "Local", - "NoAuthorization", - "ISO15693" - ] - }, - "RecurrencyKindEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Daily", - "Weekly" - ] - }, - "AdditionalInfoType": { - "javaType": "AdditionalInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalIdToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "additionalIdToken", - "type" - ] - }, - "ChargingProfileType": { - "javaType": "ChargingProfile", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "stackLevel": { - "type": "integer" - }, - "primary": { - "type": "boolean" - }, - "chargingProfilePurpose": { - "$ref": "#/definitions/ChargingProfilePurposeEnumType" - }, - "chargingProfileKind": { - "$ref": "#/definitions/ChargingProfileKindEnumType" - }, - "recurrencyKind": { - "$ref": "#/definitions/RecurrencyKindEnumType" - }, - "validFrom": { - "type": "string", - "format": "date-time" - }, - "validTo": { - "type": "string", - "format": "date-time" - }, - "chargingSchedule": { - "$ref": "#/definitions/ChargingScheduleType" - }, - "transactionId": { - "type": "string", - "maxLength": 36 - } - }, - "required": [ - "id", - "stackLevel", - "chargingProfilePurpose", - "chargingProfileKind", - "chargingSchedule" - ] - }, - "ChargingSchedulePeriodType": { - "javaType": "ChargingSchedulePeriod", - "type": "object", - "additionalProperties": true, - "properties": { - "startPeriod": { - "type": "integer" - }, - "limit": { - "type": "number" - }, - "numberPhases": { - "type": "integer" - }, - "phaseToUse": { - "type": "integer" - } - }, - "required": [ - "startPeriod", - "limit" - ] - }, - "ChargingScheduleType": { - "javaType": "ChargingSchedule", - "type": "object", - "additionalProperties": true, - "properties": { - "startSchedule": { - "type": "string", - "format": "date-time" - }, - "duration": { - "type": "integer" - }, - "chargingRateUnit": { - "$ref": "#/definitions/ChargingRateUnitEnumType" - }, - "chargingSchedulePeriod": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ChargingSchedulePeriodType" - }, - "minItems": 1 - }, - "minChargingRate": { - "type": "number" - } - }, - "required": [ - "chargingRateUnit", - "chargingSchedulePeriod" - ] - }, - "IdTokenType": { - "javaType": "IdToken", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalInfo": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/AdditionalInfoType" - }, - "minItems": 1 - }, - "idToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "$ref": "#/definitions/IdTokenEnumType" - } - }, - "required": [ - "idToken", - "type" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "evseId": { - "type": "integer" - }, - "idToken": { - "$ref": "#/definitions/IdTokenType" - }, - "remoteStartId": { - "type": "integer" - }, - "chargingProfile": { - "$ref": "#/definitions/ChargingProfileType" - } - }, - "required": [ - "remoteStartId", - "idToken" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/RequestStartTransactionResponse_v1p0.json b/ocpp/v20/schemas/RequestStartTransactionResponse_v1p0.json deleted file mode 100644 index 3ed196659..000000000 --- a/ocpp/v20/schemas/RequestStartTransactionResponse_v1p0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - }, - "transactionId": { - "type": "string", - "maxLength": 36 - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/RequestStopTransactionRequest_v1p0.json b/ocpp/v20/schemas/RequestStopTransactionRequest_v1p0.json deleted file mode 100644 index c07587106..000000000 --- a/ocpp/v20/schemas/RequestStopTransactionRequest_v1p0.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "transactionId": { - "type": "string", - "maxLength": 36 - } - }, - "required": [ - "transactionId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/RequestStopTransactionResponse_v1p0.json b/ocpp/v20/schemas/RequestStopTransactionResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/RequestStopTransactionResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ReservationStatusUpdateRequest_v1p0.json b/ocpp/v20/schemas/ReservationStatusUpdateRequest_v1p0.json deleted file mode 100644 index 615f9cad6..000000000 --- a/ocpp/v20/schemas/ReservationStatusUpdateRequest_v1p0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "reservationId": { - "type": "integer" - }, - "reservationUpdateStatus": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Expired", - "Removed" - ] - } - }, - "required": [ - "reservationId", - "reservationUpdateStatus" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ReservationStatusUpdateResponse_v1p0.json b/ocpp/v20/schemas/ReservationStatusUpdateResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/ReservationStatusUpdateResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ReserveNowRequest_v1p0.json b/ocpp/v20/schemas/ReserveNowRequest_v1p0.json deleted file mode 100644 index f0198bcdf..000000000 --- a/ocpp/v20/schemas/ReserveNowRequest_v1p0.json +++ /dev/null @@ -1,150 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ConnectorEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "cCCS1", - "cCCS2", - "cG105", - "cTesla", - "cType1", - "cType2", - "s309-1P-16A", - "s309-1P-32A", - "s309-3P-16A", - "s309-3P-32A", - "sBS1361", - "sCEE-7-7", - "sType2", - "sType3", - "Other1PhMax16A", - "Other1PhOver16A", - "Other3Ph", - "Pan", - "wInductive", - "wResonant", - "Undetermined", - "Unknown" - ] - }, - "IdTokenEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Central", - "eMAID", - "ISO14443", - "KeyCode", - "Local", - "NoAuthorization", - "ISO15693" - ] - }, - "AdditionalInfoType": { - "javaType": "AdditionalInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalIdToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "additionalIdToken", - "type" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "IdTokenType": { - "javaType": "IdToken", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalInfo": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/AdditionalInfoType" - }, - "minItems": 1 - }, - "idToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "$ref": "#/definitions/IdTokenEnumType" - } - }, - "required": [ - "idToken", - "type" - ] - }, - "ReservationType": { - "javaType": "Reservation", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "id": { - "type": "integer" - }, - "expiryDateTime": { - "type": "string", - "format": "date-time" - }, - "connectorCode": { - "$ref": "#/definitions/ConnectorEnumType" - } - }, - "required": [ - "id", - "expiryDateTime", - "evse" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "idToken": { - "$ref": "#/definitions/IdTokenType" - }, - "groupIdToken": { - "$ref": "#/definitions/IdTokenType" - }, - "reservation": { - "$ref": "#/definitions/ReservationType" - } - }, - "required": [ - "idToken", - "reservation" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ReserveNowResponse_v1p0.json b/ocpp/v20/schemas/ReserveNowResponse_v1p0.json deleted file mode 100644 index da6ea53ac..000000000 --- a/ocpp/v20/schemas/ReserveNowResponse_v1p0.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Faulted", - "Occupied", - "Rejected", - "Unavailable" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ResetRequest_v1p0.json b/ocpp/v20/schemas/ResetRequest_v1p0.json deleted file mode 100644 index c52f98a68..000000000 --- a/ocpp/v20/schemas/ResetRequest_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "type": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Immediate", - "OnIdle" - ] - } - }, - "required": [ - "type" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/ResetResponse_v1p0.json b/ocpp/v20/schemas/ResetResponse_v1p0.json deleted file mode 100644 index e839d6d2d..000000000 --- a/ocpp/v20/schemas/ResetResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "Scheduled" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SecurityEventNotificationRequest_v1p0.json b/ocpp/v20/schemas/SecurityEventNotificationRequest_v1p0.json deleted file mode 100644 index d2ea5defe..000000000 --- a/ocpp/v20/schemas/SecurityEventNotificationRequest_v1p0.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "type": { - "type": "string", - "additionalProperties": true, - "enum": [ - "FirmwareUpdated", - "FailedToAuthenticateAtCsms", - "CsmsFailedToAuthenticate", - "SettingSystemTime", - "StartupOfTheDevice", - "ResetOrReboot", - "SecurityLogWasCleared", - "ReconfigurationOfSecurityParameters", - "MemoryExhaustion", - "InvalidMessages", - "AttemptedReplayAttacks", - "TamperDetectionActivated", - "InvalidFirmwareSignature", - "InvalidFirmwareSigningCertificate", - "InvalidCsmsCertificate", - "InvalidChargingStationCertificate", - "InvalidTLSVersion", - "InvalidTLSCipherSuite" - ] - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "type", - "timestamp" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SecurityEventNotificationResponse_v1p0.json b/ocpp/v20/schemas/SecurityEventNotificationResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/SecurityEventNotificationResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SendLocalListRequest_v1p0.json b/ocpp/v20/schemas/SendLocalListRequest_v1p0.json deleted file mode 100644 index 6482dc2e2..000000000 --- a/ocpp/v20/schemas/SendLocalListRequest_v1p0.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "AuthorizationStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Blocked", - "ConcurrentTx", - "Expired", - "Invalid", - "NoCredit", - "NotAllowedTypeEVSE", - "NotAtThisLocation", - "NotAtThisTime", - "Unknown" - ] - }, - "IdTokenEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Central", - "eMAID", - "ISO14443", - "KeyCode", - "Local", - "NoAuthorization", - "ISO15693" - ] - }, - "MessageFormatEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ASCII", - "HTML", - "URI", - "UTF8" - ] - }, - "UpdateEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Differential", - "Full" - ] - }, - "AdditionalInfoType": { - "javaType": "AdditionalInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalIdToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "additionalIdToken", - "type" - ] - }, - "AuthorizationData": { - "javaType": "AuthorizationData", - "type": "object", - "additionalProperties": true, - "properties": { - "idToken": { - "$ref": "#/definitions/IdTokenType" - }, - "idTokenInfo": { - "$ref": "#/definitions/IdTokenInfoType" - } - }, - "required": [ - "idToken" - ] - }, - "GroupIdTokenType": { - "javaType": "GroupIdToken", - "type": "object", - "additionalProperties": true, - "properties": { - "idToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "$ref": "#/definitions/IdTokenEnumType" - } - }, - "required": [ - "idToken", - "type" - ] - }, - "IdTokenInfoType": { - "javaType": "IdTokenInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "$ref": "#/definitions/AuthorizationStatusEnumType" - }, - "cacheExpiryDateTime": { - "type": "string", - "format": "date-time" - }, - "chargingPriority": { - "type": "integer" - }, - "groupIdToken": { - "$ref": "#/definitions/GroupIdTokenType" - }, - "language1": { - "type": "string", - "maxLength": 8 - }, - "language2": { - "type": "string", - "maxLength": 8 - }, - "personalMessage": { - "$ref": "#/definitions/MessageContentType" - } - }, - "required": [ - "status" - ] - }, - "IdTokenType": { - "javaType": "IdToken", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalInfo": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/AdditionalInfoType" - }, - "minItems": 1 - }, - "idToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "$ref": "#/definitions/IdTokenEnumType" - } - }, - "required": [ - "idToken", - "type" - ] - }, - "MessageContentType": { - "javaType": "MessageContent", - "type": "object", - "additionalProperties": true, - "properties": { - "format": { - "$ref": "#/definitions/MessageFormatEnumType" - }, - "language": { - "type": "string", - "maxLength": 8 - }, - "content": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "format", - "content" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "localAuthorizationList": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/AuthorizationData" - }, - "minItems": 1 - }, - "versionNumber": { - "type": "integer" - }, - "updateType": { - "$ref": "#/definitions/UpdateEnumType" - } - }, - "required": [ - "versionNumber", - "updateType" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SendLocalListResponse_v1p0.json b/ocpp/v20/schemas/SendLocalListResponse_v1p0.json deleted file mode 100644 index 8fd3949aa..000000000 --- a/ocpp/v20/schemas/SendLocalListResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Failed", - "VersionMismatch" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetChargingProfileRequest_v1p0.json b/ocpp/v20/schemas/SetChargingProfileRequest_v1p0.json deleted file mode 100644 index bdf6023d8..000000000 --- a/ocpp/v20/schemas/SetChargingProfileRequest_v1p0.json +++ /dev/null @@ -1,157 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ChargingProfileKindEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Absolute", - "Recurring", - "Relative" - ] - }, - "ChargingProfilePurposeEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ChargingStationExternalConstraints", - "ChargingStationMaxProfile", - "TxDefaultProfile", - "TxProfile" - ] - }, - "ChargingRateUnitEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "W", - "A" - ] - }, - "RecurrencyKindEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Daily", - "Weekly" - ] - }, - "ChargingProfileType": { - "javaType": "ChargingProfile", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "stackLevel": { - "type": "integer" - }, - "primary": { - "type": "boolean" - }, - "chargingProfilePurpose": { - "$ref": "#/definitions/ChargingProfilePurposeEnumType" - }, - "chargingProfileKind": { - "$ref": "#/definitions/ChargingProfileKindEnumType" - }, - "recurrencyKind": { - "$ref": "#/definitions/RecurrencyKindEnumType" - }, - "validFrom": { - "type": "string", - "format": "date-time" - }, - "validTo": { - "type": "string", - "format": "date-time" - }, - "chargingSchedule": { - "$ref": "#/definitions/ChargingScheduleType" - }, - "transactionId": { - "type": "string", - "maxLength": 36 - } - }, - "required": [ - "id", - "stackLevel", - "chargingProfilePurpose", - "chargingProfileKind", - "chargingSchedule" - ] - }, - "ChargingSchedulePeriodType": { - "javaType": "ChargingSchedulePeriod", - "type": "object", - "additionalProperties": true, - "properties": { - "startPeriod": { - "type": "integer" - }, - "limit": { - "type": "number" - }, - "numberPhases": { - "type": "integer" - }, - "phaseToUse": { - "type": "integer" - } - }, - "required": [ - "startPeriod", - "limit" - ] - }, - "ChargingScheduleType": { - "javaType": "ChargingSchedule", - "type": "object", - "additionalProperties": true, - "properties": { - "startSchedule": { - "type": "string", - "format": "date-time" - }, - "duration": { - "type": "integer" - }, - "chargingRateUnit": { - "$ref": "#/definitions/ChargingRateUnitEnumType" - }, - "chargingSchedulePeriod": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/ChargingSchedulePeriodType" - }, - "minItems": 1 - }, - "minChargingRate": { - "type": "number" - } - }, - "required": [ - "chargingRateUnit", - "chargingSchedulePeriod" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "evseId": { - "type": "integer" - }, - "chargingProfile": { - "$ref": "#/definitions/ChargingProfileType" - } - }, - "required": [ - "evseId", - "chargingProfile" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetChargingProfileResponse_v1p0.json b/ocpp/v20/schemas/SetChargingProfileResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/SetChargingProfileResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetDisplayMessageRequest_v1p0.json b/ocpp/v20/schemas/SetDisplayMessageRequest_v1p0.json deleted file mode 100644 index 24dcf89ab..000000000 --- a/ocpp/v20/schemas/SetDisplayMessageRequest_v1p0.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "MessageFormatEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ASCII", - "HTML", - "URI", - "UTF8" - ] - }, - "MessagePriorityEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "AlwaysFront", - "InFront", - "NormalCycle" - ] - }, - "MessageStateEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Charging", - "Faulted", - "Idle", - "Unavailable" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "MessageContentType": { - "javaType": "MessageContent", - "type": "object", - "additionalProperties": true, - "properties": { - "format": { - "$ref": "#/definitions/MessageFormatEnumType" - }, - "language": { - "type": "string", - "maxLength": 8 - }, - "content": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "format", - "content" - ] - }, - "MessageInfoType": { - "javaType": "MessageInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "display": { - "$ref": "#/definitions/ComponentType" - }, - "id": { - "type": "integer" - }, - "priority": { - "$ref": "#/definitions/MessagePriorityEnumType" - }, - "state": { - "$ref": "#/definitions/MessageStateEnumType" - }, - "startDateTime": { - "type": "string", - "format": "date-time" - }, - "endDateTime": { - "type": "string", - "format": "date-time" - }, - "transactionId": { - "type": "string", - "maxLength": 36 - }, - "message": { - "$ref": "#/definitions/MessageContentType" - } - }, - "required": [ - "id", - "priority", - "message" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "message": { - "$ref": "#/definitions/MessageInfoType" - } - }, - "required": [ - "message" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetDisplayMessageResponse_v1p0.json b/ocpp/v20/schemas/SetDisplayMessageResponse_v1p0.json deleted file mode 100644 index a2a5431c4..000000000 --- a/ocpp/v20/schemas/SetDisplayMessageResponse_v1p0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "NotSupportedMessageFormat", - "Rejected", - "NotSupportedPriority", - "NotSupportedState", - "UnknownTransaction" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetMonitoringBaseRequest_v1p0.json b/ocpp/v20/schemas/SetMonitoringBaseRequest_v1p0.json deleted file mode 100644 index 7808ad5f1..000000000 --- a/ocpp/v20/schemas/SetMonitoringBaseRequest_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "monitoringBase": { - "type": "string", - "additionalProperties": true, - "enum": [ - "All", - "FactoryDefault", - "None" - ] - } - }, - "required": [ - "monitoringBase" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetMonitoringBaseResponse_v1p0.json b/ocpp/v20/schemas/SetMonitoringBaseResponse_v1p0.json deleted file mode 100644 index 59370c308..000000000 --- a/ocpp/v20/schemas/SetMonitoringBaseResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "NotSupported" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetMonitoringLevelRequest_v1p0.json b/ocpp/v20/schemas/SetMonitoringLevelRequest_v1p0.json deleted file mode 100644 index 723338a6d..000000000 --- a/ocpp/v20/schemas/SetMonitoringLevelRequest_v1p0.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "severity": { - "type": "integer" - } - }, - "required": [ - "severity" - ] -} - diff --git a/ocpp/v20/schemas/SetMonitoringLevelResponse_v1p0.json b/ocpp/v20/schemas/SetMonitoringLevelResponse_v1p0.json deleted file mode 100644 index 8b143014a..000000000 --- a/ocpp/v20/schemas/SetMonitoringLevelResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} - diff --git a/ocpp/v20/schemas/SetNetworkProfileRequest_v1p0.json b/ocpp/v20/schemas/SetNetworkProfileRequest_v1p0.json deleted file mode 100644 index 3972a9380..000000000 --- a/ocpp/v20/schemas/SetNetworkProfileRequest_v1p0.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "APNAuthenticationEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "CHAP", - "NONE", - "PAP", - "AUTO" - ] - }, - "OCPPInterfaceEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Wired0", - "Wired1", - "Wired2", - "Wired3", - "Wireless0", - "Wireless1", - "Wireless2", - "Wireless3" - ] - }, - "OCPPTransportEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "JSON", - "SOAP" - ] - }, - "OCPPVersionEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "OCPP12", - "OCPP15", - "OCPP16", - "OCPP20" - ] - }, - "VPNEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "IKEv2", - "IPSec", - "L2TP", - "PPTP" - ] - }, - "APNType": { - "javaType": "APN", - "type": "object", - "additionalProperties": true, - "properties": { - "apn": { - "type": "string", - "maxLength": 512 - }, - "apnUserName": { - "type": "string", - "maxLength": 20 - }, - "apnPassword": { - "type": "string", - "maxLength": 20 - }, - "simPin": { - "type": "integer" - }, - "preferredNetwork": { - "type": "string", - "maxLength": 6 - }, - "useOnlyPreferredNetwork": { - "type": "boolean" - }, - "apnAuthentication": { - "$ref": "#/definitions/APNAuthenticationEnumType" - } - }, - "required": [ - "apn", - "apnAuthentication" - ] - }, - "NetworkConnectionProfileType": { - "javaType": "NetworkConnectionProfile", - "type": "object", - "additionalProperties": true, - "properties": { - "apn": { - "$ref": "#/definitions/APNType" - }, - "ocppVersion": { - "$ref": "#/definitions/OCPPVersionEnumType" - }, - "ocppTransport": { - "$ref": "#/definitions/OCPPTransportEnumType" - }, - "ocppCsmsUrl": { - "type": "string", - "maxLength": 512 - }, - "messageTimeout": { - "type": "integer" - }, - "ocppInterface": { - "$ref": "#/definitions/OCPPInterfaceEnumType" - }, - "vpn": { - "$ref": "#/definitions/VPNType" - } - }, - "required": [ - "ocppVersion", - "ocppTransport", - "ocppCsmsUrl", - "messageTimeout", - "ocppInterface" - ] - }, - "VPNType": { - "javaType": "VPN", - "type": "object", - "additionalProperties": true, - "properties": { - "server": { - "type": "string", - "maxLength": 512 - }, - "user": { - "type": "string", - "maxLength": 20 - }, - "group": { - "type": "string", - "maxLength": 20 - }, - "password": { - "type": "string", - "maxLength": 20 - }, - "key": { - "type": "string", - "maxLength": 255 - }, - "type": { - "$ref": "#/definitions/VPNEnumType" - } - }, - "required": [ - "server", - "user", - "password", - "key", - "type" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "configurationSlot": { - "type": "integer" - }, - "connectionData": { - "$ref": "#/definitions/NetworkConnectionProfileType" - } - }, - "required": [ - "configurationSlot", - "connectionData" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetNetworkProfileResponse_v1p0.json b/ocpp/v20/schemas/SetNetworkProfileResponse_v1p0.json deleted file mode 100644 index 896af00ac..000000000 --- a/ocpp/v20/schemas/SetNetworkProfileResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "Failed" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetVariableMonitoringRequest_v1p0.json b/ocpp/v20/schemas/SetVariableMonitoringRequest_v1p0.json deleted file mode 100644 index 8f45e028b..000000000 --- a/ocpp/v20/schemas/SetVariableMonitoringRequest_v1p0.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "MonitorEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "UpperThreshold", - "LowerThreshold", - "Delta", - "Periodic", - "PeriodicClockAligned" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "SetMonitoringDataType": { - "javaType": "SetMonitoringData", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "value": { - "type": "number" - }, - "type": { - "$ref": "#/definitions/MonitorEnumType" - }, - "severity": { - "type": "integer" - }, - "transaction": { - "type": "boolean" - }, - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - } - }, - "required": [ - "value", - "type", - "severity", - "component", - "variable" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "setMonitoringData": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/SetMonitoringDataType" - }, - "minItems": 1 - } - }, - "required": [ - "setMonitoringData" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetVariableMonitoringResponse_v1p0.json b/ocpp/v20/schemas/SetVariableMonitoringResponse_v1p0.json deleted file mode 100644 index 07d93730f..000000000 --- a/ocpp/v20/schemas/SetVariableMonitoringResponse_v1p0.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "MonitorEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "UpperThreshold", - "LowerThreshold", - "Delta", - "Periodic", - "PeriodicClockAligned" - ] - }, - "SetMonitoringStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "UnknownComponent", - "UnknownVariable", - "UnsupportedMonitorType", - "Rejected", - "OutOfRange", - "Duplicate" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "SetMonitoringResultType": { - "javaType": "SetMonitoringResult", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "type": { - "$ref": "#/definitions/MonitorEnumType" - }, - "severity": { - "type": "integer" - }, - "status": { - "$ref": "#/definitions/SetMonitoringStatusEnumType" - }, - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - } - }, - "required": [ - "type", - "severity", - "status", - "component", - "variable" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "setMonitoringResult": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/SetMonitoringResultType" - }, - "minItems": 1 - } - }, - "required": [ - "setMonitoringResult" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetVariablesRequest_v1p0.json b/ocpp/v20/schemas/SetVariablesRequest_v1p0.json deleted file mode 100644 index 32424c9cb..000000000 --- a/ocpp/v20/schemas/SetVariablesRequest_v1p0.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "AttributeEnumType": { - "type": "string", - "default": "Actual", - "additionalProperties": true, - "enum": [ - "Actual", - "Target", - "MinSet", - "MaxSet" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "SetVariableDataType": { - "javaType": "SetVariableData", - "type": "object", - "additionalProperties": true, - "properties": { - "attributeType": { - "$ref": "#/definitions/AttributeEnumType" - }, - "attributeValue": { - "type": "string", - "maxLength": 1000 - }, - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - } - }, - "required": [ - "attributeValue", - "component", - "variable" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "setVariableData": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/SetVariableDataType" - }, - "minItems": 1 - } - }, - "required": [ - "setVariableData" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SetVariablesResponse_v1p0.json b/ocpp/v20/schemas/SetVariablesResponse_v1p0.json deleted file mode 100644 index 4ae7f683a..000000000 --- a/ocpp/v20/schemas/SetVariablesResponse_v1p0.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "AttributeEnumType": { - "type": "string", - "default": "Actual", - "additionalProperties": true, - "enum": [ - "Actual", - "Target", - "MinSet", - "MaxSet" - ] - }, - "SetVariableStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "InvalidValue", - "UnknownComponent", - "UnknownVariable", - "NotSupportedAttributeType", - "OutOfRange", - "RebootRequired" - ] - }, - "ComponentType": { - "javaType": "Component", - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "SetVariableResultType": { - "javaType": "SetVariableResult", - "type": "object", - "additionalProperties": true, - "properties": { - "attributeType": { - "$ref": "#/definitions/AttributeEnumType" - }, - "attributeStatus": { - "$ref": "#/definitions/SetVariableStatusEnumType" - }, - "component": { - "$ref": "#/definitions/ComponentType" - }, - "variable": { - "$ref": "#/definitions/VariableType" - } - }, - "required": [ - "attributeStatus", - "component", - "variable" - ] - }, - "VariableType": { - "javaType": "Variable", - "type": "object", - "additionalProperties": true, - "properties": { - "name": { - "type": "string", - "maxLength": 50 - }, - "instance": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "name" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "setVariableResult": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/SetVariableResultType" - }, - "minItems": 1 - } - }, - "required": [ - "setVariableResult" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SignCertificateRequest_v1p0.json b/ocpp/v20/schemas/SignCertificateRequest_v1p0.json deleted file mode 100644 index e3b212769..000000000 --- a/ocpp/v20/schemas/SignCertificateRequest_v1p0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "csr": { - "type": "string", - "maxLength": 800 - }, - "typeOfCertificate": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ChargingStationCertificate", - "V2GCertificate" - ] - } - }, - "required": [ - "csr" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/SignCertificateResponse_v1p0.json b/ocpp/v20/schemas/SignCertificateResponse_v1p0.json deleted file mode 100644 index 5cd67bdf0..000000000 --- a/ocpp/v20/schemas/SignCertificateResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/StatusNotificationRequest_v1p0.json b/ocpp/v20/schemas/StatusNotificationRequest_v1p0.json deleted file mode 100644 index 2759d6fa2..000000000 --- a/ocpp/v20/schemas/StatusNotificationRequest_v1p0.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "timestamp": { - "type": "string", - "format": "date-time" - }, - "connectorStatus": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Available", - "Occupied", - "Reserved", - "Unavailable", - "Faulted" - ] - }, - "evseId": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "timestamp", - "connectorStatus", - "evseId", - "connectorId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/StatusNotificationResponse_v1p0.json b/ocpp/v20/schemas/StatusNotificationResponse_v1p0.json deleted file mode 100644 index 49b69e9fd..000000000 --- a/ocpp/v20/schemas/StatusNotificationResponse_v1p0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true -} \ No newline at end of file diff --git a/ocpp/v20/schemas/TransactionEventRequest_v1p0.json b/ocpp/v20/schemas/TransactionEventRequest_v1p0.json deleted file mode 100644 index 66b30a018..000000000 --- a/ocpp/v20/schemas/TransactionEventRequest_v1p0.json +++ /dev/null @@ -1,414 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "ChargingStateEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Charging", - "EVDetected", - "SuspendedEV", - "SuspendedEVSE" - ] - }, - "EncodingMethodEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Other", - "DLMS Message", - "COSEM Protected Data", - "EDL" - ] - }, - "IdTokenEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Central", - "eMAID", - "ISO14443", - "KeyCode", - "Local", - "NoAuthorization", - "ISO15693" - ] - }, - "LocationEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Body", - "Cable", - "EV", - "Inlet", - "Outlet" - ] - }, - "MeasurandEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Current.Export", - "Current.Import", - "Current.Offered", - "Energy.Active.Export.Register", - "Energy.Active.Import.Register", - "Energy.Reactive.Export.Register", - "Energy.Reactive.Import.Register", - "Energy.Active.Export.Interval", - "Energy.Active.Import.Interval", - "Energy.Active.Net", - "Energy.Reactive.Export.Interval", - "Energy.Reactive.Import.Interval", - "Energy.Reactive.Net", - "Energy.Apparent.Net", - "Energy.Apparent.Import", - "Energy.Apparent.Export", - "Frequency", - "Power.Active.Export", - "Power.Active.Import", - "Power.Factor", - "Power.Offered", - "Power.Reactive.Export", - "Power.Reactive.Import", - "SoC", - "Voltage" - ] - }, - "PhaseEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "L1", - "L2", - "L3", - "N", - "L1-N", - "L2-N", - "L3-N", - "L1-L2", - "L2-L3", - "L3-L1" - ] - }, - "ReadingContextEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Interruption.Begin", - "Interruption.End", - "Other", - "Sample.Clock", - "Sample.Periodic", - "Transaction.Begin", - "Transaction.End", - "Trigger" - ] - }, - "ReasonEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "DeAuthorized", - "EmergencyStop", - "EnergyLimitReached", - "EVDisconnected", - "GroundFault", - "ImmediateReset", - "Local", - "LocalOutOfCredit", - "MasterPass", - "Other", - "OvercurrentFault", - "PowerLoss", - "PowerQuality", - "Reboot", - "Remote", - "SOCLimitReached", - "StoppedByEV", - "TimeLimitReached", - "Timeout", - "UnlockCommand" - ] - }, - "SignatureMethodEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ECDSAP256SHA256", - "ECDSAP384SHA384", - "ECDSA192SHA256" - ] - }, - "TransactionEventEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Ended", - "Started", - "Updated" - ] - }, - "TriggerReasonEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Authorized", - "CablePluggedIn", - "ChargingRateChanged", - "ChargingStateChanged", - "Deauthorized", - "EnergyLimitReached", - "EVCommunicationLost", - "EVConnectTimeout", - "MeterValueClock", - "MeterValuePeriodic", - "TimeLimitReached", - "Trigger", - "UnlockCommand", - "StopAuthorized", - "EVDeparted", - "EVDetected", - "RemoteStop", - "RemoteStart" - ] - }, - "AdditionalInfoType": { - "javaType": "AdditionalInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalIdToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "type": "string", - "maxLength": 50 - } - }, - "required": [ - "additionalIdToken", - "type" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "IdTokenType": { - "javaType": "IdToken", - "type": "object", - "additionalProperties": true, - "properties": { - "additionalInfo": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/AdditionalInfoType" - }, - "minItems": 1 - }, - "idToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "$ref": "#/definitions/IdTokenEnumType" - } - }, - "required": [ - "idToken", - "type" - ] - }, - "MeterValueType": { - "javaType": "MeterValue", - "type": "object", - "additionalProperties": true, - "properties": { - "sampledValue": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/SampledValueType" - }, - "minItems": 1 - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "timestamp", - "sampledValue" - ] - }, - "SampledValueType": { - "javaType": "SampledValue", - "type": "object", - "additionalProperties": true, - "properties": { - "value": { - "type": "number" - }, - "context": { - "$ref": "#/definitions/ReadingContextEnumType" - }, - "measurand": { - "$ref": "#/definitions/MeasurandEnumType" - }, - "phase": { - "$ref": "#/definitions/PhaseEnumType" - }, - "location": { - "$ref": "#/definitions/LocationEnumType" - }, - "signedMeterValue": { - "$ref": "#/definitions/SignedMeterValueType" - }, - "unitOfMeasure": { - "$ref": "#/definitions/UnitOfMeasureType" - } - }, - "required": [ - "value" - ] - }, - "SignedMeterValueType": { - "javaType": "SignedMeterValue", - "type": "object", - "additionalProperties": true, - "properties": { - "meterValueSignature": { - "type": "string", - "maxLength": 2500 - }, - "signatureMethod": { - "$ref": "#/definitions/SignatureMethodEnumType" - }, - "encodingMethod": { - "$ref": "#/definitions/EncodingMethodEnumType" - }, - "encodedMeterValue": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "meterValueSignature", - "signatureMethod", - "encodingMethod", - "encodedMeterValue" - ] - }, - "TransactionType": { - "javaType": "Transaction", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "string", - "maxLength": 36 - }, - "chargingState": { - "$ref": "#/definitions/ChargingStateEnumType" - }, - "timeSpentCharging": { - "type": "integer" - }, - "stoppedReason": { - "$ref": "#/definitions/ReasonEnumType" - }, - "remoteStartId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - }, - "UnitOfMeasureType": { - "javaType": "UnitOfMeasure", - "type": "object", - "additionalProperties": true, - "properties": { - "unit": { - "type": "string", - "maxLength": 20 - }, - "multiplier": { - "type": "integer" - } - } - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "eventType": { - "$ref": "#/definitions/TransactionEventEnumType" - }, - "meterValue": { - "type": "array", - "additionalItems": false, - "items": { - "$ref": "#/definitions/MeterValueType" - }, - "minItems": 1 - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "triggerReason": { - "$ref": "#/definitions/TriggerReasonEnumType" - }, - "seqNo": { - "type": "integer" - }, - "offline": { - "type": "boolean" - }, - "numberOfPhasesUsed": { - "type": "integer" - }, - "cableMaxCurrent": { - "type": "number" - }, - "reservationId": { - "type": "integer" - }, - "transactionData": { - "$ref": "#/definitions/TransactionType" - }, - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "idToken": { - "$ref": "#/definitions/IdTokenType" - } - }, - "required": [ - "eventType", - "timestamp", - "triggerReason", - "seqNo", - "transactionData" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/TransactionEventResponse_v1p0.json b/ocpp/v20/schemas/TransactionEventResponse_v1p0.json deleted file mode 100644 index c89e9ef4b..000000000 --- a/ocpp/v20/schemas/TransactionEventResponse_v1p0.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "AuthorizationStatusEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Blocked", - "ConcurrentTx", - "Expired", - "Invalid", - "NoCredit", - "NotAllowedTypeEVSE", - "NotAtThisLocation", - "NotAtThisTime", - "Unknown" - ] - }, - "IdTokenEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Central", - "eMAID", - "ISO14443", - "KeyCode", - "Local", - "NoAuthorization", - "ISO15693" - ] - }, - "MessageFormatEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "ASCII", - "HTML", - "URI", - "UTF8" - ] - }, - "GroupIdTokenType": { - "javaType": "GroupIdToken", - "type": "object", - "additionalProperties": true, - "properties": { - "idToken": { - "type": "string", - "maxLength": 36 - }, - "type": { - "$ref": "#/definitions/IdTokenEnumType" - } - }, - "required": [ - "idToken", - "type" - ] - }, - "IdTokenInfoType": { - "javaType": "IdTokenInfo", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "$ref": "#/definitions/AuthorizationStatusEnumType" - }, - "cacheExpiryDateTime": { - "type": "string", - "format": "date-time" - }, - "chargingPriority": { - "type": "integer" - }, - "groupIdToken": { - "$ref": "#/definitions/GroupIdTokenType" - }, - "language1": { - "type": "string", - "maxLength": 8 - }, - "language2": { - "type": "string", - "maxLength": 8 - }, - "personalMessage": { - "$ref": "#/definitions/MessageContentType" - } - }, - "required": [ - "status" - ] - }, - "MessageContentType": { - "javaType": "MessageContent", - "type": "object", - "additionalProperties": true, - "properties": { - "format": { - "$ref": "#/definitions/MessageFormatEnumType" - }, - "language": { - "type": "string", - "maxLength": 8 - }, - "content": { - "type": "string", - "maxLength": 512 - } - }, - "required": [ - "format", - "content" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "totalCost": { - "type": "number" - }, - "chargingPriority": { - "type": "integer" - }, - "idTokenInfo": { - "$ref": "#/definitions/IdTokenInfoType" - }, - "updatedPersonalMessage": { - "$ref": "#/definitions/MessageContentType" - } - } -} \ No newline at end of file diff --git a/ocpp/v20/schemas/TriggerMessageRequest_v1p0.json b/ocpp/v20/schemas/TriggerMessageRequest_v1p0.json deleted file mode 100644 index 8c6c96ff7..000000000 --- a/ocpp/v20/schemas/TriggerMessageRequest_v1p0.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "MessageTriggerEnumType": { - "type": "string", - "additionalProperties": true, - "enum": [ - "BootNotification", - "LogStatusNotification", - "FirmwareStatusNotification", - "Heartbeat", - "MeterValues", - "SignChargingStationCertificate", - "SignV2GCertificate", - "StatusNotification", - "TransactionEvent" - ] - }, - "EVSEType": { - "javaType": "EVSE", - "type": "object", - "additionalProperties": true, - "properties": { - "id": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "id" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "evse": { - "$ref": "#/definitions/EVSEType" - }, - "requestedMessage": { - "$ref": "#/definitions/MessageTriggerEnumType" - } - }, - "required": [ - "requestedMessage" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/TriggerMessageResponse_v1p0.json b/ocpp/v20/schemas/TriggerMessageResponse_v1p0.json deleted file mode 100644 index 9147d7c04..000000000 --- a/ocpp/v20/schemas/TriggerMessageResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "NotImplemented" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/UnlockConnectorRequest_v1p0.json b/ocpp/v20/schemas/UnlockConnectorRequest_v1p0.json deleted file mode 100644 index 6f86c6db2..000000000 --- a/ocpp/v20/schemas/UnlockConnectorRequest_v1p0.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "evseId": { - "type": "integer" - }, - "connectorId": { - "type": "integer" - } - }, - "required": [ - "evseId", - "connectorId" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/UnlockConnectorResponse_v1p0.json b/ocpp/v20/schemas/UnlockConnectorResponse_v1p0.json deleted file mode 100644 index 4b06ee55c..000000000 --- a/ocpp/v20/schemas/UnlockConnectorResponse_v1p0.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Unlocked", - "UnlockFailed" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/UnpublishFirmwareRequest_v1p0.json b/ocpp/v20/schemas/UnpublishFirmwareRequest_v1p0.json deleted file mode 100644 index 4f3e8cc94..000000000 --- a/ocpp/v20/schemas/UnpublishFirmwareRequest_v1p0.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "checksum": { - "type": "string", - "maxLength": 32 - } - }, - "required": [ - "checksum" - ] -} diff --git a/ocpp/v20/schemas/UnpublishFirmwareResponse_v1p0.json b/ocpp/v20/schemas/UnpublishFirmwareResponse_v1p0.json deleted file mode 100644 index 2fa6589ac..000000000 --- a/ocpp/v20/schemas/UnpublishFirmwareResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "DownloadOngoing", - "NoFirmware", - "Unpublished" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/Update15118EVCertificateRequest_v1p0.json b/ocpp/v20/schemas/Update15118EVCertificateRequest_v1p0.json deleted file mode 100644 index 694c39fdf..000000000 --- a/ocpp/v20/schemas/Update15118EVCertificateRequest_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "15118SchemaVersion": { - "type": "string", - "maxLength": 50 - }, - "exiRequest": { - "type": "string", - "maxLength": 5500 - } - }, - "required": [ - "15118SchemaVersion", - "exiRequest" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/Update15118EVCertificateResponse_v1p0.json b/ocpp/v20/schemas/Update15118EVCertificateResponse_v1p0.json deleted file mode 100644 index fa02e958d..000000000 --- a/ocpp/v20/schemas/Update15118EVCertificateResponse_v1p0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Failed" - ] - }, - "exiResponse": { - "type": "string", - "maxLength": 5500 - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/UpdateFirmwareRequest_v1p0.json b/ocpp/v20/schemas/UpdateFirmwareRequest_v1p0.json deleted file mode 100644 index 67bc70084..000000000 --- a/ocpp/v20/schemas/UpdateFirmwareRequest_v1p0.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "definitions": { - "FirmwareType": { - "javaType": "Firmware", - "type": "object", - "additionalProperties": true, - "properties": { - "location": { - "type": "string", - "maxLength": 512 - }, - "retrieveDateTime": { - "type": "string", - "format": "date-time" - }, - "installDateTime": { - "type": "string", - "format": "date-time" - }, - "signingCertificate": { - "type": "string", - "maxLength": 800 - }, - "signature": { - "type": "string", - "maxLength": 800 - } - }, - "required": [ - "location", - "retrieveDateTime" - ] - } - }, - "type": "object", - "additionalProperties": true, - "properties": { - "retries": { - "type": "integer" - }, - "retryInterval": { - "type": "integer" - }, - "requestId": { - "type": "integer" - }, - "firmware": { - "$ref": "#/definitions/FirmwareType" - } - }, - "required": [ - "requestId", - "firmware" - ] -} \ No newline at end of file diff --git a/ocpp/v20/schemas/UpdateFirmwareResponse_v1p0.json b/ocpp/v20/schemas/UpdateFirmwareResponse_v1p0.json deleted file mode 100644 index 058700949..000000000 --- a/ocpp/v20/schemas/UpdateFirmwareResponse_v1p0.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "comment": "OCPP 2.0 - v1p0", - "type": "object", - "additionalProperties": true, - "properties": { - "status": { - "type": "string", - "additionalProperties": true, - "enum": [ - "Accepted", - "Rejected", - "AcceptedCanceled" - ] - } - }, - "required": [ - "status" - ] -} \ No newline at end of file diff --git a/tests/test_charge_point.py b/tests/test_charge_point.py index 87052b1e9..3b0fd98d9 100644 --- a/tests/test_charge_point.py +++ b/tests/test_charge_point.py @@ -10,14 +10,14 @@ from ocpp.v16.call_result import BootNotification as BootNotificationResult from ocpp.v16.datatypes import MeterValue, SampledValue from ocpp.v16.enums import Action, RegistrationStatus -from ocpp.v20 import ChargePoint as cp_20 +from ocpp.v201 import ChargePoint as cp_201 from ocpp.v201.call import SetNetworkProfile from ocpp.v201.datatypes import NetworkConnectionProfileType from ocpp.v201.enums import OCPPInterfaceType, OCPPTransportType, OCPPVersionType def test_getters_should_not_be_called_during_routemap_setup(): - class ChargePoint(cp_20): + class ChargePoint(cp_201): @property def foo(self): raise RuntimeError("this will be raised") @@ -30,12 +30,12 @@ def foo(self): def test_multiple_classes_with_same_name_for_handler(): - class ChargerA(cp_20): + class ChargerA(cp_201): @on(Action.Heartbeat) def heartbeat(self, **kwargs): pass - class ChargerB(cp_20): + class ChargerB(cp_201): @on(Action.Heartbeat) def heartbeat(self, **kwargs): pass diff --git a/tests/test_messages.py b/tests/test_messages.py index 60c798b0a..3bd7131e7 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -150,7 +150,7 @@ def test_validate_get_composite_profile_payload(): validate_payload(message, ocpp_version="1.6") -@pytest.mark.parametrize("ocpp_version", ["1.6", "2.0"]) +@pytest.mark.parametrize("ocpp_version", ["1.6", "2.0.1"]) def test_validate_payload_with_valid_payload(ocpp_version): """ Test if validate_payload doesn't return any exceptions when it's diff --git a/tests/v20/conftest.py b/tests/v20/conftest.py deleted file mode 100644 index 927faef17..000000000 --- a/tests/v20/conftest.py +++ /dev/null @@ -1,75 +0,0 @@ -try: - from unittest.mock import AsyncMock -except ImportError: - # Python 3.7 and below don't include unittest.mock.AsyncMock. Hence, - # we need to resolve to a package on pypi. - from asynctest import CoroutineMock as AsyncMock - -import pytest - -from ocpp.messages import Call, CallResult -from ocpp.v20 import ChargePoint, call - -chargingStation = { - "vendorName": "ICU Eve Mini", - "firmwareVersion": "#1:3.4.0-2990#N:217H;1.0-223", - "model": "ICU Eve Mini", -} - - -@pytest.fixture -def heartbeat_call(): - return Call(unique_id=1, action="Heartbeat", payload={}).to_json() - - -@pytest.fixture -def boot_notification_call(): - return Call( - unique_id="1", - action="BootNotification", - payload={ - "reason": "PowerUp", - "chargingStation": chargingStation, - }, - ).to_json() - - -@pytest.fixture -def base_central_system(connection): - cs = ChargePoint( - id=1234, - connection=connection, - ) - - cs._unique_id_generator = lambda: 1337 - - return cs - - -@pytest.fixture -def mock_boot_request(): - return call.BootNotificationPayload( - reason="PowerUp", - charging_station=chargingStation, - ) - - -@pytest.fixture -def mock_base_central_system(base_central_system): - mock_result_call = CallResult( - unique_id=str(base_central_system._unique_id_generator()), - action="BootNotification", - payload={ - "currentTime": "2018-05-29T17:37:05.495259", - "interval": 350, - "status": "Accepted", - }, - ) - - base_central_system._send = AsyncMock() - - mock_response = AsyncMock() - mock_response.return_value = mock_result_call - base_central_system._get_specific_response = mock_response - - return base_central_system diff --git a/tests/v20/test_v20_charge_point.py b/tests/v20/test_v20_charge_point.py deleted file mode 100644 index bb0a04aa2..000000000 --- a/tests/v20/test_v20_charge_point.py +++ /dev/null @@ -1,120 +0,0 @@ -import json - -import pytest - -from ocpp.routing import after, create_route_map, on -from ocpp.v20 import call_result - - -@pytest.mark.asyncio -async def test_route_message_with_existing_route( - base_central_system, boot_notification_call -): - """Test if the correct handler is called when routing a message. - Also test if payload of request is injected correctly in handler. - - """ - - @on("BootNotification") - def on_boot_notification(reason, charging_station, **kwargs): - assert reason == "PowerUp" - assert charging_station == { - "vendor_name": "ICU Eve Mini", - "firmware_version": "#1:3.4.0-2990#N:217H;1.0-223", - "model": "ICU Eve Mini", - } - - return call_result.BootNotificationPayload( - current_time="2018-05-29T17:37:05.495259", - interval=350, - status="Accepted", - ) - - @after("BootNotification") - def after_boot_notification(reason, charging_station, **kwargs): - assert reason == "PowerUp" - assert charging_station == { - "vendor_name": "ICU Eve Mini", - "firmware_version": "#1:3.4.0-2990#N:217H;1.0-223", - "model": "ICU Eve Mini", - } - - setattr(base_central_system, "on_boot_notification", on_boot_notification) - setattr(base_central_system, "after_boot_notification", after_boot_notification) - base_central_system.route_map = create_route_map(base_central_system) - - await base_central_system.route_message(boot_notification_call) - base_central_system._connection.send.assert_called_once_with( - json.dumps( - [ - 3, - "1", - { - "currentTime": "2018-05-29T17:37:05.495259", - "interval": 350, - "status": "Accepted", - }, - ], - separators=(",", ":"), - ) - ) - - -@pytest.mark.asyncio -async def test_route_message_with_no_route(base_central_system, heartbeat_call): - """ - Test that a CALLERROR is sent back, reporting that no handler is - registred for it. - - """ - # Empty the route map - base_central_system.route_map = {} - - await base_central_system.route_message(heartbeat_call) - base_central_system._connection.send.assert_called_once_with( - json.dumps( - [ - 4, - 1, - "NotImplemented", - "Request Action is recognized but not supported by the receiver", - {"cause": "No handler for Heartbeat registered."}, - ], - separators=(",", ":"), - ) - ) - - -@pytest.mark.asyncio -async def test_call_with_unique_id_should_return_same_id( - mock_boot_request, mock_base_central_system -): - - expected_unique_id = "12345" - # Call the method being tested with a unique_id as a parameter - await mock_base_central_system.call(mock_boot_request, unique_id=expected_unique_id) - ( - actual_unique_id, - _, - ) = mock_base_central_system._get_specific_response.call_args_list[0][0] - - # Check the actual unique id is equals to the one passed to the call method - assert actual_unique_id == expected_unique_id - - -@pytest.mark.asyncio -async def test_call_without_unique_id_should_return_a_random_value( - mock_boot_request, mock_base_central_system -): - - expected_unique_id = str(mock_base_central_system._unique_id_generator()) - - # Call the method being tested without passing a unique_id as a parameter - await mock_base_central_system.call(mock_boot_request) - - ( - actual_unique_id, - _, - ) = mock_base_central_system._get_specific_response.call_args_list[0][0] - # Check the actual unique id is equals to the one internally generated - assert actual_unique_id == expected_unique_id From f1f9f172bd626fdd3ec19706762349d54709093c Mon Sep 17 00:00:00 2001 From: Jared-Newell-Mobility <119603687+Jared-Newell-Mobility@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:42:05 +0100 Subject: [PATCH 39/39] v201.datatypes.ChargingNeedsType.request_energy_transfer is mistyped (#496) see issue https://github.com/mobilityhouse/ocpp/issues/430 --- CHANGELOG.md | 2 ++ ocpp/v201/datatypes.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48f2b4eda..ac353b956 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,8 @@ - [#504](https://github.com/mobilityhouse/ocpp/pull/504) Add missing tech_info attribute to v2.0.1 EventDataType. Thanks [@LokiHokie](https://github.com/LokiHokie) - [#381](https://github.com/mobilityhouse/ocpp/issues/381) Add FormationError and OccurrenceConstraintViolationError. +- [#373](https://github.com/mobilityhouse/ocpp/issues/373) v201.datatypes.ChargingNeedsType.request_energy_transfer is mistyped + ## 0.21.0 (2023-10-19) - [#492] Minor fixes _handle_call doc string - Thanks @drc38 diff --git a/ocpp/v201/datatypes.py b/ocpp/v201/datatypes.py index b9a2fabd7..1c5c65e88 100644 --- a/ocpp/v201/datatypes.py +++ b/ocpp/v201/datatypes.py @@ -101,7 +101,7 @@ class ChargingNeedsType: ChargingNeedsType is used by: NotifyEVChargingNeedsRequest """ - request_energy_transfer: enums.EnergyTransferModeType + requested_energy_transfer: enums.EnergyTransferModeType departure_time: Optional[str] = None ac_charging_parameters: Optional[ACChargingParametersType] = None dc_charging_parameters: Optional[DCChargingParametersType] = None