Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter

- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
This commit is contained in:
Eric F
2026-06-08 00:38:27 -04:00
parent 468cfeaa50
commit d398a6ced2
7326 changed files with 1177561 additions and 7 deletions

View File

@@ -0,0 +1,58 @@
set(OCPP1_6_PROFILE_SCHEMAS_DIR "profile_schemas/")
set(USER_CONFIG_FILE "user_config/user_config.json")
set(CERTS_DIR "../certs/")
# find all migration files, store only the filenames by showing relative to the folder
set(MIGRATION_FILES_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/core_migrations")
include(../CollectMigrationFiles.cmake)
collect_migration_files(
LOCATION ${MIGRATION_FILES_LOCATION}
INSTALL_DESTINATION ${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP/core_migrations
)
set(OCPP1_6_CONFIG_DIR "${CMAKE_CURRENT_SOURCE_DIR}" PARENT_SCOPE)
set(MIGRATION_FILE_VERSION_V16 ${TARGET_MIGRATION_FILE_VERSION} PARENT_SCOPE)
set(MIGRATION_FILES_SOURCE_DIR_V16 ${MIGRATION_FILES_LOCATION} PARENT_SCOPE)
list(APPEND OCPP1_6_PROFILE_SCHEMAS
Config.json
Core.json
FirmwareManagement.json
Internal.json
LocalAuthListManagement.json
Reservation.json
SmartCharging.json
Security.json
PnC.json
CostAndPrice.json
)
list(TRANSFORM OCPP1_6_PROFILE_SCHEMAS
PREPEND ${OCPP1_6_PROFILE_SCHEMAS_DIR})
install(
FILES ${OCPP1_6_PROFILE_SCHEMAS}
DESTINATION ${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP/profile_schemas
)
list(APPEND CONFIGS
config.json
config-docker.json
config-full.json
config-docker-tls.json
../logging.ini
)
install(
FILES ${CONFIGS}
DESTINATION ${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP
)
if(EXISTS ${USER_CONFIG_FILE})
install(
FILES ${USER_CONFIG_FILE}
DESTINATION ${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP)
endif()

View File

@@ -0,0 +1,58 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:8443/steve/websocket/CentralSystemService/",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1"
},
"Core": {
"AuthorizeRemoteTxRequests": false,
"ClockAlignedDataInterval": 900,
"ConnectionTimeOut": 10,
"ConnectorPhaseRotation": "0.RST,1.RST",
"GetConfigurationMaxKeys": 100,
"HeartbeatInterval": 86400,
"LocalAuthorizeOffline": false,
"LocalPreAuthorize": false,
"MeterValuesAlignedData": "Energy.Active.Import.Register",
"MeterValuesSampledData": "Energy.Active.Import.Register",
"MeterValueSampleInterval": 0,
"NumberOfConnectors": 1,
"ResetRetries": 1,
"StopTransactionOnInvalidId": true,
"StopTxnAlignedData": "Energy.Active.Import.Register",
"StopTxnSampledData": "Energy.Active.Import.Register",
"SupportedFeatureProfiles": "Core,FirmwareManagement,Reservation,RemoteTrigger,LocalAuthListManagement,SmartCharging",
"TransactionMessageAttempts": 1,
"TransactionMessageRetryInterval": 10,
"UnlockConnectorOnEVSideDisconnect": true
},
"FirmwareManagement": {
"SupportedFileTransferProtocols": "FTP"
},
"Security": {
"AuthorizationKey": "AABBCCDDEEFFGGHH",
"SecurityProfile": 2
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
},
"PnC": {
"ISO15118CertificateManagementEnabled": true,
"ISO15118PnCEnabled": true,
"ContractValidationOffline": true
},
"Custom": {
"ExampleConfigurationKey": "example"
}
}

View File

@@ -0,0 +1,66 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:8180/steve/websocket/CentralSystemService/",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1",
"AllowChargingProfileWithoutStartSchedule": true,
"UseTPM" : false,
"LogMessagesFormat": ["html","security"]
},
"Core": {
"AuthorizeRemoteTxRequests": false,
"ClockAlignedDataInterval": 900,
"ConnectionTimeOut": 30,
"ConnectorPhaseRotation": "0.RST,1.RST",
"GetConfigurationMaxKeys": 100,
"HeartbeatInterval": 86400,
"LocalAuthorizeOffline": false,
"LocalPreAuthorize": false,
"MeterValuesAlignedData": "Energy.Active.Import.Register",
"MeterValuesSampledData": "Energy.Active.Import.Register,SoC",
"MeterValueSampleInterval": 60,
"NumberOfConnectors": 1,
"ResetRetries": 1,
"StopTransactionOnInvalidId": true,
"StopTxnAlignedData": "Energy.Active.Import.Register",
"StopTxnSampledData": "Energy.Active.Import.Register",
"SupportedFeatureProfiles": "Core,FirmwareManagement,RemoteTrigger,Reservation,LocalAuthListManagement,SmartCharging",
"TransactionMessageAttempts": 1,
"TransactionMessageRetryInterval": 10,
"UnlockConnectorOnEVSideDisconnect": true,
"WebSocketPingInterval": 10
},
"FirmwareManagement": {
"SupportedFileTransferProtocols": "FTP"
},
"Security": {
"CpoName": "Pionix",
"AuthorizationKey": "AABBCCDDEEFFGGHH",
"SecurityProfile": 1
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current,Power",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
},
"PnC": {
"ISO15118CertificateManagementEnabled": true,
"ISO15118PnCEnabled": true,
"ContractValidationOffline": true
},
"CostAndPrice": {
"CustomDisplayCostAndPrice": false
},
"Custom": {
"ExampleConfigurationKey": "example"
}
}

View File

@@ -0,0 +1,180 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:8180/steve/websocket/CentralSystemService/",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointSerialNumber": "cp001",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1",
"ICCID": "891004234814455936F",
"IMSI": "262 01 9876543210",
"MeterSerialNumber": "123-456-789",
"MeterType": "AC",
"SupportedCiphers12": [
"ECDHE-ECDSA-AES128-GCM-SHA256",
"ECDHE-ECDSA-AES256-GCM-SHA384",
"AES128-GCM-SHA256",
"AES256-GCM-SHA384"
],
"SupportedCiphers13": [
"TLS_AES_256_GCM_SHA384",
"TLS_AES_128_GCM_SHA256"
],
"UseTPM": false,
"RetryBackoffRandomRange": 10,
"RetryBackoffRepeatTimes": 3,
"RetryBackoffWaitMinimum": 3,
"AuthorizeConnectorZeroOnConnectorOne": true,
"LogMessages": true,
"LogMessagesFormat": [
"log",
"html",
"session_logging",
"security"
],
"LogRotation": false,
"LogRotationDateSuffix": false,
"LogRotationMaximumFileSize": 0,
"LogRotationMaximumFileCount": 0,
"SupportedChargingProfilePurposeTypes": [
"ChargePointMaxProfile",
"TxDefaultProfile",
"TxProfile"
],
"MaxCompositeScheduleDuration": 31536000,
"WebsocketPingPayload": "Hello from EVerest!",
"WebsocketPongTimeout": 5,
"UseSslDefaultVerifyPaths": true,
"VerifyCsmsCommonName": true,
"VerifyCsmsAllowWildcards": true,
"OcspRequestInterval": 604800,
"SeccLeafSubjectCommonName": "DEPNX100001",
"SeccLeafSubjectCountry": "DE",
"SeccLeafSubjectOrganization": "Pionix",
"ConnectorEvseIds": "DE*PNX*100001,DE*PNX*100002",
"AllowChargingProfileWithoutStartSchedule": false,
"WaitForStopTransactionsOnResetTimeout": 60,
"QueueAllMessages": true,
"MessageTypesDiscardForQueueing": "Heartbeat",
"MessageQueueSizeThreshold": 5000,
"SupportedMeasurands": "Energy.Active.Import.Register,Energy.Active.Export.Register,Power.Active.Import,Voltage,Current.Import,Frequency,Current.Offered,Power.Offered,SoC",
"MaxMessageSize": 65000,
"TLSKeylogFile": "/tmp/ocpp_tls_keylog.txt",
"EnableTLSKeylog": false
},
"Core": {
"AllowOfflineTxForUnknownId": true,
"AuthorizationCacheEnabled": true,
"AuthorizeRemoteTxRequests": true,
"BlinkRepeat": 0,
"ClockAlignedDataInterval": 900,
"ConnectionTimeOut": 120,
"ConnectorPhaseRotation": "RST0.RST,1.RST,2.RTS",
"ConnectorPhaseRotationMaxLength": 100,
"GetConfigurationMaxKeys": 1024,
"HeartbeatInterval": 900,
"LightIntensity": 0,
"LocalAuthorizeOffline": true,
"LocalPreAuthorize": true,
"MaxEnergyOnInvalidId": 500,
"MeterValuesAlignedData": "Energy.Active.Import.Register",
"MeterValuesAlignedDataMaxLength": 1024,
"MeterValuesSampledData": "Energy.Active.Import.Register",
"MeterValuesSampledDataMaxLength": 1024,
"MeterValueSampleInterval": 300,
"MinimumStatusDuration": 1,
"NumberOfConnectors": 2,
"ResetRetries": 1,
"StopTransactionOnEVSideDisconnect": true,
"StopTransactionOnInvalidId": true,
"StopTxnAlignedData": "Energy.Active.Import.Register",
"StopTxnAlignedDataMaxLength": 1024,
"StopTxnSampledData": "Energy.Active.Import.Register",
"StopTxnSampledDataMaxLength": 1024,
"SupportedFeatureProfiles": "Core,FirmwareManagement,RemoteTrigger,Reservation,LocalAuthListManagement,SmartCharging",
"SupportedFeatureProfilesMaxLength": 1024,
"TransactionMessageAttempts": 1,
"TransactionMessageRetryInterval": 10,
"UnlockConnectorOnEVSideDisconnect": true,
"WebSocketPingInterval": 10
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 1024,
"SendLocalListMaxLength": 1024
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 1000,
"ChargingScheduleAllowedChargingRateUnit": "Current,Power",
"ChargingScheduleMaxPeriods": 1000,
"ConnectorSwitch3to1PhaseSupported": true,
"MaxChargingProfilesInstalled": 1000
},
"FirmwareManagement": {
"SupportedFileTransferProtocols": "FTP"
},
"Reservation": {
"ReserveConnectorZeroSupported": false
},
"Security": {
"AdditionalRootCertificateCheck": false,
"AuthorizationKey": "DEADBEEFDEADBEEF",
"CertificateSignedMaxChainSize": 10000,
"CertificateStoreMaxLength": 1000,
"CpoName": "Pionix",
"SecurityProfile": 1,
"DisableSecurityEventNotifications": false
},
"PnC": {
"ISO15118CertificateManagementEnabled": true,
"ISO15118PnCEnabled": true,
"CentralContractValidationAllowed": true,
"CertSigningWaitMinimum": 30,
"CertSigningRepeatTimes": 2,
"ContractValidationOffline": true
},
"CostAndPrice": {
"CustomDisplayCostAndPrice": true,
"NumberOfDecimalsForCostValues": 4,
"DefaultPrice":
{
"priceText": "This is the price",
"priceTextOffline": "Show this price text when offline!",
"chargingPrice":
{
"kWhPrice": 3.14,
"hourPrice": 0.42
}
},
"DefaultPriceText":
{
"priceTexts":
[
{
"priceText": "This is the price",
"priceTextOffline": "Show this price text when offline!",
"language": "en"
},
{
"priceText": "Dit is de prijs",
"priceTextOffline": "Laat dit zien wanneer de charging station offline is!",
"language": "nl"
},
{
"priceText": "Dette er prisen",
"priceTextOffline": "Vis denne pristeksten når du er frakoblet",
"language": "nb_NO"
}
]
},
"TimeOffset": "02:00",
"NextTimeOffsetTransitionDateTime": "2024-01-01T00:00:00",
"TimeOffsetNextTransition": "01:00",
"CustomIdleFeeAfterStop": false,
"SupportedLanguages": "en, nl, de, nb_NO",
"CustomMultiLanguageMessages": true,
"Language": "en",
"WaitForSetUserPriceTimeout": 5000
}
}

