Add BootNotification and ClearCache OCPP 2.0.1 commands support
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 5 Jan 2023 18:29:52 +0000 (19:29 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 5 Jan 2023 18:29:52 +0000 (19:29 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
147 files changed:
src/assets/json-schemas/ocpp/1.6/GetCompositeSchedule.json [new file with mode: 0644]
src/assets/json-schemas/ocpp/2.0/AuthorizeRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/AuthorizeResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/BootNotificationRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/BootNotificationResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/CancelReservationRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/CancelReservationResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/CertificateSignedRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/CertificateSignedResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ChangeAvailabilityRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ChangeAvailabilityResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearCacheRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearCacheResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearChargingProfileRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearChargingProfileResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearDisplayMessageRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearDisplayMessageResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearVariableMonitoringRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearVariableMonitoringResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearedChargingLimitRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ClearedChargingLimitResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/CostUpdatedRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/CostUpdatedResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/CustomerInformationRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/CustomerInformationResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/DataTransferRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/DataTransferResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/DeleteCertificateRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/DeleteCertificateResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/FirmwareStatusNotificationRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/FirmwareStatusNotificationResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/Get15118EVCertificateRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/Get15118EVCertificateResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetBaseReportRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetBaseReportResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetCertificateStatusRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetCertificateStatusResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetChargingProfilesRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetChargingProfilesResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetCompositeScheduleRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetCompositeScheduleResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetDisplayMessagesRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetDisplayMessagesResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetInstalledCertificateIdsRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetInstalledCertificateIdsResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetLocalListVersionRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetLocalListVersionResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetLogRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetLogResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetMonitoringReportRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetMonitoringReportResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetReportRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetReportResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetTransactionStatusRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetTransactionStatusResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetVariablesRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/GetVariablesResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/HeartbeatRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/HeartbeatResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/InstallCertificateRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/InstallCertificateResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/LogStatusNotificationRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/LogStatusNotificationResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/MeterValuesRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/MeterValuesResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyChargingLimitRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyChargingLimitResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyCustomerInformationRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyCustomerInformationResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyDisplayMessagesRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyDisplayMessagesResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyEVChargingNeedsRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyEVChargingNeedsResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyEVChargingScheduleRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyEVChargingScheduleResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyEventRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyEventResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyMonitoringReportRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyMonitoringReportResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyReportRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/NotifyReportResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/PublishFirmwareRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/PublishFirmwareResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/PublishFirmwareStatusNotificationRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/PublishFirmwareStatusNotificationResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ReportChargingProfilesRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ReportChargingProfilesResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/RequestStartTransactionRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/RequestStartTransactionResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/RequestStopTransactionRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/RequestStopTransactionResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ReservationStatusUpdateRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ReservationStatusUpdateResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ReserveNowRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ReserveNowResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ResetRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/ResetResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SecurityEventNotificationRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SecurityEventNotificationResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SendLocalListRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SendLocalListResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetChargingProfileRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetChargingProfileResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetDisplayMessageRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetDisplayMessageResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetMonitoringBaseRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetMonitoringBaseResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetMonitoringLevelRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetMonitoringLevelResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetNetworkProfileRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetNetworkProfileResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetVariableMonitoringRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetVariableMonitoringResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetVariablesRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SetVariablesResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SignCertificateRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/SignCertificateResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/StatusNotificationRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/StatusNotificationResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/TransactionEventRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/TransactionEventResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/TriggerMessageRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/TriggerMessageResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/UnlockConnectorRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/UnlockConnectorResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/UnpublishFirmwareRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/UnpublishFirmwareResponse.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/UpdateFirmwareRequest.json [new file with mode: 0755]
src/assets/json-schemas/ocpp/2.0/UpdateFirmwareResponse.json [new file with mode: 0755]
src/charging-station/ChargingStation.ts
src/charging-station/ChargingStationUtils.ts
src/charging-station/ChargingStationWorkerBroadcastChannel.ts
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/charging-station/ocpp/1.6/OCPP16RequestService.ts
src/charging-station/ocpp/1.6/OCPP16ResponseService.ts
src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts
src/charging-station/ocpp/2.0/OCPP20RequestService.ts
src/charging-station/ocpp/2.0/OCPP20ResponseService.ts
src/charging-station/ocpp/OCPPIncomingRequestService.ts
src/charging-station/ocpp/OCPPRequestService.ts
src/charging-station/ocpp/OCPPResponseService.ts
src/types/ocpp/1.6/Responses.ts
src/types/ocpp/2.0/Requests.ts
src/types/ocpp/2.0/Responses.ts
src/types/ocpp/Requests.ts
src/types/ocpp/Responses.ts
ui/web/src/types/ChargingStationType.ts

diff --git a/src/assets/json-schemas/ocpp/1.6/GetCompositeSchedule.json b/src/assets/json-schemas/ocpp/1.6/GetCompositeSchedule.json
new file mode 100644 (file)
index 0000000..8939a61
--- /dev/null
@@ -0,0 +1,21 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "urn:OCPP:1.6:2019:12:GetCompositeScheduleRequest",
+  "title": "GetCompositeScheduleRequest",
+  "type": "object",
+  "properties": {
+    "connectorId": {
+      "type": "integer"
+    },
+    "duration": {
+      "type": "integer"
+    },
+    "chargingRateUnit": {
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["A", "W"]
+    }
+  },
+  "additionalProperties": false,
+  "required": ["connectorId", "duration"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/AuthorizeRequest.json b/src/assets/json-schemas/ocpp/2.0/AuthorizeRequest.json
new file mode 100755 (executable)
index 0000000..f20a0a7
--- /dev/null
@@ -0,0 +1,157 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:AuthorizeRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "HashAlgorithmEnumType": {
+      "description": "Used algorithms for the hashes provided.\r\n",
+      "javaType": "HashAlgorithmEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["SHA256", "SHA384", "SHA512"]
+    },
+    "IdTokenEnumType": {
+      "description": "Enumeration of possible idToken types.\r\n",
+      "javaType": "IdTokenEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Central",
+        "eMAID",
+        "ISO14443",
+        "ISO15693",
+        "KeyCode",
+        "Local",
+        "MacAddress",
+        "NoAuthorization"
+      ]
+    },
+    "AdditionalInfoType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "AdditionalInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalIdToken": {
+          "description": "This field specifies the additional IdToken.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "description": "This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["additionalIdToken", "type"]
+    },
+    "IdTokenType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "IdToken",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalInfo": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/AdditionalInfoType"
+          },
+          "minItems": 1
+        },
+        "idToken": {
+          "description": "IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "$ref": "#/definitions/IdTokenEnumType"
+        }
+      },
+      "required": ["idToken", "type"]
+    },
+    "OCSPRequestDataType": {
+      "javaType": "OCSPRequestData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "hashAlgorithm": {
+          "$ref": "#/definitions/HashAlgorithmEnumType"
+        },
+        "issuerNameHash": {
+          "description": "Hashed value of the Issuer DN (Distinguished Name).\r\n\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "issuerKeyHash": {
+          "description": "Hashed value of the issuers public key\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "serialNumber": {
+          "description": "The serial number of the certificate.\r\n",
+          "type": "string",
+          "maxLength": 40
+        },
+        "responderURL": {
+          "description": "This contains the responder URL (Case insensitive). \r\n\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": [
+        "hashAlgorithm",
+        "issuerNameHash",
+        "issuerKeyHash",
+        "serialNumber",
+        "responderURL"
+      ]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "idToken": {
+      "$ref": "#/definitions/IdTokenType"
+    },
+    "certificate": {
+      "description": "The X.509 certificated presented by EV and encoded in PEM format.\r\n",
+      "type": "string",
+      "maxLength": 5500
+    },
+    "iso15118CertificateHashData": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/OCSPRequestDataType"
+      },
+      "minItems": 1,
+      "maxItems": 4
+    }
+  },
+  "required": ["idToken"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/AuthorizeResponse.json b/src/assets/json-schemas/ocpp/2.0/AuthorizeResponse.json
new file mode 100755 (executable)
index 0000000..7311d6d
--- /dev/null
@@ -0,0 +1,213 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:AuthorizeResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "AuthorizationStatusEnumType": {
+      "description": "ID_ Token. Status. Authorization_ Status\r\nurn:x-oca:ocpp:uid:1:569372\r\nCurrent status of the ID Token.\r\n",
+      "javaType": "AuthorizationStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Accepted",
+        "Blocked",
+        "ConcurrentTx",
+        "Expired",
+        "Invalid",
+        "NoCredit",
+        "NotAllowedTypeEVSE",
+        "NotAtThisLocation",
+        "NotAtThisTime",
+        "Unknown"
+      ]
+    },
+    "AuthorizeCertificateStatusEnumType": {
+      "description": "Certificate status information. \r\n- if all certificates are valid: return 'Accepted'.\r\n- if one of the certificates was revoked, return 'CertificateRevoked'.\r\n",
+      "javaType": "AuthorizeCertificateStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Accepted",
+        "SignatureError",
+        "CertificateExpired",
+        "CertificateRevoked",
+        "NoCertificateAvailable",
+        "CertChainError",
+        "ContractCancelled"
+      ]
+    },
+    "IdTokenEnumType": {
+      "description": "Enumeration of possible idToken types.\r\n",
+      "javaType": "IdTokenEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Central",
+        "eMAID",
+        "ISO14443",
+        "ISO15693",
+        "KeyCode",
+        "Local",
+        "MacAddress",
+        "NoAuthorization"
+      ]
+    },
+    "MessageFormatEnumType": {
+      "description": "Message_ Content. Format. Message_ Format_ Code\r\nurn:x-enexis:ecdm:uid:1:570848\r\nFormat of the message.\r\n",
+      "javaType": "MessageFormatEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["ASCII", "HTML", "URI", "UTF8"]
+    },
+    "AdditionalInfoType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "AdditionalInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalIdToken": {
+          "description": "This field specifies the additional IdToken.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "description": "This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["additionalIdToken", "type"]
+    },
+    "IdTokenInfoType": {
+      "description": "ID_ Token\r\nurn:x-oca:ocpp:uid:2:233247\r\nContains status information about an identifier.\r\nIt is advised to not stop charging for a token that expires during charging, as ExpiryDate is only used for caching purposes. If ExpiryDate is not given, the status has no end date.\r\n",
+      "javaType": "IdTokenInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "status": {
+          "$ref": "#/definitions/AuthorizationStatusEnumType"
+        },
+        "cacheExpiryDateTime": {
+          "description": "ID_ Token. Expiry. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569373\r\nDate and Time after which the token must be considered invalid.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "chargingPriority": {
+          "description": "Priority from a business point of view. Default priority is 0, The range is from -9 to 9. Higher values indicate a higher priority. The chargingPriority in &lt;&lt;transactioneventresponse,TransactionEventResponse&gt;&gt; overrules this one. \r\n",
+          "type": "integer"
+        },
+        "language1": {
+          "description": "ID_ Token. Language1. Language_ Code\r\nurn:x-oca:ocpp:uid:1:569374\r\nPreferred user interface language of identifier user. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "evseId": {
+          "description": "Only used when the IdToken is only valid for one or more specific EVSEs, not for the entire Charging Station.\r\n\r\n",
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "type": "integer"
+          },
+          "minItems": 1
+        },
+        "groupIdToken": {
+          "$ref": "#/definitions/IdTokenType"
+        },
+        "language2": {
+          "description": "ID_ Token. Language2. Language_ Code\r\nurn:x-oca:ocpp:uid:1:569375\r\nSecond preferred user interface language of identifier user. Don’t use when language1 is omitted, has to be different from language1. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "personalMessage": {
+          "$ref": "#/definitions/MessageContentType"
+        }
+      },
+      "required": ["status"]
+    },
+    "IdTokenType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "IdToken",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalInfo": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/AdditionalInfoType"
+          },
+          "minItems": 1
+        },
+        "idToken": {
+          "description": "IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "$ref": "#/definitions/IdTokenEnumType"
+        }
+      },
+      "required": ["idToken", "type"]
+    },
+    "MessageContentType": {
+      "description": "Message_ Content\r\nurn:x-enexis:ecdm:uid:2:234490\r\nContains message details, for a message to be displayed on a Charging Station.\r\n\r\n",
+      "javaType": "MessageContent",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "format": {
+          "$ref": "#/definitions/MessageFormatEnumType"
+        },
+        "language": {
+          "description": "Message_ Content. Language. Language_ Code\r\nurn:x-enexis:ecdm:uid:1:570849\r\nMessage language identifier. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "content": {
+          "description": "Message_ Content. Content. Message\r\nurn:x-enexis:ecdm:uid:1:570852\r\nMessage contents.\r\n\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["format", "content"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "idTokenInfo": {
+      "$ref": "#/definitions/IdTokenInfoType"
+    },
+    "certificateStatus": {
+      "$ref": "#/definitions/AuthorizeCertificateStatusEnumType"
+    }
+  },
+  "required": ["idTokenInfo"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/BootNotificationRequest.json b/src/assets/json-schemas/ocpp/2.0/BootNotificationRequest.json
new file mode 100755 (executable)
index 0000000..76dd7d5
--- /dev/null
@@ -0,0 +1,106 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:BootNotificationRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "BootReasonEnumType": {
+      "description": "This contains the reason for sending this message to the CSMS.\r\n",
+      "javaType": "BootReasonEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "ApplicationReset",
+        "FirmwareUpdate",
+        "LocalReset",
+        "PowerUp",
+        "RemoteReset",
+        "ScheduledReset",
+        "Triggered",
+        "Unknown",
+        "Watchdog"
+      ]
+    },
+    "ChargingStationType": {
+      "description": "Charge_ Point\r\nurn:x-oca:ocpp:uid:2:233122\r\nThe physical system where an Electrical Vehicle (EV) can be charged.\r\n",
+      "javaType": "ChargingStation",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "serialNumber": {
+          "description": "Device. Serial_ Number. Serial_ Number\r\nurn:x-oca:ocpp:uid:1:569324\r\nVendor-specific device identifier.\r\n",
+          "type": "string",
+          "maxLength": 25
+        },
+        "model": {
+          "description": "Device. Model. CI20_ Text\r\nurn:x-oca:ocpp:uid:1:569325\r\nDefines the model of the device.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "modem": {
+          "$ref": "#/definitions/ModemType"
+        },
+        "vendorName": {
+          "description": "Identifies the vendor (not necessarily in a unique manner).\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "firmwareVersion": {
+          "description": "This contains the firmware version of the Charging Station.\r\n\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["model", "vendorName"]
+    },
+    "ModemType": {
+      "description": "Wireless_ Communication_ Module\r\nurn:x-oca:ocpp:uid:2:233306\r\nDefines parameters required for initiating and maintaining wireless communication with other devices.\r\n",
+      "javaType": "Modem",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "iccid": {
+          "description": "Wireless_ Communication_ Module. ICCID. CI20_ Text\r\nurn:x-oca:ocpp:uid:1:569327\r\nThis contains the ICCID of the modem’s SIM card.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "imsi": {
+          "description": "Wireless_ Communication_ Module. IMSI. CI20_ Text\r\nurn:x-oca:ocpp:uid:1:569328\r\nThis contains the IMSI of the modem’s SIM card.\r\n",
+          "type": "string",
+          "maxLength": 20
+        }
+      }
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "chargingStation": {
+      "$ref": "#/definitions/ChargingStationType"
+    },
+    "reason": {
+      "$ref": "#/definitions/BootReasonEnumType"
+    }
+  },
+  "required": ["reason", "chargingStation"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/BootNotificationResponse.json b/src/assets/json-schemas/ocpp/2.0/BootNotificationResponse.json
new file mode 100755 (executable)
index 0000000..cb18c07
--- /dev/null
@@ -0,0 +1,71 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:BootNotificationResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "RegistrationStatusEnumType": {
+      "description": "This contains whether the Charging Station has been registered\r\nwithin the CSMS.\r\n",
+      "javaType": "RegistrationStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Pending", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "currentTime": {
+      "description": "This contains the CSMS’s current time.\r\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "interval": {
+      "description": "When &lt;&lt;cmn_registrationstatusenumtype,Status&gt;&gt; is Accepted, this contains the heartbeat interval in seconds. If the CSMS returns something other than Accepted, the value of the interval field indicates the minimum wait time before sending a next BootNotification request.\r\n",
+      "type": "integer"
+    },
+    "status": {
+      "$ref": "#/definitions/RegistrationStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["currentTime", "interval", "status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/CancelReservationRequest.json b/src/assets/json-schemas/ocpp/2.0/CancelReservationRequest.json
new file mode 100755 (executable)
index 0000000..9190413
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:CancelReservationRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "reservationId": {
+      "description": "Id of the reservation to cancel.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["reservationId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/CancelReservationResponse.json b/src/assets/json-schemas/ocpp/2.0/CancelReservationResponse.json
new file mode 100755 (executable)
index 0000000..eed8735
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:CancelReservationResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "CancelReservationStatusEnumType": {
+      "description": "This indicates the success or failure of the canceling of a reservation by CSMS.\r\n",
+      "javaType": "CancelReservationStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/CancelReservationStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/CertificateSignedRequest.json b/src/assets/json-schemas/ocpp/2.0/CertificateSignedRequest.json
new file mode 100755 (executable)
index 0000000..db056aa
--- /dev/null
@@ -0,0 +1,42 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:CertificateSignedRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "CertificateSigningUseEnumType": {
+      "description": "Indicates the type of the signed certificate that is returned. When omitted the certificate is used for both the 15118 connection (if implemented) and the Charging Station to CSMS connection. This field is required when a typeOfCertificate was included in the &lt;&lt;signcertificaterequest,SignCertificateRequest&gt;&gt; that requested this certificate to be signed AND both the 15118 connection and the Charging Station connection are implemented.\r\n\r\n",
+      "javaType": "CertificateSigningUseEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["ChargingStationCertificate", "V2GCertificate"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "certificateChain": {
+      "description": "The signed PEM encoded X.509 certificate. This can also contain the necessary sub CA certificates. In that case, the order of the bundle should follow the certificate chain, starting from the leaf certificate.\r\n\r\nThe Configuration Variable &lt;&lt;configkey-max-certificate-chain-size,MaxCertificateChainSize&gt;&gt; can be used to limit the maximum size of this field.\r\n",
+      "type": "string",
+      "maxLength": 10000
+    },
+    "certificateType": {
+      "$ref": "#/definitions/CertificateSigningUseEnumType"
+    }
+  },
+  "required": ["certificateChain"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/CertificateSignedResponse.json b/src/assets/json-schemas/ocpp/2.0/CertificateSignedResponse.json
new file mode 100755 (executable)
index 0000000..e897b8d
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:CertificateSignedResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "CertificateSignedStatusEnumType": {
+      "description": "Returns whether certificate signing has been accepted, otherwise rejected.\r\n",
+      "javaType": "CertificateSignedStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/CertificateSignedStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ChangeAvailabilityRequest.json b/src/assets/json-schemas/ocpp/2.0/ChangeAvailabilityRequest.json
new file mode 100755 (executable)
index 0000000..6577ffe
--- /dev/null
@@ -0,0 +1,60 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ChangeAvailabilityRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "OperationalStatusEnumType": {
+      "description": "This contains the type of availability change that the Charging Station should perform.\r\n\r\n",
+      "javaType": "OperationalStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Inoperative", "Operative"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "evse": {
+      "$ref": "#/definitions/EVSEType"
+    },
+    "operationalStatus": {
+      "$ref": "#/definitions/OperationalStatusEnumType"
+    }
+  },
+  "required": ["operationalStatus"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ChangeAvailabilityResponse.json b/src/assets/json-schemas/ocpp/2.0/ChangeAvailabilityResponse.json
new file mode 100755 (executable)
index 0000000..1d259fb
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ChangeAvailabilityResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChangeAvailabilityStatusEnumType": {
+      "description": "This indicates whether the Charging Station is able to perform the availability change.\r\n",
+      "javaType": "ChangeAvailabilityStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "Scheduled"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/ChangeAvailabilityStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearCacheRequest.json b/src/assets/json-schemas/ocpp/2.0/ClearCacheRequest.json
new file mode 100755 (executable)
index 0000000..dfff0bf
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearCacheRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearCacheResponse.json b/src/assets/json-schemas/ocpp/2.0/ClearCacheResponse.json
new file mode 100755 (executable)
index 0000000..dac5bc1
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearCacheResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ClearCacheStatusEnumType": {
+      "description": "Accepted if the Charging Station has executed the request, otherwise rejected.\r\n",
+      "javaType": "ClearCacheStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/ClearCacheStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearChargingProfileRequest.json b/src/assets/json-schemas/ocpp/2.0/ClearChargingProfileRequest.json
new file mode 100755 (executable)
index 0000000..548e029
--- /dev/null
@@ -0,0 +1,67 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearChargingProfileRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingProfilePurposeEnumType": {
+      "description": "Charging_ Profile. Charging_ Profile_ Purpose. Charging_ Profile_ Purpose_ Code\r\nurn:x-oca:ocpp:uid:1:569231\r\nSpecifies to purpose of the charging profiles that will be cleared, if they meet the other criteria in the request.\r\n",
+      "javaType": "ChargingProfilePurposeEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "ChargingStationExternalConstraints",
+        "ChargingStationMaxProfile",
+        "TxDefaultProfile",
+        "TxProfile"
+      ]
+    },
+    "ClearChargingProfileType": {
+      "description": "Charging_ Profile\r\nurn:x-oca:ocpp:uid:2:233255\r\nA ChargingProfile consists of a ChargingSchedule, describing the amount of power or current that can be delivered per time interval.\r\n",
+      "javaType": "ClearChargingProfile",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evseId": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nSpecifies the id of the EVSE for which to clear charging profiles. An evseId of zero (0) specifies the charging profile for the overall Charging Station. Absence of this parameter means the clearing applies to all charging profiles that match the other criteria in the request.\r\n\r\n",
+          "type": "integer"
+        },
+        "chargingProfilePurpose": {
+          "$ref": "#/definitions/ChargingProfilePurposeEnumType"
+        },
+        "stackLevel": {
+          "description": "Charging_ Profile. Stack_ Level. Counter\r\nurn:x-oca:ocpp:uid:1:569230\r\nSpecifies the stackLevel for which charging profiles will be cleared, if they meet the other criteria in the request.\r\n",
+          "type": "integer"
+        }
+      }
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "chargingProfileId": {
+      "description": "The Id of the charging profile to clear.\r\n",
+      "type": "integer"
+    },
+    "chargingProfileCriteria": {
+      "$ref": "#/definitions/ClearChargingProfileType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearChargingProfileResponse.json b/src/assets/json-schemas/ocpp/2.0/ClearChargingProfileResponse.json
new file mode 100755 (executable)
index 0000000..1c87d99
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearChargingProfileResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ClearChargingProfileStatusEnumType": {
+      "description": "Indicates if the Charging Station was able to execute the request.\r\n",
+      "javaType": "ClearChargingProfileStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Unknown"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/ClearChargingProfileStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearDisplayMessageRequest.json b/src/assets/json-schemas/ocpp/2.0/ClearDisplayMessageRequest.json
new file mode 100755 (executable)
index 0000000..a213612
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearDisplayMessageRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "id": {
+      "description": "Id of the message that SHALL be removed from the Charging Station.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["id"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearDisplayMessageResponse.json b/src/assets/json-schemas/ocpp/2.0/ClearDisplayMessageResponse.json
new file mode 100755 (executable)
index 0000000..19c2c94
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearDisplayMessageResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ClearMessageStatusEnumType": {
+      "description": "Returns whether the Charging Station has been able to remove the message.\r\n",
+      "javaType": "ClearMessageStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Unknown"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/ClearMessageStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearVariableMonitoringRequest.json b/src/assets/json-schemas/ocpp/2.0/ClearVariableMonitoringRequest.json
new file mode 100755 (executable)
index 0000000..8519480
--- /dev/null
@@ -0,0 +1,36 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearVariableMonitoringRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "id": {
+      "description": "List of the monitors to be cleared, identified by there Id.\r\n",
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "type": "integer"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["id"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearVariableMonitoringResponse.json b/src/assets/json-schemas/ocpp/2.0/ClearVariableMonitoringResponse.json
new file mode 100755 (executable)
index 0000000..ce9dfdd
--- /dev/null
@@ -0,0 +1,85 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearVariableMonitoringResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ClearMonitoringStatusEnumType": {
+      "description": "Result of the clear request for this monitor, identified by its Id.\r\n\r\n",
+      "javaType": "ClearMonitoringStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "NotFound"]
+    },
+    "ClearMonitoringResultType": {
+      "javaType": "ClearMonitoringResult",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "status": {
+          "$ref": "#/definitions/ClearMonitoringStatusEnumType"
+        },
+        "id": {
+          "description": "Id of the monitor of which a clear was requested.\r\n\r\n",
+          "type": "integer"
+        },
+        "statusInfo": {
+          "$ref": "#/definitions/StatusInfoType"
+        }
+      },
+      "required": ["status", "id"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "clearMonitoringResult": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/ClearMonitoringResultType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["clearMonitoringResult"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearedChargingLimitRequest.json b/src/assets/json-schemas/ocpp/2.0/ClearedChargingLimitRequest.json
new file mode 100755 (executable)
index 0000000..b57253c
--- /dev/null
@@ -0,0 +1,41 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearedChargingLimitRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingLimitSourceEnumType": {
+      "description": "Source of the charging limit.\r\n",
+      "javaType": "ChargingLimitSourceEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["EMS", "Other", "SO", "CSO"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "chargingLimitSource": {
+      "$ref": "#/definitions/ChargingLimitSourceEnumType"
+    },
+    "evseId": {
+      "description": "EVSE Identifier.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["chargingLimitSource"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ClearedChargingLimitResponse.json b/src/assets/json-schemas/ocpp/2.0/ClearedChargingLimitResponse.json
new file mode 100755 (executable)
index 0000000..85d4689
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ClearedChargingLimitResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/CostUpdatedRequest.json b/src/assets/json-schemas/ocpp/2.0/CostUpdatedRequest.json
new file mode 100755 (executable)
index 0000000..485a80e
--- /dev/null
@@ -0,0 +1,36 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:CostUpdatedRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "totalCost": {
+      "description": "Current total cost, based on the information known by the CSMS, of the transaction including taxes. In the currency configured with the configuration Variable: [&lt;&lt;configkey-currency, Currency&gt;&gt;]\r\n\r\n",
+      "type": "number"
+    },
+    "transactionId": {
+      "description": "Transaction Id of the transaction the current cost are asked for.\r\n\r\n",
+      "type": "string",
+      "maxLength": 36
+    }
+  },
+  "required": ["totalCost", "transactionId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/CostUpdatedResponse.json b/src/assets/json-schemas/ocpp/2.0/CostUpdatedResponse.json
new file mode 100755 (executable)
index 0000000..b8180fe
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:CostUpdatedResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/CustomerInformationRequest.json b/src/assets/json-schemas/ocpp/2.0/CustomerInformationRequest.json
new file mode 100755 (executable)
index 0000000..79923c4
--- /dev/null
@@ -0,0 +1,152 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:CustomerInformationRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "HashAlgorithmEnumType": {
+      "description": "Used algorithms for the hashes provided.\r\n",
+      "javaType": "HashAlgorithmEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["SHA256", "SHA384", "SHA512"]
+    },
+    "IdTokenEnumType": {
+      "description": "Enumeration of possible idToken types.\r\n",
+      "javaType": "IdTokenEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Central",
+        "eMAID",
+        "ISO14443",
+        "ISO15693",
+        "KeyCode",
+        "Local",
+        "MacAddress",
+        "NoAuthorization"
+      ]
+    },
+    "AdditionalInfoType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "AdditionalInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalIdToken": {
+          "description": "This field specifies the additional IdToken.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "description": "This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["additionalIdToken", "type"]
+    },
+    "CertificateHashDataType": {
+      "javaType": "CertificateHashData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "hashAlgorithm": {
+          "$ref": "#/definitions/HashAlgorithmEnumType"
+        },
+        "issuerNameHash": {
+          "description": "Hashed value of the Issuer DN (Distinguished Name).\r\n\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "issuerKeyHash": {
+          "description": "Hashed value of the issuers public key\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "serialNumber": {
+          "description": "The serial number of the certificate.\r\n",
+          "type": "string",
+          "maxLength": 40
+        }
+      },
+      "required": ["hashAlgorithm", "issuerNameHash", "issuerKeyHash", "serialNumber"]
+    },
+    "IdTokenType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "IdToken",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalInfo": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/AdditionalInfoType"
+          },
+          "minItems": 1
+        },
+        "idToken": {
+          "description": "IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "$ref": "#/definitions/IdTokenEnumType"
+        }
+      },
+      "required": ["idToken", "type"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "customerCertificate": {
+      "$ref": "#/definitions/CertificateHashDataType"
+    },
+    "idToken": {
+      "$ref": "#/definitions/IdTokenType"
+    },
+    "requestId": {
+      "description": "The Id of the request.\r\n\r\n",
+      "type": "integer"
+    },
+    "report": {
+      "description": "Flag indicating whether the Charging Station should return NotifyCustomerInformationRequest messages containing information about the customer referred to.\r\n",
+      "type": "boolean"
+    },
+    "clear": {
+      "description": "Flag indicating whether the Charging Station should clear all information about the customer referred to.\r\n",
+      "type": "boolean"
+    },
+    "customerIdentifier": {
+      "description": "A (e.g. vendor specific) identifier of the customer this request refers to. This field contains a custom identifier other than IdToken and Certificate.\r\nOne of the possible identifiers (customerIdentifier, customerIdToken or customerCertificate) should be in the request message.\r\n",
+      "type": "string",
+      "maxLength": 64
+    }
+  },
+  "required": ["requestId", "report", "clear"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/CustomerInformationResponse.json b/src/assets/json-schemas/ocpp/2.0/CustomerInformationResponse.json
new file mode 100755 (executable)
index 0000000..7d76e74
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:CustomerInformationResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "CustomerInformationStatusEnumType": {
+      "description": "Indicates whether the request was accepted.\r\n",
+      "javaType": "CustomerInformationStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "Invalid"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/CustomerInformationStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/DataTransferRequest.json b/src/assets/json-schemas/ocpp/2.0/DataTransferRequest.json
new file mode 100755 (executable)
index 0000000..961adfe
--- /dev/null
@@ -0,0 +1,40 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:DataTransferRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "messageId": {
+      "description": "May be used to indicate a specific message or implementation.\r\n",
+      "type": "string",
+      "maxLength": 50
+    },
+    "data": {
+      "description": "Data without specified length or format. This needs to be decided by both parties (Open to implementation).\r\n"
+    },
+    "vendorId": {
+      "description": "This identifies the Vendor specific implementation\r\n\r\n",
+      "type": "string",
+      "maxLength": 255
+    }
+  },
+  "required": ["vendorId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/DataTransferResponse.json b/src/assets/json-schemas/ocpp/2.0/DataTransferResponse.json
new file mode 100755 (executable)
index 0000000..8718096
--- /dev/null
@@ -0,0 +1,65 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:DataTransferResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "DataTransferStatusEnumType": {
+      "description": "This indicates the success or failure of the data transfer.\r\n",
+      "javaType": "DataTransferStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "UnknownMessageId", "UnknownVendorId"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/DataTransferStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    },
+    "data": {
+      "description": "Data without specified length or format, in response to request.\r\n"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/DeleteCertificateRequest.json b/src/assets/json-schemas/ocpp/2.0/DeleteCertificateRequest.json
new file mode 100755 (executable)
index 0000000..daa9d2f
--- /dev/null
@@ -0,0 +1,66 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:DeleteCertificateRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "HashAlgorithmEnumType": {
+      "description": "Used algorithms for the hashes provided.\r\n",
+      "javaType": "HashAlgorithmEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["SHA256", "SHA384", "SHA512"]
+    },
+    "CertificateHashDataType": {
+      "javaType": "CertificateHashData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "hashAlgorithm": {
+          "$ref": "#/definitions/HashAlgorithmEnumType"
+        },
+        "issuerNameHash": {
+          "description": "Hashed value of the Issuer DN (Distinguished Name).\r\n\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "issuerKeyHash": {
+          "description": "Hashed value of the issuers public key\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "serialNumber": {
+          "description": "The serial number of the certificate.\r\n",
+          "type": "string",
+          "maxLength": 40
+        }
+      },
+      "required": ["hashAlgorithm", "issuerNameHash", "issuerKeyHash", "serialNumber"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "certificateHashData": {
+      "$ref": "#/definitions/CertificateHashDataType"
+    }
+  },
+  "required": ["certificateHashData"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/DeleteCertificateResponse.json b/src/assets/json-schemas/ocpp/2.0/DeleteCertificateResponse.json
new file mode 100755 (executable)
index 0000000..7e5bed8
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:DeleteCertificateResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "DeleteCertificateStatusEnumType": {
+      "description": "Charging Station indicates if it can process the request.\r\n",
+      "javaType": "DeleteCertificateStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Failed", "NotFound"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/DeleteCertificateStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/FirmwareStatusNotificationRequest.json b/src/assets/json-schemas/ocpp/2.0/FirmwareStatusNotificationRequest.json
new file mode 100755 (executable)
index 0000000..1da2af6
--- /dev/null
@@ -0,0 +1,56 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:FirmwareStatusNotificationRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "FirmwareStatusEnumType": {
+      "description": "This contains the progress status of the firmware installation.\r\n",
+      "javaType": "FirmwareStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Downloaded",
+        "DownloadFailed",
+        "Downloading",
+        "DownloadScheduled",
+        "DownloadPaused",
+        "Idle",
+        "InstallationFailed",
+        "Installing",
+        "Installed",
+        "InstallRebooting",
+        "InstallScheduled",
+        "InstallVerificationFailed",
+        "InvalidSignature",
+        "SignatureVerified"
+      ]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/FirmwareStatusEnumType"
+    },
+    "requestId": {
+      "description": "The request id that was provided in the\r\nUpdateFirmwareRequest that started this firmware update.\r\nThis field is mandatory, unless the message was triggered by a TriggerMessageRequest AND there is no firmware update ongoing.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/FirmwareStatusNotificationResponse.json b/src/assets/json-schemas/ocpp/2.0/FirmwareStatusNotificationResponse.json
new file mode 100755 (executable)
index 0000000..178d0a2
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:FirmwareStatusNotificationResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/Get15118EVCertificateRequest.json b/src/assets/json-schemas/ocpp/2.0/Get15118EVCertificateRequest.json
new file mode 100755 (executable)
index 0000000..bd74edc
--- /dev/null
@@ -0,0 +1,47 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:Get15118EVCertificateRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "CertificateActionEnumType": {
+      "description": "Defines whether certificate needs to be installed or updated.\r\n",
+      "javaType": "CertificateActionEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Install", "Update"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "iso15118SchemaVersion": {
+      "description": "Schema version currently used for the 15118 session between EV and Charging Station. Needed for parsing of the EXI stream by the CSMS.\r\n\r\n",
+      "type": "string",
+      "maxLength": 50
+    },
+    "action": {
+      "$ref": "#/definitions/CertificateActionEnumType"
+    },
+    "exiRequest": {
+      "description": "Raw CertificateInstallationReq request from EV, Base64 encoded.\r\n",
+      "type": "string",
+      "maxLength": 5600
+    }
+  },
+  "required": ["iso15118SchemaVersion", "action", "exiRequest"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/Get15118EVCertificateResponse.json b/src/assets/json-schemas/ocpp/2.0/Get15118EVCertificateResponse.json
new file mode 100755 (executable)
index 0000000..2b28e08
--- /dev/null
@@ -0,0 +1,67 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:Get15118EVCertificateResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "Iso15118EVCertificateStatusEnumType": {
+      "description": "Indicates whether the message was processed properly.\r\n",
+      "javaType": "Iso15118EVCertificateStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Failed"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/Iso15118EVCertificateStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    },
+    "exiResponse": {
+      "description": "Raw CertificateInstallationRes response for the EV, Base64 encoded.\r\n",
+      "type": "string",
+      "maxLength": 5600
+    }
+  },
+  "required": ["status", "exiResponse"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetBaseReportRequest.json b/src/assets/json-schemas/ocpp/2.0/GetBaseReportRequest.json
new file mode 100755 (executable)
index 0000000..98d27dd
--- /dev/null
@@ -0,0 +1,41 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetBaseReportRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ReportBaseEnumType": {
+      "description": "This field specifies the report base.\r\n",
+      "javaType": "ReportBaseEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["ConfigurationInventory", "FullInventory", "SummaryInventory"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "requestId": {
+      "description": "The Id of the request.\r\n",
+      "type": "integer"
+    },
+    "reportBase": {
+      "$ref": "#/definitions/ReportBaseEnumType"
+    }
+  },
+  "required": ["requestId", "reportBase"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetBaseReportResponse.json b/src/assets/json-schemas/ocpp/2.0/GetBaseReportResponse.json
new file mode 100755 (executable)
index 0000000..64cc0d0
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetBaseReportResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GenericDeviceModelStatusEnumType": {
+      "description": "This indicates whether the Charging Station is able to accept this request.\r\n",
+      "javaType": "GenericDeviceModelStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "NotSupported", "EmptyResultSet"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GenericDeviceModelStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetCertificateStatusRequest.json b/src/assets/json-schemas/ocpp/2.0/GetCertificateStatusRequest.json
new file mode 100755 (executable)
index 0000000..932eaca
--- /dev/null
@@ -0,0 +1,77 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetCertificateStatusRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "HashAlgorithmEnumType": {
+      "description": "Used algorithms for the hashes provided.\r\n",
+      "javaType": "HashAlgorithmEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["SHA256", "SHA384", "SHA512"]
+    },
+    "OCSPRequestDataType": {
+      "javaType": "OCSPRequestData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "hashAlgorithm": {
+          "$ref": "#/definitions/HashAlgorithmEnumType"
+        },
+        "issuerNameHash": {
+          "description": "Hashed value of the Issuer DN (Distinguished Name).\r\n\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "issuerKeyHash": {
+          "description": "Hashed value of the issuers public key\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "serialNumber": {
+          "description": "The serial number of the certificate.\r\n",
+          "type": "string",
+          "maxLength": 40
+        },
+        "responderURL": {
+          "description": "This contains the responder URL (Case insensitive). \r\n\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": [
+        "hashAlgorithm",
+        "issuerNameHash",
+        "issuerKeyHash",
+        "serialNumber",
+        "responderURL"
+      ]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "ocspRequestData": {
+      "$ref": "#/definitions/OCSPRequestDataType"
+    }
+  },
+  "required": ["ocspRequestData"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetCertificateStatusResponse.json b/src/assets/json-schemas/ocpp/2.0/GetCertificateStatusResponse.json
new file mode 100755 (executable)
index 0000000..615755b
--- /dev/null
@@ -0,0 +1,67 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetCertificateStatusResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GetCertificateStatusEnumType": {
+      "description": "This indicates whether the charging station was able to retrieve the OCSP certificate status.\r\n",
+      "javaType": "GetCertificateStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Failed"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GetCertificateStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    },
+    "ocspResult": {
+      "description": "OCSPResponse class as defined in &lt;&lt;ref-ocpp_security_24, IETF RFC 6960&gt;&gt;. DER encoded (as defined in &lt;&lt;ref-ocpp_security_24, IETF RFC 6960&gt;&gt;), and then base64 encoded. MAY only be omitted when status is not Accepted.\r\n",
+      "type": "string",
+      "maxLength": 5500
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetChargingProfilesRequest.json b/src/assets/json-schemas/ocpp/2.0/GetChargingProfilesRequest.json
new file mode 100755 (executable)
index 0000000..f3776bb
--- /dev/null
@@ -0,0 +1,93 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetChargingProfilesRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingLimitSourceEnumType": {
+      "javaType": "ChargingLimitSourceEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["EMS", "Other", "SO", "CSO"]
+    },
+    "ChargingProfilePurposeEnumType": {
+      "description": "Charging_ Profile. Charging_ Profile_ Purpose. Charging_ Profile_ Purpose_ Code\r\nurn:x-oca:ocpp:uid:1:569231\r\nDefines the purpose of the schedule transferred by this profile\r\n",
+      "javaType": "ChargingProfilePurposeEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "ChargingStationExternalConstraints",
+        "ChargingStationMaxProfile",
+        "TxDefaultProfile",
+        "TxProfile"
+      ]
+    },
+    "ChargingProfileCriterionType": {
+      "description": "Charging_ Profile\r\nurn:x-oca:ocpp:uid:2:233255\r\nA ChargingProfile consists of ChargingSchedule, describing the amount of power or current that can be delivered per time interval.\r\n",
+      "javaType": "ChargingProfileCriterion",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "chargingProfilePurpose": {
+          "$ref": "#/definitions/ChargingProfilePurposeEnumType"
+        },
+        "stackLevel": {
+          "description": "Charging_ Profile. Stack_ Level. Counter\r\nurn:x-oca:ocpp:uid:1:569230\r\nValue determining level in hierarchy stack of profiles. Higher values have precedence over lower values. Lowest level is 0.\r\n",
+          "type": "integer"
+        },
+        "chargingProfileId": {
+          "description": "List of all the chargingProfileIds requested. Any ChargingProfile that matches one of these profiles will be reported. If omitted, the Charging Station SHALL not filter on chargingProfileId. This field SHALL NOT contain more ids than set in &lt;&lt;configkey-charging-profile-entries,ChargingProfileEntries.maxLimit&gt;&gt;\r\n\r\n",
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "type": "integer"
+          },
+          "minItems": 1
+        },
+        "chargingLimitSource": {
+          "description": "For which charging limit sources, charging profiles SHALL be reported. If omitted, the Charging Station SHALL not filter on chargingLimitSource.\r\n",
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingLimitSourceEnumType"
+          },
+          "minItems": 1,
+          "maxItems": 4
+        }
+      }
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "requestId": {
+      "description": "Reference identification that is to be used by the Charging Station in the &lt;&lt;reportchargingprofilesrequest, ReportChargingProfilesRequest&gt;&gt; when provided.\r\n",
+      "type": "integer"
+    },
+    "evseId": {
+      "description": "For which EVSE installed charging profiles SHALL be reported. If 0, only charging profiles installed on the Charging Station itself (the grid connection) SHALL be reported. If omitted, all installed charging profiles SHALL be reported.\r\n",
+      "type": "integer"
+    },
+    "chargingProfile": {
+      "$ref": "#/definitions/ChargingProfileCriterionType"
+    }
+  },
+  "required": ["requestId", "chargingProfile"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetChargingProfilesResponse.json b/src/assets/json-schemas/ocpp/2.0/GetChargingProfilesResponse.json
new file mode 100755 (executable)
index 0000000..0eb6e83
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetChargingProfilesResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GetChargingProfileStatusEnumType": {
+      "description": "This indicates whether the Charging Station is able to process this request and will send &lt;&lt;reportchargingprofilesrequest, ReportChargingProfilesRequest&gt;&gt; messages.\r\n",
+      "javaType": "GetChargingProfileStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "NoProfiles"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GetChargingProfileStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetCompositeScheduleRequest.json b/src/assets/json-schemas/ocpp/2.0/GetCompositeScheduleRequest.json
new file mode 100755 (executable)
index 0000000..7d1d000
--- /dev/null
@@ -0,0 +1,45 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetCompositeScheduleRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingRateUnitEnumType": {
+      "description": "Can be used to force a power or current profile.\r\n\r\n",
+      "javaType": "ChargingRateUnitEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["W", "A"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "duration": {
+      "description": "Length of the requested schedule in seconds.\r\n\r\n",
+      "type": "integer"
+    },
+    "chargingRateUnit": {
+      "$ref": "#/definitions/ChargingRateUnitEnumType"
+    },
+    "evseId": {
+      "description": "The ID of the EVSE for which the schedule is requested. When evseid=0, the Charging Station will calculate the expected consumption for the grid connection.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["duration", "evseId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetCompositeScheduleResponse.json b/src/assets/json-schemas/ocpp/2.0/GetCompositeScheduleResponse.json
new file mode 100755 (executable)
index 0000000..5ac7385
--- /dev/null
@@ -0,0 +1,142 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetCompositeScheduleResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingRateUnitEnumType": {
+      "description": "The unit of measure Limit is\r\nexpressed in.\r\n",
+      "javaType": "ChargingRateUnitEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["W", "A"]
+    },
+    "GenericStatusEnumType": {
+      "description": "The Charging Station will indicate if it was\r\nable to process the request\r\n",
+      "javaType": "GenericStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "ChargingSchedulePeriodType": {
+      "description": "Charging_ Schedule_ Period\r\nurn:x-oca:ocpp:uid:2:233257\r\nCharging schedule period structure defines a time period in a charging schedule.\r\n",
+      "javaType": "ChargingSchedulePeriod",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startPeriod": {
+          "description": "Charging_ Schedule_ Period. Start_ Period. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569240\r\nStart of the period, in seconds from the start of schedule. The value of StartPeriod also defines the stop time of the previous period.\r\n",
+          "type": "integer"
+        },
+        "limit": {
+          "description": "Charging_ Schedule_ Period. Limit. Measure\r\nurn:x-oca:ocpp:uid:1:569241\r\nCharging rate limit during the schedule period, in the applicable chargingRateUnit, for example in Amperes (A) or Watts (W). Accepts at most one digit fraction (e.g. 8.1).\r\n",
+          "type": "number"
+        },
+        "numberPhases": {
+          "description": "Charging_ Schedule_ Period. Number_ Phases. Counter\r\nurn:x-oca:ocpp:uid:1:569242\r\nThe number of phases that can be used for charging. If a number of phases is needed, numberPhases=3 will be assumed unless another number is given.\r\n",
+          "type": "integer"
+        },
+        "phaseToUse": {
+          "description": "Values: 1..3, Used if numberPhases=1 and if the EVSE is capable of switching the phase connected to the EV, i.e. ACPhaseSwitchingSupported is defined and true. It’s not allowed unless both conditions above are true. If both conditions are true, and phaseToUse is omitted, the Charging Station / EVSE will make the selection on its own.\r\n\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["startPeriod", "limit"]
+    },
+    "CompositeScheduleType": {
+      "description": "Composite_ Schedule\r\nurn:x-oca:ocpp:uid:2:233362\r\n",
+      "javaType": "CompositeSchedule",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "chargingSchedulePeriod": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingSchedulePeriodType"
+          },
+          "minItems": 1
+        },
+        "evseId": {
+          "description": "The ID of the EVSE for which the\r\nschedule is requested. When evseid=0, the\r\nCharging Station calculated the expected\r\nconsumption for the grid connection.\r\n",
+          "type": "integer"
+        },
+        "duration": {
+          "description": "Duration of the schedule in seconds.\r\n",
+          "type": "integer"
+        },
+        "scheduleStart": {
+          "description": "Composite_ Schedule. Start. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569456\r\nDate and time at which the schedule becomes active. All time measurements within the schedule are relative to this timestamp.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "chargingRateUnit": {
+          "$ref": "#/definitions/ChargingRateUnitEnumType"
+        }
+      },
+      "required": [
+        "evseId",
+        "duration",
+        "scheduleStart",
+        "chargingRateUnit",
+        "chargingSchedulePeriod"
+      ]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GenericStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    },
+    "schedule": {
+      "$ref": "#/definitions/CompositeScheduleType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetDisplayMessagesRequest.json b/src/assets/json-schemas/ocpp/2.0/GetDisplayMessagesRequest.json
new file mode 100755 (executable)
index 0000000..e5f733b
--- /dev/null
@@ -0,0 +1,60 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetDisplayMessagesRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "MessagePriorityEnumType": {
+      "description": "If provided the Charging Station shall return Display Messages with the given priority only.\r\n",
+      "javaType": "MessagePriorityEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["AlwaysFront", "InFront", "NormalCycle"]
+    },
+    "MessageStateEnumType": {
+      "description": "If provided the Charging Station shall return Display Messages with the given state only. \r\n",
+      "javaType": "MessageStateEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Charging", "Faulted", "Idle", "Unavailable"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "id": {
+      "description": "If provided the Charging Station shall return Display Messages of the given ids. This field SHALL NOT contain more ids than set in &lt;&lt;configkey-number-of-display-messages,NumberOfDisplayMessages.maxLimit&gt;&gt;\r\n\r\n",
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "type": "integer"
+      },
+      "minItems": 1
+    },
+    "requestId": {
+      "description": "The Id of this request.\r\n",
+      "type": "integer"
+    },
+    "priority": {
+      "$ref": "#/definitions/MessagePriorityEnumType"
+    },
+    "state": {
+      "$ref": "#/definitions/MessageStateEnumType"
+    }
+  },
+  "required": ["requestId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetDisplayMessagesResponse.json b/src/assets/json-schemas/ocpp/2.0/GetDisplayMessagesResponse.json
new file mode 100755 (executable)
index 0000000..f74aa0d
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetDisplayMessagesResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GetDisplayMessagesStatusEnumType": {
+      "description": "Indicates if the Charging Station has Display Messages that match the request criteria in the &lt;&lt;getdisplaymessagesrequest,GetDisplayMessagesRequest&gt;&gt;\r\n",
+      "javaType": "GetDisplayMessagesStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Unknown"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GetDisplayMessagesStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetInstalledCertificateIdsRequest.json b/src/assets/json-schemas/ocpp/2.0/GetInstalledCertificateIdsRequest.json
new file mode 100755 (executable)
index 0000000..1b2e3d4
--- /dev/null
@@ -0,0 +1,47 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetInstalledCertificateIdsRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GetCertificateIdUseEnumType": {
+      "javaType": "GetCertificateIdUseEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "V2GRootCertificate",
+        "MORootCertificate",
+        "CSMSRootCertificate",
+        "V2GCertificateChain",
+        "ManufacturerRootCertificate"
+      ]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "certificateType": {
+      "description": "Indicates the type of certificates requested. When omitted, all certificate types are requested.\r\n",
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/GetCertificateIdUseEnumType"
+      },
+      "minItems": 1
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetInstalledCertificateIdsResponse.json b/src/assets/json-schemas/ocpp/2.0/GetInstalledCertificateIdsResponse.json
new file mode 100755 (executable)
index 0000000..dfb3533
--- /dev/null
@@ -0,0 +1,145 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetInstalledCertificateIdsResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GetCertificateIdUseEnumType": {
+      "description": "Indicates the type of the requested certificate(s).\r\n",
+      "javaType": "GetCertificateIdUseEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "V2GRootCertificate",
+        "MORootCertificate",
+        "CSMSRootCertificate",
+        "V2GCertificateChain",
+        "ManufacturerRootCertificate"
+      ]
+    },
+    "GetInstalledCertificateStatusEnumType": {
+      "description": "Charging Station indicates if it can process the request.\r\n",
+      "javaType": "GetInstalledCertificateStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "NotFound"]
+    },
+    "HashAlgorithmEnumType": {
+      "description": "Used algorithms for the hashes provided.\r\n",
+      "javaType": "HashAlgorithmEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["SHA256", "SHA384", "SHA512"]
+    },
+    "CertificateHashDataChainType": {
+      "javaType": "CertificateHashDataChain",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "certificateHashData": {
+          "$ref": "#/definitions/CertificateHashDataType"
+        },
+        "certificateType": {
+          "$ref": "#/definitions/GetCertificateIdUseEnumType"
+        },
+        "childCertificateHashData": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/CertificateHashDataType"
+          },
+          "minItems": 1,
+          "maxItems": 4
+        }
+      },
+      "required": ["certificateType", "certificateHashData"]
+    },
+    "CertificateHashDataType": {
+      "javaType": "CertificateHashData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "hashAlgorithm": {
+          "$ref": "#/definitions/HashAlgorithmEnumType"
+        },
+        "issuerNameHash": {
+          "description": "Hashed value of the Issuer DN (Distinguished Name).\r\n\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "issuerKeyHash": {
+          "description": "Hashed value of the issuers public key\r\n",
+          "type": "string",
+          "maxLength": 128
+        },
+        "serialNumber": {
+          "description": "The serial number of the certificate.\r\n",
+          "type": "string",
+          "maxLength": 40
+        }
+      },
+      "required": ["hashAlgorithm", "issuerNameHash", "issuerKeyHash", "serialNumber"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GetInstalledCertificateStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    },
+    "certificateHashDataChain": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/CertificateHashDataChainType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetLocalListVersionRequest.json b/src/assets/json-schemas/ocpp/2.0/GetLocalListVersionRequest.json
new file mode 100755 (executable)
index 0000000..38068df
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetLocalListVersionRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetLocalListVersionResponse.json b/src/assets/json-schemas/ocpp/2.0/GetLocalListVersionResponse.json
new file mode 100755 (executable)
index 0000000..539ab17
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetLocalListVersionResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "versionNumber": {
+      "description": "This contains the current version number of the local authorization list in the Charging Station.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["versionNumber"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetLogRequest.json b/src/assets/json-schemas/ocpp/2.0/GetLogRequest.json
new file mode 100755 (executable)
index 0000000..61f0fe8
--- /dev/null
@@ -0,0 +1,79 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetLogRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "LogEnumType": {
+      "description": "This contains the type of log file that the Charging Station\r\nshould send.\r\n",
+      "javaType": "LogEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["DiagnosticsLog", "SecurityLog"]
+    },
+    "LogParametersType": {
+      "description": "Log\r\nurn:x-enexis:ecdm:uid:2:233373\r\nGeneric class for the configuration of logging entries.\r\n",
+      "javaType": "LogParameters",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "remoteLocation": {
+          "description": "Log. Remote_ Location. URI\r\nurn:x-enexis:ecdm:uid:1:569484\r\nThe URL of the location at the remote system where the log should be stored.\r\n",
+          "type": "string",
+          "maxLength": 512
+        },
+        "oldestTimestamp": {
+          "description": "Log. Oldest_ Timestamp. Date_ Time\r\nurn:x-enexis:ecdm:uid:1:569477\r\nThis contains the date and time of the oldest logging information to include in the diagnostics.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "latestTimestamp": {
+          "description": "Log. Latest_ Timestamp. Date_ Time\r\nurn:x-enexis:ecdm:uid:1:569482\r\nThis contains the date and time of the latest logging information to include in the diagnostics.\r\n",
+          "type": "string",
+          "format": "date-time"
+        }
+      },
+      "required": ["remoteLocation"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "log": {
+      "$ref": "#/definitions/LogParametersType"
+    },
+    "logType": {
+      "$ref": "#/definitions/LogEnumType"
+    },
+    "requestId": {
+      "description": "The Id of this request\r\n",
+      "type": "integer"
+    },
+    "retries": {
+      "description": "This specifies how many times the Charging Station must try to upload the log before giving up. If this field is not present, it is left to Charging Station to decide how many times it wants to retry.\r\n",
+      "type": "integer"
+    },
+    "retryInterval": {
+      "description": "The interval in seconds after which a retry may be attempted. If this field is not present, it is left to Charging Station to decide how long to wait between attempts.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["logType", "requestId", "log"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetLogResponse.json b/src/assets/json-schemas/ocpp/2.0/GetLogResponse.json
new file mode 100755 (executable)
index 0000000..b604ff8
--- /dev/null
@@ -0,0 +1,67 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetLogResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "LogStatusEnumType": {
+      "description": "This field indicates whether the Charging Station was able to accept the request.\r\n",
+      "javaType": "LogStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "AcceptedCanceled"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/LogStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    },
+    "filename": {
+      "description": "This contains the name of the log file that will be uploaded. This field is not present when no logging information is available.\r\n",
+      "type": "string",
+      "maxLength": 255
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetMonitoringReportRequest.json b/src/assets/json-schemas/ocpp/2.0/GetMonitoringReportRequest.json
new file mode 100755 (executable)
index 0000000..efe82d1
--- /dev/null
@@ -0,0 +1,140 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetMonitoringReportRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "MonitoringCriterionEnumType": {
+      "javaType": "MonitoringCriterionEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["ThresholdMonitoring", "DeltaMonitoring", "PeriodicMonitoring"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "ComponentVariableType": {
+      "description": "Class to report components, variables and variable attributes and characteristics.\r\n",
+      "javaType": "ComponentVariable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        }
+      },
+      "required": ["component"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "componentVariable": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/ComponentVariableType"
+      },
+      "minItems": 1
+    },
+    "requestId": {
+      "description": "The Id of the request.\r\n",
+      "type": "integer"
+    },
+    "monitoringCriteria": {
+      "description": "This field contains criteria for components for which a monitoring report is requested\r\n",
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/MonitoringCriterionEnumType"
+      },
+      "minItems": 1,
+      "maxItems": 3
+    }
+  },
+  "required": ["requestId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetMonitoringReportResponse.json b/src/assets/json-schemas/ocpp/2.0/GetMonitoringReportResponse.json
new file mode 100755 (executable)
index 0000000..c294ee6
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetMonitoringReportResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GenericDeviceModelStatusEnumType": {
+      "description": "This field indicates whether the Charging Station was able to accept the request.\r\n",
+      "javaType": "GenericDeviceModelStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "NotSupported", "EmptyResultSet"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GenericDeviceModelStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetReportRequest.json b/src/assets/json-schemas/ocpp/2.0/GetReportRequest.json
new file mode 100755 (executable)
index 0000000..24ceebd
--- /dev/null
@@ -0,0 +1,140 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetReportRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ComponentCriterionEnumType": {
+      "javaType": "ComponentCriterionEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Active", "Available", "Enabled", "Problem"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "ComponentVariableType": {
+      "description": "Class to report components, variables and variable attributes and characteristics.\r\n",
+      "javaType": "ComponentVariable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        }
+      },
+      "required": ["component"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "componentVariable": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/ComponentVariableType"
+      },
+      "minItems": 1
+    },
+    "requestId": {
+      "description": "The Id of the request.\r\n",
+      "type": "integer"
+    },
+    "componentCriteria": {
+      "description": "This field contains criteria for components for which a report is requested\r\n",
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/ComponentCriterionEnumType"
+      },
+      "minItems": 1,
+      "maxItems": 4
+    }
+  },
+  "required": ["requestId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetReportResponse.json b/src/assets/json-schemas/ocpp/2.0/GetReportResponse.json
new file mode 100755 (executable)
index 0000000..5085358
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetReportResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GenericDeviceModelStatusEnumType": {
+      "description": "This field indicates whether the Charging Station was able to accept the request.\r\n",
+      "javaType": "GenericDeviceModelStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "NotSupported", "EmptyResultSet"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GenericDeviceModelStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetTransactionStatusRequest.json b/src/assets/json-schemas/ocpp/2.0/GetTransactionStatusRequest.json
new file mode 100755 (executable)
index 0000000..081dd81
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetTransactionStatusRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "transactionId": {
+      "description": "The Id of the transaction for which the status is requested.\r\n",
+      "type": "string",
+      "maxLength": 36
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetTransactionStatusResponse.json b/src/assets/json-schemas/ocpp/2.0/GetTransactionStatusResponse.json
new file mode 100755 (executable)
index 0000000..01a5206
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetTransactionStatusResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "ongoingIndicator": {
+      "description": "Whether the transaction is still ongoing.\r\n",
+      "type": "boolean"
+    },
+    "messagesInQueue": {
+      "description": "Whether there are still message to be delivered.\r\n",
+      "type": "boolean"
+    }
+  },
+  "required": ["messagesInQueue"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetVariablesRequest.json b/src/assets/json-schemas/ocpp/2.0/GetVariablesRequest.json
new file mode 100755 (executable)
index 0000000..a6c65aa
--- /dev/null
@@ -0,0 +1,131 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetVariablesRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "AttributeEnumType": {
+      "description": "Attribute type for which value is requested. When absent, default Actual is assumed.\r\n",
+      "javaType": "AttributeEnum",
+      "type": "string",
+      "default": "Actual",
+      "additionalProperties": false,
+      "enum": ["Actual", "Target", "MinSet", "MaxSet"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "GetVariableDataType": {
+      "description": "Class to hold parameters for GetVariables request.\r\n",
+      "javaType": "GetVariableData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "attributeType": {
+          "$ref": "#/definitions/AttributeEnumType"
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        }
+      },
+      "required": ["component", "variable"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "getVariableData": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/GetVariableDataType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["getVariableData"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/GetVariablesResponse.json b/src/assets/json-schemas/ocpp/2.0/GetVariablesResponse.json
new file mode 100755 (executable)
index 0000000..44f8913
--- /dev/null
@@ -0,0 +1,177 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:GetVariablesResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "AttributeEnumType": {
+      "description": "Attribute type for which value is requested. When absent, default Actual is assumed.\r\n",
+      "javaType": "AttributeEnum",
+      "type": "string",
+      "default": "Actual",
+      "additionalProperties": false,
+      "enum": ["Actual", "Target", "MinSet", "MaxSet"]
+    },
+    "GetVariableStatusEnumType": {
+      "description": "Result status of getting the variable.\r\n\r\n",
+      "javaType": "GetVariableStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Accepted",
+        "Rejected",
+        "UnknownComponent",
+        "UnknownVariable",
+        "NotSupportedAttributeType"
+      ]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "GetVariableResultType": {
+      "description": "Class to hold results of GetVariables request.\r\n",
+      "javaType": "GetVariableResult",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "attributeStatusInfo": {
+          "$ref": "#/definitions/StatusInfoType"
+        },
+        "attributeStatus": {
+          "$ref": "#/definitions/GetVariableStatusEnumType"
+        },
+        "attributeType": {
+          "$ref": "#/definitions/AttributeEnumType"
+        },
+        "attributeValue": {
+          "description": "Value of requested attribute type of component-variable. This field can only be empty when the given status is NOT accepted.\r\n\r\nThe Configuration Variable &lt;&lt;configkey-reporting-value-size,ReportingValueSize&gt;&gt; can be used to limit GetVariableResult.attributeValue, VariableAttribute.value and EventData.actualValue. The max size of these values will always remain equal. \r\n\r\n",
+          "type": "string",
+          "maxLength": 2500
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        }
+      },
+      "required": ["attributeStatus", "component", "variable"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "getVariableResult": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/GetVariableResultType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["getVariableResult"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/HeartbeatRequest.json b/src/assets/json-schemas/ocpp/2.0/HeartbeatRequest.json
new file mode 100755 (executable)
index 0000000..bc1808e
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:HeartbeatRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/HeartbeatResponse.json b/src/assets/json-schemas/ocpp/2.0/HeartbeatResponse.json
new file mode 100755 (executable)
index 0000000..908ffd9
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:HeartbeatResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "currentTime": {
+      "description": "Contains the current time of the CSMS.\r\n",
+      "type": "string",
+      "format": "date-time"
+    }
+  },
+  "required": ["currentTime"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/InstallCertificateRequest.json b/src/assets/json-schemas/ocpp/2.0/InstallCertificateRequest.json
new file mode 100755 (executable)
index 0000000..2c8689b
--- /dev/null
@@ -0,0 +1,47 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:InstallCertificateRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "InstallCertificateUseEnumType": {
+      "description": "Indicates the certificate type that is sent.\r\n",
+      "javaType": "InstallCertificateUseEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "V2GRootCertificate",
+        "MORootCertificate",
+        "CSMSRootCertificate",
+        "ManufacturerRootCertificate"
+      ]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "certificateType": {
+      "$ref": "#/definitions/InstallCertificateUseEnumType"
+    },
+    "certificate": {
+      "description": "A PEM encoded X.509 certificate.\r\n",
+      "type": "string",
+      "maxLength": 5500
+    }
+  },
+  "required": ["certificateType", "certificate"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/InstallCertificateResponse.json b/src/assets/json-schemas/ocpp/2.0/InstallCertificateResponse.json
new file mode 100755 (executable)
index 0000000..980e0fe
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:InstallCertificateResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "InstallCertificateStatusEnumType": {
+      "description": "Charging Station indicates if installation was successful.\r\n",
+      "javaType": "InstallCertificateStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "Failed"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/InstallCertificateStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/LogStatusNotificationRequest.json b/src/assets/json-schemas/ocpp/2.0/LogStatusNotificationRequest.json
new file mode 100755 (executable)
index 0000000..cf2a89d
--- /dev/null
@@ -0,0 +1,50 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:LogStatusNotificationRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "UploadLogStatusEnumType": {
+      "description": "This contains the status of the log upload.\r\n",
+      "javaType": "UploadLogStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "BadMessage",
+        "Idle",
+        "NotSupportedOperation",
+        "PermissionDenied",
+        "Uploaded",
+        "UploadFailure",
+        "Uploading",
+        "AcceptedCanceled"
+      ]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/UploadLogStatusEnumType"
+    },
+    "requestId": {
+      "description": "The request id that was provided in GetLogRequest that started this log upload. This field is mandatory,\r\nunless the message was triggered by a TriggerMessageRequest AND there is no log upload ongoing.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/LogStatusNotificationResponse.json b/src/assets/json-schemas/ocpp/2.0/LogStatusNotificationResponse.json
new file mode 100755 (executable)
index 0000000..eddc32c
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:LogStatusNotificationResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/MeterValuesRequest.json b/src/assets/json-schemas/ocpp/2.0/MeterValuesRequest.json
new file mode 100755 (executable)
index 0000000..85810ac
--- /dev/null
@@ -0,0 +1,219 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:MeterValuesRequest",
+  "description": "Request_ Body\r\nurn:x-enexis:ecdm:uid:2:234744\r\n",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "LocationEnumType": {
+      "description": "Sampled_ Value. Location. Location_ Code\r\nurn:x-oca:ocpp:uid:1:569265\r\nIndicates where the measured value has been sampled. Default =  \"Outlet\"\r\n\r\n",
+      "javaType": "LocationEnum",
+      "type": "string",
+      "default": "Outlet",
+      "additionalProperties": false,
+      "enum": ["Body", "Cable", "EV", "Inlet", "Outlet"]
+    },
+    "MeasurandEnumType": {
+      "description": "Sampled_ Value. Measurand. Measurand_ Code\r\nurn:x-oca:ocpp:uid:1:569263\r\nType of measurement. Default = \"Energy.Active.Import.Register\"\r\n",
+      "javaType": "MeasurandEnum",
+      "type": "string",
+      "default": "Energy.Active.Import.Register",
+      "additionalProperties": false,
+      "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": {
+      "description": "Sampled_ Value. Phase. Phase_ Code\r\nurn:x-oca:ocpp:uid:1:569264\r\nIndicates how the measured value is to be interpreted. For instance between L1 and neutral (L1-N) Please note that not all values of phase are applicable to all Measurands. When phase is absent, the measured value is interpreted as an overall value.\r\n",
+      "javaType": "PhaseEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["L1", "L2", "L3", "N", "L1-N", "L2-N", "L3-N", "L1-L2", "L2-L3", "L3-L1"]
+    },
+    "ReadingContextEnumType": {
+      "description": "Sampled_ Value. Context. Reading_ Context_ Code\r\nurn:x-oca:ocpp:uid:1:569261\r\nType of detail value: start, end or sample. Default = \"Sample.Periodic\"\r\n",
+      "javaType": "ReadingContextEnum",
+      "type": "string",
+      "default": "Sample.Periodic",
+      "additionalProperties": false,
+      "enum": [
+        "Interruption.Begin",
+        "Interruption.End",
+        "Other",
+        "Sample.Clock",
+        "Sample.Periodic",
+        "Transaction.Begin",
+        "Transaction.End",
+        "Trigger"
+      ]
+    },
+    "MeterValueType": {
+      "description": "Meter_ Value\r\nurn:x-oca:ocpp:uid:2:233265\r\nCollection of one or more sampled values in MeterValuesRequest and TransactionEvent. All sampled values in a MeterValue are sampled at the same point in time.\r\n",
+      "javaType": "MeterValue",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "sampledValue": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/SampledValueType"
+          },
+          "minItems": 1
+        },
+        "timestamp": {
+          "description": "Meter_ Value. Timestamp. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569259\r\nTimestamp for measured value(s).\r\n",
+          "type": "string",
+          "format": "date-time"
+        }
+      },
+      "required": ["timestamp", "sampledValue"]
+    },
+    "SampledValueType": {
+      "description": "Sampled_ Value\r\nurn:x-oca:ocpp:uid:2:233266\r\nSingle sampled value in MeterValues. Each value can be accompanied by optional fields.\r\n\r\nTo save on mobile data usage, default values of all of the optional fields are such that. The value without any additional fields will be interpreted, as a register reading of active import energy in Wh (Watt-hour) units.\r\n",
+      "javaType": "SampledValue",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "value": {
+          "description": "Sampled_ Value. Value. Measure\r\nurn:x-oca:ocpp:uid:1:569260\r\nIndicates the measured value.\r\n\r\n",
+          "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": {
+      "description": "Represent a signed version of the meter value.\r\n",
+      "javaType": "SignedMeterValue",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "signedMeterData": {
+          "description": "Base64 encoded, contains the signed data which might contain more then just the meter value. It can contain information like timestamps, reference to a customer etc.\r\n",
+          "type": "string",
+          "maxLength": 2500
+        },
+        "signingMethod": {
+          "description": "Method used to create the digital signature.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "encodingMethod": {
+          "description": "Method used to encode the meter values before applying the digital signature algorithm.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "publicKey": {
+          "description": "Base64 encoded, sending depends on configuration variable _PublicKeyWithSignedMeterValue_.\r\n",
+          "type": "string",
+          "maxLength": 2500
+        }
+      },
+      "required": ["signedMeterData", "signingMethod", "encodingMethod", "publicKey"]
+    },
+    "UnitOfMeasureType": {
+      "description": "Represents a UnitOfMeasure with a multiplier\r\n",
+      "javaType": "UnitOfMeasure",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "unit": {
+          "description": "Unit of the value. Default = \"Wh\" if the (default) measurand is an \"Energy\" type.\r\nThis field SHALL use a value from the list Standardized Units of Measurements in Part 2 Appendices. \r\nIf an applicable unit is available in that list, otherwise a \"custom\" unit might be used.\r\n",
+          "type": "string",
+          "default": "Wh",
+          "maxLength": 20
+        },
+        "multiplier": {
+          "description": "Multiplier, this value represents the exponent to base 10. I.e. multiplier 3 means 10 raised to the 3rd power. Default is 0.\r\n",
+          "type": "integer",
+          "default": 0
+        }
+      }
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "evseId": {
+      "description": "Request_ Body. EVSEID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:571101\r\nThis contains a number (&gt;0) designating an EVSE of the Charging Station. ‘0’ (zero) is used to designate the main power meter.\r\n",
+      "type": "integer"
+    },
+    "meterValue": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/MeterValueType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["evseId", "meterValue"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/MeterValuesResponse.json b/src/assets/json-schemas/ocpp/2.0/MeterValuesResponse.json
new file mode 100755 (executable)
index 0000000..4d1348d
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:MeterValuesResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyChargingLimitRequest.json b/src/assets/json-schemas/ocpp/2.0/NotifyChargingLimitRequest.json
new file mode 100755 (executable)
index 0000000..589715e
--- /dev/null
@@ -0,0 +1,285 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyChargingLimitRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingLimitSourceEnumType": {
+      "description": "Charging_ Limit. Charging_ Limit_ Source. Charging_ Limit_ Source_ Code\r\nurn:x-enexis:ecdm:uid:1:570845\r\nRepresents the source of the charging limit.\r\n",
+      "javaType": "ChargingLimitSourceEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["EMS", "Other", "SO", "CSO"]
+    },
+    "ChargingRateUnitEnumType": {
+      "description": "Charging_ Schedule. Charging_ Rate_ Unit. Charging_ Rate_ Unit_ Code\r\nurn:x-oca:ocpp:uid:1:569238\r\nThe unit of measure Limit is expressed in.\r\n",
+      "javaType": "ChargingRateUnitEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["W", "A"]
+    },
+    "CostKindEnumType": {
+      "description": "Cost. Cost_ Kind. Cost_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569243\r\nThe kind of cost referred to in the message element amount\r\n",
+      "javaType": "CostKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["CarbonDioxideEmission", "RelativePricePercentage", "RenewableGenerationPercentage"]
+    },
+    "ChargingLimitType": {
+      "description": "Charging_ Limit\r\nurn:x-enexis:ecdm:uid:2:234489\r\n",
+      "javaType": "ChargingLimit",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "chargingLimitSource": {
+          "$ref": "#/definitions/ChargingLimitSourceEnumType"
+        },
+        "isGridCritical": {
+          "description": "Charging_ Limit. Is_ Grid_ Critical. Indicator\r\nurn:x-enexis:ecdm:uid:1:570847\r\nIndicates whether the charging limit is critical for the grid.\r\n",
+          "type": "boolean"
+        }
+      },
+      "required": ["chargingLimitSource"]
+    },
+    "ChargingSchedulePeriodType": {
+      "description": "Charging_ Schedule_ Period\r\nurn:x-oca:ocpp:uid:2:233257\r\nCharging schedule period structure defines a time period in a charging schedule.\r\n",
+      "javaType": "ChargingSchedulePeriod",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startPeriod": {
+          "description": "Charging_ Schedule_ Period. Start_ Period. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569240\r\nStart of the period, in seconds from the start of schedule. The value of StartPeriod also defines the stop time of the previous period.\r\n",
+          "type": "integer"
+        },
+        "limit": {
+          "description": "Charging_ Schedule_ Period. Limit. Measure\r\nurn:x-oca:ocpp:uid:1:569241\r\nCharging rate limit during the schedule period, in the applicable chargingRateUnit, for example in Amperes (A) or Watts (W). Accepts at most one digit fraction (e.g. 8.1).\r\n",
+          "type": "number"
+        },
+        "numberPhases": {
+          "description": "Charging_ Schedule_ Period. Number_ Phases. Counter\r\nurn:x-oca:ocpp:uid:1:569242\r\nThe number of phases that can be used for charging. If a number of phases is needed, numberPhases=3 will be assumed unless another number is given.\r\n",
+          "type": "integer"
+        },
+        "phaseToUse": {
+          "description": "Values: 1..3, Used if numberPhases=1 and if the EVSE is capable of switching the phase connected to the EV, i.e. ACPhaseSwitchingSupported is defined and true. It’s not allowed unless both conditions above are true. If both conditions are true, and phaseToUse is omitted, the Charging Station / EVSE will make the selection on its own.\r\n\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["startPeriod", "limit"]
+    },
+    "ChargingScheduleType": {
+      "description": "Charging_ Schedule\r\nurn:x-oca:ocpp:uid:2:233256\r\nCharging schedule structure defines a list of charging periods, as used in: GetCompositeSchedule.conf and ChargingProfile. \r\n",
+      "javaType": "ChargingSchedule",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identifies the ChargingSchedule.\r\n",
+          "type": "integer"
+        },
+        "startSchedule": {
+          "description": "Charging_ Schedule. Start_ Schedule. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569237\r\nStarting point of an absolute schedule. If absent the schedule will be relative to start of charging.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "duration": {
+          "description": "Charging_ Schedule. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569236\r\nDuration of the charging schedule in seconds. If the duration is left empty, the last period will continue indefinitely or until end of the transaction if chargingProfilePurpose = TxProfile.\r\n",
+          "type": "integer"
+        },
+        "chargingRateUnit": {
+          "$ref": "#/definitions/ChargingRateUnitEnumType"
+        },
+        "chargingSchedulePeriod": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingSchedulePeriodType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        },
+        "minChargingRate": {
+          "description": "Charging_ Schedule. Min_ Charging_ Rate. Numeric\r\nurn:x-oca:ocpp:uid:1:569239\r\nMinimum charging rate supported by the EV. The unit of measure is defined by the chargingRateUnit. This parameter is intended to be used by a local smart charging algorithm to optimize the power allocation for in the case a charging process is inefficient at lower charging rates. Accepts at most one digit fraction (e.g. 8.1)\r\n",
+          "type": "number"
+        },
+        "salesTariff": {
+          "$ref": "#/definitions/SalesTariffType"
+        }
+      },
+      "required": ["id", "chargingRateUnit", "chargingSchedulePeriod"]
+    },
+    "ConsumptionCostType": {
+      "description": "Consumption_ Cost\r\nurn:x-oca:ocpp:uid:2:233259\r\n",
+      "javaType": "ConsumptionCost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startValue": {
+          "description": "Consumption_ Cost. Start_ Value. Numeric\r\nurn:x-oca:ocpp:uid:1:569246\r\nThe lowest level of consumption that defines the starting point of this consumption block. The block interval extends to the start of the next interval.\r\n",
+          "type": "number"
+        },
+        "cost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/CostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["startValue", "cost"]
+    },
+    "CostType": {
+      "description": "Cost\r\nurn:x-oca:ocpp:uid:2:233258\r\n",
+      "javaType": "Cost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "costKind": {
+          "$ref": "#/definitions/CostKindEnumType"
+        },
+        "amount": {
+          "description": "Cost. Amount. Amount\r\nurn:x-oca:ocpp:uid:1:569244\r\nThe estimated or actual cost per kWh\r\n",
+          "type": "integer"
+        },
+        "amountMultiplier": {
+          "description": "Cost. Amount_ Multiplier. Integer\r\nurn:x-oca:ocpp:uid:1:569245\r\nValues: -3..3, The amountMultiplier defines the exponent to base 10 (dec). The final value is determined by: amount * 10 ^ amountMultiplier\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["costKind", "amount"]
+    },
+    "RelativeTimeIntervalType": {
+      "description": "Relative_ Timer_ Interval\r\nurn:x-oca:ocpp:uid:2:233270\r\n",
+      "javaType": "RelativeTimeInterval",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "start": {
+          "description": "Relative_ Timer_ Interval. Start. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569279\r\nStart of the interval, in seconds from NOW.\r\n",
+          "type": "integer"
+        },
+        "duration": {
+          "description": "Relative_ Timer_ Interval. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569280\r\nDuration of the interval, in seconds.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["start"]
+    },
+    "SalesTariffEntryType": {
+      "description": "Sales_ Tariff_ Entry\r\nurn:x-oca:ocpp:uid:2:233271\r\n",
+      "javaType": "SalesTariffEntry",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "relativeTimeInterval": {
+          "$ref": "#/definitions/RelativeTimeIntervalType"
+        },
+        "ePriceLevel": {
+          "description": "Sales_ Tariff_ Entry. E_ Price_ Level. Unsigned_ Integer\r\nurn:x-oca:ocpp:uid:1:569281\r\nDefines the price level of this SalesTariffEntry (referring to NumEPriceLevels). Small values for the EPriceLevel represent a cheaper TariffEntry. Large values for the EPriceLevel represent a more expensive TariffEntry.\r\n",
+          "type": "integer",
+          "minimum": 0.0
+        },
+        "consumptionCost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ConsumptionCostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["relativeTimeInterval"]
+    },
+    "SalesTariffType": {
+      "description": "Sales_ Tariff\r\nurn:x-oca:ocpp:uid:2:233272\r\nNOTE: This dataType is based on dataTypes from &lt;&lt;ref-ISOIEC15118-2,ISO 15118-2&gt;&gt;.\r\n",
+      "javaType": "SalesTariff",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nSalesTariff identifier used to identify one sales tariff. An SAID remains a unique identifier for one schedule throughout a charging session.\r\n",
+          "type": "integer"
+        },
+        "salesTariffDescription": {
+          "description": "Sales_ Tariff. Sales. Tariff_ Description\r\nurn:x-oca:ocpp:uid:1:569283\r\nA human readable title/short description of the sales tariff e.g. for HMI display purposes.\r\n",
+          "type": "string",
+          "maxLength": 32
+        },
+        "numEPriceLevels": {
+          "description": "Sales_ Tariff. Num_ E_ Price_ Levels. Counter\r\nurn:x-oca:ocpp:uid:1:569284\r\nDefines the overall number of distinct price levels used across all provided SalesTariff elements.\r\n",
+          "type": "integer"
+        },
+        "salesTariffEntry": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/SalesTariffEntryType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        }
+      },
+      "required": ["id", "salesTariffEntry"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "chargingSchedule": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/ChargingScheduleType"
+      },
+      "minItems": 1
+    },
+    "evseId": {
+      "description": "The charging schedule contained in this notification applies to an EVSE. evseId must be &gt; 0.\r\n",
+      "type": "integer"
+    },
+    "chargingLimit": {
+      "$ref": "#/definitions/ChargingLimitType"
+    }
+  },
+  "required": ["chargingLimit"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyChargingLimitResponse.json b/src/assets/json-schemas/ocpp/2.0/NotifyChargingLimitResponse.json
new file mode 100755 (executable)
index 0000000..80dd164
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyChargingLimitResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyCustomerInformationRequest.json b/src/assets/json-schemas/ocpp/2.0/NotifyCustomerInformationRequest.json
new file mode 100755 (executable)
index 0000000..70dc0bd
--- /dev/null
@@ -0,0 +1,50 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyCustomerInformationRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "data": {
+      "description": "(Part of) the requested data. No format specified in which the data is returned. Should be human readable.\r\n",
+      "type": "string",
+      "maxLength": 512
+    },
+    "tbc": {
+      "description": "“to be continued” indicator. Indicates whether another part of the monitoringData follows in an upcoming notifyMonitoringReportRequest message. Default value when omitted is false.\r\n",
+      "type": "boolean",
+      "default": false
+    },
+    "seqNo": {
+      "description": "Sequence number of this message. First message starts at 0.\r\n",
+      "type": "integer"
+    },
+    "generatedAt": {
+      "description": " Timestamp of the moment this message was generated at the Charging Station.\r\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "requestId": {
+      "description": "The Id of the request.\r\n\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["data", "seqNo", "generatedAt", "requestId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyCustomerInformationResponse.json b/src/assets/json-schemas/ocpp/2.0/NotifyCustomerInformationResponse.json
new file mode 100755 (executable)
index 0000000..e95c356
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyCustomerInformationResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyDisplayMessagesRequest.json b/src/assets/json-schemas/ocpp/2.0/NotifyDisplayMessagesRequest.json
new file mode 100755 (executable)
index 0000000..b843b26
--- /dev/null
@@ -0,0 +1,178 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyDisplayMessagesRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "MessageFormatEnumType": {
+      "description": "Message_ Content. Format. Message_ Format_ Code\r\nurn:x-enexis:ecdm:uid:1:570848\r\nFormat of the message.\r\n",
+      "javaType": "MessageFormatEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["ASCII", "HTML", "URI", "UTF8"]
+    },
+    "MessagePriorityEnumType": {
+      "description": "Message_ Info. Priority. Message_ Priority_ Code\r\nurn:x-enexis:ecdm:uid:1:569253\r\nWith what priority should this message be shown\r\n",
+      "javaType": "MessagePriorityEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["AlwaysFront", "InFront", "NormalCycle"]
+    },
+    "MessageStateEnumType": {
+      "description": "Message_ Info. State. Message_ State_ Code\r\nurn:x-enexis:ecdm:uid:1:569254\r\nDuring what state should this message be shown. When omitted this message should be shown in any state of the Charging Station.\r\n",
+      "javaType": "MessageStateEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Charging", "Faulted", "Idle", "Unavailable"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "MessageContentType": {
+      "description": "Message_ Content\r\nurn:x-enexis:ecdm:uid:2:234490\r\nContains message details, for a message to be displayed on a Charging Station.\r\n\r\n",
+      "javaType": "MessageContent",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "format": {
+          "$ref": "#/definitions/MessageFormatEnumType"
+        },
+        "language": {
+          "description": "Message_ Content. Language. Language_ Code\r\nurn:x-enexis:ecdm:uid:1:570849\r\nMessage language identifier. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "content": {
+          "description": "Message_ Content. Content. Message\r\nurn:x-enexis:ecdm:uid:1:570852\r\nMessage contents.\r\n\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["format", "content"]
+    },
+    "MessageInfoType": {
+      "description": "Message_ Info\r\nurn:x-enexis:ecdm:uid:2:233264\r\nContains message details, for a message to be displayed on a Charging Station.\r\n",
+      "javaType": "MessageInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "display": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nMaster resource identifier, unique within an exchange context. It is defined within the OCPP context as a positive Integer value (greater or equal to zero).\r\n",
+          "type": "integer"
+        },
+        "priority": {
+          "$ref": "#/definitions/MessagePriorityEnumType"
+        },
+        "state": {
+          "$ref": "#/definitions/MessageStateEnumType"
+        },
+        "startDateTime": {
+          "description": "Message_ Info. Start. Date_ Time\r\nurn:x-enexis:ecdm:uid:1:569256\r\nFrom what date-time should this message be shown. If omitted: directly.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "endDateTime": {
+          "description": "Message_ Info. End. Date_ Time\r\nurn:x-enexis:ecdm:uid:1:569257\r\nUntil what date-time should this message be shown, after this date/time this message SHALL be removed.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "transactionId": {
+          "description": "During which transaction shall this message be shown.\r\nMessage SHALL be removed by the Charging Station after transaction has\r\nended.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "message": {
+          "$ref": "#/definitions/MessageContentType"
+        }
+      },
+      "required": ["id", "priority", "message"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "messageInfo": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/MessageInfoType"
+      },
+      "minItems": 1
+    },
+    "requestId": {
+      "description": "The id of the &lt;&lt;getdisplaymessagesrequest,GetDisplayMessagesRequest&gt;&gt; that requested this message.\r\n",
+      "type": "integer"
+    },
+    "tbc": {
+      "description": "\"to be continued\" indicator. Indicates whether another part of the report follows in an upcoming NotifyDisplayMessagesRequest message. Default value when omitted is false.\r\n",
+      "type": "boolean",
+      "default": false
+    }
+  },
+  "required": ["requestId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyDisplayMessagesResponse.json b/src/assets/json-schemas/ocpp/2.0/NotifyDisplayMessagesResponse.json
new file mode 100755 (executable)
index 0000000..c33abd9
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyDisplayMessagesResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyEVChargingNeedsRequest.json b/src/assets/json-schemas/ocpp/2.0/NotifyEVChargingNeedsRequest.json
new file mode 100755 (executable)
index 0000000..13a7fa8
--- /dev/null
@@ -0,0 +1,149 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyEVChargingNeedsRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "EnergyTransferModeEnumType": {
+      "description": "Charging_ Needs. Requested. Energy_ Transfer_ Mode_ Code\r\nurn:x-oca:ocpp:uid:1:569209\r\nMode of energy transfer requested by the EV.\r\n",
+      "javaType": "EnergyTransferModeEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["DC", "AC_single_phase", "AC_two_phase", "AC_three_phase"]
+    },
+    "ACChargingParametersType": {
+      "description": "AC_ Charging_ Parameters\r\nurn:x-oca:ocpp:uid:2:233250\r\nEV AC charging parameters.\r\n\r\n",
+      "javaType": "ACChargingParameters",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "energyAmount": {
+          "description": "AC_ Charging_ Parameters. Energy_ Amount. Energy_ Amount\r\nurn:x-oca:ocpp:uid:1:569211\r\nAmount of energy requested (in Wh). This includes energy required for preconditioning.\r\n",
+          "type": "integer"
+        },
+        "evMinCurrent": {
+          "description": "AC_ Charging_ Parameters. EV_ Min. Current\r\nurn:x-oca:ocpp:uid:1:569212\r\nMinimum current (amps) supported by the electric vehicle (per phase).\r\n",
+          "type": "integer"
+        },
+        "evMaxCurrent": {
+          "description": "AC_ Charging_ Parameters. EV_ Max. Current\r\nurn:x-oca:ocpp:uid:1:569213\r\nMaximum current (amps) supported by the electric vehicle (per phase). Includes cable capacity.\r\n",
+          "type": "integer"
+        },
+        "evMaxVoltage": {
+          "description": "AC_ Charging_ Parameters. EV_ Max. Voltage\r\nurn:x-oca:ocpp:uid:1:569214\r\nMaximum voltage supported by the electric vehicle\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["energyAmount", "evMinCurrent", "evMaxCurrent", "evMaxVoltage"]
+    },
+    "ChargingNeedsType": {
+      "description": "Charging_ Needs\r\nurn:x-oca:ocpp:uid:2:233249\r\n",
+      "javaType": "ChargingNeeds",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "acChargingParameters": {
+          "$ref": "#/definitions/ACChargingParametersType"
+        },
+        "dcChargingParameters": {
+          "$ref": "#/definitions/DCChargingParametersType"
+        },
+        "requestedEnergyTransfer": {
+          "$ref": "#/definitions/EnergyTransferModeEnumType"
+        },
+        "departureTime": {
+          "description": "Charging_ Needs. Departure_ Time. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569223\r\nEstimated departure time of the EV.\r\n",
+          "type": "string",
+          "format": "date-time"
+        }
+      },
+      "required": ["requestedEnergyTransfer"]
+    },
+    "DCChargingParametersType": {
+      "description": "DC_ Charging_ Parameters\r\nurn:x-oca:ocpp:uid:2:233251\r\nEV DC charging parameters\r\n\r\n\r\n",
+      "javaType": "DCChargingParameters",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evMaxCurrent": {
+          "description": "DC_ Charging_ Parameters. EV_ Max. Current\r\nurn:x-oca:ocpp:uid:1:569215\r\nMaximum current (amps) supported by the electric vehicle. Includes cable capacity.\r\n",
+          "type": "integer"
+        },
+        "evMaxVoltage": {
+          "description": "DC_ Charging_ Parameters. EV_ Max. Voltage\r\nurn:x-oca:ocpp:uid:1:569216\r\nMaximum voltage supported by the electric vehicle\r\n",
+          "type": "integer"
+        },
+        "energyAmount": {
+          "description": "DC_ Charging_ Parameters. Energy_ Amount. Energy_ Amount\r\nurn:x-oca:ocpp:uid:1:569217\r\nAmount of energy requested (in Wh). This inludes energy required for preconditioning.\r\n",
+          "type": "integer"
+        },
+        "evMaxPower": {
+          "description": "DC_ Charging_ Parameters. EV_ Max. Power\r\nurn:x-oca:ocpp:uid:1:569218\r\nMaximum power (in W) supported by the electric vehicle. Required for DC charging.\r\n",
+          "type": "integer"
+        },
+        "stateOfCharge": {
+          "description": "DC_ Charging_ Parameters. State_ Of_ Charge. Numeric\r\nurn:x-oca:ocpp:uid:1:569219\r\nEnergy available in the battery (in percent of the battery capacity)\r\n",
+          "type": "integer",
+          "minimum": 0.0,
+          "maximum": 100.0
+        },
+        "evEnergyCapacity": {
+          "description": "DC_ Charging_ Parameters. EV_ Energy_ Capacity. Numeric\r\nurn:x-oca:ocpp:uid:1:569220\r\nCapacity of the electric vehicle battery (in Wh)\r\n",
+          "type": "integer"
+        },
+        "fullSoC": {
+          "description": "DC_ Charging_ Parameters. Full_ SOC. Percentage\r\nurn:x-oca:ocpp:uid:1:569221\r\nPercentage of SoC at which the EV considers the battery fully charged. (possible values: 0 - 100)\r\n",
+          "type": "integer",
+          "minimum": 0.0,
+          "maximum": 100.0
+        },
+        "bulkSoC": {
+          "description": "DC_ Charging_ Parameters. Bulk_ SOC. Percentage\r\nurn:x-oca:ocpp:uid:1:569222\r\nPercentage of SoC at which the EV considers a fast charging process to end. (possible values: 0 - 100)\r\n",
+          "type": "integer",
+          "minimum": 0.0,
+          "maximum": 100.0
+        }
+      },
+      "required": ["evMaxCurrent", "evMaxVoltage"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "maxScheduleTuples": {
+      "description": "Contains the maximum schedule tuples the car supports per schedule.\r\n",
+      "type": "integer"
+    },
+    "chargingNeeds": {
+      "$ref": "#/definitions/ChargingNeedsType"
+    },
+    "evseId": {
+      "description": "Defines the EVSE and connector to which the EV is connected. EvseId may not be 0.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["evseId", "chargingNeeds"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyEVChargingNeedsResponse.json b/src/assets/json-schemas/ocpp/2.0/NotifyEVChargingNeedsResponse.json
new file mode 100755 (executable)
index 0000000..cda2834
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyEVChargingNeedsResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "NotifyEVChargingNeedsStatusEnumType": {
+      "description": "Returns whether the CSMS has been able to process the message successfully. It does not imply that the evChargingNeeds can be met with the current charging profile.\r\n",
+      "javaType": "NotifyEVChargingNeedsStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "Processing"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/NotifyEVChargingNeedsStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyEVChargingScheduleRequest.json b/src/assets/json-schemas/ocpp/2.0/NotifyEVChargingScheduleRequest.json
new file mode 100755 (executable)
index 0000000..6d09606
--- /dev/null
@@ -0,0 +1,256 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyEVChargingScheduleRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingRateUnitEnumType": {
+      "description": "Charging_ Schedule. Charging_ Rate_ Unit. Charging_ Rate_ Unit_ Code\r\nurn:x-oca:ocpp:uid:1:569238\r\nThe unit of measure Limit is expressed in.\r\n",
+      "javaType": "ChargingRateUnitEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["W", "A"]
+    },
+    "CostKindEnumType": {
+      "description": "Cost. Cost_ Kind. Cost_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569243\r\nThe kind of cost referred to in the message element amount\r\n",
+      "javaType": "CostKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["CarbonDioxideEmission", "RelativePricePercentage", "RenewableGenerationPercentage"]
+    },
+    "ChargingSchedulePeriodType": {
+      "description": "Charging_ Schedule_ Period\r\nurn:x-oca:ocpp:uid:2:233257\r\nCharging schedule period structure defines a time period in a charging schedule.\r\n",
+      "javaType": "ChargingSchedulePeriod",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startPeriod": {
+          "description": "Charging_ Schedule_ Period. Start_ Period. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569240\r\nStart of the period, in seconds from the start of schedule. The value of StartPeriod also defines the stop time of the previous period.\r\n",
+          "type": "integer"
+        },
+        "limit": {
+          "description": "Charging_ Schedule_ Period. Limit. Measure\r\nurn:x-oca:ocpp:uid:1:569241\r\nCharging rate limit during the schedule period, in the applicable chargingRateUnit, for example in Amperes (A) or Watts (W). Accepts at most one digit fraction (e.g. 8.1).\r\n",
+          "type": "number"
+        },
+        "numberPhases": {
+          "description": "Charging_ Schedule_ Period. Number_ Phases. Counter\r\nurn:x-oca:ocpp:uid:1:569242\r\nThe number of phases that can be used for charging. If a number of phases is needed, numberPhases=3 will be assumed unless another number is given.\r\n",
+          "type": "integer"
+        },
+        "phaseToUse": {
+          "description": "Values: 1..3, Used if numberPhases=1 and if the EVSE is capable of switching the phase connected to the EV, i.e. ACPhaseSwitchingSupported is defined and true. It’s not allowed unless both conditions above are true. If both conditions are true, and phaseToUse is omitted, the Charging Station / EVSE will make the selection on its own.\r\n\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["startPeriod", "limit"]
+    },
+    "ChargingScheduleType": {
+      "description": "Charging_ Schedule\r\nurn:x-oca:ocpp:uid:2:233256\r\nCharging schedule structure defines a list of charging periods, as used in: GetCompositeSchedule.conf and ChargingProfile. \r\n",
+      "javaType": "ChargingSchedule",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identifies the ChargingSchedule.\r\n",
+          "type": "integer"
+        },
+        "startSchedule": {
+          "description": "Charging_ Schedule. Start_ Schedule. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569237\r\nStarting point of an absolute schedule. If absent the schedule will be relative to start of charging.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "duration": {
+          "description": "Charging_ Schedule. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569236\r\nDuration of the charging schedule in seconds. If the duration is left empty, the last period will continue indefinitely or until end of the transaction if chargingProfilePurpose = TxProfile.\r\n",
+          "type": "integer"
+        },
+        "chargingRateUnit": {
+          "$ref": "#/definitions/ChargingRateUnitEnumType"
+        },
+        "chargingSchedulePeriod": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingSchedulePeriodType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        },
+        "minChargingRate": {
+          "description": "Charging_ Schedule. Min_ Charging_ Rate. Numeric\r\nurn:x-oca:ocpp:uid:1:569239\r\nMinimum charging rate supported by the EV. The unit of measure is defined by the chargingRateUnit. This parameter is intended to be used by a local smart charging algorithm to optimize the power allocation for in the case a charging process is inefficient at lower charging rates. Accepts at most one digit fraction (e.g. 8.1)\r\n",
+          "type": "number"
+        },
+        "salesTariff": {
+          "$ref": "#/definitions/SalesTariffType"
+        }
+      },
+      "required": ["id", "chargingRateUnit", "chargingSchedulePeriod"]
+    },
+    "ConsumptionCostType": {
+      "description": "Consumption_ Cost\r\nurn:x-oca:ocpp:uid:2:233259\r\n",
+      "javaType": "ConsumptionCost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startValue": {
+          "description": "Consumption_ Cost. Start_ Value. Numeric\r\nurn:x-oca:ocpp:uid:1:569246\r\nThe lowest level of consumption that defines the starting point of this consumption block. The block interval extends to the start of the next interval.\r\n",
+          "type": "number"
+        },
+        "cost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/CostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["startValue", "cost"]
+    },
+    "CostType": {
+      "description": "Cost\r\nurn:x-oca:ocpp:uid:2:233258\r\n",
+      "javaType": "Cost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "costKind": {
+          "$ref": "#/definitions/CostKindEnumType"
+        },
+        "amount": {
+          "description": "Cost. Amount. Amount\r\nurn:x-oca:ocpp:uid:1:569244\r\nThe estimated or actual cost per kWh\r\n",
+          "type": "integer"
+        },
+        "amountMultiplier": {
+          "description": "Cost. Amount_ Multiplier. Integer\r\nurn:x-oca:ocpp:uid:1:569245\r\nValues: -3..3, The amountMultiplier defines the exponent to base 10 (dec). The final value is determined by: amount * 10 ^ amountMultiplier\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["costKind", "amount"]
+    },
+    "RelativeTimeIntervalType": {
+      "description": "Relative_ Timer_ Interval\r\nurn:x-oca:ocpp:uid:2:233270\r\n",
+      "javaType": "RelativeTimeInterval",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "start": {
+          "description": "Relative_ Timer_ Interval. Start. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569279\r\nStart of the interval, in seconds from NOW.\r\n",
+          "type": "integer"
+        },
+        "duration": {
+          "description": "Relative_ Timer_ Interval. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569280\r\nDuration of the interval, in seconds.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["start"]
+    },
+    "SalesTariffEntryType": {
+      "description": "Sales_ Tariff_ Entry\r\nurn:x-oca:ocpp:uid:2:233271\r\n",
+      "javaType": "SalesTariffEntry",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "relativeTimeInterval": {
+          "$ref": "#/definitions/RelativeTimeIntervalType"
+        },
+        "ePriceLevel": {
+          "description": "Sales_ Tariff_ Entry. E_ Price_ Level. Unsigned_ Integer\r\nurn:x-oca:ocpp:uid:1:569281\r\nDefines the price level of this SalesTariffEntry (referring to NumEPriceLevels). Small values for the EPriceLevel represent a cheaper TariffEntry. Large values for the EPriceLevel represent a more expensive TariffEntry.\r\n",
+          "type": "integer",
+          "minimum": 0.0
+        },
+        "consumptionCost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ConsumptionCostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["relativeTimeInterval"]
+    },
+    "SalesTariffType": {
+      "description": "Sales_ Tariff\r\nurn:x-oca:ocpp:uid:2:233272\r\nNOTE: This dataType is based on dataTypes from &lt;&lt;ref-ISOIEC15118-2,ISO 15118-2&gt;&gt;.\r\n",
+      "javaType": "SalesTariff",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nSalesTariff identifier used to identify one sales tariff. An SAID remains a unique identifier for one schedule throughout a charging session.\r\n",
+          "type": "integer"
+        },
+        "salesTariffDescription": {
+          "description": "Sales_ Tariff. Sales. Tariff_ Description\r\nurn:x-oca:ocpp:uid:1:569283\r\nA human readable title/short description of the sales tariff e.g. for HMI display purposes.\r\n",
+          "type": "string",
+          "maxLength": 32
+        },
+        "numEPriceLevels": {
+          "description": "Sales_ Tariff. Num_ E_ Price_ Levels. Counter\r\nurn:x-oca:ocpp:uid:1:569284\r\nDefines the overall number of distinct price levels used across all provided SalesTariff elements.\r\n",
+          "type": "integer"
+        },
+        "salesTariffEntry": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/SalesTariffEntryType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        }
+      },
+      "required": ["id", "salesTariffEntry"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "timeBase": {
+      "description": "Periods contained in the charging profile are relative to this point in time.\r\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "chargingSchedule": {
+      "$ref": "#/definitions/ChargingScheduleType"
+    },
+    "evseId": {
+      "description": "The charging schedule contained in this notification applies to an EVSE. EvseId must be &gt; 0.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["timeBase", "evseId", "chargingSchedule"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyEVChargingScheduleResponse.json b/src/assets/json-schemas/ocpp/2.0/NotifyEVChargingScheduleResponse.json
new file mode 100755 (executable)
index 0000000..f423934
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyEVChargingScheduleResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GenericStatusEnumType": {
+      "description": "Returns whether the CSMS has been able to process the message successfully. It does not imply any approval of the charging schedule.\r\n",
+      "javaType": "GenericStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GenericStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyEventRequest.json b/src/assets/json-schemas/ocpp/2.0/NotifyEventRequest.json
new file mode 100755 (executable)
index 0000000..99d90a6
--- /dev/null
@@ -0,0 +1,203 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyEventRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "EventNotificationEnumType": {
+      "description": "Specifies the event notification type of the message.\r\n\r\n",
+      "javaType": "EventNotificationEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["HardWiredNotification", "HardWiredMonitor", "PreconfiguredMonitor", "CustomMonitor"]
+    },
+    "EventTriggerEnumType": {
+      "description": "Type of monitor that triggered this event, e.g. exceeding a threshold value.\r\n\r\n",
+      "javaType": "EventTriggerEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Alerting", "Delta", "Periodic"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EventDataType": {
+      "description": "Class to report an event notification for a component-variable.\r\n",
+      "javaType": "EventData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "eventId": {
+          "description": "Identifies the event. This field can be referred to as a cause by other events.\r\n\r\n",
+          "type": "integer"
+        },
+        "timestamp": {
+          "description": "Timestamp of the moment the report was generated.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "trigger": {
+          "$ref": "#/definitions/EventTriggerEnumType"
+        },
+        "cause": {
+          "description": "Refers to the Id of an event that is considered to be the cause for this event.\r\n\r\n",
+          "type": "integer"
+        },
+        "actualValue": {
+          "description": "Actual value (_attributeType_ Actual) of the variable.\r\n\r\nThe Configuration Variable &lt;&lt;configkey-reporting-value-size,ReportingValueSize&gt;&gt; can be used to limit GetVariableResult.attributeValue, VariableAttribute.value and EventData.actualValue. The max size of these values will always remain equal. \r\n\r\n",
+          "type": "string",
+          "maxLength": 2500
+        },
+        "techCode": {
+          "description": "Technical (error) code as reported by component.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "techInfo": {
+          "description": "Technical detail information as reported by component.\r\n",
+          "type": "string",
+          "maxLength": 500
+        },
+        "cleared": {
+          "description": "_Cleared_ is set to true to report the clearing of a monitored situation, i.e. a 'return to normal'. \r\n\r\n",
+          "type": "boolean"
+        },
+        "transactionId": {
+          "description": "If an event notification is linked to a specific transaction, this field can be used to specify its transactionId.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variableMonitoringId": {
+          "description": "Identifies the VariableMonitoring which triggered the event.\r\n",
+          "type": "integer"
+        },
+        "eventNotificationType": {
+          "$ref": "#/definitions/EventNotificationEnumType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        }
+      },
+      "required": [
+        "eventId",
+        "timestamp",
+        "trigger",
+        "actualValue",
+        "eventNotificationType",
+        "component",
+        "variable"
+      ]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "generatedAt": {
+      "description": "Timestamp of the moment this message was generated at the Charging Station.\r\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "tbc": {
+      "description": "“to be continued” indicator. Indicates whether another part of the report follows in an upcoming notifyEventRequest message. Default value when omitted is false. \r\n",
+      "type": "boolean",
+      "default": false
+    },
+    "seqNo": {
+      "description": "Sequence number of this message. First message starts at 0.\r\n",
+      "type": "integer"
+    },
+    "eventData": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/EventDataType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["generatedAt", "seqNo", "eventData"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyEventResponse.json b/src/assets/json-schemas/ocpp/2.0/NotifyEventResponse.json
new file mode 100755 (executable)
index 0000000..df02e70
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyEventResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyMonitoringReportRequest.json b/src/assets/json-schemas/ocpp/2.0/NotifyMonitoringReportRequest.json
new file mode 100755 (executable)
index 0000000..6b405d1
--- /dev/null
@@ -0,0 +1,184 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyMonitoringReportRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "MonitorEnumType": {
+      "description": "The type of this monitor, e.g. a threshold, delta or periodic monitor. \r\n",
+      "javaType": "MonitorEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["UpperThreshold", "LowerThreshold", "Delta", "Periodic", "PeriodicClockAligned"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "MonitoringDataType": {
+      "description": "Class to hold parameters of SetVariableMonitoring request.\r\n",
+      "javaType": "MonitoringData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        },
+        "variableMonitoring": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/VariableMonitoringType"
+          },
+          "minItems": 1
+        }
+      },
+      "required": ["component", "variable", "variableMonitoring"]
+    },
+    "VariableMonitoringType": {
+      "description": "A monitoring setting for a variable.\r\n",
+      "javaType": "VariableMonitoring",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identifies the monitor.\r\n",
+          "type": "integer"
+        },
+        "transaction": {
+          "description": "Monitor only active when a transaction is ongoing on a component relevant to this transaction. \r\n",
+          "type": "boolean"
+        },
+        "value": {
+          "description": "Value for threshold or delta monitoring.\r\nFor Periodic or PeriodicClockAligned this is the interval in seconds.\r\n",
+          "type": "number"
+        },
+        "type": {
+          "$ref": "#/definitions/MonitorEnumType"
+        },
+        "severity": {
+          "description": "The severity that will be assigned to an event that is triggered by this monitor. The severity range is 0-9, with 0 as the highest and 9 as the lowest severity level.\r\n\r\nThe severity levels have the following meaning: +\r\n*0-Danger* +\r\nIndicates lives are potentially in danger. Urgent attention is needed and action should be taken immediately. +\r\n*1-Hardware Failure* +\r\nIndicates that the Charging Station is unable to continue regular operations due to Hardware issues. Action is required. +\r\n*2-System Failure* +\r\nIndicates that the Charging Station is unable to continue regular operations due to software or minor hardware issues. Action is required. +\r\n*3-Critical* +\r\nIndicates a critical error. Action is required. +\r\n*4-Error* +\r\nIndicates a non-urgent error. Action is required. +\r\n*5-Alert* +\r\nIndicates an alert event. Default severity for any type of monitoring event.  +\r\n*6-Warning* +\r\nIndicates a warning event. Action may be required. +\r\n*7-Notice* +\r\nIndicates an unusual event. No immediate action is required. +\r\n*8-Informational* +\r\nIndicates a regular operational event. May be used for reporting, measuring throughput, etc. No action is required. +\r\n*9-Debug* +\r\nIndicates information useful to developers for debugging, not useful during operations.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id", "transaction", "value", "type", "severity"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "monitor": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/MonitoringDataType"
+      },
+      "minItems": 1
+    },
+    "requestId": {
+      "description": "The id of the GetMonitoringRequest that requested this report.\r\n\r\n",
+      "type": "integer"
+    },
+    "tbc": {
+      "description": "“to be continued” indicator. Indicates whether another part of the monitoringData follows in an upcoming notifyMonitoringReportRequest message. Default value when omitted is false.\r\n",
+      "type": "boolean",
+      "default": false
+    },
+    "seqNo": {
+      "description": "Sequence number of this message. First message starts at 0.\r\n",
+      "type": "integer"
+    },
+    "generatedAt": {
+      "description": "Timestamp of the moment this message was generated at the Charging Station.\r\n",
+      "type": "string",
+      "format": "date-time"
+    }
+  },
+  "required": ["requestId", "seqNo", "generatedAt"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyMonitoringReportResponse.json b/src/assets/json-schemas/ocpp/2.0/NotifyMonitoringReportResponse.json
new file mode 100755 (executable)
index 0000000..e262197
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyMonitoringReportResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyReportRequest.json b/src/assets/json-schemas/ocpp/2.0/NotifyReportRequest.json
new file mode 100755 (executable)
index 0000000..61e2dcc
--- /dev/null
@@ -0,0 +1,251 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyReportRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "AttributeEnumType": {
+      "description": "Attribute: Actual, MinSet, MaxSet, etc.\r\nDefaults to Actual if absent.\r\n",
+      "javaType": "AttributeEnum",
+      "type": "string",
+      "default": "Actual",
+      "additionalProperties": false,
+      "enum": ["Actual", "Target", "MinSet", "MaxSet"]
+    },
+    "DataEnumType": {
+      "description": "Data type of this variable.\r\n",
+      "javaType": "DataEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "string",
+        "decimal",
+        "integer",
+        "dateTime",
+        "boolean",
+        "OptionList",
+        "SequenceList",
+        "MemberList"
+      ]
+    },
+    "MutabilityEnumType": {
+      "description": "Defines the mutability of this attribute. Default is ReadWrite when omitted.\r\n",
+      "javaType": "MutabilityEnum",
+      "type": "string",
+      "default": "ReadWrite",
+      "additionalProperties": false,
+      "enum": ["ReadOnly", "WriteOnly", "ReadWrite"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "ReportDataType": {
+      "description": "Class to report components, variables and variable attributes and characteristics.\r\n",
+      "javaType": "ReportData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "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": {
+      "description": "Attribute data of a variable.\r\n",
+      "javaType": "VariableAttribute",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "type": {
+          "$ref": "#/definitions/AttributeEnumType"
+        },
+        "value": {
+          "description": "Value of the attribute. May only be omitted when mutability is set to 'WriteOnly'.\r\n\r\nThe Configuration Variable &lt;&lt;configkey-reporting-value-size,ReportingValueSize&gt;&gt; can be used to limit GetVariableResult.attributeValue, VariableAttribute.value and EventData.actualValue. The max size of these values will always remain equal. \r\n",
+          "type": "string",
+          "maxLength": 2500
+        },
+        "mutability": {
+          "$ref": "#/definitions/MutabilityEnumType"
+        },
+        "persistent": {
+          "description": "If true, value will be persistent across system reboots or power down. Default when omitted is false.\r\n",
+          "type": "boolean",
+          "default": false
+        },
+        "constant": {
+          "description": "If true, value that will never be changed by the Charging Station at runtime. Default when omitted is false.\r\n",
+          "type": "boolean",
+          "default": false
+        }
+      }
+    },
+    "VariableCharacteristicsType": {
+      "description": "Fixed read-only parameters of a variable.\r\n",
+      "javaType": "VariableCharacteristics",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "unit": {
+          "description": "Unit of the variable. When the transmitted value has a unit, this field SHALL be included.\r\n",
+          "type": "string",
+          "maxLength": 16
+        },
+        "dataType": {
+          "$ref": "#/definitions/DataEnumType"
+        },
+        "minLimit": {
+          "description": "Minimum possible value of this variable.\r\n",
+          "type": "number"
+        },
+        "maxLimit": {
+          "description": "Maximum possible value of this variable. When the datatype of this Variable is String, OptionList, SequenceList or MemberList, this field defines the maximum length of the (CSV) string.\r\n",
+          "type": "number"
+        },
+        "valuesList": {
+          "description": "Allowed values when variable is Option/Member/SequenceList. \r\n\r\n* OptionList: The (Actual) Variable value must be a single value from the reported (CSV) enumeration list.\r\n\r\n* MemberList: The (Actual) Variable value  may be an (unordered) (sub-)set of the reported (CSV) valid values list.\r\n\r\n* SequenceList: The (Actual) Variable value  may be an ordered (priority, etc)  (sub-)set of the reported (CSV) valid values.\r\n\r\nThis is a comma separated list.\r\n\r\nThe Configuration Variable &lt;&lt;configkey-configuration-value-size,ConfigurationValueSize&gt;&gt; can be used to limit SetVariableData.attributeValue and VariableCharacteristics.valueList. The max size of these values will always remain equal. \r\n\r\n",
+          "type": "string",
+          "maxLength": 1000
+        },
+        "supportsMonitoring": {
+          "description": "Flag indicating if this variable supports monitoring. \r\n",
+          "type": "boolean"
+        }
+      },
+      "required": ["dataType", "supportsMonitoring"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "requestId": {
+      "description": "The id of the GetReportRequest  or GetBaseReportRequest that requested this report\r\n",
+      "type": "integer"
+    },
+    "generatedAt": {
+      "description": "Timestamp of the moment this message was generated at the Charging Station.\r\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "reportData": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/ReportDataType"
+      },
+      "minItems": 1
+    },
+    "tbc": {
+      "description": "“to be continued” indicator. Indicates whether another part of the report follows in an upcoming notifyReportRequest message. Default value when omitted is false.\r\n\r\n",
+      "type": "boolean",
+      "default": false
+    },
+    "seqNo": {
+      "description": "Sequence number of this message. First message starts at 0.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["requestId", "generatedAt", "seqNo"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/NotifyReportResponse.json b/src/assets/json-schemas/ocpp/2.0/NotifyReportResponse.json
new file mode 100755 (executable)
index 0000000..4795187
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:NotifyReportResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/PublishFirmwareRequest.json b/src/assets/json-schemas/ocpp/2.0/PublishFirmwareRequest.json
new file mode 100755 (executable)
index 0000000..ff6ac83
--- /dev/null
@@ -0,0 +1,49 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:PublishFirmwareRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "location": {
+      "description": "This contains a string containing a URI pointing to a\r\nlocation from which to retrieve the firmware.\r\n",
+      "type": "string",
+      "maxLength": 512
+    },
+    "retries": {
+      "description": "This specifies how many times Charging Station must try\r\nto download the firmware before giving up. If this field is not\r\npresent, it is left to Charging Station to decide how many times it wants to retry.\r\n",
+      "type": "integer"
+    },
+    "checksum": {
+      "description": "The MD5 checksum over the entire firmware file as a hexadecimal string of length 32. \r\n",
+      "type": "string",
+      "maxLength": 32
+    },
+    "requestId": {
+      "description": "The Id of the request.\r\n",
+      "type": "integer"
+    },
+    "retryInterval": {
+      "description": "The interval in seconds\r\nafter which a retry may be\r\nattempted. If this field is not\r\npresent, it is left to Charging\r\nStation to decide how long to wait\r\nbetween attempts.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["location", "checksum", "requestId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/PublishFirmwareResponse.json b/src/assets/json-schemas/ocpp/2.0/PublishFirmwareResponse.json
new file mode 100755 (executable)
index 0000000..652f949
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:PublishFirmwareResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GenericStatusEnumType": {
+      "description": "Indicates whether the request was accepted.\r\n",
+      "javaType": "GenericStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GenericStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/PublishFirmwareStatusNotificationRequest.json b/src/assets/json-schemas/ocpp/2.0/PublishFirmwareStatusNotificationRequest.json
new file mode 100755 (executable)
index 0000000..0eaac75
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:PublishFirmwareStatusNotificationRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "PublishFirmwareStatusEnumType": {
+      "description": "This contains the progress status of the publishfirmware\r\ninstallation.\r\n",
+      "javaType": "PublishFirmwareStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Idle",
+        "DownloadScheduled",
+        "Downloading",
+        "Downloaded",
+        "Published",
+        "DownloadFailed",
+        "DownloadPaused",
+        "InvalidChecksum",
+        "ChecksumVerified",
+        "PublishFailed"
+      ]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/PublishFirmwareStatusEnumType"
+    },
+    "location": {
+      "description": "Required if status is Published. Can be multiple URI’s, if the Local Controller supports e.g. HTTP, HTTPS, and FTP.\r\n",
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "type": "string",
+        "maxLength": 512
+      },
+      "minItems": 1
+    },
+    "requestId": {
+      "description": "The request id that was\r\nprovided in the\r\nPublishFirmwareRequest which\r\ntriggered this action.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/PublishFirmwareStatusNotificationResponse.json b/src/assets/json-schemas/ocpp/2.0/PublishFirmwareStatusNotificationResponse.json
new file mode 100755 (executable)
index 0000000..c7220a6
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:PublishFirmwareStatusNotificationResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ReportChargingProfilesRequest.json b/src/assets/json-schemas/ocpp/2.0/ReportChargingProfilesRequest.json
new file mode 100755 (executable)
index 0000000..03dfe76
--- /dev/null
@@ -0,0 +1,360 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ReportChargingProfilesRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingLimitSourceEnumType": {
+      "description": "Source that has installed this charging profile.\r\n",
+      "javaType": "ChargingLimitSourceEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["EMS", "Other", "SO", "CSO"]
+    },
+    "ChargingProfileKindEnumType": {
+      "description": "Charging_ Profile. Charging_ Profile_ Kind. Charging_ Profile_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569232\r\nIndicates the kind of schedule.\r\n",
+      "javaType": "ChargingProfileKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Absolute", "Recurring", "Relative"]
+    },
+    "ChargingProfilePurposeEnumType": {
+      "description": "Charging_ Profile. Charging_ Profile_ Purpose. Charging_ Profile_ Purpose_ Code\r\nurn:x-oca:ocpp:uid:1:569231\r\nDefines the purpose of the schedule transferred by this profile\r\n",
+      "javaType": "ChargingProfilePurposeEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "ChargingStationExternalConstraints",
+        "ChargingStationMaxProfile",
+        "TxDefaultProfile",
+        "TxProfile"
+      ]
+    },
+    "ChargingRateUnitEnumType": {
+      "description": "Charging_ Schedule. Charging_ Rate_ Unit. Charging_ Rate_ Unit_ Code\r\nurn:x-oca:ocpp:uid:1:569238\r\nThe unit of measure Limit is expressed in.\r\n",
+      "javaType": "ChargingRateUnitEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["W", "A"]
+    },
+    "CostKindEnumType": {
+      "description": "Cost. Cost_ Kind. Cost_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569243\r\nThe kind of cost referred to in the message element amount\r\n",
+      "javaType": "CostKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["CarbonDioxideEmission", "RelativePricePercentage", "RenewableGenerationPercentage"]
+    },
+    "RecurrencyKindEnumType": {
+      "description": "Charging_ Profile. Recurrency_ Kind. Recurrency_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569233\r\nIndicates the start point of a recurrence.\r\n",
+      "javaType": "RecurrencyKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Daily", "Weekly"]
+    },
+    "ChargingProfileType": {
+      "description": "Charging_ Profile\r\nurn:x-oca:ocpp:uid:2:233255\r\nA ChargingProfile consists of ChargingSchedule, describing the amount of power or current that can be delivered per time interval.\r\n",
+      "javaType": "ChargingProfile",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nId of ChargingProfile.\r\n",
+          "type": "integer"
+        },
+        "stackLevel": {
+          "description": "Charging_ Profile. Stack_ Level. Counter\r\nurn:x-oca:ocpp:uid:1:569230\r\nValue determining level in hierarchy stack of profiles. Higher values have precedence over lower values. Lowest level is 0.\r\n",
+          "type": "integer"
+        },
+        "chargingProfilePurpose": {
+          "$ref": "#/definitions/ChargingProfilePurposeEnumType"
+        },
+        "chargingProfileKind": {
+          "$ref": "#/definitions/ChargingProfileKindEnumType"
+        },
+        "recurrencyKind": {
+          "$ref": "#/definitions/RecurrencyKindEnumType"
+        },
+        "validFrom": {
+          "description": "Charging_ Profile. Valid_ From. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569234\r\nPoint in time at which the profile starts to be valid. If absent, the profile is valid as soon as it is received by the Charging Station.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "validTo": {
+          "description": "Charging_ Profile. Valid_ To. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569235\r\nPoint in time at which the profile stops to be valid. If absent, the profile is valid until it is replaced by another profile.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "chargingSchedule": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingScheduleType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        },
+        "transactionId": {
+          "description": "SHALL only be included if ChargingProfilePurpose is set to TxProfile. The transactionId is used to match the profile to a specific transaction.\r\n",
+          "type": "string",
+          "maxLength": 36
+        }
+      },
+      "required": [
+        "id",
+        "stackLevel",
+        "chargingProfilePurpose",
+        "chargingProfileKind",
+        "chargingSchedule"
+      ]
+    },
+    "ChargingSchedulePeriodType": {
+      "description": "Charging_ Schedule_ Period\r\nurn:x-oca:ocpp:uid:2:233257\r\nCharging schedule period structure defines a time period in a charging schedule.\r\n",
+      "javaType": "ChargingSchedulePeriod",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startPeriod": {
+          "description": "Charging_ Schedule_ Period. Start_ Period. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569240\r\nStart of the period, in seconds from the start of schedule. The value of StartPeriod also defines the stop time of the previous period.\r\n",
+          "type": "integer"
+        },
+        "limit": {
+          "description": "Charging_ Schedule_ Period. Limit. Measure\r\nurn:x-oca:ocpp:uid:1:569241\r\nCharging rate limit during the schedule period, in the applicable chargingRateUnit, for example in Amperes (A) or Watts (W). Accepts at most one digit fraction (e.g. 8.1).\r\n",
+          "type": "number"
+        },
+        "numberPhases": {
+          "description": "Charging_ Schedule_ Period. Number_ Phases. Counter\r\nurn:x-oca:ocpp:uid:1:569242\r\nThe number of phases that can be used for charging. If a number of phases is needed, numberPhases=3 will be assumed unless another number is given.\r\n",
+          "type": "integer"
+        },
+        "phaseToUse": {
+          "description": "Values: 1..3, Used if numberPhases=1 and if the EVSE is capable of switching the phase connected to the EV, i.e. ACPhaseSwitchingSupported is defined and true. It’s not allowed unless both conditions above are true. If both conditions are true, and phaseToUse is omitted, the Charging Station / EVSE will make the selection on its own.\r\n\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["startPeriod", "limit"]
+    },
+    "ChargingScheduleType": {
+      "description": "Charging_ Schedule\r\nurn:x-oca:ocpp:uid:2:233256\r\nCharging schedule structure defines a list of charging periods, as used in: GetCompositeSchedule.conf and ChargingProfile. \r\n",
+      "javaType": "ChargingSchedule",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identifies the ChargingSchedule.\r\n",
+          "type": "integer"
+        },
+        "startSchedule": {
+          "description": "Charging_ Schedule. Start_ Schedule. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569237\r\nStarting point of an absolute schedule. If absent the schedule will be relative to start of charging.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "duration": {
+          "description": "Charging_ Schedule. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569236\r\nDuration of the charging schedule in seconds. If the duration is left empty, the last period will continue indefinitely or until end of the transaction if chargingProfilePurpose = TxProfile.\r\n",
+          "type": "integer"
+        },
+        "chargingRateUnit": {
+          "$ref": "#/definitions/ChargingRateUnitEnumType"
+        },
+        "chargingSchedulePeriod": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingSchedulePeriodType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        },
+        "minChargingRate": {
+          "description": "Charging_ Schedule. Min_ Charging_ Rate. Numeric\r\nurn:x-oca:ocpp:uid:1:569239\r\nMinimum charging rate supported by the EV. The unit of measure is defined by the chargingRateUnit. This parameter is intended to be used by a local smart charging algorithm to optimize the power allocation for in the case a charging process is inefficient at lower charging rates. Accepts at most one digit fraction (e.g. 8.1)\r\n",
+          "type": "number"
+        },
+        "salesTariff": {
+          "$ref": "#/definitions/SalesTariffType"
+        }
+      },
+      "required": ["id", "chargingRateUnit", "chargingSchedulePeriod"]
+    },
+    "ConsumptionCostType": {
+      "description": "Consumption_ Cost\r\nurn:x-oca:ocpp:uid:2:233259\r\n",
+      "javaType": "ConsumptionCost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startValue": {
+          "description": "Consumption_ Cost. Start_ Value. Numeric\r\nurn:x-oca:ocpp:uid:1:569246\r\nThe lowest level of consumption that defines the starting point of this consumption block. The block interval extends to the start of the next interval.\r\n",
+          "type": "number"
+        },
+        "cost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/CostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["startValue", "cost"]
+    },
+    "CostType": {
+      "description": "Cost\r\nurn:x-oca:ocpp:uid:2:233258\r\n",
+      "javaType": "Cost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "costKind": {
+          "$ref": "#/definitions/CostKindEnumType"
+        },
+        "amount": {
+          "description": "Cost. Amount. Amount\r\nurn:x-oca:ocpp:uid:1:569244\r\nThe estimated or actual cost per kWh\r\n",
+          "type": "integer"
+        },
+        "amountMultiplier": {
+          "description": "Cost. Amount_ Multiplier. Integer\r\nurn:x-oca:ocpp:uid:1:569245\r\nValues: -3..3, The amountMultiplier defines the exponent to base 10 (dec). The final value is determined by: amount * 10 ^ amountMultiplier\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["costKind", "amount"]
+    },
+    "RelativeTimeIntervalType": {
+      "description": "Relative_ Timer_ Interval\r\nurn:x-oca:ocpp:uid:2:233270\r\n",
+      "javaType": "RelativeTimeInterval",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "start": {
+          "description": "Relative_ Timer_ Interval. Start. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569279\r\nStart of the interval, in seconds from NOW.\r\n",
+          "type": "integer"
+        },
+        "duration": {
+          "description": "Relative_ Timer_ Interval. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569280\r\nDuration of the interval, in seconds.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["start"]
+    },
+    "SalesTariffEntryType": {
+      "description": "Sales_ Tariff_ Entry\r\nurn:x-oca:ocpp:uid:2:233271\r\n",
+      "javaType": "SalesTariffEntry",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "relativeTimeInterval": {
+          "$ref": "#/definitions/RelativeTimeIntervalType"
+        },
+        "ePriceLevel": {
+          "description": "Sales_ Tariff_ Entry. E_ Price_ Level. Unsigned_ Integer\r\nurn:x-oca:ocpp:uid:1:569281\r\nDefines the price level of this SalesTariffEntry (referring to NumEPriceLevels). Small values for the EPriceLevel represent a cheaper TariffEntry. Large values for the EPriceLevel represent a more expensive TariffEntry.\r\n",
+          "type": "integer",
+          "minimum": 0.0
+        },
+        "consumptionCost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ConsumptionCostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["relativeTimeInterval"]
+    },
+    "SalesTariffType": {
+      "description": "Sales_ Tariff\r\nurn:x-oca:ocpp:uid:2:233272\r\nNOTE: This dataType is based on dataTypes from &lt;&lt;ref-ISOIEC15118-2,ISO 15118-2&gt;&gt;.\r\n",
+      "javaType": "SalesTariff",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nSalesTariff identifier used to identify one sales tariff. An SAID remains a unique identifier for one schedule throughout a charging session.\r\n",
+          "type": "integer"
+        },
+        "salesTariffDescription": {
+          "description": "Sales_ Tariff. Sales. Tariff_ Description\r\nurn:x-oca:ocpp:uid:1:569283\r\nA human readable title/short description of the sales tariff e.g. for HMI display purposes.\r\n",
+          "type": "string",
+          "maxLength": 32
+        },
+        "numEPriceLevels": {
+          "description": "Sales_ Tariff. Num_ E_ Price_ Levels. Counter\r\nurn:x-oca:ocpp:uid:1:569284\r\nDefines the overall number of distinct price levels used across all provided SalesTariff elements.\r\n",
+          "type": "integer"
+        },
+        "salesTariffEntry": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/SalesTariffEntryType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        }
+      },
+      "required": ["id", "salesTariffEntry"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "requestId": {
+      "description": "Id used to match the &lt;&lt;getchargingprofilesrequest, GetChargingProfilesRequest&gt;&gt; message with the resulting ReportChargingProfilesRequest messages. When the CSMS provided a requestId in the &lt;&lt;getchargingprofilesrequest, GetChargingProfilesRequest&gt;&gt;, this field SHALL contain the same value.\r\n",
+      "type": "integer"
+    },
+    "chargingLimitSource": {
+      "$ref": "#/definitions/ChargingLimitSourceEnumType"
+    },
+    "chargingProfile": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/ChargingProfileType"
+      },
+      "minItems": 1
+    },
+    "tbc": {
+      "description": "To Be Continued. Default value when omitted: false. false indicates that there are no further messages as part of this report.\r\n",
+      "type": "boolean",
+      "default": false
+    },
+    "evseId": {
+      "description": "The evse to which the charging profile applies. If evseId = 0, the message contains an overall limit for the Charging Station.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["requestId", "chargingLimitSource", "evseId", "chargingProfile"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ReportChargingProfilesResponse.json b/src/assets/json-schemas/ocpp/2.0/ReportChargingProfilesResponse.json
new file mode 100755 (executable)
index 0000000..8bb3b81
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ReportChargingProfilesResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/RequestStartTransactionRequest.json b/src/assets/json-schemas/ocpp/2.0/RequestStartTransactionRequest.json
new file mode 100755 (executable)
index 0000000..f1429db
--- /dev/null
@@ -0,0 +1,412 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:RequestStartTransactionRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingProfileKindEnumType": {
+      "description": "Charging_ Profile. Charging_ Profile_ Kind. Charging_ Profile_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569232\r\nIndicates the kind of schedule.\r\n",
+      "javaType": "ChargingProfileKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Absolute", "Recurring", "Relative"]
+    },
+    "ChargingProfilePurposeEnumType": {
+      "description": "Charging_ Profile. Charging_ Profile_ Purpose. Charging_ Profile_ Purpose_ Code\r\nurn:x-oca:ocpp:uid:1:569231\r\nDefines the purpose of the schedule transferred by this profile\r\n",
+      "javaType": "ChargingProfilePurposeEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "ChargingStationExternalConstraints",
+        "ChargingStationMaxProfile",
+        "TxDefaultProfile",
+        "TxProfile"
+      ]
+    },
+    "ChargingRateUnitEnumType": {
+      "description": "Charging_ Schedule. Charging_ Rate_ Unit. Charging_ Rate_ Unit_ Code\r\nurn:x-oca:ocpp:uid:1:569238\r\nThe unit of measure Limit is expressed in.\r\n",
+      "javaType": "ChargingRateUnitEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["W", "A"]
+    },
+    "CostKindEnumType": {
+      "description": "Cost. Cost_ Kind. Cost_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569243\r\nThe kind of cost referred to in the message element amount\r\n",
+      "javaType": "CostKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["CarbonDioxideEmission", "RelativePricePercentage", "RenewableGenerationPercentage"]
+    },
+    "IdTokenEnumType": {
+      "description": "Enumeration of possible idToken types.\r\n",
+      "javaType": "IdTokenEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Central",
+        "eMAID",
+        "ISO14443",
+        "ISO15693",
+        "KeyCode",
+        "Local",
+        "MacAddress",
+        "NoAuthorization"
+      ]
+    },
+    "RecurrencyKindEnumType": {
+      "description": "Charging_ Profile. Recurrency_ Kind. Recurrency_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569233\r\nIndicates the start point of a recurrence.\r\n",
+      "javaType": "RecurrencyKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Daily", "Weekly"]
+    },
+    "AdditionalInfoType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "AdditionalInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalIdToken": {
+          "description": "This field specifies the additional IdToken.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "description": "This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["additionalIdToken", "type"]
+    },
+    "ChargingProfileType": {
+      "description": "Charging_ Profile\r\nurn:x-oca:ocpp:uid:2:233255\r\nA ChargingProfile consists of ChargingSchedule, describing the amount of power or current that can be delivered per time interval.\r\n",
+      "javaType": "ChargingProfile",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nId of ChargingProfile.\r\n",
+          "type": "integer"
+        },
+        "stackLevel": {
+          "description": "Charging_ Profile. Stack_ Level. Counter\r\nurn:x-oca:ocpp:uid:1:569230\r\nValue determining level in hierarchy stack of profiles. Higher values have precedence over lower values. Lowest level is 0.\r\n",
+          "type": "integer"
+        },
+        "chargingProfilePurpose": {
+          "$ref": "#/definitions/ChargingProfilePurposeEnumType"
+        },
+        "chargingProfileKind": {
+          "$ref": "#/definitions/ChargingProfileKindEnumType"
+        },
+        "recurrencyKind": {
+          "$ref": "#/definitions/RecurrencyKindEnumType"
+        },
+        "validFrom": {
+          "description": "Charging_ Profile. Valid_ From. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569234\r\nPoint in time at which the profile starts to be valid. If absent, the profile is valid as soon as it is received by the Charging Station.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "validTo": {
+          "description": "Charging_ Profile. Valid_ To. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569235\r\nPoint in time at which the profile stops to be valid. If absent, the profile is valid until it is replaced by another profile.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "chargingSchedule": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingScheduleType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        },
+        "transactionId": {
+          "description": "SHALL only be included if ChargingProfilePurpose is set to TxProfile. The transactionId is used to match the profile to a specific transaction.\r\n",
+          "type": "string",
+          "maxLength": 36
+        }
+      },
+      "required": [
+        "id",
+        "stackLevel",
+        "chargingProfilePurpose",
+        "chargingProfileKind",
+        "chargingSchedule"
+      ]
+    },
+    "ChargingSchedulePeriodType": {
+      "description": "Charging_ Schedule_ Period\r\nurn:x-oca:ocpp:uid:2:233257\r\nCharging schedule period structure defines a time period in a charging schedule.\r\n",
+      "javaType": "ChargingSchedulePeriod",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startPeriod": {
+          "description": "Charging_ Schedule_ Period. Start_ Period. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569240\r\nStart of the period, in seconds from the start of schedule. The value of StartPeriod also defines the stop time of the previous period.\r\n",
+          "type": "integer"
+        },
+        "limit": {
+          "description": "Charging_ Schedule_ Period. Limit. Measure\r\nurn:x-oca:ocpp:uid:1:569241\r\nCharging rate limit during the schedule period, in the applicable chargingRateUnit, for example in Amperes (A) or Watts (W). Accepts at most one digit fraction (e.g. 8.1).\r\n",
+          "type": "number"
+        },
+        "numberPhases": {
+          "description": "Charging_ Schedule_ Period. Number_ Phases. Counter\r\nurn:x-oca:ocpp:uid:1:569242\r\nThe number of phases that can be used for charging. If a number of phases is needed, numberPhases=3 will be assumed unless another number is given.\r\n",
+          "type": "integer"
+        },
+        "phaseToUse": {
+          "description": "Values: 1..3, Used if numberPhases=1 and if the EVSE is capable of switching the phase connected to the EV, i.e. ACPhaseSwitchingSupported is defined and true. It’s not allowed unless both conditions above are true. If both conditions are true, and phaseToUse is omitted, the Charging Station / EVSE will make the selection on its own.\r\n\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["startPeriod", "limit"]
+    },
+    "ChargingScheduleType": {
+      "description": "Charging_ Schedule\r\nurn:x-oca:ocpp:uid:2:233256\r\nCharging schedule structure defines a list of charging periods, as used in: GetCompositeSchedule.conf and ChargingProfile. \r\n",
+      "javaType": "ChargingSchedule",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identifies the ChargingSchedule.\r\n",
+          "type": "integer"
+        },
+        "startSchedule": {
+          "description": "Charging_ Schedule. Start_ Schedule. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569237\r\nStarting point of an absolute schedule. If absent the schedule will be relative to start of charging.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "duration": {
+          "description": "Charging_ Schedule. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569236\r\nDuration of the charging schedule in seconds. If the duration is left empty, the last period will continue indefinitely or until end of the transaction if chargingProfilePurpose = TxProfile.\r\n",
+          "type": "integer"
+        },
+        "chargingRateUnit": {
+          "$ref": "#/definitions/ChargingRateUnitEnumType"
+        },
+        "chargingSchedulePeriod": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingSchedulePeriodType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        },
+        "minChargingRate": {
+          "description": "Charging_ Schedule. Min_ Charging_ Rate. Numeric\r\nurn:x-oca:ocpp:uid:1:569239\r\nMinimum charging rate supported by the EV. The unit of measure is defined by the chargingRateUnit. This parameter is intended to be used by a local smart charging algorithm to optimize the power allocation for in the case a charging process is inefficient at lower charging rates. Accepts at most one digit fraction (e.g. 8.1)\r\n",
+          "type": "number"
+        },
+        "salesTariff": {
+          "$ref": "#/definitions/SalesTariffType"
+        }
+      },
+      "required": ["id", "chargingRateUnit", "chargingSchedulePeriod"]
+    },
+    "ConsumptionCostType": {
+      "description": "Consumption_ Cost\r\nurn:x-oca:ocpp:uid:2:233259\r\n",
+      "javaType": "ConsumptionCost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startValue": {
+          "description": "Consumption_ Cost. Start_ Value. Numeric\r\nurn:x-oca:ocpp:uid:1:569246\r\nThe lowest level of consumption that defines the starting point of this consumption block. The block interval extends to the start of the next interval.\r\n",
+          "type": "number"
+        },
+        "cost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/CostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["startValue", "cost"]
+    },
+    "CostType": {
+      "description": "Cost\r\nurn:x-oca:ocpp:uid:2:233258\r\n",
+      "javaType": "Cost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "costKind": {
+          "$ref": "#/definitions/CostKindEnumType"
+        },
+        "amount": {
+          "description": "Cost. Amount. Amount\r\nurn:x-oca:ocpp:uid:1:569244\r\nThe estimated or actual cost per kWh\r\n",
+          "type": "integer"
+        },
+        "amountMultiplier": {
+          "description": "Cost. Amount_ Multiplier. Integer\r\nurn:x-oca:ocpp:uid:1:569245\r\nValues: -3..3, The amountMultiplier defines the exponent to base 10 (dec). The final value is determined by: amount * 10 ^ amountMultiplier\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["costKind", "amount"]
+    },
+    "IdTokenType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "IdToken",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalInfo": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/AdditionalInfoType"
+          },
+          "minItems": 1
+        },
+        "idToken": {
+          "description": "IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "$ref": "#/definitions/IdTokenEnumType"
+        }
+      },
+      "required": ["idToken", "type"]
+    },
+    "RelativeTimeIntervalType": {
+      "description": "Relative_ Timer_ Interval\r\nurn:x-oca:ocpp:uid:2:233270\r\n",
+      "javaType": "RelativeTimeInterval",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "start": {
+          "description": "Relative_ Timer_ Interval. Start. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569279\r\nStart of the interval, in seconds from NOW.\r\n",
+          "type": "integer"
+        },
+        "duration": {
+          "description": "Relative_ Timer_ Interval. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569280\r\nDuration of the interval, in seconds.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["start"]
+    },
+    "SalesTariffEntryType": {
+      "description": "Sales_ Tariff_ Entry\r\nurn:x-oca:ocpp:uid:2:233271\r\n",
+      "javaType": "SalesTariffEntry",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "relativeTimeInterval": {
+          "$ref": "#/definitions/RelativeTimeIntervalType"
+        },
+        "ePriceLevel": {
+          "description": "Sales_ Tariff_ Entry. E_ Price_ Level. Unsigned_ Integer\r\nurn:x-oca:ocpp:uid:1:569281\r\nDefines the price level of this SalesTariffEntry (referring to NumEPriceLevels). Small values for the EPriceLevel represent a cheaper TariffEntry. Large values for the EPriceLevel represent a more expensive TariffEntry.\r\n",
+          "type": "integer",
+          "minimum": 0.0
+        },
+        "consumptionCost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ConsumptionCostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["relativeTimeInterval"]
+    },
+    "SalesTariffType": {
+      "description": "Sales_ Tariff\r\nurn:x-oca:ocpp:uid:2:233272\r\nNOTE: This dataType is based on dataTypes from &lt;&lt;ref-ISOIEC15118-2,ISO 15118-2&gt;&gt;.\r\n",
+      "javaType": "SalesTariff",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nSalesTariff identifier used to identify one sales tariff. An SAID remains a unique identifier for one schedule throughout a charging session.\r\n",
+          "type": "integer"
+        },
+        "salesTariffDescription": {
+          "description": "Sales_ Tariff. Sales. Tariff_ Description\r\nurn:x-oca:ocpp:uid:1:569283\r\nA human readable title/short description of the sales tariff e.g. for HMI display purposes.\r\n",
+          "type": "string",
+          "maxLength": 32
+        },
+        "numEPriceLevels": {
+          "description": "Sales_ Tariff. Num_ E_ Price_ Levels. Counter\r\nurn:x-oca:ocpp:uid:1:569284\r\nDefines the overall number of distinct price levels used across all provided SalesTariff elements.\r\n",
+          "type": "integer"
+        },
+        "salesTariffEntry": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/SalesTariffEntryType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        }
+      },
+      "required": ["id", "salesTariffEntry"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "evseId": {
+      "description": "Number of the EVSE on which to start the transaction. EvseId SHALL be &gt; 0\r\n",
+      "type": "integer"
+    },
+    "groupIdToken": {
+      "$ref": "#/definitions/IdTokenType"
+    },
+    "idToken": {
+      "$ref": "#/definitions/IdTokenType"
+    },
+    "remoteStartId": {
+      "description": "Id given by the server to this start request. The Charging Station might return this in the &lt;&lt;transactioneventrequest, TransactionEventRequest&gt;&gt;, letting the server know which transaction was started for this request. Use to start a transaction.\r\n",
+      "type": "integer"
+    },
+    "chargingProfile": {
+      "$ref": "#/definitions/ChargingProfileType"
+    }
+  },
+  "required": ["remoteStartId", "idToken"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/RequestStartTransactionResponse.json b/src/assets/json-schemas/ocpp/2.0/RequestStartTransactionResponse.json
new file mode 100755 (executable)
index 0000000..0b1c04f
--- /dev/null
@@ -0,0 +1,67 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:RequestStartTransactionResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "RequestStartStopStatusEnumType": {
+      "description": "Status indicating whether the Charging Station accepts the request to start a transaction.\r\n",
+      "javaType": "RequestStartStopStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/RequestStartStopStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    },
+    "transactionId": {
+      "description": "When the transaction was already started by the Charging Station before the RequestStartTransactionRequest was received, for example: cable plugged in first. This contains the transactionId of the already started transaction.\r\n",
+      "type": "string",
+      "maxLength": 36
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/RequestStopTransactionRequest.json b/src/assets/json-schemas/ocpp/2.0/RequestStopTransactionRequest.json
new file mode 100755 (executable)
index 0000000..ca33197
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:RequestStopTransactionRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "transactionId": {
+      "description": "The identifier of the transaction which the Charging Station is requested to stop.\r\n",
+      "type": "string",
+      "maxLength": 36
+    }
+  },
+  "required": ["transactionId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/RequestStopTransactionResponse.json b/src/assets/json-schemas/ocpp/2.0/RequestStopTransactionResponse.json
new file mode 100755 (executable)
index 0000000..cc133f4
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:RequestStopTransactionResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "RequestStartStopStatusEnumType": {
+      "description": "Status indicating whether Charging Station accepts the request to stop a transaction.\r\n",
+      "javaType": "RequestStartStopStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/RequestStartStopStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ReservationStatusUpdateRequest.json b/src/assets/json-schemas/ocpp/2.0/ReservationStatusUpdateRequest.json
new file mode 100755 (executable)
index 0000000..7991b0b
--- /dev/null
@@ -0,0 +1,41 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ReservationStatusUpdateRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ReservationUpdateStatusEnumType": {
+      "description": "The updated reservation status.\r\n",
+      "javaType": "ReservationUpdateStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Expired", "Removed"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "reservationId": {
+      "description": "The ID of the reservation.\r\n",
+      "type": "integer"
+    },
+    "reservationUpdateStatus": {
+      "$ref": "#/definitions/ReservationUpdateStatusEnumType"
+    }
+  },
+  "required": ["reservationId", "reservationUpdateStatus"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ReservationStatusUpdateResponse.json b/src/assets/json-schemas/ocpp/2.0/ReservationStatusUpdateResponse.json
new file mode 100755 (executable)
index 0000000..2b15600
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ReservationStatusUpdateResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ReserveNowRequest.json b/src/assets/json-schemas/ocpp/2.0/ReserveNowRequest.json
new file mode 100755 (executable)
index 0000000..e27580f
--- /dev/null
@@ -0,0 +1,145 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ReserveNowRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ConnectorEnumType": {
+      "description": "This field specifies the connector type.\r\n",
+      "javaType": "ConnectorEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "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": {
+      "description": "Enumeration of possible idToken types.\r\n",
+      "javaType": "IdTokenEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Central",
+        "eMAID",
+        "ISO14443",
+        "ISO15693",
+        "KeyCode",
+        "Local",
+        "MacAddress",
+        "NoAuthorization"
+      ]
+    },
+    "AdditionalInfoType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "AdditionalInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalIdToken": {
+          "description": "This field specifies the additional IdToken.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "description": "This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["additionalIdToken", "type"]
+    },
+    "IdTokenType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "IdToken",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalInfo": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/AdditionalInfoType"
+          },
+          "minItems": 1
+        },
+        "idToken": {
+          "description": "IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "$ref": "#/definitions/IdTokenEnumType"
+        }
+      },
+      "required": ["idToken", "type"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "id": {
+      "description": "Id of reservation.\r\n",
+      "type": "integer"
+    },
+    "expiryDateTime": {
+      "description": "Date and time at which the reservation expires.\r\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "connectorType": {
+      "$ref": "#/definitions/ConnectorEnumType"
+    },
+    "idToken": {
+      "$ref": "#/definitions/IdTokenType"
+    },
+    "evseId": {
+      "description": "This contains ID of the evse to be reserved.\r\n",
+      "type": "integer"
+    },
+    "groupIdToken": {
+      "$ref": "#/definitions/IdTokenType"
+    }
+  },
+  "required": ["id", "expiryDateTime", "idToken"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ReserveNowResponse.json b/src/assets/json-schemas/ocpp/2.0/ReserveNowResponse.json
new file mode 100755 (executable)
index 0000000..f13e6c7
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ReserveNowResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ReserveNowStatusEnumType": {
+      "description": "This indicates the success or failure of the reservation.\r\n",
+      "javaType": "ReserveNowStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Faulted", "Occupied", "Rejected", "Unavailable"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/ReserveNowStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ResetRequest.json b/src/assets/json-schemas/ocpp/2.0/ResetRequest.json
new file mode 100755 (executable)
index 0000000..3a2f055
--- /dev/null
@@ -0,0 +1,41 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ResetRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ResetEnumType": {
+      "description": "This contains the type of reset that the Charging Station or EVSE should perform.\r\n",
+      "javaType": "ResetEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Immediate", "OnIdle"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "type": {
+      "$ref": "#/definitions/ResetEnumType"
+    },
+    "evseId": {
+      "description": "This contains the ID of a specific EVSE that needs to be reset, instead of the entire Charging Station.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["type"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/ResetResponse.json b/src/assets/json-schemas/ocpp/2.0/ResetResponse.json
new file mode 100755 (executable)
index 0000000..b861923
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:ResetResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ResetStatusEnumType": {
+      "description": "This indicates whether the Charging Station is able to perform the reset.\r\n",
+      "javaType": "ResetStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "Scheduled"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/ResetStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SecurityEventNotificationRequest.json b/src/assets/json-schemas/ocpp/2.0/SecurityEventNotificationRequest.json
new file mode 100755 (executable)
index 0000000..217d364
--- /dev/null
@@ -0,0 +1,42 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SecurityEventNotificationRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "type": {
+      "description": "Type of the security event. This value should be taken from the Security events list.\r\n",
+      "type": "string",
+      "maxLength": 50
+    },
+    "timestamp": {
+      "description": "Date and time at which the event occurred.\r\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "techInfo": {
+      "description": "Additional information about the occurred security event.\r\n",
+      "type": "string",
+      "maxLength": 255
+    }
+  },
+  "required": ["type", "timestamp"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SecurityEventNotificationResponse.json b/src/assets/json-schemas/ocpp/2.0/SecurityEventNotificationResponse.json
new file mode 100755 (executable)
index 0000000..7f51cd7
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SecurityEventNotificationResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SendLocalListRequest.json b/src/assets/json-schemas/ocpp/2.0/SendLocalListRequest.json
new file mode 100755 (executable)
index 0000000..f709a0d
--- /dev/null
@@ -0,0 +1,232 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SendLocalListRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "AuthorizationStatusEnumType": {
+      "description": "ID_ Token. Status. Authorization_ Status\r\nurn:x-oca:ocpp:uid:1:569372\r\nCurrent status of the ID Token.\r\n",
+      "javaType": "AuthorizationStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Accepted",
+        "Blocked",
+        "ConcurrentTx",
+        "Expired",
+        "Invalid",
+        "NoCredit",
+        "NotAllowedTypeEVSE",
+        "NotAtThisLocation",
+        "NotAtThisTime",
+        "Unknown"
+      ]
+    },
+    "IdTokenEnumType": {
+      "description": "Enumeration of possible idToken types.\r\n",
+      "javaType": "IdTokenEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Central",
+        "eMAID",
+        "ISO14443",
+        "ISO15693",
+        "KeyCode",
+        "Local",
+        "MacAddress",
+        "NoAuthorization"
+      ]
+    },
+    "MessageFormatEnumType": {
+      "description": "Message_ Content. Format. Message_ Format_ Code\r\nurn:x-enexis:ecdm:uid:1:570848\r\nFormat of the message.\r\n",
+      "javaType": "MessageFormatEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["ASCII", "HTML", "URI", "UTF8"]
+    },
+    "UpdateEnumType": {
+      "description": "This contains the type of update (full or differential) of this request.\r\n",
+      "javaType": "UpdateEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Differential", "Full"]
+    },
+    "AdditionalInfoType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "AdditionalInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalIdToken": {
+          "description": "This field specifies the additional IdToken.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "description": "This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["additionalIdToken", "type"]
+    },
+    "AuthorizationData": {
+      "description": "Contains the identifier to use for authorization.\r\n",
+      "javaType": "AuthorizationData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "idToken": {
+          "$ref": "#/definitions/IdTokenType"
+        },
+        "idTokenInfo": {
+          "$ref": "#/definitions/IdTokenInfoType"
+        }
+      },
+      "required": ["idToken"]
+    },
+    "IdTokenInfoType": {
+      "description": "ID_ Token\r\nurn:x-oca:ocpp:uid:2:233247\r\nContains status information about an identifier.\r\nIt is advised to not stop charging for a token that expires during charging, as ExpiryDate is only used for caching purposes. If ExpiryDate is not given, the status has no end date.\r\n",
+      "javaType": "IdTokenInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "status": {
+          "$ref": "#/definitions/AuthorizationStatusEnumType"
+        },
+        "cacheExpiryDateTime": {
+          "description": "ID_ Token. Expiry. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569373\r\nDate and Time after which the token must be considered invalid.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "chargingPriority": {
+          "description": "Priority from a business point of view. Default priority is 0, The range is from -9 to 9. Higher values indicate a higher priority. The chargingPriority in &lt;&lt;transactioneventresponse,TransactionEventResponse&gt;&gt; overrules this one. \r\n",
+          "type": "integer"
+        },
+        "language1": {
+          "description": "ID_ Token. Language1. Language_ Code\r\nurn:x-oca:ocpp:uid:1:569374\r\nPreferred user interface language of identifier user. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "evseId": {
+          "description": "Only used when the IdToken is only valid for one or more specific EVSEs, not for the entire Charging Station.\r\n\r\n",
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "type": "integer"
+          },
+          "minItems": 1
+        },
+        "groupIdToken": {
+          "$ref": "#/definitions/IdTokenType"
+        },
+        "language2": {
+          "description": "ID_ Token. Language2. Language_ Code\r\nurn:x-oca:ocpp:uid:1:569375\r\nSecond preferred user interface language of identifier user. Don’t use when language1 is omitted, has to be different from language1. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "personalMessage": {
+          "$ref": "#/definitions/MessageContentType"
+        }
+      },
+      "required": ["status"]
+    },
+    "IdTokenType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "IdToken",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalInfo": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/AdditionalInfoType"
+          },
+          "minItems": 1
+        },
+        "idToken": {
+          "description": "IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "$ref": "#/definitions/IdTokenEnumType"
+        }
+      },
+      "required": ["idToken", "type"]
+    },
+    "MessageContentType": {
+      "description": "Message_ Content\r\nurn:x-enexis:ecdm:uid:2:234490\r\nContains message details, for a message to be displayed on a Charging Station.\r\n\r\n",
+      "javaType": "MessageContent",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "format": {
+          "$ref": "#/definitions/MessageFormatEnumType"
+        },
+        "language": {
+          "description": "Message_ Content. Language. Language_ Code\r\nurn:x-enexis:ecdm:uid:1:570849\r\nMessage language identifier. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "content": {
+          "description": "Message_ Content. Content. Message\r\nurn:x-enexis:ecdm:uid:1:570852\r\nMessage contents.\r\n\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["format", "content"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "localAuthorizationList": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/AuthorizationData"
+      },
+      "minItems": 1
+    },
+    "versionNumber": {
+      "description": "In case of a full update this is the version number of the full list. In case of a differential update it is the version number of the list after the update has been applied.\r\n",
+      "type": "integer"
+    },
+    "updateType": {
+      "$ref": "#/definitions/UpdateEnumType"
+    }
+  },
+  "required": ["versionNumber", "updateType"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SendLocalListResponse.json b/src/assets/json-schemas/ocpp/2.0/SendLocalListResponse.json
new file mode 100755 (executable)
index 0000000..d5765a6
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SendLocalListResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "SendLocalListStatusEnumType": {
+      "description": "This indicates whether the Charging Station has successfully received and applied the update of the Local Authorization List.\r\n",
+      "javaType": "SendLocalListStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Failed", "VersionMismatch"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/SendLocalListStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetChargingProfileRequest.json b/src/assets/json-schemas/ocpp/2.0/SetChargingProfileRequest.json
new file mode 100755 (executable)
index 0000000..03c1df9
--- /dev/null
@@ -0,0 +1,336 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetChargingProfileRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingProfileKindEnumType": {
+      "description": "Charging_ Profile. Charging_ Profile_ Kind. Charging_ Profile_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569232\r\nIndicates the kind of schedule.\r\n",
+      "javaType": "ChargingProfileKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Absolute", "Recurring", "Relative"]
+    },
+    "ChargingProfilePurposeEnumType": {
+      "description": "Charging_ Profile. Charging_ Profile_ Purpose. Charging_ Profile_ Purpose_ Code\r\nurn:x-oca:ocpp:uid:1:569231\r\nDefines the purpose of the schedule transferred by this profile\r\n",
+      "javaType": "ChargingProfilePurposeEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "ChargingStationExternalConstraints",
+        "ChargingStationMaxProfile",
+        "TxDefaultProfile",
+        "TxProfile"
+      ]
+    },
+    "ChargingRateUnitEnumType": {
+      "description": "Charging_ Schedule. Charging_ Rate_ Unit. Charging_ Rate_ Unit_ Code\r\nurn:x-oca:ocpp:uid:1:569238\r\nThe unit of measure Limit is expressed in.\r\n",
+      "javaType": "ChargingRateUnitEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["W", "A"]
+    },
+    "CostKindEnumType": {
+      "description": "Cost. Cost_ Kind. Cost_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569243\r\nThe kind of cost referred to in the message element amount\r\n",
+      "javaType": "CostKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["CarbonDioxideEmission", "RelativePricePercentage", "RenewableGenerationPercentage"]
+    },
+    "RecurrencyKindEnumType": {
+      "description": "Charging_ Profile. Recurrency_ Kind. Recurrency_ Kind_ Code\r\nurn:x-oca:ocpp:uid:1:569233\r\nIndicates the start point of a recurrence.\r\n",
+      "javaType": "RecurrencyKindEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Daily", "Weekly"]
+    },
+    "ChargingProfileType": {
+      "description": "Charging_ Profile\r\nurn:x-oca:ocpp:uid:2:233255\r\nA ChargingProfile consists of ChargingSchedule, describing the amount of power or current that can be delivered per time interval.\r\n",
+      "javaType": "ChargingProfile",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nId of ChargingProfile.\r\n",
+          "type": "integer"
+        },
+        "stackLevel": {
+          "description": "Charging_ Profile. Stack_ Level. Counter\r\nurn:x-oca:ocpp:uid:1:569230\r\nValue determining level in hierarchy stack of profiles. Higher values have precedence over lower values. Lowest level is 0.\r\n",
+          "type": "integer"
+        },
+        "chargingProfilePurpose": {
+          "$ref": "#/definitions/ChargingProfilePurposeEnumType"
+        },
+        "chargingProfileKind": {
+          "$ref": "#/definitions/ChargingProfileKindEnumType"
+        },
+        "recurrencyKind": {
+          "$ref": "#/definitions/RecurrencyKindEnumType"
+        },
+        "validFrom": {
+          "description": "Charging_ Profile. Valid_ From. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569234\r\nPoint in time at which the profile starts to be valid. If absent, the profile is valid as soon as it is received by the Charging Station.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "validTo": {
+          "description": "Charging_ Profile. Valid_ To. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569235\r\nPoint in time at which the profile stops to be valid. If absent, the profile is valid until it is replaced by another profile.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "chargingSchedule": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingScheduleType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        },
+        "transactionId": {
+          "description": "SHALL only be included if ChargingProfilePurpose is set to TxProfile. The transactionId is used to match the profile to a specific transaction.\r\n",
+          "type": "string",
+          "maxLength": 36
+        }
+      },
+      "required": [
+        "id",
+        "stackLevel",
+        "chargingProfilePurpose",
+        "chargingProfileKind",
+        "chargingSchedule"
+      ]
+    },
+    "ChargingSchedulePeriodType": {
+      "description": "Charging_ Schedule_ Period\r\nurn:x-oca:ocpp:uid:2:233257\r\nCharging schedule period structure defines a time period in a charging schedule.\r\n",
+      "javaType": "ChargingSchedulePeriod",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startPeriod": {
+          "description": "Charging_ Schedule_ Period. Start_ Period. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569240\r\nStart of the period, in seconds from the start of schedule. The value of StartPeriod also defines the stop time of the previous period.\r\n",
+          "type": "integer"
+        },
+        "limit": {
+          "description": "Charging_ Schedule_ Period. Limit. Measure\r\nurn:x-oca:ocpp:uid:1:569241\r\nCharging rate limit during the schedule period, in the applicable chargingRateUnit, for example in Amperes (A) or Watts (W). Accepts at most one digit fraction (e.g. 8.1).\r\n",
+          "type": "number"
+        },
+        "numberPhases": {
+          "description": "Charging_ Schedule_ Period. Number_ Phases. Counter\r\nurn:x-oca:ocpp:uid:1:569242\r\nThe number of phases that can be used for charging. If a number of phases is needed, numberPhases=3 will be assumed unless another number is given.\r\n",
+          "type": "integer"
+        },
+        "phaseToUse": {
+          "description": "Values: 1..3, Used if numberPhases=1 and if the EVSE is capable of switching the phase connected to the EV, i.e. ACPhaseSwitchingSupported is defined and true. It’s not allowed unless both conditions above are true. If both conditions are true, and phaseToUse is omitted, the Charging Station / EVSE will make the selection on its own.\r\n\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["startPeriod", "limit"]
+    },
+    "ChargingScheduleType": {
+      "description": "Charging_ Schedule\r\nurn:x-oca:ocpp:uid:2:233256\r\nCharging schedule structure defines a list of charging periods, as used in: GetCompositeSchedule.conf and ChargingProfile. \r\n",
+      "javaType": "ChargingSchedule",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identifies the ChargingSchedule.\r\n",
+          "type": "integer"
+        },
+        "startSchedule": {
+          "description": "Charging_ Schedule. Start_ Schedule. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569237\r\nStarting point of an absolute schedule. If absent the schedule will be relative to start of charging.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "duration": {
+          "description": "Charging_ Schedule. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569236\r\nDuration of the charging schedule in seconds. If the duration is left empty, the last period will continue indefinitely or until end of the transaction if chargingProfilePurpose = TxProfile.\r\n",
+          "type": "integer"
+        },
+        "chargingRateUnit": {
+          "$ref": "#/definitions/ChargingRateUnitEnumType"
+        },
+        "chargingSchedulePeriod": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ChargingSchedulePeriodType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        },
+        "minChargingRate": {
+          "description": "Charging_ Schedule. Min_ Charging_ Rate. Numeric\r\nurn:x-oca:ocpp:uid:1:569239\r\nMinimum charging rate supported by the EV. The unit of measure is defined by the chargingRateUnit. This parameter is intended to be used by a local smart charging algorithm to optimize the power allocation for in the case a charging process is inefficient at lower charging rates. Accepts at most one digit fraction (e.g. 8.1)\r\n",
+          "type": "number"
+        },
+        "salesTariff": {
+          "$ref": "#/definitions/SalesTariffType"
+        }
+      },
+      "required": ["id", "chargingRateUnit", "chargingSchedulePeriod"]
+    },
+    "ConsumptionCostType": {
+      "description": "Consumption_ Cost\r\nurn:x-oca:ocpp:uid:2:233259\r\n",
+      "javaType": "ConsumptionCost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "startValue": {
+          "description": "Consumption_ Cost. Start_ Value. Numeric\r\nurn:x-oca:ocpp:uid:1:569246\r\nThe lowest level of consumption that defines the starting point of this consumption block. The block interval extends to the start of the next interval.\r\n",
+          "type": "number"
+        },
+        "cost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/CostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["startValue", "cost"]
+    },
+    "CostType": {
+      "description": "Cost\r\nurn:x-oca:ocpp:uid:2:233258\r\n",
+      "javaType": "Cost",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "costKind": {
+          "$ref": "#/definitions/CostKindEnumType"
+        },
+        "amount": {
+          "description": "Cost. Amount. Amount\r\nurn:x-oca:ocpp:uid:1:569244\r\nThe estimated or actual cost per kWh\r\n",
+          "type": "integer"
+        },
+        "amountMultiplier": {
+          "description": "Cost. Amount_ Multiplier. Integer\r\nurn:x-oca:ocpp:uid:1:569245\r\nValues: -3..3, The amountMultiplier defines the exponent to base 10 (dec). The final value is determined by: amount * 10 ^ amountMultiplier\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["costKind", "amount"]
+    },
+    "RelativeTimeIntervalType": {
+      "description": "Relative_ Timer_ Interval\r\nurn:x-oca:ocpp:uid:2:233270\r\n",
+      "javaType": "RelativeTimeInterval",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "start": {
+          "description": "Relative_ Timer_ Interval. Start. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569279\r\nStart of the interval, in seconds from NOW.\r\n",
+          "type": "integer"
+        },
+        "duration": {
+          "description": "Relative_ Timer_ Interval. Duration. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569280\r\nDuration of the interval, in seconds.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["start"]
+    },
+    "SalesTariffEntryType": {
+      "description": "Sales_ Tariff_ Entry\r\nurn:x-oca:ocpp:uid:2:233271\r\n",
+      "javaType": "SalesTariffEntry",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "relativeTimeInterval": {
+          "$ref": "#/definitions/RelativeTimeIntervalType"
+        },
+        "ePriceLevel": {
+          "description": "Sales_ Tariff_ Entry. E_ Price_ Level. Unsigned_ Integer\r\nurn:x-oca:ocpp:uid:1:569281\r\nDefines the price level of this SalesTariffEntry (referring to NumEPriceLevels). Small values for the EPriceLevel represent a cheaper TariffEntry. Large values for the EPriceLevel represent a more expensive TariffEntry.\r\n",
+          "type": "integer",
+          "minimum": 0.0
+        },
+        "consumptionCost": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/ConsumptionCostType"
+          },
+          "minItems": 1,
+          "maxItems": 3
+        }
+      },
+      "required": ["relativeTimeInterval"]
+    },
+    "SalesTariffType": {
+      "description": "Sales_ Tariff\r\nurn:x-oca:ocpp:uid:2:233272\r\nNOTE: This dataType is based on dataTypes from &lt;&lt;ref-ISOIEC15118-2,ISO 15118-2&gt;&gt;.\r\n",
+      "javaType": "SalesTariff",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nSalesTariff identifier used to identify one sales tariff. An SAID remains a unique identifier for one schedule throughout a charging session.\r\n",
+          "type": "integer"
+        },
+        "salesTariffDescription": {
+          "description": "Sales_ Tariff. Sales. Tariff_ Description\r\nurn:x-oca:ocpp:uid:1:569283\r\nA human readable title/short description of the sales tariff e.g. for HMI display purposes.\r\n",
+          "type": "string",
+          "maxLength": 32
+        },
+        "numEPriceLevels": {
+          "description": "Sales_ Tariff. Num_ E_ Price_ Levels. Counter\r\nurn:x-oca:ocpp:uid:1:569284\r\nDefines the overall number of distinct price levels used across all provided SalesTariff elements.\r\n",
+          "type": "integer"
+        },
+        "salesTariffEntry": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/SalesTariffEntryType"
+          },
+          "minItems": 1,
+          "maxItems": 1024
+        }
+      },
+      "required": ["id", "salesTariffEntry"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "evseId": {
+      "description": "For TxDefaultProfile an evseId=0 applies the profile to each individual evse. For ChargingStationMaxProfile and ChargingStationExternalConstraints an evseId=0 contains an overal limit for the whole Charging Station.\r\n",
+      "type": "integer"
+    },
+    "chargingProfile": {
+      "$ref": "#/definitions/ChargingProfileType"
+    }
+  },
+  "required": ["evseId", "chargingProfile"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetChargingProfileResponse.json b/src/assets/json-schemas/ocpp/2.0/SetChargingProfileResponse.json
new file mode 100755 (executable)
index 0000000..130adef
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetChargingProfileResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingProfileStatusEnumType": {
+      "description": "Returns whether the Charging Station has been able to process the message successfully. This does not guarantee the schedule will be followed to the letter. There might be other constraints the Charging Station may need to take into account.\r\n",
+      "javaType": "ChargingProfileStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/ChargingProfileStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetDisplayMessageRequest.json b/src/assets/json-schemas/ocpp/2.0/SetDisplayMessageRequest.json
new file mode 100755 (executable)
index 0000000..3711af0
--- /dev/null
@@ -0,0 +1,164 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetDisplayMessageRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "MessageFormatEnumType": {
+      "description": "Message_ Content. Format. Message_ Format_ Code\r\nurn:x-enexis:ecdm:uid:1:570848\r\nFormat of the message.\r\n",
+      "javaType": "MessageFormatEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["ASCII", "HTML", "URI", "UTF8"]
+    },
+    "MessagePriorityEnumType": {
+      "description": "Message_ Info. Priority. Message_ Priority_ Code\r\nurn:x-enexis:ecdm:uid:1:569253\r\nWith what priority should this message be shown\r\n",
+      "javaType": "MessagePriorityEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["AlwaysFront", "InFront", "NormalCycle"]
+    },
+    "MessageStateEnumType": {
+      "description": "Message_ Info. State. Message_ State_ Code\r\nurn:x-enexis:ecdm:uid:1:569254\r\nDuring what state should this message be shown. When omitted this message should be shown in any state of the Charging Station.\r\n",
+      "javaType": "MessageStateEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Charging", "Faulted", "Idle", "Unavailable"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "MessageContentType": {
+      "description": "Message_ Content\r\nurn:x-enexis:ecdm:uid:2:234490\r\nContains message details, for a message to be displayed on a Charging Station.\r\n\r\n",
+      "javaType": "MessageContent",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "format": {
+          "$ref": "#/definitions/MessageFormatEnumType"
+        },
+        "language": {
+          "description": "Message_ Content. Language. Language_ Code\r\nurn:x-enexis:ecdm:uid:1:570849\r\nMessage language identifier. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "content": {
+          "description": "Message_ Content. Content. Message\r\nurn:x-enexis:ecdm:uid:1:570852\r\nMessage contents.\r\n\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["format", "content"]
+    },
+    "MessageInfoType": {
+      "description": "Message_ Info\r\nurn:x-enexis:ecdm:uid:2:233264\r\nContains message details, for a message to be displayed on a Charging Station.\r\n",
+      "javaType": "MessageInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "display": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nMaster resource identifier, unique within an exchange context. It is defined within the OCPP context as a positive Integer value (greater or equal to zero).\r\n",
+          "type": "integer"
+        },
+        "priority": {
+          "$ref": "#/definitions/MessagePriorityEnumType"
+        },
+        "state": {
+          "$ref": "#/definitions/MessageStateEnumType"
+        },
+        "startDateTime": {
+          "description": "Message_ Info. Start. Date_ Time\r\nurn:x-enexis:ecdm:uid:1:569256\r\nFrom what date-time should this message be shown. If omitted: directly.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "endDateTime": {
+          "description": "Message_ Info. End. Date_ Time\r\nurn:x-enexis:ecdm:uid:1:569257\r\nUntil what date-time should this message be shown, after this date/time this message SHALL be removed.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "transactionId": {
+          "description": "During which transaction shall this message be shown.\r\nMessage SHALL be removed by the Charging Station after transaction has\r\nended.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "message": {
+          "$ref": "#/definitions/MessageContentType"
+        }
+      },
+      "required": ["id", "priority", "message"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "message": {
+      "$ref": "#/definitions/MessageInfoType"
+    }
+  },
+  "required": ["message"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetDisplayMessageResponse.json b/src/assets/json-schemas/ocpp/2.0/SetDisplayMessageResponse.json
new file mode 100755 (executable)
index 0000000..4b97caf
--- /dev/null
@@ -0,0 +1,69 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetDisplayMessageResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "DisplayMessageStatusEnumType": {
+      "description": "This indicates whether the Charging Station is able to display the message.\r\n",
+      "javaType": "DisplayMessageStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Accepted",
+        "NotSupportedMessageFormat",
+        "Rejected",
+        "NotSupportedPriority",
+        "NotSupportedState",
+        "UnknownTransaction"
+      ]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/DisplayMessageStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetMonitoringBaseRequest.json b/src/assets/json-schemas/ocpp/2.0/SetMonitoringBaseRequest.json
new file mode 100755 (executable)
index 0000000..40b2342
--- /dev/null
@@ -0,0 +1,37 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetMonitoringBaseRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "MonitoringBaseEnumType": {
+      "description": "Specify which monitoring base will be set\r\n",
+      "javaType": "MonitoringBaseEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["All", "FactoryDefault", "HardWiredOnly"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "monitoringBase": {
+      "$ref": "#/definitions/MonitoringBaseEnumType"
+    }
+  },
+  "required": ["monitoringBase"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetMonitoringBaseResponse.json b/src/assets/json-schemas/ocpp/2.0/SetMonitoringBaseResponse.json
new file mode 100755 (executable)
index 0000000..708f37a
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetMonitoringBaseResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GenericDeviceModelStatusEnumType": {
+      "description": "Indicates whether the Charging Station was able to accept the request.\r\n",
+      "javaType": "GenericDeviceModelStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "NotSupported", "EmptyResultSet"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GenericDeviceModelStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetMonitoringLevelRequest.json b/src/assets/json-schemas/ocpp/2.0/SetMonitoringLevelRequest.json
new file mode 100755 (executable)
index 0000000..305891f
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetMonitoringLevelRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "severity": {
+      "description": "The Charging Station SHALL only report events with a severity number lower than or equal to this severity.\r\nThe severity range is 0-9, with 0 as the highest and 9 as the lowest severity level.\r\n\r\nThe severity levels have the following meaning: +\r\n*0-Danger* +\r\nIndicates lives are potentially in danger. Urgent attention is needed and action should be taken immediately. +\r\n*1-Hardware Failure* +\r\nIndicates that the Charging Station is unable to continue regular operations due to Hardware issues. Action is required. +\r\n*2-System Failure* +\r\nIndicates that the Charging Station is unable to continue regular operations due to software or minor hardware issues. Action is required. +\r\n*3-Critical* +\r\nIndicates a critical error. Action is required. +\r\n*4-Error* +\r\nIndicates a non-urgent error. Action is required. +\r\n*5-Alert* +\r\nIndicates an alert event. Default severity for any type of monitoring event.  +\r\n*6-Warning* +\r\nIndicates a warning event. Action may be required. +\r\n*7-Notice* +\r\nIndicates an unusual event. No immediate action is required. +\r\n*8-Informational* +\r\nIndicates a regular operational event. May be used for reporting, measuring throughput, etc. No action is required. +\r\n*9-Debug* +\r\nIndicates information useful to developers for debugging, not useful during operations.\r\n\r\n\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["severity"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetMonitoringLevelResponse.json b/src/assets/json-schemas/ocpp/2.0/SetMonitoringLevelResponse.json
new file mode 100755 (executable)
index 0000000..94a406d
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetMonitoringLevelResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GenericStatusEnumType": {
+      "description": "Indicates whether the Charging Station was able to accept the request.\r\n",
+      "javaType": "GenericStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GenericStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetNetworkProfileRequest.json b/src/assets/json-schemas/ocpp/2.0/SetNetworkProfileRequest.json
new file mode 100755 (executable)
index 0000000..82eed32
--- /dev/null
@@ -0,0 +1,209 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetNetworkProfileRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "APNAuthenticationEnumType": {
+      "description": "APN. APN_ Authentication. APN_ Authentication_ Code\r\nurn:x-oca:ocpp:uid:1:568828\r\nAuthentication method.\r\n",
+      "javaType": "APNAuthenticationEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["CHAP", "NONE", "PAP", "AUTO"]
+    },
+    "OCPPInterfaceEnumType": {
+      "description": "Applicable Network Interface.\r\n",
+      "javaType": "OCPPInterfaceEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Wired0",
+        "Wired1",
+        "Wired2",
+        "Wired3",
+        "Wireless0",
+        "Wireless1",
+        "Wireless2",
+        "Wireless3"
+      ]
+    },
+    "OCPPTransportEnumType": {
+      "description": "Communication_ Function. OCPP_ Transport. OCPP_ Transport_ Code\r\nurn:x-oca:ocpp:uid:1:569356\r\nDefines the transport protocol (e.g. SOAP or JSON). Note: SOAP is not supported in OCPP 2.0, but is supported by other versions of OCPP.\r\n",
+      "javaType": "OCPPTransportEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["JSON", "SOAP"]
+    },
+    "OCPPVersionEnumType": {
+      "description": "Communication_ Function. OCPP_ Version. OCPP_ Version_ Code\r\nurn:x-oca:ocpp:uid:1:569355\r\nDefines the OCPP version used for this communication function.\r\n",
+      "javaType": "OCPPVersionEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["OCPP12", "OCPP15", "OCPP16", "OCPP20"]
+    },
+    "VPNEnumType": {
+      "description": "VPN. Type. VPN_ Code\r\nurn:x-oca:ocpp:uid:1:569277\r\nType of VPN\r\n",
+      "javaType": "VPNEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["IKEv2", "IPSec", "L2TP", "PPTP"]
+    },
+    "APNType": {
+      "description": "APN\r\nurn:x-oca:ocpp:uid:2:233134\r\nCollection of configuration data needed to make a data-connection over a cellular network.\r\n\r\nNOTE: When asking a GSM modem to dial in, it is possible to specify which mobile operator should be used. This can be done with the mobile country code (MCC) in combination with a mobile network code (MNC). Example: If your preferred network is Vodafone Netherlands, the MCC=204 and the MNC=04 which means the key PreferredNetwork = 20404 Some modems allows to specify a preferred network, which means, if this network is not available, a different network is used. If you specify UseOnlyPreferredNetwork and this network is not available, the modem will not dial in.\r\n",
+      "javaType": "APN",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "apn": {
+          "description": "APN. APN. URI\r\nurn:x-oca:ocpp:uid:1:568814\r\nThe Access Point Name as an URL.\r\n",
+          "type": "string",
+          "maxLength": 512
+        },
+        "apnUserName": {
+          "description": "APN. APN. User_ Name\r\nurn:x-oca:ocpp:uid:1:568818\r\nAPN username.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "apnPassword": {
+          "description": "APN. APN. Password\r\nurn:x-oca:ocpp:uid:1:568819\r\nAPN Password.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "simPin": {
+          "description": "APN. SIMPIN. PIN_ Code\r\nurn:x-oca:ocpp:uid:1:568821\r\nSIM card pin code.\r\n",
+          "type": "integer"
+        },
+        "preferredNetwork": {
+          "description": "APN. Preferred_ Network. Mobile_ Network_ ID\r\nurn:x-oca:ocpp:uid:1:568822\r\nPreferred network, written as MCC and MNC concatenated. See note.\r\n",
+          "type": "string",
+          "maxLength": 6
+        },
+        "useOnlyPreferredNetwork": {
+          "description": "APN. Use_ Only_ Preferred_ Network. Indicator\r\nurn:x-oca:ocpp:uid:1:568824\r\nDefault: false. Use only the preferred Network, do\r\nnot dial in when not available. See Note.\r\n",
+          "type": "boolean",
+          "default": false
+        },
+        "apnAuthentication": {
+          "$ref": "#/definitions/APNAuthenticationEnumType"
+        }
+      },
+      "required": ["apn", "apnAuthentication"]
+    },
+    "NetworkConnectionProfileType": {
+      "description": "Communication_ Function\r\nurn:x-oca:ocpp:uid:2:233304\r\nThe NetworkConnectionProfile defines the functional and technical parameters of a communication link.\r\n",
+      "javaType": "NetworkConnectionProfile",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "apn": {
+          "$ref": "#/definitions/APNType"
+        },
+        "ocppVersion": {
+          "$ref": "#/definitions/OCPPVersionEnumType"
+        },
+        "ocppTransport": {
+          "$ref": "#/definitions/OCPPTransportEnumType"
+        },
+        "ocppCsmsUrl": {
+          "description": "Communication_ Function. OCPP_ Central_ System_ URL. URI\r\nurn:x-oca:ocpp:uid:1:569357\r\nURL of the CSMS(s) that this Charging Station  communicates with.\r\n",
+          "type": "string",
+          "maxLength": 512
+        },
+        "messageTimeout": {
+          "description": "Duration in seconds before a message send by the Charging Station via this network connection times-out.\r\nThe best setting depends on the underlying network and response times of the CSMS.\r\nIf you are looking for a some guideline: use 30 seconds as a starting point.\r\n",
+          "type": "integer"
+        },
+        "securityProfile": {
+          "description": "This field specifies the security profile used when connecting to the CSMS with this NetworkConnectionProfile.\r\n",
+          "type": "integer"
+        },
+        "ocppInterface": {
+          "$ref": "#/definitions/OCPPInterfaceEnumType"
+        },
+        "vpn": {
+          "$ref": "#/definitions/VPNType"
+        }
+      },
+      "required": [
+        "ocppVersion",
+        "ocppTransport",
+        "ocppCsmsUrl",
+        "messageTimeout",
+        "securityProfile",
+        "ocppInterface"
+      ]
+    },
+    "VPNType": {
+      "description": "VPN\r\nurn:x-oca:ocpp:uid:2:233268\r\nVPN Configuration settings\r\n",
+      "javaType": "VPN",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "server": {
+          "description": "VPN. Server. URI\r\nurn:x-oca:ocpp:uid:1:569272\r\nVPN Server Address\r\n",
+          "type": "string",
+          "maxLength": 512
+        },
+        "user": {
+          "description": "VPN. User. User_ Name\r\nurn:x-oca:ocpp:uid:1:569273\r\nVPN User\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "group": {
+          "description": "VPN. Group. Group_ Name\r\nurn:x-oca:ocpp:uid:1:569274\r\nVPN group.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "password": {
+          "description": "VPN. Password. Password\r\nurn:x-oca:ocpp:uid:1:569275\r\nVPN Password.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "key": {
+          "description": "VPN. Key. VPN_ Key\r\nurn:x-oca:ocpp:uid:1:569276\r\nVPN shared secret.\r\n",
+          "type": "string",
+          "maxLength": 255
+        },
+        "type": {
+          "$ref": "#/definitions/VPNEnumType"
+        }
+      },
+      "required": ["server", "user", "password", "key", "type"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "configurationSlot": {
+      "description": "Slot in which the configuration should be stored.\r\n",
+      "type": "integer"
+    },
+    "connectionData": {
+      "$ref": "#/definitions/NetworkConnectionProfileType"
+    }
+  },
+  "required": ["configurationSlot", "connectionData"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetNetworkProfileResponse.json b/src/assets/json-schemas/ocpp/2.0/SetNetworkProfileResponse.json
new file mode 100755 (executable)
index 0000000..03a3d16
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetNetworkProfileResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "SetNetworkProfileStatusEnumType": {
+      "description": "Result of operation.\r\n",
+      "javaType": "SetNetworkProfileStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "Failed"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/SetNetworkProfileStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetVariableMonitoringRequest.json b/src/assets/json-schemas/ocpp/2.0/SetVariableMonitoringRequest.json
new file mode 100755 (executable)
index 0000000..29ede10
--- /dev/null
@@ -0,0 +1,147 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetVariableMonitoringRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "MonitorEnumType": {
+      "description": "The type of this monitor, e.g. a threshold, delta or periodic monitor. \r\n\r\n",
+      "javaType": "MonitorEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["UpperThreshold", "LowerThreshold", "Delta", "Periodic", "PeriodicClockAligned"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "SetMonitoringDataType": {
+      "description": "Class to hold parameters of SetVariableMonitoring request.\r\n",
+      "javaType": "SetMonitoringData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "An id SHALL only be given to replace an existing monitor. The Charging Station handles the generation of id's for new monitors.\r\n\r\n",
+          "type": "integer"
+        },
+        "transaction": {
+          "description": "Monitor only active when a transaction is ongoing on a component relevant to this transaction. Default = false.\r\n\r\n",
+          "type": "boolean",
+          "default": false
+        },
+        "value": {
+          "description": "Value for threshold or delta monitoring.\r\nFor Periodic or PeriodicClockAligned this is the interval in seconds.\r\n\r\n",
+          "type": "number"
+        },
+        "type": {
+          "$ref": "#/definitions/MonitorEnumType"
+        },
+        "severity": {
+          "description": "The severity that will be assigned to an event that is triggered by this monitor. The severity range is 0-9, with 0 as the highest and 9 as the lowest severity level.\r\n\r\nThe severity levels have the following meaning: +\r\n*0-Danger* +\r\nIndicates lives are potentially in danger. Urgent attention is needed and action should be taken immediately. +\r\n*1-Hardware Failure* +\r\nIndicates that the Charging Station is unable to continue regular operations due to Hardware issues. Action is required. +\r\n*2-System Failure* +\r\nIndicates that the Charging Station is unable to continue regular operations due to software or minor hardware issues. Action is required. +\r\n*3-Critical* +\r\nIndicates a critical error. Action is required. +\r\n*4-Error* +\r\nIndicates a non-urgent error. Action is required. +\r\n*5-Alert* +\r\nIndicates an alert event. Default severity for any type of monitoring event.  +\r\n*6-Warning* +\r\nIndicates a warning event. Action may be required. +\r\n*7-Notice* +\r\nIndicates an unusual event. No immediate action is required. +\r\n*8-Informational* +\r\nIndicates a regular operational event. May be used for reporting, measuring throughput, etc. No action is required. +\r\n*9-Debug* +\r\nIndicates information useful to developers for debugging, not useful during operations.\r\n\r\n",
+          "type": "integer"
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        }
+      },
+      "required": ["value", "type", "severity", "component", "variable"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "setMonitoringData": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/SetMonitoringDataType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["setMonitoringData"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetVariableMonitoringResponse.json b/src/assets/json-schemas/ocpp/2.0/SetVariableMonitoringResponse.json
new file mode 100755 (executable)
index 0000000..32870b9
--- /dev/null
@@ -0,0 +1,180 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetVariableMonitoringResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "MonitorEnumType": {
+      "description": "The type of this monitor, e.g. a threshold, delta or periodic monitor. \r\n\r\n",
+      "javaType": "MonitorEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["UpperThreshold", "LowerThreshold", "Delta", "Periodic", "PeriodicClockAligned"]
+    },
+    "SetMonitoringStatusEnumType": {
+      "description": "Status is OK if a value could be returned. Otherwise this will indicate the reason why a value could not be returned.\r\n",
+      "javaType": "SetMonitoringStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Accepted",
+        "UnknownComponent",
+        "UnknownVariable",
+        "UnsupportedMonitorType",
+        "Rejected",
+        "Duplicate"
+      ]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "SetMonitoringResultType": {
+      "description": "Class to hold result of SetVariableMonitoring request.\r\n",
+      "javaType": "SetMonitoringResult",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Id given to the VariableMonitor by the Charging Station. The Id is only returned when status is accepted. Installed VariableMonitors should have unique id's but the id's of removed Installed monitors should have unique id's but the id's of removed monitors MAY be reused.\r\n",
+          "type": "integer"
+        },
+        "statusInfo": {
+          "$ref": "#/definitions/StatusInfoType"
+        },
+        "status": {
+          "$ref": "#/definitions/SetMonitoringStatusEnumType"
+        },
+        "type": {
+          "$ref": "#/definitions/MonitorEnumType"
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        },
+        "severity": {
+          "description": "The severity that will be assigned to an event that is triggered by this monitor. The severity range is 0-9, with 0 as the highest and 9 as the lowest severity level.\r\n\r\nThe severity levels have the following meaning: +\r\n*0-Danger* +\r\nIndicates lives are potentially in danger. Urgent attention is needed and action should be taken immediately. +\r\n*1-Hardware Failure* +\r\nIndicates that the Charging Station is unable to continue regular operations due to Hardware issues. Action is required. +\r\n*2-System Failure* +\r\nIndicates that the Charging Station is unable to continue regular operations due to software or minor hardware issues. Action is required. +\r\n*3-Critical* +\r\nIndicates a critical error. Action is required. +\r\n*4-Error* +\r\nIndicates a non-urgent error. Action is required. +\r\n*5-Alert* +\r\nIndicates an alert event. Default severity for any type of monitoring event.  +\r\n*6-Warning* +\r\nIndicates a warning event. Action may be required. +\r\n*7-Notice* +\r\nIndicates an unusual event. No immediate action is required. +\r\n*8-Informational* +\r\nIndicates a regular operational event. May be used for reporting, measuring throughput, etc. No action is required. +\r\n*9-Debug* +\r\nIndicates information useful to developers for debugging, not useful during operations.\r\n\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["status", "type", "severity", "component", "variable"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "setMonitoringResult": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/SetMonitoringResultType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["setMonitoringResult"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetVariablesRequest.json b/src/assets/json-schemas/ocpp/2.0/SetVariablesRequest.json
new file mode 100755 (executable)
index 0000000..200b3cb
--- /dev/null
@@ -0,0 +1,135 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetVariablesRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "AttributeEnumType": {
+      "description": "Type of attribute: Actual, Target, MinSet, MaxSet. Default is Actual when omitted.\r\n",
+      "javaType": "AttributeEnum",
+      "type": "string",
+      "default": "Actual",
+      "additionalProperties": false,
+      "enum": ["Actual", "Target", "MinSet", "MaxSet"]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "SetVariableDataType": {
+      "javaType": "SetVariableData",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "attributeType": {
+          "$ref": "#/definitions/AttributeEnumType"
+        },
+        "attributeValue": {
+          "description": "Value to be assigned to attribute of variable.\r\n\r\nThe Configuration Variable &lt;&lt;configkey-configuration-value-size,ConfigurationValueSize&gt;&gt; can be used to limit SetVariableData.attributeValue and VariableCharacteristics.valueList. The max size of these values will always remain equal. \r\n",
+          "type": "string",
+          "maxLength": 1000
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        }
+      },
+      "required": ["attributeValue", "component", "variable"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "setVariableData": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/SetVariableDataType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["setVariableData"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SetVariablesResponse.json b/src/assets/json-schemas/ocpp/2.0/SetVariablesResponse.json
new file mode 100755 (executable)
index 0000000..d2e2c2c
--- /dev/null
@@ -0,0 +1,172 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SetVariablesResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "AttributeEnumType": {
+      "description": "Type of attribute: Actual, Target, MinSet, MaxSet. Default is Actual when omitted.\r\n",
+      "javaType": "AttributeEnum",
+      "type": "string",
+      "default": "Actual",
+      "additionalProperties": false,
+      "enum": ["Actual", "Target", "MinSet", "MaxSet"]
+    },
+    "SetVariableStatusEnumType": {
+      "description": "Result status of setting the variable.\r\n",
+      "javaType": "SetVariableStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Accepted",
+        "Rejected",
+        "UnknownComponent",
+        "UnknownVariable",
+        "NotSupportedAttributeType",
+        "RebootRequired"
+      ]
+    },
+    "ComponentType": {
+      "description": "A physical or logical component\r\n",
+      "javaType": "Component",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "evse": {
+          "$ref": "#/definitions/EVSEType"
+        },
+        "name": {
+          "description": "Name of the component. Name should be taken from the list of standardized component names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the component exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "SetVariableResultType": {
+      "javaType": "SetVariableResult",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "attributeType": {
+          "$ref": "#/definitions/AttributeEnumType"
+        },
+        "attributeStatus": {
+          "$ref": "#/definitions/SetVariableStatusEnumType"
+        },
+        "attributeStatusInfo": {
+          "$ref": "#/definitions/StatusInfoType"
+        },
+        "component": {
+          "$ref": "#/definitions/ComponentType"
+        },
+        "variable": {
+          "$ref": "#/definitions/VariableType"
+        }
+      },
+      "required": ["attributeStatus", "component", "variable"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    },
+    "VariableType": {
+      "description": "Reference key to a component-variable.\r\n",
+      "javaType": "Variable",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "name": {
+          "description": "Name of the variable. Name should be taken from the list of standardized variable names whenever possible. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "instance": {
+          "description": "Name of instance in case the variable exists as multiple instances. Case Insensitive. strongly advised to use Camel Case.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["name"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "setVariableResult": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/SetVariableResultType"
+      },
+      "minItems": 1
+    }
+  },
+  "required": ["setVariableResult"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SignCertificateRequest.json b/src/assets/json-schemas/ocpp/2.0/SignCertificateRequest.json
new file mode 100755 (executable)
index 0000000..e80bf1d
--- /dev/null
@@ -0,0 +1,42 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SignCertificateRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "CertificateSigningUseEnumType": {
+      "description": "Indicates the type of certificate that is to be signed. When omitted the certificate is to be used for both the 15118 connection (if implemented) and the Charging Station to CSMS connection.\r\n\r\n",
+      "javaType": "CertificateSigningUseEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["ChargingStationCertificate", "V2GCertificate"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "csr": {
+      "description": "The Charging Station SHALL send the public key in form of a Certificate Signing Request (CSR) as described in RFC 2986 [22] and then PEM encoded, using the &lt;&lt;signcertificaterequest,SignCertificateRequest&gt;&gt; message.\r\n",
+      "type": "string",
+      "maxLength": 5500
+    },
+    "certificateType": {
+      "$ref": "#/definitions/CertificateSigningUseEnumType"
+    }
+  },
+  "required": ["csr"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/SignCertificateResponse.json b/src/assets/json-schemas/ocpp/2.0/SignCertificateResponse.json
new file mode 100755 (executable)
index 0000000..8c88f69
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:SignCertificateResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "GenericStatusEnumType": {
+      "description": "Specifies whether the CSMS can process the request.\r\n",
+      "javaType": "GenericStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/GenericStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/StatusNotificationRequest.json b/src/assets/json-schemas/ocpp/2.0/StatusNotificationRequest.json
new file mode 100755 (executable)
index 0000000..f79c968
--- /dev/null
@@ -0,0 +1,50 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:StatusNotificationRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ConnectorStatusEnumType": {
+      "description": "This contains the current status of the Connector.\r\n",
+      "javaType": "ConnectorStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Available", "Occupied", "Reserved", "Unavailable", "Faulted"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "timestamp": {
+      "description": "The time for which the status is reported. If absent time of receipt of the message will be assumed.\r\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "connectorStatus": {
+      "$ref": "#/definitions/ConnectorStatusEnumType"
+    },
+    "evseId": {
+      "description": "The id of the EVSE to which the connector belongs for which the the status is reported.\r\n",
+      "type": "integer"
+    },
+    "connectorId": {
+      "description": "The id of the connector within the EVSE for which the status is reported.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["timestamp", "connectorStatus", "evseId", "connectorId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/StatusNotificationResponse.json b/src/assets/json-schemas/ocpp/2.0/StatusNotificationResponse.json
new file mode 100755 (executable)
index 0000000..630b757
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:StatusNotificationResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/TransactionEventRequest.json b/src/assets/json-schemas/ocpp/2.0/TransactionEventRequest.json
new file mode 100755 (executable)
index 0000000..391881b
--- /dev/null
@@ -0,0 +1,442 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:TransactionEventRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "ChargingStateEnumType": {
+      "description": "Transaction. State. Transaction_ State_ Code\r\nurn:x-oca:ocpp:uid:1:569419\r\nCurrent charging state, is required when state\r\nhas changed.\r\n",
+      "javaType": "ChargingStateEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Charging", "EVConnected", "SuspendedEV", "SuspendedEVSE", "Idle"]
+    },
+    "IdTokenEnumType": {
+      "description": "Enumeration of possible idToken types.\r\n",
+      "javaType": "IdTokenEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Central",
+        "eMAID",
+        "ISO14443",
+        "ISO15693",
+        "KeyCode",
+        "Local",
+        "MacAddress",
+        "NoAuthorization"
+      ]
+    },
+    "LocationEnumType": {
+      "description": "Sampled_ Value. Location. Location_ Code\r\nurn:x-oca:ocpp:uid:1:569265\r\nIndicates where the measured value has been sampled. Default =  \"Outlet\"\r\n\r\n",
+      "javaType": "LocationEnum",
+      "type": "string",
+      "default": "Outlet",
+      "additionalProperties": false,
+      "enum": ["Body", "Cable", "EV", "Inlet", "Outlet"]
+    },
+    "MeasurandEnumType": {
+      "description": "Sampled_ Value. Measurand. Measurand_ Code\r\nurn:x-oca:ocpp:uid:1:569263\r\nType of measurement. Default = \"Energy.Active.Import.Register\"\r\n",
+      "javaType": "MeasurandEnum",
+      "type": "string",
+      "default": "Energy.Active.Import.Register",
+      "additionalProperties": false,
+      "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": {
+      "description": "Sampled_ Value. Phase. Phase_ Code\r\nurn:x-oca:ocpp:uid:1:569264\r\nIndicates how the measured value is to be interpreted. For instance between L1 and neutral (L1-N) Please note that not all values of phase are applicable to all Measurands. When phase is absent, the measured value is interpreted as an overall value.\r\n",
+      "javaType": "PhaseEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["L1", "L2", "L3", "N", "L1-N", "L2-N", "L3-N", "L1-L2", "L2-L3", "L3-L1"]
+    },
+    "ReadingContextEnumType": {
+      "description": "Sampled_ Value. Context. Reading_ Context_ Code\r\nurn:x-oca:ocpp:uid:1:569261\r\nType of detail value: start, end or sample. Default = \"Sample.Periodic\"\r\n",
+      "javaType": "ReadingContextEnum",
+      "type": "string",
+      "default": "Sample.Periodic",
+      "additionalProperties": false,
+      "enum": [
+        "Interruption.Begin",
+        "Interruption.End",
+        "Other",
+        "Sample.Clock",
+        "Sample.Periodic",
+        "Transaction.Begin",
+        "Transaction.End",
+        "Trigger"
+      ]
+    },
+    "ReasonEnumType": {
+      "description": "Transaction. Stopped_ Reason. EOT_ Reason_ Code\r\nurn:x-oca:ocpp:uid:1:569413\r\nThis contains the reason why the transaction was stopped. MAY only be omitted when Reason is \"Local\".\r\n",
+      "javaType": "ReasonEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "DeAuthorized",
+        "EmergencyStop",
+        "EnergyLimitReached",
+        "EVDisconnected",
+        "GroundFault",
+        "ImmediateReset",
+        "Local",
+        "LocalOutOfCredit",
+        "MasterPass",
+        "Other",
+        "OvercurrentFault",
+        "PowerLoss",
+        "PowerQuality",
+        "Reboot",
+        "Remote",
+        "SOCLimitReached",
+        "StoppedByEV",
+        "TimeLimitReached",
+        "Timeout"
+      ]
+    },
+    "TransactionEventEnumType": {
+      "description": "This contains the type of this event.\r\nThe first TransactionEvent of a transaction SHALL contain: \"Started\" The last TransactionEvent of a transaction SHALL contain: \"Ended\" All others SHALL contain: \"Updated\"\r\n",
+      "javaType": "TransactionEventEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Ended", "Started", "Updated"]
+    },
+    "TriggerReasonEnumType": {
+      "description": "Reason the Charging Station sends this message to the CSMS\r\n",
+      "javaType": "TriggerReasonEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Authorized",
+        "CablePluggedIn",
+        "ChargingRateChanged",
+        "ChargingStateChanged",
+        "Deauthorized",
+        "EnergyLimitReached",
+        "EVCommunicationLost",
+        "EVConnectTimeout",
+        "MeterValueClock",
+        "MeterValuePeriodic",
+        "TimeLimitReached",
+        "Trigger",
+        "UnlockCommand",
+        "StopAuthorized",
+        "EVDeparted",
+        "EVDetected",
+        "RemoteStop",
+        "RemoteStart",
+        "AbnormalCondition",
+        "SignedDataReceived",
+        "ResetCommand"
+      ]
+    },
+    "AdditionalInfoType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "AdditionalInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalIdToken": {
+          "description": "This field specifies the additional IdToken.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "description": "This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["additionalIdToken", "type"]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    },
+    "IdTokenType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "IdToken",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalInfo": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/AdditionalInfoType"
+          },
+          "minItems": 1
+        },
+        "idToken": {
+          "description": "IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "$ref": "#/definitions/IdTokenEnumType"
+        }
+      },
+      "required": ["idToken", "type"]
+    },
+    "MeterValueType": {
+      "description": "Meter_ Value\r\nurn:x-oca:ocpp:uid:2:233265\r\nCollection of one or more sampled values in MeterValuesRequest and TransactionEvent. All sampled values in a MeterValue are sampled at the same point in time.\r\n",
+      "javaType": "MeterValue",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "sampledValue": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/SampledValueType"
+          },
+          "minItems": 1
+        },
+        "timestamp": {
+          "description": "Meter_ Value. Timestamp. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569259\r\nTimestamp for measured value(s).\r\n",
+          "type": "string",
+          "format": "date-time"
+        }
+      },
+      "required": ["timestamp", "sampledValue"]
+    },
+    "SampledValueType": {
+      "description": "Sampled_ Value\r\nurn:x-oca:ocpp:uid:2:233266\r\nSingle sampled value in MeterValues. Each value can be accompanied by optional fields.\r\n\r\nTo save on mobile data usage, default values of all of the optional fields are such that. The value without any additional fields will be interpreted, as a register reading of active import energy in Wh (Watt-hour) units.\r\n",
+      "javaType": "SampledValue",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "value": {
+          "description": "Sampled_ Value. Value. Measure\r\nurn:x-oca:ocpp:uid:1:569260\r\nIndicates the measured value.\r\n\r\n",
+          "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": {
+      "description": "Represent a signed version of the meter value.\r\n",
+      "javaType": "SignedMeterValue",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "signedMeterData": {
+          "description": "Base64 encoded, contains the signed data which might contain more then just the meter value. It can contain information like timestamps, reference to a customer etc.\r\n",
+          "type": "string",
+          "maxLength": 2500
+        },
+        "signingMethod": {
+          "description": "Method used to create the digital signature.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "encodingMethod": {
+          "description": "Method used to encode the meter values before applying the digital signature algorithm.\r\n",
+          "type": "string",
+          "maxLength": 50
+        },
+        "publicKey": {
+          "description": "Base64 encoded, sending depends on configuration variable _PublicKeyWithSignedMeterValue_.\r\n",
+          "type": "string",
+          "maxLength": 2500
+        }
+      },
+      "required": ["signedMeterData", "signingMethod", "encodingMethod", "publicKey"]
+    },
+    "TransactionType": {
+      "description": "Transaction\r\nurn:x-oca:ocpp:uid:2:233318\r\n",
+      "javaType": "Transaction",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "transactionId": {
+          "description": "This contains the Id of the transaction.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "chargingState": {
+          "$ref": "#/definitions/ChargingStateEnumType"
+        },
+        "timeSpentCharging": {
+          "description": "Transaction. Time_ Spent_ Charging. Elapsed_ Time\r\nurn:x-oca:ocpp:uid:1:569415\r\nContains the total time that energy flowed from EVSE to EV during the transaction (in seconds). Note that timeSpentCharging is smaller or equal to the duration of the transaction.\r\n",
+          "type": "integer"
+        },
+        "stoppedReason": {
+          "$ref": "#/definitions/ReasonEnumType"
+        },
+        "remoteStartId": {
+          "description": "The ID given to remote start request (&lt;&lt;requeststarttransactionrequest, RequestStartTransactionRequest&gt;&gt;. This enables to CSMS to match the started transaction to the given start request.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["transactionId"]
+    },
+    "UnitOfMeasureType": {
+      "description": "Represents a UnitOfMeasure with a multiplier\r\n",
+      "javaType": "UnitOfMeasure",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "unit": {
+          "description": "Unit of the value. Default = \"Wh\" if the (default) measurand is an \"Energy\" type.\r\nThis field SHALL use a value from the list Standardized Units of Measurements in Part 2 Appendices. \r\nIf an applicable unit is available in that list, otherwise a \"custom\" unit might be used.\r\n",
+          "type": "string",
+          "default": "Wh",
+          "maxLength": 20
+        },
+        "multiplier": {
+          "description": "Multiplier, this value represents the exponent to base 10. I.e. multiplier 3 means 10 raised to the 3rd power. Default is 0.\r\n",
+          "type": "integer",
+          "default": 0
+        }
+      }
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "eventType": {
+      "$ref": "#/definitions/TransactionEventEnumType"
+    },
+    "meterValue": {
+      "type": "array",
+      "additionalItems": false,
+      "items": {
+        "$ref": "#/definitions/MeterValueType"
+      },
+      "minItems": 1
+    },
+    "timestamp": {
+      "description": "The date and time at which this transaction event occurred.\r\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "triggerReason": {
+      "$ref": "#/definitions/TriggerReasonEnumType"
+    },
+    "seqNo": {
+      "description": "Incremental sequence number, helps with determining if all messages of a transaction have been received.\r\n",
+      "type": "integer"
+    },
+    "offline": {
+      "description": "Indication that this transaction event happened when the Charging Station was offline. Default = false, meaning: the event occurred when the Charging Station was online.\r\n",
+      "type": "boolean",
+      "default": false
+    },
+    "numberOfPhasesUsed": {
+      "description": "If the Charging Station is able to report the number of phases used, then it SHALL provide it. When omitted the CSMS may be able to determine the number of phases used via device management.\r\n",
+      "type": "integer"
+    },
+    "cableMaxCurrent": {
+      "description": "The maximum current of the connected cable in Ampere (A).\r\n",
+      "type": "integer"
+    },
+    "reservationId": {
+      "description": "This contains the Id of the reservation that terminates as a result of this transaction.\r\n",
+      "type": "integer"
+    },
+    "transactionInfo": {
+      "$ref": "#/definitions/TransactionType"
+    },
+    "evse": {
+      "$ref": "#/definitions/EVSEType"
+    },
+    "idToken": {
+      "$ref": "#/definitions/IdTokenType"
+    }
+  },
+  "required": ["eventType", "timestamp", "triggerReason", "seqNo", "transactionInfo"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/TransactionEventResponse.json b/src/assets/json-schemas/ocpp/2.0/TransactionEventResponse.json
new file mode 100755 (executable)
index 0000000..344a7b4
--- /dev/null
@@ -0,0 +1,205 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:TransactionEventResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "AuthorizationStatusEnumType": {
+      "description": "ID_ Token. Status. Authorization_ Status\r\nurn:x-oca:ocpp:uid:1:569372\r\nCurrent status of the ID Token.\r\n",
+      "javaType": "AuthorizationStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Accepted",
+        "Blocked",
+        "ConcurrentTx",
+        "Expired",
+        "Invalid",
+        "NoCredit",
+        "NotAllowedTypeEVSE",
+        "NotAtThisLocation",
+        "NotAtThisTime",
+        "Unknown"
+      ]
+    },
+    "IdTokenEnumType": {
+      "description": "Enumeration of possible idToken types.\r\n",
+      "javaType": "IdTokenEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Central",
+        "eMAID",
+        "ISO14443",
+        "ISO15693",
+        "KeyCode",
+        "Local",
+        "MacAddress",
+        "NoAuthorization"
+      ]
+    },
+    "MessageFormatEnumType": {
+      "description": "Message_ Content. Format. Message_ Format_ Code\r\nurn:x-enexis:ecdm:uid:1:570848\r\nFormat of the message.\r\n",
+      "javaType": "MessageFormatEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["ASCII", "HTML", "URI", "UTF8"]
+    },
+    "AdditionalInfoType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "AdditionalInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalIdToken": {
+          "description": "This field specifies the additional IdToken.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "description": "This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.\r\n",
+          "type": "string",
+          "maxLength": 50
+        }
+      },
+      "required": ["additionalIdToken", "type"]
+    },
+    "IdTokenInfoType": {
+      "description": "ID_ Token\r\nurn:x-oca:ocpp:uid:2:233247\r\nContains status information about an identifier.\r\nIt is advised to not stop charging for a token that expires during charging, as ExpiryDate is only used for caching purposes. If ExpiryDate is not given, the status has no end date.\r\n",
+      "javaType": "IdTokenInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "status": {
+          "$ref": "#/definitions/AuthorizationStatusEnumType"
+        },
+        "cacheExpiryDateTime": {
+          "description": "ID_ Token. Expiry. Date_ Time\r\nurn:x-oca:ocpp:uid:1:569373\r\nDate and Time after which the token must be considered invalid.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "chargingPriority": {
+          "description": "Priority from a business point of view. Default priority is 0, The range is from -9 to 9. Higher values indicate a higher priority. The chargingPriority in &lt;&lt;transactioneventresponse,TransactionEventResponse&gt;&gt; overrules this one. \r\n",
+          "type": "integer"
+        },
+        "language1": {
+          "description": "ID_ Token. Language1. Language_ Code\r\nurn:x-oca:ocpp:uid:1:569374\r\nPreferred user interface language of identifier user. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "evseId": {
+          "description": "Only used when the IdToken is only valid for one or more specific EVSEs, not for the entire Charging Station.\r\n\r\n",
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "type": "integer"
+          },
+          "minItems": 1
+        },
+        "groupIdToken": {
+          "$ref": "#/definitions/IdTokenType"
+        },
+        "language2": {
+          "description": "ID_ Token. Language2. Language_ Code\r\nurn:x-oca:ocpp:uid:1:569375\r\nSecond preferred user interface language of identifier user. Don’t use when language1 is omitted, has to be different from language1. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "personalMessage": {
+          "$ref": "#/definitions/MessageContentType"
+        }
+      },
+      "required": ["status"]
+    },
+    "IdTokenType": {
+      "description": "Contains a case insensitive identifier to use for the authorization and the type of authorization to support multiple forms of identifiers.\r\n",
+      "javaType": "IdToken",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "additionalInfo": {
+          "type": "array",
+          "additionalItems": false,
+          "items": {
+            "$ref": "#/definitions/AdditionalInfoType"
+          },
+          "minItems": 1
+        },
+        "idToken": {
+          "description": "IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.\r\n",
+          "type": "string",
+          "maxLength": 36
+        },
+        "type": {
+          "$ref": "#/definitions/IdTokenEnumType"
+        }
+      },
+      "required": ["idToken", "type"]
+    },
+    "MessageContentType": {
+      "description": "Message_ Content\r\nurn:x-enexis:ecdm:uid:2:234490\r\nContains message details, for a message to be displayed on a Charging Station.\r\n\r\n",
+      "javaType": "MessageContent",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "format": {
+          "$ref": "#/definitions/MessageFormatEnumType"
+        },
+        "language": {
+          "description": "Message_ Content. Language. Language_ Code\r\nurn:x-enexis:ecdm:uid:1:570849\r\nMessage language identifier. Contains a language code as defined in &lt;&lt;ref-RFC5646,[RFC5646]&gt;&gt;.\r\n",
+          "type": "string",
+          "maxLength": 8
+        },
+        "content": {
+          "description": "Message_ Content. Content. Message\r\nurn:x-enexis:ecdm:uid:1:570852\r\nMessage contents.\r\n\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["format", "content"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "totalCost": {
+      "description": "SHALL only be sent when charging has ended. Final total cost of this transaction, including taxes. In the currency configured with the Configuration Variable: &lt;&lt;configkey-currency,`Currency`&gt;&gt;. When omitted, the transaction was NOT free. To indicate a free transaction, the CSMS SHALL send 0.00.\r\n\r\n",
+      "type": "number"
+    },
+    "chargingPriority": {
+      "description": "Priority from a business point of view. Default priority is 0, The range is from -9 to 9. Higher values indicate a higher priority. The chargingPriority in &lt;&lt;transactioneventresponse,TransactionEventResponse&gt;&gt; is temporarily, so it may not be set in the &lt;&lt;cmn_idtokeninfotype,IdTokenInfoType&gt;&gt; afterwards. Also the chargingPriority in &lt;&lt;transactioneventresponse,TransactionEventResponse&gt;&gt; overrules the one in &lt;&lt;cmn_idtokeninfotype,IdTokenInfoType&gt;&gt;.  \r\n",
+      "type": "integer"
+    },
+    "idTokenInfo": {
+      "$ref": "#/definitions/IdTokenInfoType"
+    },
+    "updatedPersonalMessage": {
+      "$ref": "#/definitions/MessageContentType"
+    }
+  }
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/TriggerMessageRequest.json b/src/assets/json-schemas/ocpp/2.0/TriggerMessageRequest.json
new file mode 100755 (executable)
index 0000000..e45c764
--- /dev/null
@@ -0,0 +1,72 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:TriggerMessageRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "MessageTriggerEnumType": {
+      "description": "Type of message to be triggered.\r\n",
+      "javaType": "MessageTriggerEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "BootNotification",
+        "LogStatusNotification",
+        "FirmwareStatusNotification",
+        "Heartbeat",
+        "MeterValues",
+        "SignChargingStationCertificate",
+        "SignV2GCertificate",
+        "StatusNotification",
+        "TransactionEvent",
+        "SignCombinedCertificate",
+        "PublishFirmwareStatusNotification"
+      ]
+    },
+    "EVSEType": {
+      "description": "EVSE\r\nurn:x-oca:ocpp:uid:2:233123\r\nElectric Vehicle Supply Equipment\r\n",
+      "javaType": "EVSE",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "id": {
+          "description": "Identified_ Object. MRID. Numeric_ Identifier\r\nurn:x-enexis:ecdm:uid:1:569198\r\nEVSE Identifier. This contains a number (&gt; 0) designating an EVSE of the Charging Station.\r\n",
+          "type": "integer"
+        },
+        "connectorId": {
+          "description": "An id to designate a specific connector (on an EVSE) by connector index number.\r\n",
+          "type": "integer"
+        }
+      },
+      "required": ["id"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "evse": {
+      "$ref": "#/definitions/EVSEType"
+    },
+    "requestedMessage": {
+      "$ref": "#/definitions/MessageTriggerEnumType"
+    }
+  },
+  "required": ["requestedMessage"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/TriggerMessageResponse.json b/src/assets/json-schemas/ocpp/2.0/TriggerMessageResponse.json
new file mode 100755 (executable)
index 0000000..a082c55
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:TriggerMessageResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "TriggerMessageStatusEnumType": {
+      "description": "Indicates whether the Charging Station will send the requested notification or not.\r\n",
+      "javaType": "TriggerMessageStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Accepted", "Rejected", "NotImplemented"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/TriggerMessageStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/UnlockConnectorRequest.json b/src/assets/json-schemas/ocpp/2.0/UnlockConnectorRequest.json
new file mode 100755 (executable)
index 0000000..635f521
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:UnlockConnectorRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "evseId": {
+      "description": "This contains the identifier of the EVSE for which a connector needs to be unlocked.\r\n",
+      "type": "integer"
+    },
+    "connectorId": {
+      "description": "This contains the identifier of the connector that needs to be unlocked.\r\n",
+      "type": "integer"
+    }
+  },
+  "required": ["evseId", "connectorId"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/UnlockConnectorResponse.json b/src/assets/json-schemas/ocpp/2.0/UnlockConnectorResponse.json
new file mode 100755 (executable)
index 0000000..ebfa782
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:UnlockConnectorResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "UnlockStatusEnumType": {
+      "description": "This indicates whether the Charging Station has unlocked the connector.\r\n",
+      "javaType": "UnlockStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["Unlocked", "UnlockFailed", "OngoingAuthorizedTransaction", "UnknownConnector"]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/UnlockStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/UnpublishFirmwareRequest.json b/src/assets/json-schemas/ocpp/2.0/UnpublishFirmwareRequest.json
new file mode 100755 (executable)
index 0000000..26cc118
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:UnpublishFirmwareRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "checksum": {
+      "description": "The MD5 checksum over the entire firmware file as a hexadecimal string of length 32. \r\n",
+      "type": "string",
+      "maxLength": 32
+    }
+  },
+  "required": ["checksum"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/UnpublishFirmwareResponse.json b/src/assets/json-schemas/ocpp/2.0/UnpublishFirmwareResponse.json
new file mode 100755 (executable)
index 0000000..60e70b4
--- /dev/null
@@ -0,0 +1,37 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:UnpublishFirmwareResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "UnpublishFirmwareStatusEnumType": {
+      "description": "Indicates whether the Local Controller succeeded in unpublishing the firmware.\r\n",
+      "javaType": "UnpublishFirmwareStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": ["DownloadOngoing", "NoFirmware", "Unpublished"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/UnpublishFirmwareStatusEnumType"
+    }
+  },
+  "required": ["status"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/UpdateFirmwareRequest.json b/src/assets/json-schemas/ocpp/2.0/UpdateFirmwareRequest.json
new file mode 100755 (executable)
index 0000000..492e5f2
--- /dev/null
@@ -0,0 +1,79 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:UpdateFirmwareRequest",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "FirmwareType": {
+      "description": "Firmware\r\nurn:x-enexis:ecdm:uid:2:233291\r\nRepresents a copy of the firmware that can be loaded/updated on the Charging Station.\r\n",
+      "javaType": "Firmware",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "location": {
+          "description": "Firmware. Location. URI\r\nurn:x-enexis:ecdm:uid:1:569460\r\nURI defining the origin of the firmware.\r\n",
+          "type": "string",
+          "maxLength": 512
+        },
+        "retrieveDateTime": {
+          "description": "Firmware. Retrieve. Date_ Time\r\nurn:x-enexis:ecdm:uid:1:569461\r\nDate and time at which the firmware shall be retrieved.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "installDateTime": {
+          "description": "Firmware. Install. Date_ Time\r\nurn:x-enexis:ecdm:uid:1:569462\r\nDate and time at which the firmware shall be installed.\r\n",
+          "type": "string",
+          "format": "date-time"
+        },
+        "signingCertificate": {
+          "description": "Certificate with which the firmware was signed.\r\nPEM encoded X.509 certificate.\r\n",
+          "type": "string",
+          "maxLength": 5500
+        },
+        "signature": {
+          "description": "Firmware. Signature. Signature\r\nurn:x-enexis:ecdm:uid:1:569464\r\nBase64 encoded firmware signature.\r\n",
+          "type": "string",
+          "maxLength": 800
+        }
+      },
+      "required": ["location", "retrieveDateTime"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "retries": {
+      "description": "This specifies how many times Charging Station must try to download the firmware before giving up. If this field is not present, it is left to Charging Station to decide how many times it wants to retry.\r\n",
+      "type": "integer"
+    },
+    "retryInterval": {
+      "description": "The interval in seconds after which a retry may be attempted. If this field is not present, it is left to Charging Station to decide how long to wait between attempts.\r\n",
+      "type": "integer"
+    },
+    "requestId": {
+      "description": "The Id of this request\r\n",
+      "type": "integer"
+    },
+    "firmware": {
+      "$ref": "#/definitions/FirmwareType"
+    }
+  },
+  "required": ["requestId", "firmware"]
+}
diff --git a/src/assets/json-schemas/ocpp/2.0/UpdateFirmwareResponse.json b/src/assets/json-schemas/ocpp/2.0/UpdateFirmwareResponse.json
new file mode 100755 (executable)
index 0000000..f863d30
--- /dev/null
@@ -0,0 +1,68 @@
+{
+  "$schema": "http://json-schema.org/draft-06/schema#",
+  "$id": "urn:OCPP:Cp:2:2020:3:UpdateFirmwareResponse",
+  "comment": "OCPP 2.0.1 FINAL",
+  "definitions": {
+    "CustomDataType": {
+      "description": "This class does not get 'AdditionalProperties = false' in the schema generation, so it can be extended with arbitrary JSON properties to allow adding custom data.",
+      "javaType": "CustomData",
+      "type": "object",
+      "properties": {
+        "vendorId": {
+          "type": "string",
+          "maxLength": 255
+        }
+      },
+      "required": ["vendorId"]
+    },
+    "UpdateFirmwareStatusEnumType": {
+      "description": "This field indicates whether the Charging Station was able to accept the request.\r\n\r\n",
+      "javaType": "UpdateFirmwareStatusEnum",
+      "type": "string",
+      "additionalProperties": false,
+      "enum": [
+        "Accepted",
+        "Rejected",
+        "AcceptedCanceled",
+        "InvalidCertificate",
+        "RevokedCertificate"
+      ]
+    },
+    "StatusInfoType": {
+      "description": "Element providing more information about the status.\r\n",
+      "javaType": "StatusInfo",
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "customData": {
+          "$ref": "#/definitions/CustomDataType"
+        },
+        "reasonCode": {
+          "description": "A predefined code for the reason why the status is returned in this response. The string is case-insensitive.\r\n",
+          "type": "string",
+          "maxLength": 20
+        },
+        "additionalInfo": {
+          "description": "Additional text to provide detailed information.\r\n",
+          "type": "string",
+          "maxLength": 512
+        }
+      },
+      "required": ["reasonCode"]
+    }
+  },
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "customData": {
+      "$ref": "#/definitions/CustomDataType"
+    },
+    "status": {
+      "$ref": "#/definitions/UpdateFirmwareStatusEnumType"
+    },
+    "statusInfo": {
+      "$ref": "#/definitions/StatusInfoType"
+    }
+  },
+  "required": ["status"]
+}
index 689fe2d98099f844a42b1d15195def868f55746b..c3c984f85ae464029ad2bb89a1e904c02c1dd752 100644 (file)
@@ -56,7 +56,7 @@ import {
   type ErrorResponse,
   type HeartbeatResponse,
   type MeterValuesResponse,
-  RegistrationStatus,
+  RegistrationStatusEnumType,
   type Response,
   type StatusNotificationResponse,
 } from '../types/ocpp/Responses';
