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,46 @@
# find all migration files, store only the filenames by showing relative to the folder
set(MIGRATION_FILES_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/core_migrations")
set(MIGRATION_FILES_DEVICE_MODEL_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../common/device_model_migrations")
include(../CollectMigrationFiles.cmake)
collect_migration_files(
LOCATION ${MIGRATION_FILES_LOCATION}
INSTALL_DESTINATION ${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP201/core_migrations
)
set(MIGRATION_FILE_VERSION_V2 ${TARGET_MIGRATION_FILE_VERSION} PARENT_SCOPE)
collect_migration_files(
LOCATION ${MIGRATION_FILES_DEVICE_MODEL_LOCATION}
INSTALL_DESTINATION ${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP201/device_model_migrations
)
set(MIGRATION_DEVICE_MODEL_FILE_VERSION_V2 ${TARGET_MIGRATION_FILE_VERSION} PARENT_SCOPE)
set(MIGRATION_FILES_SOURCE_DIR_V2 ${MIGRATION_FILES_LOCATION} PARENT_SCOPE)
set(MIGRATION_FILES_DEVICE_MODEL_SOURCE_DIR_V2 ${MIGRATION_FILES_DEVICE_MODEL_LOCATION} PARENT_SCOPE)
option(LIBOCPP_INSTALL_STANDARDIZED_COMPONENT_CONFIG "Install the standardized components configs for OCPP2.0.1 and OCPP2.1" ON)
option(LIBOCPP_INSTALL_CUSTOM_COMPONENT_CONFIG "Install the custom component configs for OCPP2.0.1 and OCPP2.1" OFF)
list(APPEND CONFIGS
../logging.ini
)
install(
FILES ${CONFIGS}
DESTINATION ${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP201
)
set(LIBOCPP_STANDARDIZED_COMPONENT_CONFIG_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../common/component_config/standardized" CACHE PATH "Path to standardized OCPP component configs")
set(LIBOCPP_CUSTOM_COMPONENT_CONFIG_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../common/component_config/custom" CACHE PATH "Path to custom OCPP component configs")
if (LIBOCPP_INSTALL_STANDARDIZED_COMPONENT_CONFIG)
message(STATUS "Using ocpp standardized component config file path: ${LIBOCPP_STANDARDIZED_COMPONENT_CONFIG_PATH}")
install(DIRECTORY ${LIBOCPP_STANDARDIZED_COMPONENT_CONFIG_PATH}/ DESTINATION ${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP201/component_config/standardized)
endif()
if (LIBOCPP_INSTALL_CUSTOM_COMPONENT_CONFIG)
message(STATUS "Using ocpp custom component config file path: ${LIBOCPP_CUSTOM_COMPONENT_CONFIG_PATH}")
install(DIRECTORY ${LIBOCPP_CUSTOM_COMPONENT_CONFIG_PATH}/ DESTINATION ${CMAKE_INSTALL_DATADIR}/everest/modules/OCPP201/component_config/custom)
endif()

View File

@@ -0,0 +1,88 @@
PRAGMA foreign_keys = ON;
-- Authorization cache --
CREATE TABLE AUTH_CACHE(
ID_TOKEN_HASH TEXT PRIMARY KEY NOT NULL,
ID_TOKEN_INFO TEXT NOT NULL
);
-- OCPP 2.0.1. Availability --
-- Rows are the operative state (Operative/Inoperative) of the CS, all EVSEs, and all Connectors
CREATE TABLE AVAILABILITY(
EVSE_ID INT NOT NULL, -- EVSE_ID=0 AND CONNECTOR_ID=0 addresses the whole CS
CONNECTOR_ID INT NOT NULL, -- A CONNECTOR_ID of 0 when EVSE_ID > 0 addresses the whole connector
OPERATIONAL_STATUS TEXT NOT NULL, -- "Operative" or "Inoperative"
PRIMARY KEY (EVSE_ID, CONNECTOR_ID),
-- Consistency check: EVSE and connector IDs are positive, and if EVSE_ID is 0, CONNECTOR_ID must also be 0
CHECK (EVSE_ID >= 0 AND CONNECTOR_ID >= 0 AND (EVSE_ID > 0 OR CONNECTOR_ID = 0))
);
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
);
-- Auth list --
CREATE TABLE AUTH_LIST_VERSION (
ID INT PRIMARY KEY NOT NULL,
VERSION INT
);
CREATE TABLE AUTH_LIST (
ID_TOKEN_HASH TEXT PRIMARY KEY NOT NULL,
ID_TOKEN_INFO TEXT NOT NULL
);
INSERT OR IGNORE INTO AUTH_LIST_VERSION (ID, VERSION) VALUES
(0, 0);
-- Metervalues --
CREATE TABLE READING_CONTEXT_ENUM (
ID INT PRIMARY KEY,
READING_CONTEXT TEXT
);
CREATE TABLE MEASURAND_ENUM (
ID INT PRIMARY KEY,
MEASURAND TEXT
);
CREATE TABLE PHASE_ENUM (
ID INT PRIMARY KEY,
PHASE TEXT
);
CREATE TABLE LOCATION_ENUM (
ID INT PRIMARY KEY,
LOCATION TEXT
);
CREATE TABLE METER_VALUES (
ROWID INTEGER PRIMARY KEY,
TRANSACTION_ID TEXT NOT NULL,
TIMESTAMP INT64 NOT NULL,
READING_CONTEXT INTEGER REFERENCES READING_CONTEXT_ENUM (ID),
CUSTOM_DATA TEXT,
UNIQUE(TRANSACTION_ID, TIMESTAMP, READING_CONTEXT)
);
CREATE TABLE METER_VALUE_ITEMS (
METER_VALUE_ID INTEGER REFERENCES METER_VALUES (ROWID),
VALUE REAL NOT NULL,
MEASURAND INTEGER REFERENCES MEASURAND_ENUM (ID),
PHASE INTEGER REFERENCES PHASE_ENUM (ID),
LOCATION INTEGER REFERENCES LOCATION_ENUM (ID),
CUSTOM_DATA TEXT,
UNIT_CUSTOM_DATA TEXT,
UNIT_TEXT TEXT,
UNIT_MULTIPLIER INT,
SIGNED_METER_DATA TEXT,
SIGNING_METHOD TEXT,
ENCODING_METHOD TEXT,
PUBLIC_KEY TEXT
);

View File

@@ -0,0 +1,2 @@
ALTER TABLE AUTH_CACHE DROP COLUMN LAST_USED;
ALTER TABLE AUTH_CACHE DROP COLUMN EXPIRY_DATE;

View File

@@ -0,0 +1,2 @@
ALTER TABLE AUTH_CACHE ADD COLUMN LAST_USED INT64 NOT NULL DEFAULT 0;
ALTER TABLE AUTH_CACHE ADD COLUMN EXPIRY_DATE INT64;

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 @@
DROP TABLE TRANSACTIONS;

View File

@@ -0,0 +1,9 @@
CREATE TABLE TRANSACTIONS (
TRANSACTION_ID TEXT NOT NULL UNIQUE,
EVSE_ID INT NOT NULL UNIQUE,
CONNECTOR_ID INT NOT NULL,
TIME_START INT64 NOT NULL,
SEQ_NO INT NOT NULL,
CHARGING_STATE TEXT NOT NULL,
ID_TAG_SENT INT NOT NULL
);

View File

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

View File

@@ -0,0 +1,7 @@
CREATE TABLE CHARGING_PROFILES (
ID INT PRIMARY KEY NOT NULL,
EVSE_ID INT NOT NULL,
STACK_LEVEL INT NOT NULL,
CHARGING_PROFILE_PURPOSE TEXT NOT NULL,
PROFILE TEXT NOT NULL
);

View File

@@ -0,0 +1,2 @@
ALTER TABLE CHARGING_PROFILES DROP COLUMN CHARGING_LIMIT_SOURCE;
ALTER TABLE CHARGING_PROFILES DROP COLUMN TRANSACTION_ID;

View File

@@ -0,0 +1,2 @@
ALTER TABLE CHARGING_PROFILES ADD COLUMN CHARGING_LIMIT_SOURCE TEXT NOT NULL DEFAULT 'CSO';
ALTER TABLE CHARGING_PROFILES ADD COLUMN TRANSACTION_ID TEXT;

View File

@@ -0,0 +1,3 @@
DROP INDEX IF EXISTS idx_der_controls_default_type;
DROP INDEX IF EXISTS idx_der_controls_is_default;
DROP TABLE IF EXISTS DER_CONTROLS;

View File

@@ -0,0 +1,25 @@
CREATE TABLE IF NOT EXISTS DER_CONTROLS (
-- CiString<36> cap per OCPP 2.1.
CONTROL_ID TEXT PRIMARY KEY NOT NULL CHECK (length(CONTROL_ID) <= 36),
IS_DEFAULT INTEGER NOT NULL CHECK (IS_DEFAULT IN (0, 1)),
CONTROL_TYPE TEXT NOT NULL,
IS_SUPERSEDED INTEGER NOT NULL DEFAULT 0 CHECK (IS_SUPERSEDED IN (0, 1)),
PRIORITY INTEGER NOT NULL CHECK (PRIORITY >= 0),
-- RFC 3339 shape: lex-comparison-safe. LIKE used so '_' is single-char wildcard.
START_TIME TEXT CHECK (START_TIME IS NULL OR START_TIME LIKE '____-__-__T__:__:__%Z'),
-- Upper bound matches MAX_DURATION_SECONDS (one year = 86400 * 365) in der_control.cpp.
DURATION REAL CHECK (DURATION IS NULL OR (DURATION >= 0 AND DURATION <= 31536000)),
CONTROL_JSON TEXT NOT NULL,
-- R04.FR.07: when set, this row has been accepted but its supersede of
-- PENDING_SUPERSEDE_ID is deferred until START_TIME <= now.
PENDING_SUPERSEDE_ID TEXT,
-- R04.FR.20/21: 1 once NotifyDERStartStop(started=true) has been emitted for
-- this row. The scheduled-check pass flips this at the moment START_TIME <= now.
STARTED_NOTIFIED INTEGER NOT NULL DEFAULT 0 CHECK (STARTED_NOTIFIED IN (0, 1))
);
CREATE INDEX IF NOT EXISTS idx_der_controls_default_type
ON DER_CONTROLS (IS_DEFAULT, CONTROL_TYPE);
CREATE INDEX IF NOT EXISTS idx_der_controls_is_default
ON DER_CONTROLS (IS_DEFAULT);