View File

@@ -0,0 +1,59 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:8180/steve/websocket/CentralSystemService/",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1",
"LogMessagesFormat": []
},
"Core": {
"AuthorizeRemoteTxRequests": false,
"ClockAlignedDataInterval": 900,
"ConnectionTimeOut": 10,
"ConnectorPhaseRotation": "0.RST,1.RST",
"GetConfigurationMaxKeys": 100,
"HeartbeatInterval": 86400,
"LocalAuthorizeOffline": false,
"LocalPreAuthorize": false,
"MeterValuesAlignedData": "Energy.Active.Import.Register",
"MeterValuesSampledData": "Energy.Active.Import.Register",
"MeterValueSampleInterval": 0,
"NumberOfConnectors": 1,
"ResetRetries": 1,
"StopTransactionOnEVSideDisconnect": true,
"StopTransactionOnInvalidId": true,
"StopTxnAlignedData": "Energy.Active.Import.Register",
"StopTxnSampledData": "Energy.Active.Import.Register",
"SupportedFeatureProfiles": "Core,FirmwareManagement,RemoteTrigger,Reservation,LocalAuthListManagement,SmartCharging",
"TransactionMessageAttempts": 1,
"TransactionMessageRetryInterval": 10,
"UnlockConnectorOnEVSideDisconnect": true
},
"FirmwareManagement": {
"SupportedFileTransferProtocols": "FTP"
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
},
"Security": {
"SecurityProfile": 0
},
"PnC": {
"ISO15118CertificateManagementEnabled": true,
"ISO15118PnCEnabled": true,
"ContractValidationOffline": true
},
"CostAndPrice": {
"CustomDisplayCostAndPrice": false
}
}