@@ -200,7 +200,7 @@ export default class ChargingStation {
     return this?.wsConnection?.readyState === WebSocket.OPEN;
   }
 
-  public getRegistrationStatus(): RegistrationStatus {
+  public getRegistrationStatus(): RegistrationStatusEnumType {
     return this?.bootNotificationResponse?.status;
   }
 
@@ -209,15 +209,15 @@ export default class ChargingStation {
   }
 
   public isInPendingState(): boolean {
-    return this?.bootNotificationResponse?.status === RegistrationStatus.PENDING;
+    return this?.bootNotificationResponse?.status === RegistrationStatusEnumType.PENDING;
   }
 
   public isInAcceptedState(): boolean {
-    return this?.bootNotificationResponse?.status === RegistrationStatus.ACCEPTED;
+    return this?.bootNotificationResponse?.status === RegistrationStatusEnumType.ACCEPTED;
   }
 
   public isInRejectedState(): boolean {
-    return this?.bootNotificationResponse?.status === RegistrationStatus.REJECTED;
+    return this?.bootNotificationResponse?.status === RegistrationStatusEnumType.REJECTED;
   }
 
   public isRegistered(): boolean {
@@ -994,9 +994,9 @@ export default class ChargingStation {
     }
     if (this.stationInfo?.autoRegister === true) {
       this.bootNotificationResponse = {
-        currentTime: new Date().toISOString(),
+        currentTime: new Date(),
         interval: this.getHeartbeatInterval() / 1000,
-        status: RegistrationStatus.ACCEPTED,
+        status: RegistrationStatusEnumType.ACCEPTED,
       };
     }
   }
index fd0dd7651f02a1e65fc5cbf00bed5e25634ce0ef..540ec4ffa36bfef0dccbdb45afc2a8ca1e6a0769 100644 (file)
@@ -13,7 +13,10 @@ import {
   Voltage,
 } from '../types/ChargingStationTemplate';
 import { ChargingProfileKindType, RecurrencyKindType } from '../types/ocpp/1.6/ChargingProfile';
+import type { OCPP16BootNotificationRequest } from '../types/ocpp/1.6/Requests';
+import { BootReasonEnumType, OCPP20BootNotificationRequest } from '../types/ocpp/2.0/Requests';
 import type { ChargingProfile, ChargingSchedulePeriod } from '../types/ocpp/ChargingProfile';
+import { OCPPVersion } from '../types/ocpp/OCPPVersion';
 import type { BootNotificationRequest } from '../types/ocpp/Requests';
 import { WorkerProcessType } from '../types/Worker';
 import Configuration from '../utils/Configuration';
@@ -132,27 +135,50 @@ export class ChargingStationUtils {
   public static createBootNotificationRequest(
     stationInfo: ChargingStationInfo
   ): BootNotificationRequest {
-    return {
-      chargePointModel: stationInfo.chargePointModel,
-      chargePointVendor: stationInfo.chargePointVendor,
-      ...(!Utils.isUndefined(stationInfo.chargeBoxSerialNumber) && {
-        chargeBoxSerialNumber: stationInfo.chargeBoxSerialNumber,
-      }),
-      ...(!Utils.isUndefined(stationInfo.chargePointSerialNumber) && {
-        chargePointSerialNumber: stationInfo.chargePointSerialNumber,
-      }),
-      ...(!Utils.isUndefined(stationInfo.firmwareVersion) && {
-        firmwareVersion: stationInfo.firmwareVersion,
-      }),
-      ...(!Utils.isUndefined(stationInfo.iccid) && { iccid: stationInfo.iccid }),
-      ...(!Utils.isUndefined(stationInfo.imsi) && { imsi: stationInfo.imsi }),
-      ...(!Utils.isUndefined(stationInfo.meterSerialNumber) && {
-        meterSerialNumber: stationInfo.meterSerialNumber,
-      }),
-      ...(!Utils.isUndefined(stationInfo.meterType) && {
-        meterType: stationInfo.meterType,
-      }),
-    };
+    const ocppVersion = stationInfo.ocppVersion ?? OCPPVersion.VERSION_16;
+    switch (ocppVersion) {
+      case OCPPVersion.VERSION_16:
+        return {
+          chargePointModel: stationInfo.chargePointModel,
+          chargePointVendor: stationInfo.chargePointVendor,
+          ...(!Utils.isUndefined(stationInfo.chargeBoxSerialNumber) && {
+            chargeBoxSerialNumber: stationInfo.chargeBoxSerialNumber,
+          }),
+          ...(!Utils.isUndefined(stationInfo.chargePointSerialNumber) && {
+            chargePointSerialNumber: stationInfo.chargePointSerialNumber,
+          }),
+          ...(!Utils.isUndefined(stationInfo.firmwareVersion) && {
+            firmwareVersion: stationInfo.firmwareVersion,
+          }),
+          ...(!Utils.isUndefined(stationInfo.iccid) && { iccid: stationInfo.iccid }),
+          ...(!Utils.isUndefined(stationInfo.imsi) && { imsi: stationInfo.imsi }),
+          ...(!Utils.isUndefined(stationInfo.meterSerialNumber) && {
+            meterSerialNumber: stationInfo.meterSerialNumber,
+          }),
+          ...(!Utils.isUndefined(stationInfo.meterType) && {
+            meterType: stationInfo.meterType,
+          }),
+        } as OCPP16BootNotificationRequest;
+      case OCPPVersion.VERSION_20:
+      case OCPPVersion.VERSION_201:
+        return {
+          reason: BootReasonEnumType.PowerUp,
+          chargingStation: {
+            model: stationInfo.chargePointModel,
+            vendorName: stationInfo.chargePointVendor,
+            ...(!Utils.isUndefined(stationInfo.firmwareVersion) && {
+              firmwareVersion: stationInfo.firmwareVersion,
+            }),
+            ...(!Utils.isUndefined(stationInfo.chargeBoxSerialNumber) && {
+              serialNumber: stationInfo.chargeBoxSerialNumber,
+            }),
+            modem: {
+              ...(!Utils.isUndefined(stationInfo.iccid) && { iccid: stationInfo.iccid }),
+              ...(!Utils.isUndefined(stationInfo.imsi) && { imsi: stationInfo.imsi }),
+            },
+          },
+        } as OCPP20BootNotificationRequest;
+    }
   }
 
   public static workerPoolInUse(): boolean {
index 63b261d5db5b7a857686c63ce95f7ed47917f067..7c9883bd4277995e3abce9386327583b4479d09e 100644 (file)
@@ -15,7 +15,7 @@ import {
   DataTransferStatus,
   type HeartbeatResponse,
   type MeterValuesResponse,
-  RegistrationStatus,
+  RegistrationStatusEnumType,
   type StatusNotificationResponse,
 } from '../types/ocpp/Responses';
 import {
@@ -324,7 +324,7 @@ export default class ChargingStationWorkerBroadcastChannel extends WorkerBroadca
         }
         return ResponseStatus.FAILURE;
       case BroadcastChannelProcedureName.BOOT_NOTIFICATION:
-        if (commandResponse?.status === RegistrationStatus.ACCEPTED) {
+        if (commandResponse?.status === RegistrationStatusEnumType.ACCEPTED) {
           return ResponseStatus.SUCCESS;
         }
         return ResponseStatus.FAILURE;
index 420edf86b5e5f1af369b354e6540eb178716e9ca..7b6fe220b7a00aaa21a3c612e02fc493dfef3cc6 100644 (file)
@@ -73,6 +73,7 @@ import {
 } from '../../../types/ocpp/1.6/Transaction';
 import type { OCPPConfigurationKey } from '../../../types/ocpp/Configuration';
 import { ErrorType } from '../../../types/ocpp/ErrorType';
+import { OCPPVersion } from '../../../types/ocpp/OCPPVersion';
 import type { IncomingRequestHandler } from '../../../types/ocpp/Requests';
 import type { DefaultResponse } from '../../../types/ocpp/Responses';
 import Constants from '../../../utils/Constants';
@@ -94,7 +95,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
     if (new.target?.name === moduleName) {
       throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
     }
-    super();
+    super(OCPPVersion.VERSION_16);
     this.incomingRequestHandlers = new Map<OCPP16IncomingRequestCommand, IncomingRequestHandler>([
       [OCPP16IncomingRequestCommand.RESET, this.handleRequestReset.bind(this)],
       [OCPP16IncomingRequestCommand.CLEAR_CACHE, this.handleRequestClearCache.bind(this)],
index dce1e44a87a5ad636b4d415820f7aa55bde59f56..cf5ff237cb2e24b93dcbe5e1258ef2cd71862ae1 100644 (file)
@@ -23,6 +23,7 @@ import type {
   OCPP16StopTransactionRequest,
 } from '../../../types/ocpp/1.6/Transaction';
 import { ErrorType } from '../../../types/ocpp/ErrorType';
+import { OCPPVersion } from '../../../types/ocpp/OCPPVersion';
 import type { RequestParams } from '../../../types/ocpp/Requests';
 import Constants from '../../../utils/Constants';
 import logger from '../../../utils/Logger';
@@ -41,7 +42,7 @@ export default class OCPP16RequestService extends OCPPRequestService {
     if (new.target?.name === moduleName) {
       throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
     }
-    super(ocppResponseService);
+    super(OCPPVersion.VERSION_16, ocppResponseService);
     this.jsonSchemas = new Map<OCPP16RequestCommand, JSONSchemaType<JsonObject>>([
       [
         OCPP16RequestCommand.AUTHORIZE,
index 49252cbb62527c3a218014ec52bd747dd91f4b48..7898ce6e1448d5ae4692839fb9488e737ba07516 100644 (file)
@@ -20,13 +20,12 @@ import {
   OCPP16RequestCommand,
   type OCPP16StatusNotificationRequest,
 } from '../../../types/ocpp/1.6/Requests';
-import {
-  type DiagnosticsStatusNotificationResponse,
-  type OCPP16BootNotificationResponse,
-  type OCPP16DataTransferResponse,
-  type OCPP16HeartbeatResponse,
-  OCPP16RegistrationStatus,
-  type OCPP16StatusNotificationResponse,
+import type {
+  DiagnosticsStatusNotificationResponse,
+  OCPP16BootNotificationResponse,
+  OCPP16DataTransferResponse,
+  OCPP16HeartbeatResponse,
+  OCPP16StatusNotificationResponse,
 } from '../../../types/ocpp/1.6/Responses';
 import {
   OCPP16AuthorizationStatus,
@@ -38,7 +37,8 @@ import {
   type OCPP16StopTransactionResponse,
 } from '../../../types/ocpp/1.6/Transaction';
 import { ErrorType } from '../../../types/ocpp/ErrorType';
-import type { ResponseHandler } from '../../../types/ocpp/Responses';
+import { OCPPVersion } from '../../../types/ocpp/OCPPVersion';
+import { RegistrationStatusEnumType, type ResponseHandler } from '../../../types/ocpp/Responses';
 import Constants from '../../../utils/Constants';
 import logger from '../../../utils/Logger';
 import Utils from '../../../utils/Utils';
@@ -57,7 +57,7 @@ export default class OCPP16ResponseService extends OCPPResponseService {
     if (new.target?.name === moduleName) {
       throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
     }
-    super();
+    super(OCPPVersion.VERSION_16);
     this.responseHandlers = new Map<OCPP16RequestCommand, ResponseHandler>([
       [OCPP16RequestCommand.BOOT_NOTIFICATION, this.handleResponseBootNotification.bind(this)],
       [OCPP16RequestCommand.HEARTBEAT, this.emptyResponseHandler.bind(this)],
@@ -256,7 +256,7 @@ export default class OCPP16ResponseService extends OCPPResponseService {
     chargingStation: ChargingStation,
     payload: OCPP16BootNotificationResponse
   ): void {
-    if (payload.status === OCPP16RegistrationStatus.ACCEPTED) {
+    if (payload.status === RegistrationStatusEnumType.ACCEPTED) {
       ChargingStationConfigurationUtils.addConfigurationKey(
         chargingStation,
         OCPP16StandardParametersKey.HeartbeatInterval,
@@ -275,11 +275,11 @@ export default class OCPP16ResponseService extends OCPPResponseService {
         ? chargingStation.restartHeartbeat()
         : chargingStation.startHeartbeat();
     }
-    if (Object.values(OCPP16RegistrationStatus).includes(payload.status)) {
+    if (Object.values(RegistrationStatusEnumType).includes(payload.status)) {
       const logMsg = `${chargingStation.logPrefix()} Charging station in '${
         payload.status
       }' state on the central server`;
-      payload.status === OCPP16RegistrationStatus.REJECTED
+      payload.status === RegistrationStatusEnumType.REJECTED
         ? logger.warn(logMsg)
         : logger.info(logMsg);
     } else {
index 04715d5a3e4af77bc637971bc41b8d61bd0ad66f..9d352181629e30cb3a59614cf5b4f8dc4e391bb1 100644 (file)
@@ -1,14 +1,25 @@
 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
 
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
 import type { JSONSchemaType } from 'ajv';
 
 import OCPPError from '../../../exception/OCPPError';
 import type { JsonObject, JsonType } from '../../../types/JsonType';
-import type { OCPP20IncomingRequestCommand } from '../../../types/ocpp/2.0/Requests';
+import {
+  OCPP20ClearCacheRequest,
+  OCPP20IncomingRequestCommand,
+} from '../../../types/ocpp/2.0/Requests';
+import type { OCPP20ClearCacheResponse } from '../../../types/ocpp/2.0/Responses';
 import { ErrorType } from '../../../types/ocpp/ErrorType';
+import { OCPPVersion } from '../../../types/ocpp/OCPPVersion';
 import type { IncomingRequestHandler } from '../../../types/ocpp/Requests';
+import Constants from '../../../utils/Constants';
 import logger from '../../../utils/Logger';
 import type ChargingStation from '../../ChargingStation';
+import { ChargingStationUtils } from '../../ChargingStationUtils';
 import OCPPIncomingRequestService from '../OCPPIncomingRequestService';
 import { OCPP20ServiceUtils } from './OCPP20ServiceUtils';
 
@@ -22,9 +33,24 @@ export default class OCPP20IncomingRequestService extends OCPPIncomingRequestSer
     if (new.target?.name === moduleName) {
       throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
     }
-    super();
-    this.incomingRequestHandlers = new Map<OCPP20IncomingRequestCommand, IncomingRequestHandler>();
-    this.jsonSchemas = new Map<OCPP20IncomingRequestCommand, JSONSchemaType<JsonObject>>();
+    super(OCPPVersion.VERSION_20);
+    this.incomingRequestHandlers = new Map<OCPP20IncomingRequestCommand, IncomingRequestHandler>([
+      [OCPP20IncomingRequestCommand.CLEAR_CACHE, this.handleRequestClearCache.bind(this)],
+    ]);
+    this.jsonSchemas = new Map<OCPP20IncomingRequestCommand, JSONSchemaType<JsonObject>>([
+      [
+        OCPP20IncomingRequestCommand.CLEAR_CACHE,
+        JSON.parse(
+          fs.readFileSync(
+            path.resolve(
+              path.dirname(fileURLToPath(import.meta.url)),
+              '../../../assets/json-schemas/ocpp/2.0/ClearCacheRequest.json'
+            ),
+            'utf8'
+          )
+        ) as JSONSchemaType<OCPP20ClearCacheRequest>,
+      ],
+    ]);
     this.validatePayload.bind(this);
   }
 
@@ -128,4 +154,11 @@ export default class OCPP20IncomingRequestService extends OCPPIncomingRequestSer
     );
     return false;
   }
+
+  private handleRequestClearCache(chargingStation: ChargingStation): OCPP20ClearCacheResponse {
+    chargingStation.authorizedTagsCache.deleteAuthorizedTags(
+      ChargingStationUtils.getAuthorizationFile(chargingStation.stationInfo)
+    );
+    return Constants.OCPP_RESPONSE_ACCEPTED;
+  }
 }
index 3b1e269556338a958568f2d4e16217a756716ddb..ac22e9fbc23c9fe2684bfb2b7bae6b45b009d6c4 100644 (file)
@@ -1,11 +1,20 @@
 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
 
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
 import type { JSONSchemaType } from 'ajv';
 
 import OCPPError from '../../../exception/OCPPError';
 import type { JsonObject, JsonType } from '../../../types/JsonType';
-import type { OCPP20RequestCommand } from '../../../types/ocpp/2.0/Requests';
+import {
+  BootReasonEnumType,
+  OCPP20BootNotificationRequest,
+  OCPP20RequestCommand,
+} from '../../../types/ocpp/2.0/Requests';
 import { ErrorType } from '../../../types/ocpp/ErrorType';
+import { OCPPVersion } from '../../../types/ocpp/OCPPVersion';
 import type { RequestParams } from '../../../types/ocpp/Requests';
 import logger from '../../../utils/Logger';
 import Utils from '../../../utils/Utils';
@@ -23,8 +32,21 @@ export default class OCPP20RequestService extends OCPPRequestService {
     if (new.target?.name === moduleName) {
       throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
     }
-    super(ocppResponseService);
-    this.jsonSchemas = new Map<OCPP20RequestCommand, JSONSchemaType<JsonObject>>();
+    super(OCPPVersion.VERSION_20, ocppResponseService);
+    this.jsonSchemas = new Map<OCPP20RequestCommand, JSONSchemaType<JsonObject>>([
+      [
+        OCPP20RequestCommand.BOOT_NOTIFICATION,
+        JSON.parse(
+          fs.readFileSync(
+            path.resolve(
+              path.dirname(fileURLToPath(import.meta.url)),
+              '../../../assets/json-schemas/ocpp/2.0/BootNotificationRequest.json'
+            ),
+            'utf8'
+          )
+        ) as JSONSchemaType<OCPP20BootNotificationRequest>,
+      ],
+    ]);
     this.buildRequestPayload.bind(this);
     this.validatePayload.bind(this);
   }
@@ -66,6 +88,29 @@ export default class OCPP20RequestService extends OCPPRequestService {
   ): Request {
     commandParams = commandParams as JsonObject;
     switch (commandName) {
+      case OCPP20RequestCommand.BOOT_NOTIFICATION:
+        commandParams.modem = commandParams.modem as JsonObject;
+        return {
+          reason: commandParams?.reason,
+          chargingStation: {
+            model: commandParams?.model,
+            vendorName: commandParams?.vendorName,
+            ...(!Utils.isUndefined(commandParams?.firmwareVersion) && {
+              firmwareVersion: commandParams.firmwareVersion,
+            }),
+            ...(!Utils.isUndefined(commandParams?.serialNumber) && {
+              serialNumber: commandParams.serialNumber,
+            }),
+            modem: {
+              ...(!Utils.isUndefined(commandParams?.modem?.iccid) && {
+                iccid: commandParams.modem.iccid,
+              }),
+              ...(!Utils.isUndefined(commandParams?.modem?.imsi) && {
+                imsi: commandParams.modem.imsi,
+              }),
+            },
+          },
+        } as unknown as Request;
       default:
         // OCPPError usage here is debatable: it's an error in the OCPP stack but not targeted to sendError().
         throw new OCPPError(
index a48a11c0b8bfcc47b3c0ec04bb8e0b9fb41b724d..d4636f6f3ca25319ef5ad020bd4b29425733e0d8 100644 (file)
@@ -1,12 +1,18 @@
 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
 
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
 import type { JSONSchemaType } from 'ajv';
 
 import OCPPError from '../../../exception/OCPPError';
 import type { JsonObject, JsonType } from '../../../types/JsonType';
-import type { OCPP20RequestCommand } from '../../../types/ocpp/2.0/Requests';
+import { OCPP20RequestCommand } from '../../../types/ocpp/2.0/Requests';
+import type { OCPP20BootNotificationResponse } from '../../../types/ocpp/2.0/Responses';
 import { ErrorType } from '../../../types/ocpp/ErrorType';
-import type { ResponseHandler } from '../../../types/ocpp/Responses';
+import { OCPPVersion } from '../../../types/ocpp/OCPPVersion';
+import { RegistrationStatusEnumType, ResponseHandler } from '../../../types/ocpp/Responses';
 import logger from '../../../utils/Logger';
 import type ChargingStation from '../../ChargingStation';
 import OCPPResponseService from '../OCPPResponseService';
@@ -22,9 +28,24 @@ export default class OCPP20ResponseService extends OCPPResponseService {
     if (new.target?.name === moduleName) {
       throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
     }
-    super();
-    this.responseHandlers = new Map<OCPP20RequestCommand, ResponseHandler>();
-    this.jsonSchemas = new Map<OCPP20RequestCommand, JSONSchemaType<JsonObject>>();
+    super(OCPPVersion.VERSION_20);
+    this.responseHandlers = new Map<OCPP20RequestCommand, ResponseHandler>([
+      [OCPP20RequestCommand.BOOT_NOTIFICATION, this.handleResponseBootNotification.bind(this)],
+    ]);
+    this.jsonSchemas = new Map<OCPP20RequestCommand, JSONSchemaType<JsonObject>>([
+      [
+        OCPP20RequestCommand.BOOT_NOTIFICATION,
+        JSON.parse(
+          fs.readFileSync(
+            path.resolve(
+              path.dirname(fileURLToPath(import.meta.url)),
+              '../../../assets/json-schemas/ocpp/2.0/BootNotificationResponse.json'
+            ),
+            'utf8'
+          )
+        ) as JSONSchemaType<OCPP20BootNotificationResponse>,
+      ],
+    ]);
     this.validatePayload.bind(this);
   }
 
@@ -35,8 +56,8 @@ export default class OCPP20ResponseService extends OCPPResponseService {
     requestPayload: JsonType
   ): Promise<void> {
     if (
-      chargingStation.isRegistered() === true /* ||
-      commandName === OCPP20RequestCommand.BOOT_NOTIFICATION */
+      chargingStation.isRegistered() === true ||
+      commandName === OCPP20RequestCommand.BOOT_NOTIFICATION
     ) {
       if (
         this.responseHandlers.has(commandName) === true &&
@@ -97,4 +118,43 @@ export default class OCPP20ResponseService extends OCPPResponseService {
     );
     return false;
   }
+
+  private handleResponseBootNotification(
+    chargingStation: ChargingStation,
+    payload: OCPP20BootNotificationResponse
+  ): void {
+    if (payload.status === RegistrationStatusEnumType.ACCEPTED) {
+      // ChargingStationConfigurationUtils.addConfigurationKey(
+      //   chargingStation,
+      //   OCPP16StandardParametersKey.HeartbeatInterval,
+      //   payload.interval.toString(),
+      //   {},
+      //   { overwrite: true, save: true }
+      // );
+      // ChargingStationConfigurationUtils.addConfigurationKey(
+      //   chargingStation,
+      //   OCPP16StandardParametersKey.HeartBeatInterval,
+      //   payload.interval.toString(),
+      //   { visible: false },
+      //   { overwrite: true, save: true }
+      // );
+      chargingStation.heartbeatSetInterval
+        ? chargingStation.restartHeartbeat()
+        : chargingStation.startHeartbeat();
+    }
+    if (Object.values(RegistrationStatusEnumType).includes(payload.status)) {
+      const logMsg = `${chargingStation.logPrefix()} Charging station in '${
+        payload.status
+      }' state on the central server`;
+      payload.status === RegistrationStatusEnumType.REJECTED
+        ? logger.warn(logMsg)
+        : logger.info(logMsg);
+    } else {
+      logger.error(
+        chargingStation.logPrefix() +
+          ' Charging station boot notification response received: %j with undefined registration status',
+        payload
+      );
+    }
+  }
 }
index 3f4cb29492ac41bce26ec0b46ffb02ac9f6cdc45..ef64350812b49f897087a832040d494bf652b8a3 100644 (file)
@@ -1,12 +1,13 @@
 import { AsyncResource } from 'async_hooks';
 
-import type { JSONSchemaType } from 'ajv';
-import Ajv from 'ajv-draft-04';
+import Ajv, { type JSONSchemaType } from 'ajv';
+import AjvDraft04 from 'ajv-draft-04';
 import ajvFormats from 'ajv-formats';
 
 import OCPPError from '../../exception/OCPPError';
 import type { HandleErrorParams } from '../../types/Error';
 import type { JsonType } from '../../types/JsonType';
+import { OCPPVersion } from '../../types/ocpp/OCPPVersion';
 import type { IncomingRequestCommand } from '../../types/ocpp/Requests';
 import logger from '../../utils/Logger';
 import type ChargingStation from '../ChargingStation';
@@ -17,12 +18,22 @@ const moduleName = 'OCPPIncomingRequestService';
 export default abstract class OCPPIncomingRequestService {
   private static instance: OCPPIncomingRequestService | null = null;
   protected asyncResource: AsyncResource;
+  private readonly version: OCPPVersion;
   private readonly ajv: Ajv;
 
-  protected constructor() {
-    this.asyncResource = new AsyncResource(moduleName);
-    this.ajv = new Ajv();
+  protected constructor(version: OCPPVersion) {
+    this.version = version;
+    switch (this.version) {
+      case OCPPVersion.VERSION_16:
+        this.ajv = new AjvDraft04();
+        break;
+      case OCPPVersion.VERSION_20:
+      case OCPPVersion.VERSION_201:
+        this.ajv = new Ajv();
+        break;
+    }
     ajvFormats(this.ajv);
+    this.asyncResource = new AsyncResource(moduleName);
     this.incomingRequestHandler.bind(this);
     this.validateIncomingRequestPayload.bind(this);
   }
index 125baf4073366623f05c67797d6e375ef532f148..c9f100d48f2af32a9a4277e4671ea756efb045b3 100644 (file)
@@ -1,5 +1,5 @@
-import type { JSONSchemaType } from 'ajv';
-import Ajv from 'ajv-draft-04';
+import Ajv, { type JSONSchemaType } from 'ajv';
+import AjvDraft04 from 'ajv-draft-04';
 import ajvFormats from 'ajv-formats';
 
 import OCPPError from '../../exception/OCPPError';
@@ -9,6 +9,7 @@ import type { HandleErrorParams } from '../../types/Error';
 import type { JsonObject, JsonType } from '../../types/JsonType';
 import { ErrorType } from '../../types/ocpp/ErrorType';
 import { MessageType } from '../../types/ocpp/MessageType';
+import { OCPPVersion } from '../../types/ocpp/OCPPVersion';
 import {
   type ErrorCallback,
   type IncomingRequestCommand,
@@ -30,14 +31,24 @@ const moduleName = 'OCPPRequestService';
 
 export default abstract class OCPPRequestService {
   private static instance: OCPPRequestService | null = null;
+  private readonly version: OCPPVersion;
   private readonly ajv: Ajv;
 
   private readonly ocppResponseService: OCPPResponseService;
 
-  protected constructor(ocppResponseService: OCPPResponseService) {
-    this.ocppResponseService = ocppResponseService;
-    this.ajv = new Ajv();
+  protected constructor(version: OCPPVersion, ocppResponseService: OCPPResponseService) {
+    this.version = version;
+    switch (this.version) {
+      case OCPPVersion.VERSION_16:
+        this.ajv = new AjvDraft04();
+        break;
+      case OCPPVersion.VERSION_20:
+      case OCPPVersion.VERSION_201:
+        this.ajv = new Ajv();
+        break;
+    }
     ajvFormats(this.ajv);
+    this.ocppResponseService = ocppResponseService;
     this.requestHandler.bind(this);
     this.sendMessage.bind(this);
     this.sendResponse.bind(this);
index 3f69655ec82dfaa573bb04b269e244c45c3a4102..e5767be194dc23ab2c4fef567b63577bb9127e34 100644 (file)
@@ -1,9 +1,10 @@
-import type { JSONSchemaType } from 'ajv';
-import Ajv from 'ajv-draft-04';
+import Ajv, { type JSONSchemaType } from 'ajv';
+import AjvDraft04 from 'ajv-draft-04';
 import ajvFormats from 'ajv-formats';
 
 import OCPPError from '../../exception/OCPPError';
 import type { JsonType } from '../../types/JsonType';
+import { OCPPVersion } from '../../types/ocpp/OCPPVersion';
 import type { RequestCommand } from '../../types/ocpp/Requests';
 import logger from '../../utils/Logger';
 import type ChargingStation from '../ChargingStation';
@@ -13,10 +14,20 @@ const moduleName = 'OCPPResponseService';
 
 export default abstract class OCPPResponseService {
   private static instance: OCPPResponseService | null = null;
+  private readonly version: OCPPVersion;
   private readonly ajv: Ajv;
 
-  protected constructor() {
-    this.ajv = new Ajv();
+  protected constructor(version: OCPPVersion) {
+    this.version = version;
+    switch (this.version) {
+      case OCPPVersion.VERSION_16:
+        this.ajv = new AjvDraft04();
+        break;
+      case OCPPVersion.VERSION_20:
+      case OCPPVersion.VERSION_201:
+        this.ajv = new Ajv();
+        break;
+    }
     ajvFormats(this.ajv);
     this.responseHandler.bind(this);
     this.validateResponsePayload.bind(this);
index 1dbcfba8ffe670ceeccc0ce8218fdb35161879fd..1ccd78e2fa0acbf39b8b586999675dbcc1fc0585 100644 (file)
@@ -1,9 +1,10 @@
 import type { EmptyObject } from '../../EmptyObject';
 import type { JsonObject } from '../../JsonType';
 import type { OCPPConfigurationKey } from '../Configuration';
+import type { RegistrationStatusEnumType } from '../Responses';
 
 export interface OCPP16HeartbeatResponse extends JsonObject {
-  currentTime: string;
+  currentTime: Date;
 }
 
 export enum OCPP16UnlockStatus {
@@ -27,15 +28,9 @@ export interface ChangeConfigurationResponse extends JsonObject {
   status: OCPP16ConfigurationStatus;
 }
 
-export enum OCPP16RegistrationStatus {
-  ACCEPTED = 'Accepted',
-  PENDING = 'Pending',
-  REJECTED = 'Rejected',
-}
-
 export interface OCPP16BootNotificationResponse extends JsonObject {
-  status: OCPP16RegistrationStatus;
-  currentTime: string;
+  status: RegistrationStatusEnumType;
+  currentTime: Date;
   interval: number;
 }
 
index 04c6c91da2733dbfab51270bed5acb03b56440ca..00826ab2204f34f93cdd6ca91e7cce9343104257 100644 (file)
@@ -1,3 +1,43 @@
-export enum OCPP20RequestCommand {}
+import type { EmptyObject } from '../../EmptyObject';
+import type { JsonObject } from '../../JsonType';
 
-export enum OCPP20IncomingRequestCommand {}
+export enum OCPP20RequestCommand {
+  BOOT_NOTIFICATION = 'BootNotification',
+  HEARTBEAT = 'Heartbeat',
+}
+
+export enum OCPP20IncomingRequestCommand {
+  CLEAR_CACHE = 'ClearCache',
+}
+
+export enum BootReasonEnumType {
+  ApplicationReset = 'ApplicationReset',
+  FirmwareUpdate = 'FirmwareUpdate',
+  LocalReset = 'LocalReset',
+  PowerUp = 'PowerUp',
+  RemoteReset = 'RemoteReset',
+  ScheduledReset = 'ScheduledReset',
+  Triggered = 'Triggered',
+  Unknown = 'Unknown',
+  Watchdog = 'Watchdog',
+}
+
+export type ModemType = {
+  iccid?: string;
+  imsi?: string;
+} & JsonObject;
+
+export type ChargingStationType = {
+  serialNumber?: string;
+  model: string;
+  vendorName: string;
+  firmwareVersion?: string;
+  modem?: ModemType;
+} & JsonObject;
+
+export type OCPP20BootNotificationRequest = {
+  reason: BootReasonEnumType;
+  chargingStation: ChargingStationType;
+} & JsonObject;
+
+export type OCPP20ClearCacheRequest = EmptyObject;
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8fdfe89bb69e62e996a68d013b49f45f988a5ad0 100644 (file)
@@ -0,0 +1,19 @@
+import type { JsonObject } from '../../JsonType';
+import type { DefaultStatus, RegistrationStatusEnumType } from '../Responses';
+
+export type StatusInfoType = {
+  reasonCode: string;
+  additionalInfo?: string;
+} & JsonObject;
+
+export type OCPP20BootNotificationResponse = {
+  currentTime: Date;
+  status: RegistrationStatusEnumType;
+  interval: number;
+  statusInfo?: StatusInfoType;
+} & JsonObject;
+
+export type OCPP20ClearCacheResponse = {
+  status: DefaultStatus;
+  statusInfo?: StatusInfoType;
+} & JsonObject;
index 38596bfd4c611203d2999de8ad08c81aeb5ffb27..09e2b0cc5a7df446239c90839607c57f64262aab 100644 (file)
@@ -13,7 +13,11 @@ import {
   OCPP16RequestCommand,
   type OCPP16StatusNotificationRequest,
 } from './1.6/Requests';
-import { OCPP20IncomingRequestCommand, OCPP20RequestCommand } from './2.0/Requests';
+import {
+  type OCPP20BootNotificationRequest,
+  OCPP20IncomingRequestCommand,
+  OCPP20RequestCommand,
+} from './2.0/Requests';
 import type { MessageType } from './MessageType';
 
 export const RequestCommand = {
@@ -53,7 +57,7 @@ export const MessageTrigger = {
 } as const;
 export type MessageTrigger = OCPP16MessageTrigger;
 
-export type BootNotificationRequest = OCPP16BootNotificationRequest;
+export type BootNotificationRequest = OCPP16BootNotificationRequest | OCPP20BootNotificationRequest;
 
 export type HeartbeatRequest = OCPP16HeartbeatRequest;
 
index 59884dfd208fc127d71068177b6423a45b95ccdd..35424a78f31945f9d198bf2f1be101d2a41738ac 100644 (file)
@@ -10,11 +10,11 @@ import {
   type OCPP16DataTransferResponse,
   OCPP16DataTransferStatus,
   type OCPP16HeartbeatResponse,
-  OCPP16RegistrationStatus,
   type OCPP16StatusNotificationResponse,
   OCPP16TriggerMessageStatus,
   OCPP16UnlockStatus,
 } from './1.6/Responses';
+import type { OCPP20BootNotificationResponse } from './2.0/Responses';
 import type { ErrorType } from './ErrorType';
 import type { MessageType } from './MessageType';
 
@@ -28,7 +28,9 @@ export type ResponseHandler = (
   requestPayload?: JsonType
 ) => void | Promise<void>;
 
-export type BootNotificationResponse = OCPP16BootNotificationResponse;
+export type BootNotificationResponse =
+  | OCPP16BootNotificationResponse
+  | OCPP20BootNotificationResponse;
 
 export type HeartbeatResponse = OCPP16HeartbeatResponse;
 
@@ -47,10 +49,11 @@ export type DefaultResponse = {
   status: DefaultStatus;
 };
 
-export const RegistrationStatus = {
-  ...OCPP16RegistrationStatus,
-} as const;
-export type RegistrationStatus = OCPP16RegistrationStatus;
+export enum RegistrationStatusEnumType {
+  ACCEPTED = 'Accepted',
+  PENDING = 'Pending',
+  REJECTED = 'Rejected',
+}
 
 export const AvailabilityStatus = {
   ...OCPP16AvailabilityStatus,
index 80499a9fc8bf1f8b1bcd4ecde7c2d92b2be6d304..2446839275a6f9f115d95be1e41e7a1ac6e54060 100644 (file)
@@ -117,7 +117,7 @@ export enum OCPP16RegistrationStatus {
 
 export interface OCPP16BootNotificationResponse extends JsonObject {
   status: OCPP16RegistrationStatus;
-  currentTime: string;
+  currentTime: Date;
   interval: number;
 }