View File

@@ -0,0 +1,61 @@
PRAGMA foreign_keys = ON;
CREATE TABLE CONNECTORS (
ID INT PRIMARY KEY NOT NULL,
AVAILABILITY TEXT
);
CREATE TABLE AUTH_CACHE (
ID_TAG TEXT PRIMARY KEY NOT NULL,
AUTH_STATUS TEXT NOT NULL,
EXPIRY_DATE TEXT,
PARENT_ID_TAG TEXT
);
CREATE TABLE AUTH_LIST_VERSION (
ID INT PRIMARY KEY NOT NULL,
VERSION INT
);
CREATE TABLE AUTH_LIST (
ID_TAG TEXT PRIMARY KEY NOT NULL,
AUTH_STATUS TEXT NOT NULL,
EXPIRY_DATE TEXT,
PARENT_ID_TAG TEXT
);
CREATE TABLE TRANSACTIONS (
ID INT PRIMARY KEY NOT NULL,
TRANSACTION_ID INT,
CONNECTOR INT NOT NULL,
ID_TAG_START TEXT NOT NULL,
TIME_START TEXT NOT NULL,
METER_START INT NOT NULL,
CSMS_ACK INT NOT NULL,
METER_LAST INT NOT NULL,
METER_LAST_TIME TEXT NOT NULL,
LAST_UPDATE TEXT NOT NULL,
RESERVATION_ID INT,
PARENT_ID_TAG TEXT,
ID_TAG_END TEXT,
TIME_END TEXT,
METER_STOP INT,
STOP_REASON TEXT,
FOREIGN KEY(CONNECTOR) REFERENCES CONNECTORS(ID)
);
INSERT
OR IGNORE INTO AUTH_LIST_VERSION (ID, VERSION)
VALUES (0, 0);
CREATE TABLE CHARGING_PROFILES (
ID INT PRIMARY KEY NOT NULL,
CONNECTOR_ID INT NOT NULL,
PROFILE TEXT NOT NULL
);
CREATE TABLE OCSP_REQUEST (
LAST_UPDATE TEXT PRIMARY KEY NOT NULL
);
CREATE TABLE TRANSACTION_QUEUE(
UNIQUE_ID TEXT PRIMARY KEY NOT NULL,
MESSAGE TEXT NOT NULL,
MESSAGE_TYPE TEXT NOT NULL,
MESSAGE_ATTEMPTS INT NOT NULL,
MESSAGE_TIMESTAMP TEXT NOT NULL
);

View File

@@ -0,0 +1,2 @@
ALTER TABLE TRANSACTIONS DROP COLUMN START_TRANSACTION_MESSAGE_ID;
ALTER TABLE TRANSACTIONS DROP COLUMN STOP_TRANSACTION_MESSAGE_ID;

View File

@@ -0,0 +1,3 @@
ALTER TABLE TRANSACTIONS ADD COLUMN START_TRANSACTION_MESSAGE_ID TEXT NOT NULL DEFAULT "";
ALTER TABLE TRANSACTIONS ADD COLUMN STOP_TRANSACTION_MESSAGE_ID TEXT;
UPDATE TRANSACTIONS SET CSMS_ACK = 1;

View File

@@ -0,0 +1 @@
DROP TABLE NORMAL_QUEUE;

View File

@@ -0,0 +1,7 @@
CREATE TABLE NORMAL_QUEUE(
UNIQUE_ID TEXT PRIMARY KEY NOT NULL,
MESSAGE TEXT NOT NULL,
MESSAGE_TYPE TEXT NOT NULL,
MESSAGE_ATTEMPTS INT NOT NULL,
MESSAGE_TIMESTAMP TEXT NOT NULL
);

View File

@@ -0,0 +1,3 @@
CREATE TABLE OCSP_REQUEST (
LAST_UPDATE TEXT PRIMARY KEY NOT NULL
);

View File

@@ -0,0 +1 @@
DROP TABLE OCSP_REQUEST;

View File

@@ -0,0 +1,49 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for OCPP 1.6 config",
"type": "object",
"required": [
"Internal",
"Core",
"Security"
],
"properties": {
"Internal": {
"type": "object",
"$ref": "Internal.json"
},
"Core": {
"type": "object",
"$ref": "Core.json"
},
"LocalAuthListManagement": {
"type": "object",
"$ref": "LocalAuthListManagement.json"
},
"SmartCharging": {
"type": "object",
"$ref": "SmartCharging.json"
},
"FirmwareManagement": {
"type": "object",
"$ref": "FirmwareManagement.json"
},
"Reservation": {
"type": "object",
"$ref": "Reservation.json"
},
"Security": {
"type": "object",
"$ref": "Security.json"
},
"PnC": {
"type": "object",
"$ref": "PnC.json"
},
"CostAndPrice": {
"type": "object",
"$ref": "CostAndPrice.json"
}
},
"additionalProperties": false
}

View File

@@ -0,0 +1,190 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for Core Profile config",
"type": "object",
"required": [
"AuthorizeRemoteTxRequests",
"ClockAlignedDataInterval",
"ConnectionTimeOut",
"ConnectorPhaseRotation",
"GetConfigurationMaxKeys",
"HeartbeatInterval",
"LocalAuthorizeOffline",
"LocalPreAuthorize",
"MeterValuesAlignedData",
"MeterValuesSampledData",
"MeterValueSampleInterval",
"NumberOfConnectors",
"ResetRetries",
"StopTransactionOnInvalidId",
"StopTxnAlignedData",
"StopTxnSampledData",
"SupportedFeatureProfiles",
"TransactionMessageAttempts",
"TransactionMessageRetryInterval",
"UnlockConnectorOnEVSideDisconnect"
],
"properties": {
"AllowOfflineTxForUnknownId": {
"type": "boolean",
"readOnly": false,
"description": "If this config entry exists the charge point supports Unknown Offline Auth. If it is set to true the feature is enabled"
},
"AuthorizationCacheEnabled": {
"type": "boolean",
"readOnly": false,
"description": "If this config entry exists the charge point supports an Auth Cache. If it is set to true the feature is enabled"
},
"AuthorizeRemoteTxRequests": {
"type": "boolean",
"readOnly": false,
"description": "Authorize a RemoteStartTransaction request like a local StartTransaction. Readonly setting is up to the implementation."
},
"BlinkRepeat": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"ClockAlignedDataInterval": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"ConnectionTimeOut": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"ConnectorPhaseRotation": {
"type": "string",
"readOnly": false
},
"ConnectorPhaseRotationMaxLength": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"GetConfigurationMaxKeys": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"HeartbeatInterval": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"LightIntensity": {
"type": "integer",
"readOnly": false,
"minimum": 0,
"maximum": 100
},
"LocalAuthorizeOffline": {
"type": "boolean",
"readOnly": false
},
"LocalPreAuthorize": {
"type": "boolean",
"readOnly": false
},
"MaxEnergyOnInvalidId": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"MeterValuesAlignedData": {
"type": "string",
"readOnly": false
},
"MeterValuesAlignedDataMaxLength": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"MeterValuesSampledData": {
"type": "string",
"readOnly": false
},
"MeterValuesSampledDataMaxLength": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"MeterValueSampleInterval": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"MinimumStatusDuration": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"NumberOfConnectors": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"ResetRetries": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"StopTransactionOnEVSideDisconnect": {
"type": "boolean",
"readOnly": true
},
"StopTransactionOnInvalidId": {
"type": "boolean",
"readOnly": false
},
"StopTxnAlignedData": {
"type": "string",
"readOnly": false
},
"StopTxnAlignedDataMaxLength": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"StopTxnSampledData": {
"type": "string",
"readOnly": false
},
"StopTxnSampledDataMaxLength": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"SupportedFeatureProfiles": {
"type": "string",
"readOnly": true
},
"SupportedFeatureProfilesMaxLength": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"TransactionMessageAttempts": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"TransactionMessageRetryInterval": {
"type": "integer",
"readOnly": false,
"minimum": 0
},
"UnlockConnectorOnEVSideDisconnect": {
"type": "boolean",
"readOnly": false
},
"WebSocketPingInterval": {
"type": "integer",
"readOnly": false,
"minimum": 0
}
},
"additionalProperties": false
}

View File

@@ -0,0 +1,141 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for cost and price config",
"type": "object",
"required": [
"CustomDisplayCostAndPrice"
],
"properties": {
"CustomDisplayCostAndPrice": {
"description": "Set to true if California Pricing Requirements is supported in this charging station.",
"type": "boolean",
"readOnly": true
},
"NumberOfDecimalsForCostValues": {
"description": "Number of decimals to use for cost / price calculations. Value is received as floating point, but is converted to an integer. This config will tell with how many decimals a number is sent.",
"type": "integer",
"readOnly": true
},
"DefaultPrice": {
"description": "Default pricing information to show to the user",
"type": "object",
"readOnly": false,
"minLength": 1,
"properties": {
"chargingPrice": {
"type": "object",
"description": "Structure with price components to use when starting a session while offline. Not needed if offline sessions are not allowed or not charged.",
"properties": {
"kWhPrice": {
"type": "number"
},
"hourPrice": {
"type": "number"
},
"flatFee": {
"type": "number"
}
}
},
"priceText": {
"description": "Text for display of price information",
"type": "string",
"minLength": 1
},
"priceTextOffline": {
"description": "Alternative text for display when charge point is offline",
"type": "string",
"minLength": 1
}
},
"required": [
"priceText"
]
},
"DefaultPriceText": {
"description": "Default pricing information in 'other than default' languages to show to the user.",
"type": "object",
"readOnly": false,
"minLength": 1,
"properties": {
"priceTexts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"priceText": {
"description": "Text for display of price information",
"type": "string",
"minLength": 1
},
"priceTextOffline": {
"description": "Alternative text for display when charge point is offline",
"type": "string",
"minLength": 1
},
"language": {
"description": "The language of the text, language code per RFC5646.",
"type": "string",
"minLength": 2
}
},
"required": [
"priceText",
"language"
]
}
}
}
},
"TimeOffset": {
"descrption": "Configured current local time offset in the format: '+01:00', '-02:00' etc. The time offset is for display purposes.",
"type": "string",
"readOnly": false,
"minLength": 1,
"maxLength": 10
},
"NextTimeOffsetTransitionDateTime": {
"description": "Date time of the next time offset transition. On this date time, the clock displayed to the EV driver will be given the new offset as configured via 'TimeOffsetNextTransition'. This can be used to manually configure the next start or end of a daylight saving time period.",
"type": "string",
"readOnly": false,
"minLength": 1,
"maxLength": 40
},
"TimeOffsetNextTransition": {
"description": "Next local time offset in the format: '+01:00', '-02:00' etc. New offset that will be set on the next time offset transition as configured via 'NextTimeOffsetTransitionDateTime'. This can be used to manually configure the offset for the start or end of the daylight saving time period",
"type": "string",
"readOnly": false,
"minLength": 1,
"maxLength": 40
},
"CustomIdleFeeAfterStop": {
"description": "A Central System normally ends a transaction upon receiving the StopTransaction.req message. If the customization to calculate an idle fee after a transaction has stopped (until connector is unplugged) has been implemented, then this must be reported in a boolean configuration key 'CustomIdleFeeAfterStop' that reports 'true' to the Central System, so that it knows, that it has to extend the transaction until receipt of the DataTransfer 'ConnectorUnplugged'.",
"type": "boolean",
"readOnly": false
},
"SupportedLanguages": {
"description": "Comma separated list of supported language codes, per RFC5646.",
"type": "string",
"readOnly": true,
"minLength": 1
},
"CustomMultiLanguageMessages": {
"description": "Set to true when the charge point provides multi language support for tariffs",
"type": "boolean",
"readOnly": true
},
"Language": {
"description": "Default language code for the stations UI. Can be changed by CSMS.",
"type": "string",
"readOnly": false,
"minLength": 1
},
"WaitForSetUserPriceTimeout": {
"description": "Timeout in milliseconds that the charge point will wait for a DataTransfer(SetUserPrice) after an Authorize.req if CustomDisplayCostAndPrice is true. If the timeout expires, the authorization response will be returned without a price",
"type": "integer",
"readOnly": false,
"minimum": 0,
"maximum": 30000
}
}
}

View File

@@ -0,0 +1,9 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for Custom configuration keys",
"$comment": "This is just an example schema and can be modified according to custom requirements",
"type": "object",
"required": [],
"properties": {}
}

View File

@@ -0,0 +1,13 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for Firmware Management Profile config",
"type": "object",
"required": [],
"properties": {
"SupportedFileTransferProtocols": {
"type": "string",
"readOnly": true
}
},
"additionalProperties": false
}

View File

@@ -0,0 +1,387 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for internal config",
"type": "object",
"required": [
"ChargePointId",
"CentralSystemURI",
"ChargeBoxSerialNumber",
"ChargePointModel",
"ChargePointVendor",
"FirmwareVersion"
],
"properties": {
"ChargePointId": {
"type": "string",
"readOnly": true,
"minLength": 1
},
"CentralSystemURI": {
"type": "string",
"readOnly": true,
"minLength": 1
},
"ChargeBoxSerialNumber": {
"type": "string",
"readOnly": true,
"minLength": 1,
"maxLength": 25
},
"ChargePointModel": {
"type": "string",
"readOnly": true,
"minLength": 1,
"maxLength": 20
},
"ChargePointSerialNumber": {
"type": "string",
"readOnly": true,
"minLength": 1,
"maxLength": 25
},
"ChargePointVendor": {
"type": "string",
"readOnly": true,
"minLength": 1,
"maxLength": 20
},
"FirmwareVersion": {
"type": "string",
"readOnly": true,
"minLength": 1,
"maxLength": 50
},
"ICCID": {
"type": "string",
"readOnly": true,
"minLength": 1,
"maxLength": 20
},
"HostName": {
"type": "string",
"readOnly": true,
"minLength": 1
},
"IFace": {
"type": "string",
"readOnly": true,
"minLength": 1
},
"IMSI": {
"type": "string",
"readOnly": true,
"minLength": 1,
"maxLength": 20
},
"MeterSerialNumber": {
"type": "string",
"readOnly": true,
"minLength": 1,
"maxLength": 25
},
"MeterType": {
"type": "string",
"readOnly": true,
"minLength": 1,
"maxLength": 25
},
"SupportedCiphers12": {
"type": "array",
"items": {
"type": "string"
},
"readOnly": true,
"default": [
"ECDHE-ECDSA-AES128-GCM-SHA256",
"ECDHE-ECDSA-AES256-GCM-SHA384",
"AES128-GCM-SHA256",
"AES256-GCM-SHA384"
]
},
"SupportedCiphers13": {
"type": "array",
"items": {
"type": "string"
},
"readOnly": true,
"default": [
"TLS_AES_256_GCM_SHA384",
"TLS_AES_128_GCM_SHA256"
]
},
"UseTPM": {
"$comment": "Indicates if TPM is used to generate and retrieve private keys for the CSMS leaf certificate",
"type": "boolean",
"readOnly": true,
"default": false
},
"UseTPMSeccLeafCertificate": {
"$comment": "Indicates if TPM is used to generate and retrieve private keys for the SECC leaf certificate",
"type": "boolean",
"readOnly": true,
"default": false
},
"RetryBackoffRandomRange": {
"$comment": "maximum value for the random part of the websocket reconnect back-off time",
"type": "integer",
"readOnly": false,
"default": 10
},
"RetryBackoffRepeatTimes": {
"$comment": "amount of times previous reconnect back-off time will be doubled",
"type": "integer",
"readOnly": false,
"default": 3
},
"RetryBackoffWaitMinimum": {
"$comment": "minimum back-off time of the first reconnect",
"type": "integer",
"readOnly": false,
"default": 3
},
"AuthorizeConnectorZeroOnConnectorOne": {
"$comment": "Automatically authorize id tags on connector 1 when there is only one connector",
"type": "boolean",
"readOnly": true,
"default": true
},
"LogMessages": {
"$comment": "Automatically log all sent and received messages to a temporary file at /tmp/libocpp_messages_<LIBOCPP_START_TIMESTAMP>.txt",
"type": "boolean",
"readOnly": true,
"default": true
},
"LogMessagesRaw": {
"$comment": "If messages are additionally supposed to be logged without parsing them first. This can be useful to log and debug messages that violate the schema.",
"type": "boolean",
"readOnly": true,
"default": false
},
"LogMessagesFormat": {
"$comment": "Supported log formats are console, log, html, console_detailed, session_logging, callback and security. \"security\" logs security events into a seperate logfile",
"type": "array",
"items": {
"type": "string"
},
"readOnly": true,
"default": [
"log",
"html",
"session_logging",
"security"
]
},
"LogRotation": {
"$comment": "Enable log rotation",
"type": "boolean",
"readOnly": true,
"default": false
},
"LogRotationDateSuffix": {
"$comment": "Use a datetime suffix in log rotation files instead of the traditional .0, .1",
"type": "boolean",
"readOnly": true,
"default": false
},
"LogRotationMaximumFileSize": {
"$comment": "Maximum file size in bytes for the log file after which it will be rotated. Setting this to 0 disables log rotation.",
"type": "integer",
"readOnly": true,
"default": 0,
"minimum": 0
},
"LogRotationMaximumFileCount": {
"$comment": "Maximum amount of files before rotated logs will be deleted. Setting this to 0 disables log rotation.",
"type": "integer",
"readOnly": true,
"default": 0,
"minimum": 0
},
"SupportedChargingProfilePurposeTypes": {
"$comment": "Indicates which ChargingProfilePurposeTypes are supported. SetChargingProfile.req for profiles not listed will be rejected.",
"type": "array",
"items": {
"type": "string"
},
"readOnly": true,
"default": [
"ChargePointMaxProfile",
"TxDefaultProfile",
"TxProfile"
]
},
"IgnoredProfilePurposesOffline": {
"$comment": "Allows configuration of comma seperated list of ChargingProfilePurposes that are ignored in the composite schedule caluclation when offline.",
"type": "string",
"readOnly": false
},
"MaxCompositeScheduleDuration": {
"$comment": "Maximum duration in seconds of GetCompositeSchedule.req. For GetCompositeSchedule.req with a greater duration the schedule for only the MaxCompositeScheduleDuration will be calculated",
"type": "integer",
"readOnly": true,
"default": 31536000
},
"CompositeScheduleDefaultLimitAmps": {
"description": "Default amps limit applied when composite schedule is calculated and no limit was provided by the CSMS",
"type": "number",
"readOnly": false,
"default": 48,
"minimum": 0
},
"CompositeScheduleDefaultLimitWatts": {
"description": "Default watts limit applied when composite schedule is calculated and no limit was provided by the CSMS",
"type": "number",
"readOnly": false,
"default": 33120,
"minimum": 0
},
"CompositeScheduleDefaultNumberPhases": {
"description": "Default number of phases applied when composite schedule is calculated and no limit was provided by the CSMS",
"type": "number",
"readOnly": false,
"default": 3,
"minimum": 1,
"maximum": 3
},
"SupplyVoltage": {
"description": "Supply voltage of the grid. This value is only used in case a conversion between smart charging amp and watt limits is required",
"type": "number",
"readOnly": false,
"default": 230,
"minimum": 0
},
"WebsocketPingPayload": {
"$comment": "The payload sent in a websocket ping.",
"type": "string",
"readOnly": true,
"default": "hello there"
},
"WebsocketPongTimeout": {
"$comment": "Maximum timeout for receiving a pong message in seconds",
"type": "integer",
"readOnly": true,
"default": 5
},
"UseSslDefaultVerifyPaths": {
"$comment": "Use default verify paths for validating CSMS server certificate",
"type": "boolean",
"readOnly": true,
"default": true
},
"VerifyCsmsCommonName": {
"$comment": "Verify that the CSMS certificates commonName matches the CSMS FQDN",
"type": "boolean",
"readOnly": true,
"default": true
},
"VerifyCsmsAllowWildcards": {
"$comment": "Allow wildcards when verifying the CSMS commonName",
"type": "boolean",
"readOnly": false,
"default": false
},
"OcspRequestInterval": {
"$comment": "Interval in seconds used to request OCSP revocation status information on the CSO Sub-CA certificates",
"type": "integer",
"readOnly": false,
"default": 604800,
"minimum": 86400
},
"SeccLeafSubjectCommonName": {
"$comment": "Common Name(s) of the SECC (EVSE) leaf certificate(s). The CN must be a SECCID. The field can contain optional multiple SECCIDs if necessary.",
"type": "string",
"readOnly": false,
"minLength": 7,
"maxLength": 64
},
"SeccLeafSubjectCountry": {
"$comment": "County of the SECC (EVSE) leaf certificate. Indicates in which country the CPO operates.",
"type": "string",
"readOnly": false,
"minLength": 2,
"maxLength": 2
},
"SeccLeafSubjectOrganization": {
"$comment": "Organization of the SECC (EVSE) leaf certificate. Indicates which CPO operates this EVSE. Example: Hubject GmbH",
"type": "string",
"readOnly": false,
"minLength": 0,
"maxLength": 64
},
"ConnectorEvseIds": {
"$comment": "Comma separated EVSEIDs for OCPP connectors starting with connector 1 in one string.",
"type": "string",
"readOnly": false,
"minLength": 7,
"maxLength": 1000
},
"AllowChargingProfileWithoutStartSchedule": {
"$comment": "OCPP1.6 specifies that for certain ChargingProfiles the startSchedule field needs to be set. This flag ignores this requirement and will accept those profiles without startSchedule, assuming startSchedule is now.",
"type": "boolean",
"readOnly": false
},
"WaitForStopTransactionsOnResetTimeout": {
"$comment": "Specifies the timeout that is used when transactions are stopped because of a Reset.req . If timeout exceeds, the reset callback is executed even if StopTransaction.conf messages not yet received for transactions that have been active.",
"type": "integer",
"readOnly": false,
"minimum": 0,
"default": 60
},
"QueueAllMessages": {
"$comment": "If set to true, also non-transactional messages are queued in memory in case they cannot be sent immediately.",
"type": "boolean",
"readOnly": true
},
"MessageTypesDiscardForQueueing": {
"$comment": "Comma seperated list of message types that shall not be queued (when offline) even in case QueueAllMessages is true. If QueueAllMessages is false, the configuration of this paramater has no effect.",
"type": "string",
"readOnly": true
},
"MessageQueueSizeThreshold": {
"$comment": "Threshold for the size of in-memory message queues used to buffer messages (and store e.g. while offline). If threshold is exceeded, messages will be dropped according to OCPP specification to avoid memory issues.",
"type": "integer",
"readOnly": true,
"minimum": 1
},
"SupportedMeasurands": {
"$comment": "Comma separated list of supported measurands of the powermeter",
"type": "string",
"readOnly": true,
"default": "Energy.Active.Import.Register,Energy.Active.Export.Register,Power.Active.Import,Voltage,Current.Import,Frequency,Current.Offered,Power.Offered,SoC,Temperature"
},
"MaxMessageSize": {
"$comment": "Maximum size in bytes for messages sent to the CSMS via websocket. If a message exceeds this size, data of the message may be dropped",
"type": "integer",
"readOnly": true,
"minimum": 32000,
"default": 65000
},
"TLSKeylogFile": {
"$comment": "The file to which the OCPP TLS keylog in SSLKEYLOGFILE format is written to.",
"type": "string",
"readOnly": true,
"default": "/tmp/ocpp_tls_keylog.txt"
},
"EnableTLSKeylog": {
"$comment": "If the TLS keylogging is enabled.",
"type": "boolean",
"readOnly": true,
"default": false
},
"StopTransactionIfUnlockNotSupported": {
"$comment": "If true, a transaction is stopped on an Unlock.req even if unlocking is not supported",
"type": "boolean",
"readOnly": false,
"default": false
},
"MeterPublicKeys": {
"$comment": "The public key of the meter in formatted according the Signed Meter Values Whitepaper of OCPP. The first element represents the public key for connector id 1, the second for connector id 2, and so on.",
"type": "array",
"readOnly": true,
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}

View File

@@ -0,0 +1,27 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for Local Auth List Management Profile config",
"type": "object",
"required": [
"LocalAuthListEnabled",
"LocalAuthListMaxLength",
"SendLocalListMaxLength"
],
"properties": {
"LocalAuthListEnabled": {
"type": "boolean",
"readOnly": false
},
"LocalAuthListMaxLength": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"SendLocalListMaxLength": {
"type": "integer",
"readOnly": true,
"minimum": 0
}
},
"additionalProperties": false
}

View File

@@ -0,0 +1,41 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for ISO15118 PnC extension",
"type": "object",
"required": ["ISO15118PnCEnabled", "ContractValidationOffline"],
"properties": {
"ISO15118CertificateManagementEnabled": {
"type": "boolean",
"description": "If this variable set to true, then the Charge Point supports ISO 15118 plug and charge messages via the DataTransfer mechanism as described in the application note. It also enables the mechanism to trigger SECC leaf certificate updates if the existing certificate is about to expire.",
"readOnly": false,
"default": false
},
"ISO15118PnCEnabled": {
"type": "boolean",
"description": "If this variable set to true, then the Charge Point supports ISO 15118 plug and charge authorization via contract certificates.",
"readOnly": false
},
"CentralContractValidationAllowed": {
"type": "boolean",
"description": "If this variable exists and has the value true, then the Charge Point can provide a contract certificate that it cannot validate to the Central System for validation as part of the Authorize.req.",
"readOnly": false
},
"CertSigningWaitMinimum": {
"type": "integer",
"description": "This configuration key defines how long the Charge Point has to wait (in seconds) before generating another CSR, in the case the Central System accepts the SignCertificate.req, but never returns the signed certificate back.",
"minimum": 0,
"readOnly": false
},
"CertSigningRepeatTimes": {
"type": "integer",
"description": "This configuration key can be used to configure the amount of times the Charge Point SHALL double the previous back-off time",
"minimum": 0,
"readOnly": false
},
"ContractValidationOffline": {
"type": "boolean",
"description": "If this variable is true, then the Charge Point will try to validate a contract certificate when it is offline.",
"readOnly": false
}
}
}

View File

@@ -0,0 +1,13 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for Reservation Profile config",
"type": "object",
"required": [],
"properties": {
"ReserveConnectorZeroSupported": {
"type": "boolean",
"readOnly": true
}
},
"additionalProperties": false
}

View File

@@ -0,0 +1,52 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for Security Profile config",
"type": "object",
"required": [
"SecurityProfile"
],
"properties": {
"AdditionalRootCertificateCheck": {
"type": "boolean",
"description": "When set to true, only one certificate (plus a temporarily fallback certificate) of certificateType CentralSystemRootCertificate is allowed to be installed at a time",
"readOnly": true
},
"AuthorizationKey": {
"type": "string",
"description": "The basic authentication password is used for HTTP Basic Authentication",
"minLength": 8,
"readOnly": false
},
"CertificateSignedMaxChainSize": {
"type": "integer",
"description": "This configuration key can be used to limit the size of the 'certificateChain' field from the CertificateSigned.req PDU.",
"maximum": 10000,
"readOnly": true
},
"CertificateStoreMaxLength": {
"type": "integer",
"description": "Maximum number of Root/CA certificates that can be installed in the Charge Point.",
"minimum": 0,
"readOnly": true
},
"CpoName": {
"type": "string",
"description": "This configuration key contains CPO name (or an organization trusted by the CPO) as used in the Charge Point Certificate.",
"readOnly": false
},
"SecurityProfile": {
"type": "integer",
"default": 0,
"minimum": 0,
"maximum": 3,
"description": "This configuration key is used to set the security profile used by the Charge Point",
"readOnly": false
},
"DisableSecurityEventNotifications": {
"type": "boolean",
"description": "When set to true, no SecurityEventNotification.req messages will be sent by the Charge Point",
"readOnly": false,
"default": false
}
}
}

View File

@@ -0,0 +1,40 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Json schema for Smart Charging Profile config",
"type": "object",
"required": [
"ChargeProfileMaxStackLevel",
"ChargingScheduleAllowedChargingRateUnit",
"ChargingScheduleMaxPeriods",
"MaxChargingProfilesInstalled"
],
"properties": {
"ChargeProfileMaxStackLevel": {
"type": "integer",
"readOnly": true,
"minimum": 0
},
"ChargingScheduleAllowedChargingRateUnit": {
"type": "string",
"readOnly": true,
"default": "Current,Power"
},
"ChargingScheduleMaxPeriods": {
"type": "integer",
"readOnly": true,
"minimum": 0,
"default": 1440
},
"ConnectorSwitch3to1PhaseSupported": {
"type": "boolean",
"readOnly": true
},
"MaxChargingProfilesInstalled": {
"type": "integer",
"readOnly": true,
"minimum": 0,
"default": 500
}
},
"additionalProperties": false
}

View File

@@ -0,0 +1,3 @@
*
!.gitignore
!README.md