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,139 @@
---
Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: true
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: AfterColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 120
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
SortPriority: 0
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
SortPriority: 0
- Regex: '.*'
Priority: 1
SortPriority: 0
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentCaseLabels: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentWidth: 4
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left
QualifierAlignment: Left
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
Standard: Latest
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 8
UseCRLF: false
UseTab: Never
...

View File

@@ -0,0 +1,58 @@
Checks: >
*,
bugprone-*,
cert-*,
concurrency-*,
cppcoreguidelines-*,
misc-*,
performance-*,
-abseil-*,
-altera-*,
-android-*,
-boost-*,
-fuchsia-*,
-google-*,
-hicpp-*,
-llvm-*,
-llvmlibc-*,
-zircon-*,
-bugprone-easily-swappable-parameters,
-cert-err60-cpp,
-cppcoreguidelines-non-private-member-variables-in-classes,
-cppcoreguidelines-use-default-member-init,
-misc-include-cleaner,
-misc-non-private-member-variables-in-classes,
-modernize-pass-by-value,
-modernize-use-trailing-return-type,
-modernize-use-default-member-init,
-modernize-return-braced-init-list,
-modernize-use-scoped-lock,
-modernize-concat-nested-namespaces,
-modernize-use-nodiscard,
-modernize-raw-string-literal,
-performance-avoid-endl,
-performance-enum-size,
-performance-unnecessary-value-param,
-readability-avoid-const-params-in-decls,
-readability-function-cognitive-complexity,
-readability-identifier-length,
-readability-magic-numbers,
-readability-qualified-auto,
-readability-simplify-boolean-expr,
-readability-use-anyofallof,
-readability-use-std-min-max,
-concurrency-mt-unsafe,
-portability-avoid-pragma-once,
-portability-template-virtual-member-function,
-cppcoreguidelines-avoid-const-or-ref-data-members,
-cppcoreguidelines-avoid-do-while,
-cppcoreguidelines-avoid-magic-numbers,
-cppcoreguidelines-macro-usage,
-cppcoreguidelines-special-member-functions,
-cppcoreguidelines-pro-type-vararg,
-cppcoreguidelines-pro-type-member-init,
-cert-err58-cpp,
# (the last -cppcoreguidelines and -cert-err58-cpp lines are temporary)
HeaderFilterRegex: ".*"
CheckOptions:
- { key: performance-unnecessary-value-param.AllowedTypes, value: ((std::shared_ptr)) }

View File

@@ -0,0 +1,3 @@
[*.json]
indent_style = space
indent_size = 4

View File

@@ -0,0 +1,7 @@
* @pietfried @hikinggrass @marcemmers @mlitre
/config/v16/ @pietfried @hikinggrass @mlitre
/include/ocpp/v16/ @pietfried @hikinggrass @mlitre
/lib/ocpp/v16/ @pietfried @hikinggrass @mlitre
/.github/ @pietfried @hikinggrass @mlitre

View File

@@ -0,0 +1,11 @@
/build*
!.gitignore
*vscode
.cache/
workspace.yaml
CMakeLists.txt.user
__pycache__
!doc/build-with-fetchcontent
/dist
clang-tidy-*.yaml
clang-tidy-*.txt

View File

@@ -0,0 +1,174 @@
/*
******
base64.hpp is a repackaging of the base64.cpp and base64.h files into a
single header suitable for use as a header only library. This conversion was
done by Peter Thorson (webmaster@zaphoyd.com) in 2012. All modifications to
the code are redistributed under the same license as the original, which is
listed below.
******
base64.cpp and base64.h
Copyright (C) 2004-2008 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#ifndef BASE64_EVEREST_HPP_
#define BASE64_EVEREST_HPP_
#include <string>
namespace ocpp {
static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
/// Test whether a character is a valid base64 character
/**
* @param c The character to test
* @return true if c is a valid base64 character
*/
static inline bool is_base64(unsigned char c) {
return (c == 43 || // +
(c >= 47 && c <= 57) || // /-9
(c >= 65 && c <= 90) || // A-Z
(c >= 97 && c <= 122)); // a-z
}
/// Encode a char buffer into a base64 string
/**
* @param input The input data
* @param len The length of input in bytes
* @return A base64 encoded string representing input
*/
inline std::string base64_encode(const unsigned char* input, size_t len) {
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while ((len--) != 0) {
char_array_3[i++] = *(input++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; (i < 4); i++) {
ret += base64_chars[char_array_4[i]];
}
i = 0;
}
}
if (i != 0) {
for (j = i; j < 3; j++) {
char_array_3[j] = '\0';
}
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; (j < i + 1); j++) {
ret += base64_chars[char_array_4[j]];
}
while ((i++ < 3)) {
ret += '=';
}
}
return ret;
}
/// Encode a string into a base64 string
/**
* @param input The input data
* @return A base64 encoded string representing input
*/
inline std::string base64_encode(const std::string& input) {
return base64_encode(reinterpret_cast<const unsigned char*>(input.data()), input.size());
}
/// Decode a base64 encoded string into a string of raw bytes
/**
* @param input The base64 encoded input data
* @return A string representing the decoded raw bytes
*/
inline std::string base64_decode(const std::string& input) {
size_t in_len = input.size();
int i = 0;
int j = 0;
int in_ = 0;
unsigned char char_array_4[4];
unsigned char char_array_3[3];
std::string ret;
while (((in_len--) != 0) && (input[in_] != '=') && is_base64(input[in_])) {
char_array_4[i++] = input[in_];
in_++;
if (i == 4) {
for (i = 0; i < 4; i++) {
char_array_4[i] = static_cast<unsigned char>(base64_chars.find(char_array_4[i]));
}
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (i = 0; (i < 3); i++) {
ret += char_array_3[i];
}
i = 0;
}
}
if (i != 0) {
for (j = i; j < 4; j++) {
char_array_4[j] = 0;
}
for (j = 0; j < 4; j++) {
char_array_4[j] = static_cast<unsigned char>(base64_chars.find(char_array_4[j]));
}
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
for (j = 0; (j < i - 1); j++) {
ret += static_cast<std::string::value_type>(char_array_3[j]);
}
}
return ret;
}
} // namespace ocpp
#endif // BASE64_EVEREST_HPP_

View File

@@ -0,0 +1,313 @@
/*
* Copyright (c) 2014, Peter Thorson. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the WebSocket++ Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef WEBSOCKETPP_URI_EVEREST_HPP
#define WEBSOCKETPP_URI_EVEREST_HPP
#include <algorithm>
#include <cstdint>
#include <sstream>
#include <stdexcept>
#include <string>
namespace ocpp {
// TODO: figure out why this fixes horrible linking errors.
/// Default port for ws://
static const uint16_t uri_default_port = 80;
/// Default port for wss://
static const uint16_t uri_default_secure_port = 443;
class uri {
public:
explicit uri(const std::string& uri_string) : m_valid(false) {
std::string::const_iterator it;
std::string::const_iterator temp;
int state = 0;
it = uri_string.begin();
const size_t uri_len = uri_string.length();
if (uri_len >= 7 && std::equal(it, it + 6, "wss://")) {
m_secure = true;
m_scheme = "wss";
it += 6;
} else if (uri_len >= 6 && std::equal(it, it + 5, "ws://")) {
m_secure = false;
m_scheme = "ws";
it += 5;
} else if (uri_len >= 8 && std::equal(it, it + 7, "http://")) {
m_secure = false;
m_scheme = "http";
it += 7;
} else if (uri_len >= 9 && std::equal(it, it + 8, "https://")) {
m_secure = true;
m_scheme = "https";
it += 8;
} else {
return;
}
// extract host.
// either a host string
// an IPv4 address
// or an IPv6 address
if (*it == '[') {
++it;
// IPv6 literal
// extract IPv6 digits until ]
// TODO: this doesn't work on g++... not sure why
// temp = std::find(it,it2,']');
temp = it;
while (temp != uri_string.end()) {
if (*temp == ']') {
break;
}
++temp;
}
if (temp == uri_string.end()) {
return;
}
// validate IPv6 literal parts
// can contain numbers, a-f and A-F
m_host.append(it, temp);
it = temp + 1;
if (it == uri_string.end()) {
state = 2;
} else if (*it == '/') {
state = 2;
++it;
} else if (*it == ':') {
state = 1;
++it;
} else {
// problem
return;
}
} else {
// IPv4 or hostname
// extract until : or /
while (state == 0) {
if (it == uri_string.end()) {
state = 2;
break;
}
if (*it == '/') {
state = 2;
} else if (*it == ':') {
// end hostname start port
state = 1;
} else {
m_host += *it;
}
++it;
}
}
// parse port
std::string port;
while (state == 1) {
if (it == uri_string.end()) {
// state is not used after this point presently.
// this should be re-enabled if it ever is needed in a future
// refactoring
// state = 3;
break;
}
if (*it == '/') {
state = 3;
} else {
port += *it;
}
++it;
}
m_port = get_port_from_string(port, m_valid);
m_resource = "/";
m_resource.append(it, uri_string.end());
}
uri(bool secure, const std::string& host, uint16_t port, const std::string& resource) :
m_scheme(secure ? "wss" : "ws"),
m_host(host),
m_resource(resource.empty() ? "/" : resource),
m_port(port),
m_secure(secure),
m_valid(true) {
}
uri(bool secure, const std::string& host, const std::string& resource) :
m_scheme(secure ? "wss" : "ws"),
m_host(host),
m_resource(resource.empty() ? "/" : resource),
m_port(secure ? uri_default_secure_port : uri_default_port),
m_secure(secure),
m_valid(true) {
}
uri(bool secure, const std::string& host, const std::string& port, const std::string& resource) :
m_scheme(secure ? "wss" : "ws"), m_host(host), m_resource(resource.empty() ? "/" : resource), m_secure(secure) {
m_port = get_port_from_string(port, m_valid);
}
uri(const std::string& scheme, const std::string& host, uint16_t port, const std::string& resource) :
m_scheme(scheme),
m_host(host),
m_resource(resource.empty() ? "/" : resource),
m_port(port),
m_secure(scheme == "wss" || scheme == "https"),
m_valid(true) {
}
uri(std::string scheme, const std::string& host, const std::string& resource) :
m_scheme(scheme),
m_host(host),
m_resource(resource.empty() ? "/" : resource),
m_port((scheme == "wss" || scheme == "https") ? uri_default_secure_port : uri_default_port),
m_secure(scheme == "wss" || scheme == "https"),
m_valid(true) {
}
uri(const std::string& scheme, const std::string& host, const std::string& port, const std::string& resource) :
m_scheme(scheme),
m_host(host),
m_resource(resource.empty() ? "/" : resource),
m_secure(scheme == "wss" || scheme == "https") {
m_port = get_port_from_string(port, m_valid);
}
bool get_valid() const {
return m_valid;
}
bool get_secure() const {
return m_secure;
}
const std::string& get_scheme() const {
return m_scheme;
}
const std::string& get_host() const {
return m_host;
}
std::string get_host_port() const {
if (m_port == (m_secure ? uri_default_secure_port : uri_default_port)) {
return m_host;
}
std::stringstream p;
p << m_host << ":" << m_port;
return p.str();
}
std::string get_authority() const {
std::stringstream p;
p << m_host << ":" << m_port;
return p.str();
}
uint16_t get_port() const {
return m_port;
}
std::string get_port_str() const {
std::stringstream p;
p << m_port;
return p.str();
}
const std::string& get_resource() const {
return m_resource;
}
std::string str() const {
std::stringstream s;
s << m_scheme << "://" << m_host;
if (m_port != (m_secure ? uri_default_secure_port : uri_default_port)) {
s << ":" << m_port;
}
s << m_resource;
return s.str();
}
/// Return the query portion
/**
* Returns the query portion (after the ?) of the URI or an empty string if
* there is none.
*
* @return query portion of the URI.
*/
std::string get_query() const {
const std::size_t found = m_resource.find('?');
if (found != std::string::npos) {
return m_resource.substr(found + 1);
}
return "";
}
private:
uint16_t get_port_from_string(const std::string& port, bool& out_valid) const {
out_valid = true;
if (port.empty()) {
return (m_secure ? uri_default_secure_port : uri_default_port);
}
const auto t_port = std::stoul(port);
if (t_port > 65535) {
out_valid = false;
}
if (t_port == 0) {
out_valid = false;
}
return static_cast<uint16_t>(t_port);
}
std::string m_scheme;
std::string m_host;
std::string m_resource;
uint16_t m_port = 0;
bool m_secure = false;
bool m_valid = false;
};
} // namespace ocpp
#endif // WEBSOCKETPP_URI_HPP

View File

@@ -0,0 +1,90 @@
load("@rules_cc//cc:defs.bzl", "cc_library")
exports_files(["config"])
# Mirrors the CMake configure_file step in lib/CMakeLists.txt that embeds the
# canonical NetworkConfiguration_1 schema into a generated translation unit so
# blob migration can bootstrap a per-slot component without a filesystem read.
genrule(
name = "network_configuration_default_schema_cpp",
srcs = [
"lib/ocpp/v2/network_configuration_default_schema.cpp.in",
"config/common/component_config/standardized/NetworkConfiguration_1.json",
],
outs = ["generated/network_configuration_default_schema.cpp"],
cmd = """python3 - "$(location lib/ocpp/v2/network_configuration_default_schema.cpp.in)" "$(location config/common/component_config/standardized/NetworkConfiguration_1.json)" "$@" <<'PYEOF'
import sys
tpl_path, json_path, out_path = sys.argv[1], sys.argv[2], sys.argv[3]
with open(tpl_path) as f:
tpl = f.read()
with open(json_path) as f:
js = f.read()
with open(out_path, 'w') as f:
f.write(tpl.replace('@OCPP_NETWORK_CONFIGURATION_DEFAULT_SCHEMA_JSON@', js))
PYEOF
""",
visibility = ["//visibility:private"],
)
cc_library(
name = "websocketpp_utils",
hdrs = glob([
"3rd_party/websocketpp_utils/*.hpp",
]),
includes = ["3rd_party"],
visibility = ["//visibility:private"],
)
cc_library(
name = "libocpp",
srcs = glob([
"lib/ocpp/common/*.cpp",
"lib/ocpp/common/database/*.cpp",
"lib/ocpp/v16/*.cpp",
"lib/ocpp/v2/*.cpp",
"lib/ocpp/v2/functional_blocks/*.cpp",
"lib/ocpp/v21/functional_blocks/*.cpp",
"lib/ocpp/common/websocket/*.cpp",
"lib/ocpp/v16/messages/*.cpp",
"lib/ocpp/v2/messages/*.cpp",
"lib/ocpp/v21/messages/*.cpp",
]) + [":network_configuration_default_schema_cpp"],
hdrs = glob([
"include/**/*.hpp",
]),
strip_include_prefix = "include",
visibility = ["//visibility:public"],
deps = [
":websocketpp_utils",
"//third-party/bazel/openssl:crypto",
"//third-party/bazel/openssl:ssl",
"@com_github_nlohmann_json//:json",
"@com_github_HowardHinnant_date//:date",
"//lib/everest/framework:framework",
"//lib/everest/timer:libtimer",
"//lib/everest/evse_security:libevse-security",
"@com_github_pboettch_json-schema-validator//:json-schema-validator",
"@com_github_warmcatt_libwebsockets//:libwebsockets",
"//lib/everest/sqlite:everest-sqlite",
],
copts = [
"-std=c++17",
"-Wimplicit-fallthrough",
"-Wno-error=switch-enum", # boost.date_time 1.87.0 has incomplete switch statements
],
defines = [
"LIBOCPP_ENABLE_V16=1",
"LIBOCPP_ENABLE_V2=1",
"MIGRATION_FILE_VERSION_V16=1",
"MIGRATION_FILE_VERSION_V2=6",
"MIGRATION_DEVICE_MODEL_FILE_VERSION_V2=3",
],
# See https://github.com/HowardHinnant/date/issues/324
local_defines = [
"BUILD_TZ_LIB=ON",
"USE_SYSTEM_TZ_DB=ON",
"USE_OS_TZDB=1",
"USE_AUTOLOAD=0",
"HAS_REMOTE_API=0",
],
)

View File

@@ -0,0 +1,137 @@
cmake_minimum_required(VERSION 3.14)
project(ocpp
VERSION 0.31.1
DESCRIPTION "A C++ implementation of the Open Charge Point Protocol"
LANGUAGES CXX
)
find_package(everest-cmake 0.1 REQUIRED
PATHS ../everest-cmake
)
# options
option(${PROJECT_NAME}_BUILD_TESTING "Build unit tests, used if included as dependency" OFF)
option(BUILD_TESTING "Build unit tests, used if standalone project" OFF)
option(CMAKE_RUN_CLANG_TIDY "Run clang-tidy" OFF)
option(LIBOCPP16_BUILD_EXAMPLES "Build charge_point binary" OFF)
option(OCPP_INSTALL "Install the library (shared data might be installed anyway)" ${EVC_MAIN_PROJECT})
option(LIBOCPP_ENABLE_DEPRECATED_WEBSOCKETPP "Websocket++ has been removed from the project" OFF)
option(LIBOCPP_ENABLE_V16 "Enable OCPP 1.6 in the ocpp library" ON)
option(LIBOCPP_ENABLE_V2 "Enable OCPP 2.0.1 and OCPP2.1 in the ocpp library" ON)
if((NOT LIBOCPP_ENABLE_V16) AND (NOT LIBOCPP_ENABLE_V2))
message(FATAL_ERROR "At least one of LIBOCPP_ENABLE_V16 and LIBOCPP_ENABLE_V2 needs to be ON")
endif()
if(LIBOCPP_ENABLE_DEPRECATED_WEBSOCKETPP)
message(FATAL_ERROR "Websocket++ has been removed")
endif()
if((${CMAKE_PROJECT_NAME} STREQUAL ${PROJECT_NAME} OR ${PROJECT_NAME}_BUILD_TESTING) AND BUILD_TESTING)
set(LIBOCPP_BUILD_TESTING ON)
evc_include(CodeCoverage)
append_coverage_compiler_flags()
endif()
# this policy allows us to continue using the removed FindBoost module for now
if(POLICY CMP0167)
cmake_policy(SET CMP0167 OLD)
endif()
# dependencies
find_package(Boost COMPONENTS program_options regex thread REQUIRED)
find_package(SQLite3 REQUIRED)
find_package(OpenSSL 3 REQUIRED)
if(NOT DISABLE_EDM)
evc_setup_edm()
# In EDM mode, we can't install exports (because the dependencies usually do not install their exports)
set(OCPP_INSTALL OFF)
else()
find_package(date REQUIRED)
find_package(nlohmann_json REQUIRED)
find_package(nlohmann_json_schema_validator REQUIRED)
find_package(libwebsockets REQUIRED)
endif()
# config and auxillary files
add_subdirectory(config/v16)
add_subdirectory(config/v2)
# library code
add_subdirectory(lib)
# packaging
if (OCPP_INSTALL)
install(
TARGETS ocpp
EXPORT ocpp-targets
)
install(
DIRECTORY include/
TYPE INCLUDE
)
install(
DIRECTORY 3rd_party/
TYPE INCLUDE
)
evc_setup_package(
NAME everest-ocpp
NAMESPACE everest
EXPORT ocpp-targets
ADDITIONAL_CONTENT
"find_dependency(OpenSSL)"
"find_dependency(SQLite3)"
"find_dependency(libwebsockets)"
)
endif()
if(LIBOCPP16_BUILD_EXAMPLES)
message("Building libocpp 1.6 example binaries.")
add_subdirectory(src)
else()
message("Not building libocpp 1.6 example binaries.")
endif()
# configure clang-tidy if requested
if(CMAKE_RUN_CLANG_TIDY)
message("Running clang-tidy")
string(CONCAT CLANG_TIDY_CHECKS "*,"
"-llvmlibc*,"
"-fuchsia-default-arguments-calls,"
"-fuchsia-overloaded-operator,"
"-fuchsia-statically-constructed-objects,"
"-readability-function-cognitive-complexity,"
"-modernize-use-trailing-return-type,"
"-abseil-string-find-startswith,"
"-abseil-string-find-str-contains,"
";")
set(CMAKE_CXX_CLANG_TIDY
clang-tidy;
-header-filter='.*'
-checks=${CLANG_TIDY_CHECKS}
-export-fixes=clang-tidy-fixes.yaml)
endif()
if(LIBOCPP_BUILD_TESTING)
include(CTest)
add_subdirectory(tests)
endif()
# build doxygen documentation if doxygen is available
find_package(Doxygen)
if(DOXYGEN_FOUND)
set(DOXYGEN_OUTPUT_DIRECTORY dist/docs)
set(DOXYGEN_USE_MDFILE_AS_MAINPAGE README.md)
doxygen_add_docs(doxygen-${PROJECT_NAME} README.md include lib src doc)
else()
message("Doxygen is needed to generate documentation")
endif()

View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -0,0 +1,146 @@
# C++ implementation of OCPP
![Github Actions](https://github.com/EVerest/libocpp/actions/workflows/build_and_test.yaml/badge.svg)
This is a C++ library implementation of OCPP for version 1.6, 2.0.1 and 2.1.
(see [OCPP protocols at OCA website](https://openchargealliance.org/protocols/open-charge-point-protocol/)).
The OCPP2.0.1 implementation of libocpp has been certified by the OCA for multiple hardware platforms.
Libocpp's approach to implementing the OCPP protocol is to address as much functional requirements as possible as part of the library.
Since OCPP is a protocol that affects, controls, and monitors many areas of a charging station's operation this library needs to be
integrated with your charging station firmware.
## Integration with EVerest
This library is integrated within the [OCPP](https://github.com/EVerest/EVerest/tree/main/modules/OCPP) and [OCPP201](https://github.com/EVerest/EVerest/tree/main/modules/OCPP201)
module within [EVerest](https://github.com/EVerest/EVerest) - the complete software stack for your charging station. It is recommended to use EVerest together with this OCPP implementation.
## Getting Started
Check out the [Getting Started guide](doc/common/getting_started.md). It should be you starting point if you want to integrate this library with your charging station firmware.
## Get Involved
See the [Contribution Guideline](https://everest.github.io/nightly/project/contributing.html) of the EVerest project to get involved.
## OCPP1.6
### Supported Feature Profiles
OCPP1.6 is fully implemented.
| Feature Profile | Supported |
| -------------------------- | ------------------------- |
| Core | ✅ yes |
| Firmware Management | ✅ yes |
| Local Auth List Management | ✅ yes |
| Reservation | ✅ yes |
| Smart Charging | ✅ yes |
| Remote Trigger | ✅ yes |
| Whitepapers & Application Notes | Supported |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
| [OCPP 1.6 Security Whitepaper (3rd edition)](https://openchargealliance.org/wp-content/uploads/2023/11/OCPP-1.6-security-whitepaper-edition-3-2.zip) | ✅ yes |
| [Using ISO 15118 Plug & Charge with OCPP 1.6](https://openchargealliance.org/wp-content/uploads/2023/11/ocpp_1_6_ISO_15118_v10.pdf) | ✅ yes |
| [OCPP & California Pricing Requirements](https://openchargealliance.org/wp-content/uploads/2024/09/ocpp_and_dms_evse_regulation-v3.1.pdf) | ✅ yes |
### CSMS Compatibility
The EVerest implementation of OCPP 1.6 has been tested against the
OCPP Compliance Test Tool (OCTT) during the implementation.
The following table shows the known CSMS with which this library was tested.
- chargecloud
- chargeIQ
- Chargetic
- Compleo
- Current
- Daimler Truck
- ev.energy
- eDRV
- Fastned
- [Open Charging Cloud (GraphDefined)](https://github.com/OpenChargingCloud/WWCP_OCPP)
- Electrip Global
- EnergyStacks
- EV-Meter
- Fraunhofer IAO (ubstack CHARGE)
- Green Motion
- gridundco
- ihomer (Infuse CPMS)
- iLumen
- JibeCompany (CharlieV CMS and Chargebroker proxy)
- MSI
- PUMP (PUMP Connect)
- Scoptvision (Scopt Powerconnect)
- Siemens
- [SteVe](https://github.com/steve-community/steve)
- Syntech
- Trialog
- ubitricity
- Weev Energy
## OCPP2.0.1
### Supported Functional Blocks
| Feature Profile | Supported |
| -------------------------------------| ------------------------- |
| A. Security | ✅ yes |
| B. Provisioning | ✅ yes |
| C. Authorization | ✅ yes |
| D. LocalAuthorizationList Management | ✅ yes |
| E. Transactions | ✅ yes |
| F. RemoteControl | ✅ yes |
| G. Availability | ✅ yes |
| H. Reservation | ✅ yes |
| I. TariffAndCost | ✅ yes |
| J. MeterValues | ✅ yes |
| K. SmartCharging | ✅ yes (except K11-K17) |
| L. FirmwareManagement | ✅ yes |
| M. ISO 15118 CertificateManagement | ✅ yes |
| N. Diagnostics | ✅ yes |
| O. DisplayMessage | ✅ yes |
| P. DataTransfer | ✅ yes |
Check the [detailed current implementation status.](doc/v2/ocpp_2x_status.md).
| Whitepapers & Application Notes | Supported |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
| [OCPP & California Pricing Requirements](https://openchargealliance.org/wp-content/uploads/2024/09/ocpp_and_dms_evse_regulation-v3.1.pdf) | ✅ yes |
### CSMS Compatibility OCPP 2.0.1
The implementation of OCPP 2.0.1 has been tested against the following CSMS and is continuously tested against OCTT2.
Additionally, the implementation has been tested against these CSMS:
- ChargeLab
- Chargepoint
- [CitrineOS](https://lfenergy.org/projects/citrineos/)
- Current
- Ecoenergetyca
- einfochips
- evgateway
- ihomer (Infuse CPMS)
- Instituto Tecnológico de la Energía (ITE)
- [MaEVe (Thoughtworks)](https://github.com/thoughtworks/maeve-csms)
- [Monta](https://monta.com)
- Numocity
- [Open Charging Cloud (GraphDefined)](https://github.com/OpenChargingCloud/WWCP_OCPP)
- Switch EV
- SWTCH
- Relion
- Syntech
- Vector
## OCPP2.1
The implementation of OCPP2.1 is currently under development 🔧.
OCPP2.1 websocket connections and messages are supported by the library. Every functional block and use case supported in OCPP2.0.1 is also supported in OCPP2.1. Additional functional blocks and new requirements are currently
implemented.
The functional blocks we are targeting first are the extensions to SmartCharging and support for Bidirectional Power Transfer.
Check the [detailed current implementation status.](doc/v2/ocpp_2x_status.md).

View File

@@ -0,0 +1 @@
_Use this file to list out any third-party dependencies used by this project. You may choose to point to a Gemfile or other language specific packaging file for details._

View File

@@ -0,0 +1,63 @@
function(collect_migration_files)
set(options "")
set(oneValueArgs LOCATION INSTALL_DESTINATION)
set(multiValueArgs "")
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT ARG_LOCATION)
message(FATAL_ERROR "No LOCATION provided, can't parse files")
endif()
if(NOT ${ARG_LOCATION} MATCHES "/$")
set(ARG_LOCATION "${ARG_LOCATION}/")
endif()
message("Parsing migration files in folder: ${ARG_LOCATION}")
file(GLOB MIGRATION_FILE_LIST RELATIVE ${ARG_LOCATION} "${ARG_LOCATION}*.sql") # ARG_LOCATION already contains the slash
list(SORT MIGRATION_FILE_LIST)
# The first file should always start with 1_up so make use of that fact.
# Next we always check the next number "down" and then "up" which come in order since we sorted alphabetically
set(CURRENT_MIGRATION_FILE_ID 1)
set(NEXT_MIGRATION_FILE_TYPE "up")
foreach(MIGRATION_FILE ${MIGRATION_FILE_LIST})
string(REGEX MATCH "^([0-9]+)_(up|down)(|-.+)\.sql$" MIGRATION_FILE_MATCHED ${MIGRATION_FILE})
if (MIGRATION_FILE_MATCHED STREQUAL "")
message(FATAL_ERROR "Migration filename does not match specification: " ${MIGRATION_FILE})
endif()
string(CONCAT NEXT_ID "^" ${CURRENT_MIGRATION_FILE_ID} "_")
if(NOT ${MIGRATION_FILE_MATCHED} MATCHES ${NEXT_ID})
message(FATAL_ERROR "Skipped migration file ID, expected " ${CURRENT_MIGRATION_FILE_ID} "_*.sql, but got " ${MIGRATION_FILE_MATCHED})
endif()
string(APPEND NEXT_ID ${NEXT_MIGRATION_FILE_TYPE})
if(NOT ${MIGRATION_FILE_MATCHED} MATCHES ${NEXT_ID})
message(FATAL_ERROR "Missing " ${NEXT_MIGRATION_FILE_TYPE} " migration file: " ${MIGRATION_FILE_MATCHED})
endif()
if(NEXT_MIGRATION_FILE_TYPE STREQUAL "up")
math(EXPR CURRENT_MIGRATION_FILE_ID "${CURRENT_MIGRATION_FILE_ID}+1")
set(NEXT_MIGRATION_FILE_TYPE "down")
elseif(NEXT_MIGRATION_FILE_TYPE STREQUAL "down")
set(NEXT_MIGRATION_FILE_TYPE "up")
endif()
endforeach()
if (NEXT_MIGRATION_FILE_TYPE STREQUAL "up")
message(FATAL_ERROR "Down migration file " ${CURRENT_MIGRATION_FILE_ID} "_*.sql is missing up migration file")
endif()
# Since we always add on the up file we need to subtract one here
math(EXPR CURRENT_MIGRATION_FILE_ID "${CURRENT_MIGRATION_FILE_ID}-1")
list(TRANSFORM MIGRATION_FILE_LIST PREPEND ${ARG_LOCATION})
if(ARG_INSTALL_DESTINATION)
install(FILES ${MIGRATION_FILE_LIST} DESTINATION ${ARG_INSTALL_DESTINATION})
endif()
set(TARGET_MIGRATION_FILE_VERSION ${CURRENT_MIGRATION_FILE_ID} PARENT_SCOPE)
set(MIGRATION_FILE_LIST ${MIGRATION_FILE_LIST} PARENT_SCOPE)
endfunction()

View File

@@ -0,0 +1,96 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for Connector",
"type": "object",
"name": "Connector",
"evse_id": 1,
"connector_id": 1,
"properties": {
"ConnectorAvailabilityState": {
"variable_name": "AvailabilityState",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "Available,Occupied,Reserved,Unavailable,Faulted"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "This variable reports current availability state for the Connector. Optional, because already reported in StatusNotification.",
"type": "string",
"default": "Available"
},
"ConnectorAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"description": "Component exists",
"type": "boolean",
"default": false
},
"ChargeProtocol": {
"variable_name": "ChargeProtocol",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "The Charging Control Protocol applicable to a Connector. CHAdeMO: CHAdeMO protocol, ISO15118: ISO15118 V2G protocol (wired or wireless) as used with CCS, CPPWM: IEC61851-1 / SAE J1772 protocol (ELV DC & PWM signalling via Control Pilot wire), Uncontrolled: No charging power management applies (e.g. Schuko socket), Undetermined: Yet to be determined (e.g. before plugged in), Unknown: Not determinable, NOTE: ChargeProtocol is distinct from and orthogonal to connectorType.",
"type": "string"
},
"ConnectorType": {
"variable_name": "ConnectorType",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "sType2"
}
],
"description": "A value of ConnectorEnumType (See part 2) plus additionally: cGBT, cChaoJi, OppCharge. Specific type of connector, including sub-variant information. Note: Distinct and orthogonal to Charging Protocol, Power Type, Phases.",
"type": "string",
"default": ""
},
"ConnectorSupplyPhases": {
"variable_name": "SupplyPhases",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 3
}
],
"description": "Number of alternating current phases connected/available.",
"type": "integer",
"default": "0"
}
},
"required": [
"ConnectorAvailable",
"ConnectorSupplyPhases",
"ConnectorType"
]
}

View File

@@ -0,0 +1,96 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for Connector",
"type": "object",
"name": "Connector",
"evse_id": 2,
"connector_id": 1,
"properties": {
"ConnectorAvailabilityState": {
"variable_name": "AvailabilityState",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "Available,Occupied,Reserved,Unavailable,Faulted"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "This variable reports current availability state for the Connector. Optional, because already reported in StatusNotification.",
"type": "string",
"default": "Available"
},
"ConnectorAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"description": "Component exists",
"type": "boolean",
"default": false
},
"ChargeProtocol": {
"variable_name": "ChargeProtocol",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "The Charging Control Protocol applicable to a Connector. CHAdeMO: CHAdeMO protocol, ISO15118: ISO15118 V2G protocol (wired or wireless) as used with CCS, CPPWM: IEC61851-1 / SAE J1772 protocol (ELV DC & PWM signalling via Control Pilot wire), Uncontrolled: No charging power management applies (e.g. Schuko socket), Undetermined: Yet to be determined (e.g. before plugged in), Unknown: Not determinable, NOTE: ChargeProtocol is distinct from and orthogonal to connectorType.",
"type": "string"
},
"ConnectorType": {
"variable_name": "ConnectorType",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "sType2"
}
],
"description": "A value of ConnectorEnumType (See part 2) plus additionally: cGBT, cChaoJi, OppCharge. Specific type of connector, including sub-variant information. Note: Distinct and orthogonal to Charging Protocol, Power Type, Phases.",
"type": "string",
"default": ""
},
"ConnectorSupplyPhases": {
"variable_name": "SupplyPhases",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 3
}
],
"description": "Number of alternating current phases connected/available.",
"type": "integer",
"default": "0"
}
},
"required": [
"ConnectorAvailable",
"ConnectorSupplyPhases",
"ConnectorType"
]
}

View File

@@ -0,0 +1,150 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for EVSE",
"type": "object",
"name": "EVSE",
"evse_id": 1,
"properties": {
"EVSEAllowReset": {
"variable_name": "AllowReset",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Can be used to announce that an EVSE can be reset individually",
"type": "boolean"
},
"EVSEAvailabilityState": {
"variable_name": "AvailabilityState",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "Available,Occupied,Reserved,Unavailable,Faulted"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "This variable reports current availability state for the EVSE",
"type": "string",
"default": "Unavailable"
},
"EVSEAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"description": "Component exists",
"type": "boolean",
"default": false
},
"EvseId": {
"variable_name": "EvseId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "The name of the EVSE in the string format as required by ISO 15118 and IEC 63119-2.",
"type": "string"
},
"EVSEPower": {
"variable_name": "Power",
"characteristics": {
"unit": "W",
"maxLimit": 22000,
"supportsMonitoring": true,
"dataType": "decimal"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
},
{
"type": "MaxSet",
"mutability": "ReadOnly"
}
],
"description": " kW,The variableCharacteristic maxLimit, that holds the maximum power that this EVSE can provide, is required. The Actual value of the instantaneous (real) power is desired, but not required.",
"type": "number",
"default": "0"
},
"EVSESupplyPhases": {
"variable_name": "SupplyPhases",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 3
}
],
"description": "Number of alternating current phases connected/available.",
"type": "integer",
"default": "0"
},
"ISO15118EvseId": {
"variable_name": "ISO15118EvseId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"minLimit": 7,
"maxLimit": 37
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "The name of the EVSE in the string format as required by ISO 15118 and IEC 63119-2. Example: \"DE*ICE*E*1234567890*1\"",
"type": "string"
},
"DCInputPhaseControl": {
"variable_name": "DCInputPhaseControl",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": false
}
],
"description": "When DCInputPhaseControl is true, then the values of numberPhases and PhaseToUse in a ChargingSchedulePeriodType will select the input phases from the grid to be used by the DC EVSE.",
"type": "boolean"
}
},
"required": [
"EVSEAvailabilityState",
"EVSEAvailable",
"EVSEPower",
"EVSESupplyPhases"
]
}

View File

@@ -0,0 +1,150 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for EVSE",
"type": "object",
"name": "EVSE",
"evse_id": 2,
"properties": {
"EVSEAllowReset": {
"variable_name": "AllowReset",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Can be used to announce that an EVSE can be reset individually",
"type": "boolean"
},
"EVSEAvailabilityState": {
"variable_name": "AvailabilityState",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "Available,Occupied,Reserved,Unavailable,Faulted"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "This variable reports current availability state for the EVSE",
"type": "string",
"default": "Unavailable"
},
"EVSEAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"description": "Component exists",
"type": "boolean",
"default": false
},
"EvseId": {
"variable_name": "EvseId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "The name of the EVSE in the string format as required by ISO 15118 and IEC 63119-2.",
"type": "string"
},
"EVSEPower": {
"variable_name": "Power",
"characteristics": {
"unit": "W",
"maxLimit": 22000,
"supportsMonitoring": true,
"dataType": "decimal"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
},
{
"type": "MaxSet",
"mutability": "ReadOnly"
}
],
"description": " kW,The variableCharacteristic maxLimit, that holds the maximum power that this EVSE can provide, is required. The Actual value of the instantaneous (real) power is desired, but not required.",
"type": "number",
"default": "0"
},
"EVSESupplyPhases": {
"variable_name": "SupplyPhases",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 3
}
],
"description": "Number of alternating current phases connected/available.",
"type": "integer",
"default": "0"
},
"ISO15118EvseId": {
"variable_name": "ISO15118EvseId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"minLimit": 7,
"maxLimit": 37
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "The name of the EVSE in the string format as required by ISO 15118 and IEC 63119-2. Example: \"DE*ICE*E*1234567890*1\"",
"type": "string"
},
"DCInputPhaseControl": {
"variable_name": "DCInputPhaseControl",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": false
}
],
"description": "When DCInputPhaseControl is true, then the values of numberPhases and PhaseToUse in a ChargingSchedulePeriodType will select the input phases from the grid to be used by the DC EVSE.",
"type": "boolean"
}
},
"required": [
"EVSEAvailabilityState",
"EVSEAvailable",
"EVSEPower",
"EVSESupplyPhases"
]
}

View File

@@ -0,0 +1,150 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for AlignedDataCtrlr",
"name": "AlignedDataCtrlr",
"type": "object",
"properties": {
"AlignedDataCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"default": true,
"type": "boolean"
},
"AlignedDataCtrlrAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "If this variable reports a value of true, Clock-Aligned Data is supported.",
"default": true,
"type": "boolean"
},
"AlignedDataInterval": {
"variable_name": "Interval",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 900
}
],
"description": "Size (in seconds) of the clock-aligned data interval, intended to be transmitted in the MeterValuesRequest message.",
"default": "900",
"type": "integer"
},
"AlignedDataMeasurands": {
"variable_name": "Measurands",
"characteristics": {
"valuesList": "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.Reactive.Export.Interval,Energy.Reactive.Import.Interval,Frequency,Power.Active.Export,Power.Active.Import,Power.Factor,Power.Offered,Power.Reactive.Export,Power.Reactive.Import,Voltage",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "Energy.Active.Import.Register,Voltage,Frequency"
}
],
"description": "Clock-aligned measurand(s) to be included in MeterValuesRequest, every AlignedDataInterval seconds.",
"default": "Energy.Active.Import.Register,Voltage",
"type": "string"
},
"AlignedDataSendDuringIdle": {
"variable_name": "SendDuringIdle",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": false
}
],
"description": "If set to true, the Charging Station SHALL NOT send clock aligned meter values when a transaction is ongoing.",
"type": "boolean"
},
"AlignedDataSignReadings": {
"variable_name": "SignReadings",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "If set to true, the Charging Station SHALL include signed meter values in the SampledValueType in the MeterValuesRequest to the CSMS.",
"default": false,
"type": "boolean"
},
"AlignedDataTxEndedInterval": {
"variable_name": "TxEndedInterval",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 60
}
],
"description": "Size (in seconds) of the clock-aligned data interval, intended to be transmitted in the TransactionEventRequest (eventType = Ended) message.",
"default": "60",
"type": "integer"
},
"AlignedDataTxEndedMeasurands": {
"variable_name": "TxEndedMeasurands",
"characteristics": {
"valuesList": "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.Reactive.Export.Interval,Energy.Reactive.Import.Interval,Frequency,Power.Active.Export,Power.Active.Import,Power.Factor,Power.Offered,Power.Reactive.Export,Power.Reactive.Import,Voltage",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "Energy.Active.Import.Register,Voltage"
}
],
"description": "Clock-aligned measurands to be included in the meterValues element of TransactionEventRequest (eventType = Ended), every SampledDataTxEndedInterval seconds from the start of the transaction.",
"default": "Energy.Active.Import.Register",
"type": "string"
}
},
"required": [
"AlignedDataInterval",
"AlignedDataMeasurands",
"AlignedDataTxEndedInterval",
"AlignedDataTxEndedMeasurands"
]
}

View File

@@ -0,0 +1,105 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for AuthCacheCtrlr",
"name": "AuthCacheCtrlr",
"type": "object",
"properties": {
"AuthCacheCtrlrAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"description": "Authorization caching is available, but not necessarily enabled.",
"default": true,
"type": "boolean"
},
"AuthCacheCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "If set to true, Authorization caching is enabled.",
"default": true,
"type": "boolean"
},
"AuthCacheLifeTime": {
"variable_name": "LifeTime",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Indicates how long it takes until a token expires in the authorization cache since it is last used",
"type": "integer"
},
"AuthCachePolicy": {
"variable_name": "Policy",
"characteristics": {
"valuesList": "LRU,LFU,FIFO,CUSTOM",
"supportsMonitoring": true,
"dataType": "OptionList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Cache Entry Replacement Policy: least recently used, least frequently used, first in first out, other custom mechanism.",
"type": "string"
},
"AuthCacheStorage": {
"variable_name": "Storage",
"characteristics": {
"unit": "B",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Indicates the number of bytes currently used by the Authorization Cache. MaxLimit indicates the maximum number of bytes that can be used by the Authorization Cache.",
"type": "integer"
},
"AuthCacheDisablePostAuthorize": {
"variable_name": "DisablePostAuthorize",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "When set to true this variable disables the behavior to request authorization for an idToken that is stored in the cache with a status other than Accepted, as stated in C10.FR.03 and C12.FR.05.",
"type": "boolean"
}
},
"required": []
}

View File

@@ -0,0 +1,142 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for AuthCtrlr",
"name": "AuthCtrlr",
"type": "object",
"properties": {
"AuthCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"default": true,
"type": "boolean"
},
"AdditionalInfoItemsPerMessage": {
"variable_name": "AdditionalInfoItemsPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Maximum number of AdditionalInfo items that can be sent in one message.",
"type": "integer"
},
"AuthorizeRemoteStart": {
"variable_name": "AuthorizeRemoteStart",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "Whether a remote request to start a transaction in the form of RequestStartTransactionRequest message should be authorized beforehand like a local action to start a transaction.",
"default": true,
"type": "boolean"
},
"LocalAuthorizeOffline": {
"variable_name": "LocalAuthorizeOffline",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "Whether the Charging Station, when Offline, will start a transaction for locally-authorized identifiers,",
"default": true,
"type": "boolean"
},
"LocalPreAuthorize": {
"variable_name": "LocalPreAuthorize",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "Whether the Charging Station, when online, will start a transaction for locally-authorized identifiers without waiting for or requesting an AuthorizeResponse from the CSMS.",
"default": true,
"type": "boolean"
},
"MasterPassGroupId": {
"variable_name": "MasterPassGroupId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "123"
}
],
"description": "IdTokens that have this id as groupId belong to the Master Pass Group. Meaning they can stop any ongoing transaction, but cannot start transactions.",
"type": "string"
},
"OfflineTxForUnknownIdEnabled": {
"variable_name": "OfflineTxForUnknownIdEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Support for unknown offline transactions.",
"default": true,
"type": "boolean"
},
"DisableRemoteAuthorization": {
"variable_name": "DisableRemoteAuthorization",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "When set to true this instructs the Charging Station to not issue any AuthorizationRequests, but only use Authorization Cache and Local Authorization List to determine validity of idTokens.",
"type": "boolean"
}
},
"required": [
"AuthorizeRemoteStart",
"LocalAuthorizeOffline",
"LocalPreAuthorize"
]
}

View File

@@ -0,0 +1,138 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for ChargingStation",
"type": "object",
"name": "ChargingStation",
"properties": {
"AllowNewSessionsPendingFirmwareUpdate": {
"variable_name": "AllowNewSessionsPendingFirmwareUpdate",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"instance": "BytesPerMessage",
"description": "Indicates whether new sessions can be started on EVSEs, while Charging Station is waiting for all EVSEs to become Available in order to start a pending firmware update",
"type": "boolean"
},
"ChargingStationAvailabilityState": {
"variable_name": "AvailabilityState",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "Available,Occupied,Reserved,Unavailable,Faulted"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "This variable reports current availability state for the ChargingStation",
"type": "string",
"default": "Available"
},
"ChargingStationPhaseRotation": {
"variable_name": "PhaseRotation",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "RST"
}
],
"description": "This variable describes the phase rotation of a Component relative to its parent Component, using a three letter string consisting of the letters: R, S, T and x.",
"type": "string"
},
"ChargingStationAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"description": "Component exists",
"type": "boolean"
},
"ChargingStationModel": {
"variable_name": "Model",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "Charging station model as reported in BootNotification.",
"type": "string"
},
"ChargingStationSupplyPhases": {
"variable_name": "SupplyPhases",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 3
}
],
"description": "Number of alternating current phases connected/available.",
"type": "integer"
},
"ChargingStationVendorName": {
"variable_name": "VendorName",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "Charging station vendor name as reported in BootNotification.",
"type": "string"
},
"ChargingStationProblem": {
"variable_name": "Problem",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": false
}
],
"description": "Some problem/fault exists",
"type": "boolean"
}
},
"required": [
"ChargingStationAvailabilityState",
"ChargingStationAvailable",
"ChargingStationSupplyPhases"
]
}

View File

@@ -0,0 +1,42 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for Charging Status Indicator",
"type": "object",
"name": "ChargingStatusIndicator",
"properties": {
"ChargingStatusIndicatorActive": {
"variable_name": "Active",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": false
}
],
"description": "Lighted",
"type": "boolean"
},
"ChargingStatusIndicatorColor": {
"variable_name": "Color",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "FFFF00"
}
],
"description": "Displayed color",
"type": "string"
}
},
"required": [
]
}

View File

@@ -0,0 +1,167 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for ClockCtrlr",
"name": "ClockCtrlr",
"type": "object",
"properties": {
"ClockCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"type": "boolean"
},
"ClockCtrlrDateTime": {
"variable_name": "DateTime",
"characteristics": {
"supportsMonitoring": true,
"dataType": "dateTime"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": ""
}
],
"description": "Contains the current date and time,",
"type": "string"
},
"NextTimeOffsetTransitionDateTime": {
"variable_name": "NextTimeOffsetTransitionDateTime",
"characteristics": {
"supportsMonitoring": true,
"dataType": "dateTime"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Date time of the next time offset transition.",
"type": "string"
},
"NtpServerUri": {
"variable_name": "NtpServerUri",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "This contains the address of the NTP server.",
"type": "string"
},
"NtpSource": {
"variable_name": "NtpSource",
"characteristics": {
"valuesList": "DHCP,manual",
"supportsMonitoring": true,
"dataType": "OptionList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "When an NTP client is implemented, this variable can be used to configure the client",
"type": "string"
},
"TimeAdjustmentReportingThreshold": {
"variable_name": "TimeAdjustmentReportingThreshold",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "If set, then time adjustments with an absolute value in seconds larger than this need to be reported as a security event SettingSystemTime",
"type": "integer"
},
"TimeOffset": {
"variable_name": "TimeOffset",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "A Time Offset with respect to Coordinated Universal Time (aka UTC or Greenwich Mean Time) in the form of an [RFC3339] time (zone) offset suffix, including the mandatory \u201c+\u201d or \u201c-\u201c prefix.",
"type": "string"
},
"TimeOffsetNextTransition": {
"variable_name": "TimeOffset",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"instance": "NextTransition",
"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"
},
"TimeSource": {
"variable_name": "TimeSource",
"characteristics": {
"valuesList": "Heartbeat,NTP,GPS,RealTimeClock,MobileNetwork,RadioTimeTransmitter",
"supportsMonitoring": true,
"dataType": "SequenceList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "Heartbeat"
}
],
"description": "Via this variable, the Charging Station provides the CSMS with the option to configure multiple clock sources",
"type": "string"
},
"TimeZone": {
"variable_name": "TimeZone",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Configured current local time zone in the format: \"Europe/Oslo\", \"Asia/Singapore\" etc. For display purposes.",
"type": "string"
}
},
"required": [
"ClockCtrlrDateTime",
"TimeSource"
]
}

View File

@@ -0,0 +1,70 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for CustomizationCtrlr",
"name": "CustomizationCtrlr",
"type": "object",
"properties": {
"": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"type": "boolean"
},
"CustomImplementationEnabled": {
"variable_name": "CustomImplementationEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Custom implementation <vendorId> has been enabled.",
"type": "boolean"
},
"CustomImplementationCaliforniaPricingEnabled": {
"variable_name": "CustomImplementationEnabled",
"instance": "org.openchargealliance.costmsg",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Custom implementation org.openchargealliance.costmsg (California Pricing) has been enabled.",
"type": "boolean"
},
"CustomImplementationMultiLanguageEnabled": {
"variable_name": "CustomImplementationEnabled",
"instance": "org.openchargealliance.multilanguage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Custom implementation org.openchargealliance.multilanguage has been enabled.",
"type": "boolean"
}
},
"required": []
}

View File

@@ -0,0 +1,180 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for DeviceDataCtrlr",
"name": "DeviceDataCtrlr",
"type": "object",
"properties": {
"DeviceDataCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"type": "boolean"
},
"BytesPerMessageGetReport": {
"variable_name": "BytesPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 2048
}
],
"instance": "GetReport",
"description": "Maximum number of bytes in a message related to instance name: GetReport, GetVariables, SetVariables",
"type": "integer"
},
"BytesPerMessageGetVariables": {
"variable_name": "BytesPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 2048
}
],
"instance": "GetVariables",
"description": "Maximum number of bytes in a message related to instance name: GetReport, GetVariables, SetVariables",
"type": "integer"
},
"BytesPerMessageSetVariables": {
"variable_name": "BytesPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 2048
}
],
"instance": "SetVariables",
"description": "Maximum number of bytes in a message related to instance name: GetReport, GetVariables, SetVariables",
"type": "integer"
},
"ConfigurationValueSize": {
"variable_name": "ConfigurationValueSize",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "The limit to the following fields: SetVariableData.attributeValue and VariableCharacteristics.valueList. The max size of these values will always remain equal.",
"type": "integer"
},
"ItemsPerMessageGetReport": {
"variable_name": "ItemsPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 100
}
],
"instance": "GetReport",
"description": "Maximum number of ComponentVariable entries in message related to the instance name: GetReport, GetVariables, SetVariables",
"type": "integer"
},
"ItemsPerMessageGetVariables": {
"variable_name": "ItemsPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 100
}
],
"instance": "GetVariables",
"description": "Maximum number of ComponentVariable entries in message related to the instance name: GetReport, GetVariables, SetVariables",
"type": "integer"
},
"ItemsPerMessageSetVariables": {
"variable_name": "ItemsPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 100
}
],
"instance": "SetVariables",
"description": "Maximum number of ComponentVariable entries in message related to the instance name: GetReport, GetVariables, SetVariables",
"type": "integer"
},
"ReportingValueSize": {
"variable_name": "ReportingValueSize",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 2500
}
],
"description": "The limit to the following fields: GetVariableResult.attributeValue, VariableAttribute.value and EventData.actualValue. The max size of these values will always remain equal.",
"type": "integer"
},
"ValueSize": {
"variable_name": "ValueSize",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"mutability": "ReadOnly",
"type": "Actual",
"value": 2500
}
],
"description": "Can be used to limit the following fields: SetVariableData.attributeValue, GetVariableResult.attributeValue, VariableAttribute.value, VariableCharacteristics.valueList and EventData.actualValue.",
"type": "integer"
}
},
"required": [
"BytesPerMessageGetReport",
"BytesPerMessageGetVariables",
"BytesPerMessageSetVariables",
"ItemsPerMessageGetReport",
"ItemsPerMessageGetVariables",
"ItemsPerMessageSetVariables"
]
}

View File

@@ -0,0 +1,156 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for DisplayMessageCtrlr",
"name": "DisplayMessageCtrlr",
"type": "object",
"properties": {
"DisplayMessageCtrlrAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Whether display messages are supported.",
"type": "boolean"
},
"NumberOfDisplayMessages": {
"variable_name": "DisplayMessages",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 42
}
],
"description": "Amount of different messages that are currently configured in this Charging Station, via SetDisplayMessageRequest",
"type": "integer"
},
"DisplayMessageCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "Whether display messages are enabled.",
"type": "boolean"
},
"PersonalMessageSize": {
"variable_name": "PersonalMessageSize",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "Max size (in characters) of the personal message element of the IdTokenInfo data (0 specifies no personal data may be stored).",
"type": "integer"
},
"DisplayMessageSupportedFormats": {
"variable_name": "SupportedFormats",
"characteristics": {
"valuesList": "ASCII,HTML,URI,UTF8",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "UTF8,ASCII,URI"
}
],
"description": "List of message formats supported by this Charging Station.",
"type": "string"
},
"DisplayMessageSupportedPriorities": {
"variable_name": "SupportedPriorities",
"characteristics": {
"valuesList": "AlwaysFront,InFront,NormalCycle",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "NormalCycle"
}
],
"description": "List of the priorities supported by this Charging Station.",
"type": "string"
},
"DisplayMessageSupportedStates": {
"variable_name": "SupportedStates",
"characteristics": {
"valuesList": "Charging,Faulted,Idle,Unavailable",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "List of the priorities supported by this Charging Station.",
"type": "string",
"default": "Charging,Faulted,Idle,Unavailable"
},
"QRCodeDisplayCapable": {
"variable_name": "QRCodeDisplayCapable",
"characteristics": {
"dataType": "boolean",
"supportsMonitoring": true
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Whether the station can display QR codes or not.",
"type": "boolean"
},
"DisplayMessageLanguage": {
"variable_name": "Language",
"characteristics": {
"valuesList": "en_US,de,nl",
"supportsMonitoring": true,
"dataType": "OptionList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Default language of the charging station. Note: set all supported languages by this charging station in 'valuesList' of this Variable.",
"type": "string"
}
},
"required": [
"DisplayMessageSupportedFormats",
"DisplayMessageSupportedPriorities",
"NumberOfDisplayMessages"
]
}

View File

@@ -0,0 +1,208 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for ISO15118Ctrlr",
"name": "ISO15118Ctrlr",
"type": "object",
"properties": {
"ISO15118CtrlrAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"type": "boolean"
},
"ISO15118CtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"type": "boolean"
},
"CentralContractValidationAllowed": {
"variable_name": "CentralContractValidationAllowed",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "If this variable exists and has the value true, then Charging Station can provide a contract certificate that it cannot validate, to the CSMS for validation as part of the AuthorizeRequest.",
"type": "boolean"
},
"ContractValidationOffline": {
"variable_name": "ContractValidationOffline",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "If this variable is true, then Charging Station will try to validate a contract certificate when it is offline",
"type": "boolean"
},
"SeccId": {
"variable_name": "SeccId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "The ID of the SECC in string format as defined by ISO15118.",
"type": "string"
},
"MaxScheduleEntries": {
"variable_name": "MaxScheduleEntries",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "Maximum number of allowed schedule periods.",
"type": "integer"
},
"RequestedEnergyTransferMode": {
"variable_name": "RequestedEnergyTransferMode",
"characteristics": {
"valuesList": "DC,AC_single_phase,AC_two_phase,AC_three_phase",
"supportsMonitoring": true,
"dataType": "OptionList"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "The requested energy transfer mode.",
"type": "string"
},
"RequestMeteringReceipt": {
"variable_name": "RequestMeteringReceipt",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "If true, then Charging Station shall request a metering receipt from EV.",
"type": "boolean"
},
"ISO15118CtrlrCountryName": {
"variable_name": "CountryName",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "The countryName of the SECC in the ISO 3166-1 format. It is used as the countryName (C) of the SECC leaf certificate. Example: \"DE\"",
"type": "string"
},
"ISO15118CtrlrOrganizationName": {
"variable_name": "OrganizationName",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "The organizationName of the CSO operating the charging station. It is used as the organizationName (O) of the SECC leaf certificate. Example: \"John Doe Charging Services Ltd\" Note: This value will usually be identical to SecurityCtrlr.OrganizationName, but it does not have to be.",
"type": "string"
},
"PnCEnabled": {
"variable_name": "PnCEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "If this variable is true, then ISO 15118 plug and charge as described by use case C07 - Authorization using Contract Certificates is enabled. If this variable is false, then ISO 15118 plug and charge as described by use case C07 - Authorization using Contract Certificates is disabled.",
"type": "boolean"
},
"V2GCertificateInstallationEnabled": {
"variable_name": "V2GCertificateInstallationEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "If this variable is true, then ISO 15118 V2G Charging Station certificate installation as described by use case A02 - Update Charging Station Certificate by request of CSMS and A03 - Update Charging Station Certificate initiated by the Charging Station is enabled. If this variable is false, then ISO 15118 V2G Charging Station certificate installation as described by use case A02 - Update Charging Station Certificate by request of CSMS and A03 - Update Charging Station Certificate initiated by the Charging Station is disabled.",
"type": "boolean"
},
"ContractCertificateInstallationEnabled": {
"variable_name": "ContractCertificateInstallationEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "If this variable is true, then ISO 15118 contract certificate installation/update as described by use case M01 - Certificate installation EV and M02 - Certificate Update EV is enabled. If this variable is false, then ISO 15118 contract certificate installation/update as described by use case M01 - Certificate installation EV and M02 - Certificate Update EV is disabled.",
"type": "boolean"
}
},
"required": [
"ContractValidationOffline"
]
}

View File

@@ -0,0 +1,887 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for InternalCtrlr",
"name": "InternalCtrlr",
"type": "object",
"properties": {
"InternalCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"default": true,
"type": "boolean"
},
"ChargePointId": {
"variable_name": "ChargePointId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "cp001"
}
],
"minLength": 1,
"type": "string"
},
"NetworkConnectionProfiles": {
"variable_name": "NetworkConnectionProfiles",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "[{\"configurationSlot\": 1, \"connectionData\": {\"messageTimeout\": 30, \"ocppCsmsUrl\": \"ws://localhost:9000\", \"ocppInterface\": \"Wired0\", \"ocppTransport\": \"JSON\", \"ocppVersion\": \"OCPP20\", \"securityProfile\": 1}}]"
}
],
"description": "List of NetworkConnectionProfiles that define the functional and technical parameters of a communication link. Must be a (JSON) string with the format of SetNetworkProfileRequest",
"default": "[{\\\"configurationSlot\\\": 1, \\\"connectionData\\\": {\\\"messageTimeout\\\": 30, \\\"ocppCsmsUrl\\\": \\\"ws://localhost:9000/cp001\\\", \\\"ocppInterface\\\": \\\"Wired0\\\", \\\"ocppTransport\\\": \\\"JSON\\\", \\\"ocppVersion\\\": \\\"OCPP20\\\", \\\"securityProfile\\\": 1}}]\n",
"type": "string"
},
"ChargeBoxSerialNumber": {
"variable_name": "ChargeBoxSerialNumber",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "012345678"
}
],
"minLength": 1,
"maxLength": 25,
"type": "string"
},
"ChargePointModel": {
"variable_name": "ChargePointModel",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "EVerestModel"
}
],
"minLength": 1,
"maxLength": 20,
"type": "string"
},
"ChargePointSerialNumber": {
"variable_name": "ChargePointSerialNumber",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"minLength": 1,
"maxLength": 25,
"type": "string"
},
"ChargePointVendor": {
"variable_name": "ChargePointVendor",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "EVerestVendor"
}
],
"minLength": 1,
"maxLength": 20,
"type": "string"
},
"FirmwareVersion": {
"variable_name": "FirmwareVersion",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "1.0"
}
],
"minLength": 1,
"maxLength": 50,
"type": "string"
},
"ICCID": {
"variable_name": "ICCID",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"minLength": 1,
"maxLength": 20,
"type": "string"
},
"IMSI": {
"variable_name": "IMSI",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"minLength": 1,
"maxLength": 20,
"type": "string"
},
"MeterSerialNumber": {
"variable_name": "MeterSerialNumber",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"minLength": 1,
"maxLength": 25,
"type": "string"
},
"MeterType": {
"variable_name": "MeterType",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"minLength": 1,
"maxLength": 25,
"type": "string"
},
"SupportedCiphers12": {
"variable_name": "SupportedCiphers12",
"characteristics": {
"valuesList": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-GCM-SHA384",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-GCM-SHA384"
}
],
"default": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-GCM-SHA384",
"minLength": 0,
"type": "string"
},
"SupportedCiphers13": {
"variable_name": "SupportedCiphers13",
"characteristics": {
"valuesList": "TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256"
}
],
"default": "TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256",
"minLength": 0,
"type": "string"
},
"AuthorizeConnectorZeroOnConnectorOne": {
"variable_name": "AuthorizeConnectorZeroOnConnectorOne",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": true,
"type": "boolean"
},
"LogMessages": {
"variable_name": "LogMessages",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": true,
"type": "boolean"
},
"LogMessagesRaw": {
"variable_name": "LogMessagesRaw",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "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.",
"default": false,
"type": "boolean"
},
"LogMessagesFormat": {
"variable_name": "LogMessagesFormat",
"characteristics": {
"valuesList": "log,html,console,console_detailed,callback,security",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "log,html,security"
}
],
"description": "Supported log formats are console, log, html, console_detailed, callback and security. \"security\" logs security events into a seperate logfile",
"default": "log,html,security",
"type": "string"
},
"LogRotation": {
"variable_name": "LogRotation",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Enable log rotation",
"default": false,
"type": "boolean"
},
"LogRotationDateSuffix": {
"variable_name": "LogRotationDateSuffix",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Use a datetime suffix in log rotation files instead of the traditional .0, .1",
"default": false,
"type": "boolean"
},
"LogRotationMaximumFileSize": {
"variable_name": "LogRotationMaximumFileSize",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Maximum file size in bytes for the log file after which it will be rotated. Setting this to 0 disables log rotation.",
"default": 0,
"type": "integer"
},
"LogRotationMaximumFileCount": {
"variable_name": "LogRotationMaximumFileCount",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Maximum amount of files before rotated logs will be deleted. Setting this to 0 disables log rotation.",
"default": 0,
"type": "integer"
},
"SupportedChargingProfilePurposeTypes": {
"variable_name": "SupportedChargingProfilePurposeTypes",
"characteristics": {
"valuesList": "ChargePointMaxProfile,TxDefaultProfile,TxProfile",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": "ChargePointMaxProfile,TxDefaultProfile,TxProfile",
"type": "string"
},
"MaxCompositeScheduleDuration": {
"variable_name": "MaxCompositeScheduleDuration",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": "31536000",
"type": "integer"
},
"NumberOfConnectors": {
"variable_name": "NumberOfConnectors",
"characteristics": {
"minLimit": 1,
"maxLimit": 128,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 1
}
],
"minimum": 1,
"maximum": 128,
"default": "1",
"type": "integer"
},
"UseSslDefaultVerifyPaths": {
"variable_name": "UseSslDefaultVerifyPaths",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Use default verify paths for validating CSMS server certificate",
"default": true,
"type": "boolean"
},
"VerifyCsmsCommonName": {
"variable_name": "VerifyCsmsCommonName",
"characteristics": {
"supportsMonitoring": false,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": true,
"type": "boolean"
},
"UseTPM": {
"description": "Indicates if TPM is used to generate and retrieve private keys for the CSMS leaf certificate",
"variable_name": "UseTPM",
"characteristics": {
"supportsMonitoring": false,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": false,
"type": "boolean"
},
"UseTPMSeccLeafCertificate": {
"description": "Indicates if TPM is used to generate and retrieve private keys for the SECC leaf certificate",
"variable_name": "UseTPMSeccLeafCertificate",
"characteristics": {
"supportsMonitoring": false,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": false,
"type": "boolean"
},
"VerifyCsmsAllowWildcards": {
"variable_name": "VerifyCsmsAllowWildcards",
"characteristics": {
"supportsMonitoring": false,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"default": false,
"type": "boolean"
},
"IFace": {
"variable_name": "IFace",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": "",
"type": "string"
},
"EnableTLSKeylog": {
"variable_name": "EnableTLSKeylog",
"characteristics": {
"supportsMonitoring": false,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"default": false,
"type": "boolean"
},
"TLSKeylogFile": {
"variable_name": "TLSKeylogFile",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": "/tmp/ocpp_tlskey.log",
"type": "string"
},
"OcspRequestInterval": {
"variable_name": "OcspRequestInterval",
"characteristics": {
"minLimit": 86400,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Interval in seconds used to request OCSP revocation status information on the CSO Sub-CA certificates",
"minimum": 86400,
"default": "604800",
"type": "integer"
},
"WebsocketPingPayload": {
"variable_name": "WebsocketPingPayload",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": "hello there",
"type": "string"
},
"WebsocketPongTimeout": {
"variable_name": "WebsocketPongTimeout",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"default": "5",
"type": "integer"
},
"MonitorsProcessingInterval": {
"variable_name": "MonitorsProcessingInterval",
"characteristics": {
"supportsMonitoring": false,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Defines the interval at which the periodic monitors will be processed, in seconds",
"default": "1",
"type": "integer"
},
"MaxCustomerInformationDataLength": {
"variable_name": "MaxCustomerInformationDataLength",
"characteristics": {
"minLimit": 512,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Maximum number of characters of Customer Information data",
"minimum": 512,
"default": "51200",
"type": "integer"
},
"V2GCertificateExpireCheckInitialDelaySeconds": {
"variable_name": "V2GCertificateExpireCheckInitialDelaySeconds",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Seconds to wait after boot notification to first check the V2G leaf certificate for expiration and potential renewal",
"default": "60",
"type": "integer"
},
"V2GCertificateExpireCheckIntervalSeconds": {
"variable_name": "V2GCertificateExpireCheckIntervalSeconds",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Seconds between two checks for V2G leaf certificate expiration and potential renewal",
"default": "43200",
"type": "integer"
},
"ClientCertificateExpireCheckInitialDelaySeconds": {
"variable_name": "ClientCertificateExpireCheckInitialDelaySeconds",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Seconds to wait after boot notification to first check the client certificate for expiration and potential renewal",
"default": "60",
"type": "integer"
},
"ClientCertificateExpireCheckIntervalSeconds": {
"variable_name": "ClientCertificateExpireCheckIntervalSeconds",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Seconds between two checks for client certificate expiration and potential renewal",
"default": "43200",
"type": "integer"
},
"UpdateCertificateSymlinks": {
"variable_name": "UpdateCertificateSymlinks",
"characteristics": {
"supportsMonitoring": false,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": false
}
],
"default": false,
"type": "boolean"
},
"MessageQueueSizeThreshold": {
"variable_name": "MessageQueueSizeThreshold",
"characteristics": {
"minLimit": 1,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "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.",
"minimum": 1,
"type": "integer"
},
"MaxMessageSize": {
"variable_name": "MaxMessageSize",
"characteristics": {
"minLimit": 1,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Maximum size in bytes for messages sent to the CSMS via websocket. If a message exceeds this size and is eligible to be split into multiple messages, it will be split. Otherwise, this value is ignored.",
"minimum": 1,
"default": "32000",
"type": "integer"
},
"SupportedCriteria": {
"variable_name": "SupportedCriteria",
"characteristics": {
"supportsMonitoring": true,
"dataType": "MemberList",
"valuesList": "Enabled,Active,Problem,Available"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "Enabled,Active,Available,Problem"
}
],
"description": "List of criteria supported for a get custom report. Enabled,Active,Problem,Available",
"default": "Enabled,Active,Problem,Available",
"type": "string"
},
"RoundClockAlignedTimestamps": {
"variable_name": "RoundClockAlignedTimestamps",
"characteristics": {
"supportsMonitoring": false,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": false
}
],
"description": "If enabled the metervalues configured with the AlignedDataCtrlr will be rounded to the exact time intervals",
"default": false,
"type": "boolean"
},
"ResumeTransactionsOnBoot": {
"variable_name": "ResumeTransactionsOnBoot",
"characteristics": {
"supportsMonitoring": false,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "If enabled the transactions that were active before shutdown will be resumed, if possible",
"default": false,
"type": "boolean"
},
"NetworkConfigTimeout": {
"variable_name": "NetworkConfigTimeout",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"minLimit": 1
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Timeout value in seconds to wait for a response from a network configuration request",
"minimum": 1,
"default": "60",
"type": "integer"
},
"AllowCSMSRootCertInstallWithUnsecureConnection": {
"variable_name": "AllowCSMSRootCertInstallWithUnsecureConnection",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "The flag that indicates if installation of CSMSRootCertificate is allowed when security profile is 1.",
"default": true,
"type": "boolean"
},
"AllowMFRootCertInstallWithUnsecureConnection": {
"variable_name": "AllowMFRootCertInstallWithUnsecureConnection",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "The flag that indicates if installation of ManufacturerRootCertificate is allowed when security profile is 1.",
"default": true,
"type": "boolean"
},
"AllowSecurityLevelZeroConnections": {
"variable_name": "AllowSecurityLevelZeroConnections",
"characteristics": {
"supportsMonitoring": false,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "If enabled we allow connections using security level 0. This does pose a security risk and is not allowed according to the OCPP spec",
"default": false,
"type": "boolean"
},
"SupportedOcppVersions": {
"variable_name": "SupportedOcppVersions",
"characteristics": {
"supportsMonitoring": true,
"dataType": "SequenceList",
"valuesList": "ocpp2.0.1,ocpp2.1"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "ocpp2.1,ocpp2.0.1"
}
],
"description": "List of supported OCPP versions in order of preference",
"default": "ocpp2.1,ocpp2.0.1",
"type": "string"
}
},
"required": [
"ChargeBoxSerialNumber",
"ChargePointId",
"ChargePointModel",
"ChargePointVendor",
"FirmwareVersion",
"LogMessagesFormat",
"NetworkConnectionProfiles",
"NumberOfConnectors",
"SupportedCiphers12",
"SupportedCiphers13",
"SupportedOcppVersions"
]
}

View File

@@ -0,0 +1,125 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for LocalAuthListCtrlr",
"name": "LocalAuthListCtrlr",
"type": "object",
"properties": {
"LocalAuthListCtrlrAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Local Authorization List is available.",
"default": true,
"type": "boolean"
},
"BytesPerMessageSendLocalList": {
"variable_name": "BytesPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 4096
}
],
"description": "Maximum number of bytes in a SendLocalList message.",
"type": "integer"
},
"LocalAuthListCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "If this variable exists and reports a value of true, Local Authorization List is enabled.",
"default": true,
"type": "boolean"
},
"LocalAuthListCtrlrEntries": {
"variable_name": "Entries",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 0
}
],
"description": "Amount of IdTokens currently in the Local Authorization List",
"type": "integer"
},
"ItemsPerMessageSendLocalList": {
"variable_name": "ItemsPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 250
}
],
"description": "Maximum number of records in SendLocalList",
"type": "integer"
},
"LocalAuthListCtrlrStorage": {
"variable_name": "Storage",
"characteristics": {
"unit": "B",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Indicates the number of bytes currently used by the Local Authorization List. MaxLimit indicates the maximum number of bytes that can be used by the Local Authorization List.",
"type": "integer"
},
"LocalAuthListCtrlrDisablePostAuthorize": {
"variable_name": "DisablePostAuthorize",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "When set to true this variable disables the behavior to request authorization for an idToken that is stored in the local authorization list with a status other than Accepted, as stated in C14.FR.03.",
"type": "boolean"
}
},
"required": [
"BytesPerMessageSendLocalList",
"ItemsPerMessageSendLocalList",
"LocalAuthListCtrlrEntries"
]
}

View File

@@ -0,0 +1,159 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for MonitoringCtrlr",
"name": "MonitoringCtrlr",
"type": "object",
"properties": {
"MonitoringCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": false
}
],
"description": "Whether monitoring is enabled.",
"default": false,
"type": "boolean"
},
"MonitoringCtrlrAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Whether monitoring is available,",
"type": "boolean",
"default": true
},
"ActiveMonitoringBase": {
"variable_name": "ActiveMonitoringBase",
"characteristics": {
"valuesList": "All,FactoryDefault,HardWiredOnly",
"supportsMonitoring": true,
"dataType": "OptionList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Shows the currently used MonitoringBase. Valid values according MonitoringBaseEnumType: All, FactoryDefault, HardwiredOnly.",
"type": "string"
},
"ActiveMonitoringLevel": {
"variable_name": "ActiveMonitoringLevel",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Shows the currently used MonitoringLevel. Valid values are severity levels of SetMonitoringLevelRequest: 0-9.",
"type": "integer",
"default": 9
},
"OfflineQueuingSeverity": {
"variable_name": "OfflineQueuingSeverity",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "When set and the Charging Station is offline, the Charging Station shall queue any notifyEventRequest messages triggered by a monitor with a severity number equal to or lower than the severity configured here.",
"type": "integer",
"default": 9
},
"BytesPerMessageClearVariableMonitoring": {
"variable_name": "BytesPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"instance": "ClearVariableMonitoring",
"description": "Maximum number of bytes in a ClearVariableMonitoring message.",
"type": "integer"
},
"BytesPerMessageSetVariableMonitoring": {
"variable_name": "BytesPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 4000
}
],
"instance": "SetVariableMonitoring",
"description": "Maximum number of bytes in a SetVariableMonitoring message,",
"type": "integer"
},
"ItemsPerMessageClearVariableMonitoring": {
"variable_name": "ItemsPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"instance": "ClearVariableMonitoring",
"description": "Maximum number of IDs in a ClearVariableMonitoringRequest.",
"type": "integer"
},
"ItemsPerMessageSetVariableMonitoring": {
"variable_name": "ItemsPerMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 250
}
],
"instance": "SetVariableMonitoring",
"description": "Maximum number of setMonitoringData elements that can be sent in one setVariableMonitoringRequest message.",
"type": "integer"
}
},
"required": [
"BytesPerMessageSetVariableMonitoring",
"ItemsPerMessageSetVariableMonitoring"
]
}

View File

@@ -0,0 +1,459 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for NetworkConfiguration slot 1 (bootstrap profile; ships with sane defaults so factory image can attempt initial connect; subsequent slots have no defaults and require explicit operator/CSMS configuration)",
"type": "object",
"name": "NetworkConfiguration",
"instance": "1",
"properties": {
"OcppCsmsUrl": {
"variable_name": "OcppCsmsUrl",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 2000
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "OCPP CSMS URL",
"type": "string",
"default": ""
},
"SecurityProfile": {
"variable_name": "SecurityProfile",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"minLimit": 0,
"maxLimit": 3
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Security profile for this configuration slot",
"type": "integer",
"default": 1
},
"OcppInterface": {
"variable_name": "OcppInterface",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "Wired0,Wired1,Wired2,Wired3,Wireless0,Wireless1,Wireless2,Wireless3,Any"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "OCPP interface",
"type": "string",
"default": "Wired0"
},
"OcppTransport": {
"variable_name": "OcppTransport",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "JSON,SOAP"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "OCPP transport protocol",
"type": "string",
"default": "JSON"
},
"MessageTimeout": {
"variable_name": "MessageTimeout",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"minLimit": 1
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Message timeout in seconds",
"type": "integer",
"default": 30
},
"Identity": {
"variable_name": "Identity",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 48
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Per-slot identity override",
"type": "string",
"default": ""
},
"BasicAuthPassword": {
"variable_name": "BasicAuthPassword",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"minLimit": 16,
"maxLimit": 64
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "Per-slot basic auth password",
"type": "string"
},
"ApnEnabled": {
"variable_name": "ApnEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "APN enabled",
"type": "boolean",
"default": false
},
"VpnEnabled": {
"variable_name": "VpnEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "VPN enabled",
"type": "boolean",
"default": false
},
"Apn": {
"variable_name": "Apn",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 2000
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "APN access point name",
"type": "string"
},
"ApnUserName": {
"variable_name": "ApnUserName",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 50
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "APN user name",
"type": "string"
},
"ApnPassword": {
"variable_name": "ApnPassword",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 64
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "APN password",
"type": "string"
},
"SimPin": {
"variable_name": "SimPin",
"characteristics": {
"supportsMonitoring": false,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "SIM PIN",
"type": "integer"
},
"PreferredNetwork": {
"variable_name": "PreferredNetwork",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 6
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Preferred network MCC+MNC",
"type": "string"
},
"UseOnlyPreferredNetwork": {
"variable_name": "UseOnlyPreferredNetwork",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Use only preferred network",
"type": "boolean",
"default": false
},
"ApnAuthentication": {
"variable_name": "ApnAuthentication",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "CHAP,NONE,PAP,AUTO"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "APN authentication method",
"type": "string",
"default": "AUTO"
},
"VpnServer": {
"variable_name": "VpnServer",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 2000
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "VPN server",
"type": "string"
},
"VpnUser": {
"variable_name": "VpnUser",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 50
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "VPN user",
"type": "string"
},
"VpnPassword": {
"variable_name": "VpnPassword",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 64
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "VPN password",
"type": "string"
},
"VpnKey": {
"variable_name": "VpnKey",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 255
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "VPN key",
"type": "string"
},
"VpnType": {
"variable_name": "VpnType",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "IKEv2,IPSec,L2TP,PPTP"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "VPN type",
"type": "string"
},
"VpnGroup": {
"variable_name": "VpnGroup",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 50
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "VPN group",
"type": "string"
},
"OcppVersion": {
"variable_name": "OcppVersion",
"characteristics": {
"supportsMonitoring": false,
"dataType": "OptionList",
"valuesList": "OCPP20,OCPP201,OCPP21"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "OCPP version used for this connection",
"type": "string"
},
"CsmsRootCertificateHashAlgorithm": {
"variable_name": "CsmsRootCertificateHashAlgorithm",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 50
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Hash algorithm of the CSMS root certificate",
"type": "string"
},
"CsmsRootCertificateIssuerKeyHash": {
"variable_name": "CsmsRootCertificateIssuerKeyHash",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 128
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Issuer key hash of the CSMS root certificate",
"type": "string"
},
"CsmsRootCertificateIssuerNameHash": {
"variable_name": "CsmsRootCertificateIssuerNameHash",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 128
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Issuer name hash of the CSMS root certificate",
"type": "string"
},
"CsmsRootCertificateSerialNumber": {
"variable_name": "CsmsRootCertificateSerialNumber",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 40
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Serial number of the CSMS root certificate",
"type": "string"
}
},
"required": [
"OcppCsmsUrl",
"SecurityProfile",
"OcppInterface",
"OcppTransport",
"MessageTimeout",
"Identity",
"VpnEnabled",
"ApnEnabled"
]
}

View File

@@ -0,0 +1,454 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for NetworkConfiguration slot 2 (operator-configured; no defaults — explicit configuration required before this slot becomes usable, see NetworkConfiguration_1 for the bootstrap-defaults rationale)",
"type": "object",
"name": "NetworkConfiguration",
"instance": "2",
"properties": {
"OcppCsmsUrl": {
"variable_name": "OcppCsmsUrl",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 2000
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "OCPP CSMS URL",
"type": "string"
},
"SecurityProfile": {
"variable_name": "SecurityProfile",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"minLimit": 0,
"maxLimit": 3
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Security profile for this configuration slot",
"type": "integer"
},
"OcppInterface": {
"variable_name": "OcppInterface",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "Wired0,Wired1,Wired2,Wired3,Wireless0,Wireless1,Wireless2,Wireless3,Any"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "OCPP interface",
"type": "string"
},
"OcppTransport": {
"variable_name": "OcppTransport",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "JSON,SOAP"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "OCPP transport protocol",
"type": "string"
},
"MessageTimeout": {
"variable_name": "MessageTimeout",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"minLimit": 1
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Message timeout in seconds",
"type": "integer"
},
"Identity": {
"variable_name": "Identity",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 48
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Per-slot identity override",
"type": "string",
"default": ""
},
"BasicAuthPassword": {
"variable_name": "BasicAuthPassword",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"minLimit": 16,
"maxLimit": 64
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "Per-slot basic auth password",
"type": "string"
},
"ApnEnabled": {
"variable_name": "ApnEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "APN enabled",
"type": "boolean",
"default": false
},
"VpnEnabled": {
"variable_name": "VpnEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "VPN enabled",
"type": "boolean",
"default": false
},
"Apn": {
"variable_name": "Apn",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 2000
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "APN access point name",
"type": "string"
},
"ApnUserName": {
"variable_name": "ApnUserName",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 50
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "APN user name",
"type": "string"
},
"ApnPassword": {
"variable_name": "ApnPassword",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 64
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "APN password",
"type": "string"
},
"SimPin": {
"variable_name": "SimPin",
"characteristics": {
"supportsMonitoring": false,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "SIM PIN",
"type": "integer"
},
"PreferredNetwork": {
"variable_name": "PreferredNetwork",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 6
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Preferred network MCC+MNC",
"type": "string"
},
"UseOnlyPreferredNetwork": {
"variable_name": "UseOnlyPreferredNetwork",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Use only preferred network",
"type": "boolean",
"default": false
},
"ApnAuthentication": {
"variable_name": "ApnAuthentication",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "CHAP,NONE,PAP,AUTO"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "APN authentication method",
"type": "string",
"default": "AUTO"
},
"VpnServer": {
"variable_name": "VpnServer",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 2000
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "VPN server",
"type": "string"
},
"VpnUser": {
"variable_name": "VpnUser",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 50
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "VPN user",
"type": "string"
},
"VpnPassword": {
"variable_name": "VpnPassword",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 64
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "VPN password",
"type": "string"
},
"VpnKey": {
"variable_name": "VpnKey",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 255
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "VPN key",
"type": "string"
},
"VpnType": {
"variable_name": "VpnType",
"characteristics": {
"supportsMonitoring": true,
"dataType": "OptionList",
"valuesList": "IKEv2,IPSec,L2TP,PPTP"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "VPN type",
"type": "string"
},
"VpnGroup": {
"variable_name": "VpnGroup",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 50
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "VPN group",
"type": "string"
},
"OcppVersion": {
"variable_name": "OcppVersion",
"characteristics": {
"supportsMonitoring": false,
"dataType": "OptionList",
"valuesList": "OCPP20,OCPP201,OCPP21"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "OCPP version used for this connection",
"type": "string"
},
"CsmsRootCertificateHashAlgorithm": {
"variable_name": "CsmsRootCertificateHashAlgorithm",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 50
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Hash algorithm of the CSMS root certificate",
"type": "string"
},
"CsmsRootCertificateIssuerKeyHash": {
"variable_name": "CsmsRootCertificateIssuerKeyHash",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 128
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Issuer key hash of the CSMS root certificate",
"type": "string"
},
"CsmsRootCertificateIssuerNameHash": {
"variable_name": "CsmsRootCertificateIssuerNameHash",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 128
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Issuer name hash of the CSMS root certificate",
"type": "string"
},
"CsmsRootCertificateSerialNumber": {
"variable_name": "CsmsRootCertificateSerialNumber",
"characteristics": {
"supportsMonitoring": false,
"dataType": "string",
"maxLimit": 40
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Serial number of the CSMS root certificate",
"type": "string"
}
},
"required": [
"OcppCsmsUrl",
"SecurityProfile",
"OcppInterface",
"OcppTransport",
"MessageTimeout",
"Identity",
"VpnEnabled",
"ApnEnabled"
]
}

View File

@@ -0,0 +1,491 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for OCPP16LegacyCtrlr - OCPP 1.6 configuration keys that don't exist or map as variables in OCPP 2.x",
"name": "OCPP16LegacyCtrlr",
"type": "object",
"properties": {
"CentralSystemURI": {
"variable_name": "CentralSystemURI",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "URL endpoint of the central system",
"type": "string",
"minLength": 1
},
"BlinkRepeat": {
"variable_name": "BlinkRepeat",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Number of times to blink the connector indicator",
"type": "integer",
"minimum": 0
},
"ConnectorPhaseRotationMaxLength": {
"variable_name": "ConnectorPhaseRotationMaxLength",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Maximum length of the ConnectorPhaseRotation configuration key",
"type": "integer",
"minimum": 0
},
"GetConfigurationMaxKeys": {
"variable_name": "GetConfigurationMaxKeys",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 256
}
],
"description": "Maximum number of configuration keys that can be requested in a GetConfiguration request",
"type": "integer",
"minimum": 0
},
"LightIntensity": {
"variable_name": "LightIntensity",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"unit": "Percent"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Light intensity for connector indicators",
"type": "integer",
"minimum": 0,
"maximum": 100
},
"MinimumStatusDuration": {
"variable_name": "MinimumStatusDuration",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"unit": "s"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Minimum duration in seconds that a status must persist before a StatusNotification is sent",
"type": "integer",
"minimum": 0
},
"StopTransactionOnEVSideDisconnect": {
"variable_name": "StopTransactionOnEVSideDisconnect",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Whether to stop transaction when cable is unplugged on EV side",
"type": "boolean"
},
"SupportedFeatureProfiles": {
"variable_name": "SupportedFeatureProfiles",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Comma-separated list of supported OCPP feature profiles",
"type": "string"
},
"SupportedFeatureProfilesMaxLength": {
"variable_name": "SupportedFeatureProfilesMaxLength",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Maximum length of the SupportedFeatureProfiles configuration key",
"type": "integer",
"minimum": 0
},
"UnlockConnectorOnEVSideDisconnect": {
"variable_name": "UnlockConnectorOnEVSideDisconnect",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Whether to unlock connector when cable is unplugged on EV side",
"type": "boolean"
},
"ReserveConnectorZeroSupported": {
"variable_name": "ReserveConnectorZeroSupported",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Whether reserving connector 0 is supported",
"type": "boolean"
},
"HostName": {
"variable_name": "HostName",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Host name of the charge point",
"type": "string",
"minLength": 1
},
"AllowChargingProfileWithoutStartSchedule": {
"variable_name": "AllowChargingProfileWithoutStartSchedule",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Whether to accept charging profiles without startSchedule field",
"type": "boolean"
},
"WaitForStopTransactionsOnResetTimeout": {
"variable_name": "WaitForStopTransactionsOnResetTimeout",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"unit": "s"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Timeout in seconds to wait for StopTransaction.conf messages before executing reset",
"type": "integer",
"minimum": 0,
"default": 60
},
"StopTransactionIfUnlockNotSupported": {
"variable_name": "StopTransactionIfUnlockNotSupported",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Whether to stop transaction on Unlock request if unlocking is not supported",
"type": "boolean",
"default": false
},
"MeterPublicKeys": {
"variable_name": "MeterPublicKeys",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Comma-separated list of public keys for signed meter values, one per connector",
"type": "string"
},
"DisableSecurityEventNotifications": {
"variable_name": "DisableSecurityEventNotifications",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "When set to true, no SecurityEventNotification messages will be sent",
"type": "boolean",
"default": false
},
"ISO15118CertificateManagementEnabled": {
"variable_name": "ISO15118CertificateManagementEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Whether ISO 15118 certificate management via DataTransfer is supported",
"type": "boolean",
"default": false
},
"CustomDisplayCostAndPrice": {
"variable_name": "CustomDisplayCostAndPrice",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Whether California Pricing Requirements are supported",
"type": "boolean"
},
"DefaultPrice": {
"variable_name": "DefaultPrice",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Default pricing information as JSON object",
"type": "string",
"minLength": 1
},
"DefaultPriceText": {
"variable_name": "DefaultPriceText",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Multi-language pricing information as JSON object",
"type": "string",
"minLength": 1
},
"CustomIdleFeeAfterStop": {
"variable_name": "CustomIdleFeeAfterStop",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Whether idle fee calculation after transaction stop is supported",
"type": "boolean"
},
"SupportedLanguages": {
"variable_name": "SupportedLanguages",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Comma-separated list of supported language codes per RFC5646",
"type": "string",
"minLength": 1
},
"CustomMultiLanguageMessages": {
"variable_name": "CustomMultiLanguageMessages",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Whether multi-language support for tariffs is available",
"type": "boolean"
},
"Language": {
"variable_name": "Language",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Default language code for the station UI",
"type": "string",
"minLength": 1
},
"WaitForSetUserPriceTimeout": {
"variable_name": "WaitForSetUserPriceTimeout",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"unit": "ms"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Timeout in milliseconds to wait for SetUserPrice after authorization",
"type": "integer",
"minimum": 0,
"maximum": 30000
},
"NumberOfConnectors": {
"variable_name": "NumberOfConnectors",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Number of connectors of the charging station",
"type": "integer",
"minimum": 1
},
"AuthorizationKey": {
"variable_name": "AuthorizationKey",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly"
}
],
"description": "The OCPP 1.6 authorization key (BasicAuth password) used for the CSMS connection",
"type": "string"
},
"SecurityProfile": {
"variable_name": "SecurityProfile",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "The OCPP 1.6 security profile used for the CSMS connection",
"type": "integer",
"minimum": 0,
"maximum": 3
},
"ExampleConfigurationKey": {
"variable_name": "ExampleConfigurationKey",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Test-only OCPP 1.6 custom key mapped",
"type": "string"
}
},
"required": [
"GetConfigurationMaxKeys",
"NumberOfConnectors",
"UnlockConnectorOnEVSideDisconnect"
]
}

View File

@@ -0,0 +1,364 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for OCPPCommCtrlr",
"name": "OCPPCommCtrlr",
"type": "object",
"properties": {
"OCPPCommCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"type": "boolean"
},
"ActiveNetworkProfile": {
"variable_name": "ActiveNetworkProfile",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Indicates the configuration profile the station uses at that moment to connect to the network.",
"default": 1,
"type": "integer"
},
"FileTransferProtocols": {
"variable_name": "FileTransferProtocols",
"characteristics": {
"valuesList": "FTP,FTPS,HTTP,HTTPS,SFTP",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "FTP"
}
],
"description": "List of supported file transfer protocols",
"type": "string"
},
"HeartbeatInterval": {
"variable_name": "HeartbeatInterval",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Interval of inactivity (no OCPP exchanges) with CSMS after which the Charging Station should send HeartbeatRequest.",
"default": "1800",
"type": "integer"
},
"MessageTimeout": {
"variable_name": "MessageTimeout",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 60
}
],
"instance": "Default",
"description": "MessageTimeout(Default) specifies after which time a message times out. It is configured in the network connection profile.",
"default": "60",
"type": "integer"
},
"MessageAttemptInterval": {
"variable_name": "MessageAttemptInterval",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer",
"unit": "s"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 10
}
],
"instance": "TransactionEvent",
"description": "MessageAttemptInterval(TransactionEvent) specifies long the Charging Station should wait before resubmitting a TransactionEventRequest message that the CSMS failed to process.",
"default": "10",
"type": "integer"
},
"MessageAttempts": {
"variable_name": "MessageAttempts",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 5
}
],
"instance": "TransactionEvent",
"description": "MessageAttempts(TransactionEvent) specifies how often the Charging Station should try to submit a TransactionEventRequest message when the CSMS fails to process it.",
"default": "5",
"type": "integer"
},
"NetworkConfigurationPriority": {
"variable_name": "NetworkConfigurationPriority",
"characteristics": {
"valuesList": "1,2",
"supportsMonitoring": true,
"dataType": "SequenceList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 1
}
],
"description": "A comma separated ordered list of the priority of the possible Network Connection Profiles.",
"default": "1",
"type": "string"
},
"NetworkProfileConnectionAttempts": {
"variable_name": "NetworkProfileConnectionAttempts",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 3
}
],
"description": "Specifies the number of connection attempts the Charging Station executes before switching to a different profile.",
"default": "3",
"type": "integer"
},
"OfflineThreshold": {
"variable_name": "OfflineThreshold",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer",
"minLimit": 0
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 60
}
],
"description": "When the offline period of a Charging Station exceeds the OfflineThreshold it is recommended to send a StatusNotificationRequest for all its Connectors.",
"default": "60",
"type": "integer"
},
"PublicKeyWithSignedMeterValue": {
"variable_name": "PublicKeyWithSignedMeterValue",
"characteristics": {
"valuesList": "Never,OncePerTransaction,EveryMeterValue",
"supportsMonitoring": true,
"dataType": "OptionList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "This Configuration Variable can be used to configure whether a public key needs to be sent with a signed meter value. Note, that the field is required, so it needs to be present as an empty string when the public key is not sent.",
"type": "string"
},
"QueueAllMessages": {
"variable_name": "QueueAllMessages",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "When this variable is set to true, the Charging Station will queue all message until they are delivered to the CSMS.",
"type": "boolean"
},
"MessageTypesDiscardForQueueing": {
"variable_name": "MessageTypesDiscardForQueueing",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": ""
}
],
"description": "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"
},
"ResetRetries": {
"variable_name": "ResetRetries",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 3
}
],
"description": "Number of times to retry a reset of the Charging Station when a reset was unsuccessful",
"default": "3",
"type": "integer"
},
"RetryBackOffRandomRange": {
"variable_name": "RetryBackOffRandomRange",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 2
}
],
"description": "When the Charging Station is reconnecting, after a connection loss, it will use this variable as the maximum value for the random part of the back-off time",
"default": "2",
"type": "integer"
},
"RetryBackOffRepeatTimes": {
"variable_name": "RetryBackOffRepeatTimes",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 2
}
],
"description": "When the Charging Station is reconnecting, after a connection loss, it will use this variable for the amount of times it will double the previous back-off time.",
"default": "2",
"type": "integer"
},
"RetryBackOffWaitMinimum": {
"variable_name": "RetryBackOffWaitMinimum",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 1
}
],
"description": "When the Charging Station is reconnecting, after a connection loss, it will use this variable as the minimum back-off time, the first time it tries to reconnect.",
"default": "1",
"type": "integer"
},
"UnlockOnEVSideDisconnect": {
"variable_name": "UnlockOnEVSideDisconnect",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "When set to true, the Charging Station SHALL unlock the cable on the Charging Station side when the cable is unplugged at the EV. For an EVSE with only fixed cables, the mutability SHALL be ReadOnly and the actual value SHALL be false. For a charging station with fixed cables and sockets, the variable is only applicable to the sockets.",
"default": true,
"type": "boolean"
},
"WebSocketPingInterval": {
"variable_name": "WebSocketPingInterval",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 10
}
],
"description": "0 disables client side websocket Ping/Pong. In this case there is either no ping/pong or the server initiates the ping and client responds with Pong. Positive values are interpreted as number of seconds between pings. Negative values are not allowed.",
"default": "30",
"type": "integer"
},
"FieldLength": {
"variable_name": "FieldLength",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"instance": "Get15118EVCertificateResponse.exiResponse",
"description": "This variable is used to report the length of <field> in <message> when it is larger than the length that is defined in the standard OCPP message schema.",
"type": "integer"
}
},
"required": [
"FileTransferProtocols",
"MessageAttemptInterval",
"MessageAttempts",
"MessageTimeout",
"NetworkConfigurationPriority",
"NetworkProfileConnectionAttempts",
"OfflineThreshold",
"ResetRetries",
"RetryBackOffRandomRange",
"RetryBackOffRepeatTimes",
"RetryBackOffWaitMinimum",
"UnlockOnEVSideDisconnect",
"WebSocketPingInterval"
]
}

View File

@@ -0,0 +1,57 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for ReservationCtrlr",
"name": "ReservationCtrlr",
"type": "object",
"properties": {
"ReservationCtrlrAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Whether reservation is supported.",
"default": true,
"type": "boolean"
},
"ReservationCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Whether reservation is enabled.",
"default": true,
"type": "boolean"
},
"ReservationCtrlrNonEvseSpecific": {
"variable_name": "NonEvseSpecific",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"description": "If this configuration variable is present and set to true: Charging Station supports Reservation where EVSE id is not specified.",
"type": "boolean"
}
},
"required": []
}

View File

@@ -0,0 +1,168 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for SampledDataCtrlr",
"name": "SampledDataCtrlr",
"type": "object",
"properties": {
"SampledDataCtrlrAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "If this variable reports a value of true, Sampled Data is supported",
"default": true,
"type": "boolean"
},
"SampledDataCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "If this variable reports a value of true, Sampled Data is enabled.",
"default": true,
"type": "boolean"
},
"SampledDataSignReadings": {
"variable_name": "SignReadings",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "If set to true, the Charging Station SHALL include signed meter values in the TransactionEventRequest to the CSMS",
"type": "boolean"
},
"SampledDataTxEndedInterval": {
"variable_name": "TxEndedInterval",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 60
}
],
"description": "Interval between sampling of metering (or other) data, intended to be transmitted in the TransactionEventRequest (eventType = Ended) message.",
"default": "60",
"type": "integer"
},
"SampledDataTxEndedMeasurands": {
"variable_name": "TxEndedMeasurands",
"characteristics": {
"valuesList": "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.Reactive.Export.Interval,Energy.Reactive.Import.Interval,Frequency,Power.Active.Export,Power.Active.Import,Power.Factor,Power.Offered,Power.Reactive.Export,Power.Reactive.Import,Voltage",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "Energy.Active.Import.Register,Current.Import"
}
],
"description": "Sampled measurands to be included in the meterValues element of TransactionEventRequest (eventType = Ended), every SampledDataTxEndedInterval seconds from the start of the transaction.",
"default": "Energy.Active.Import.Register,Current.Import",
"type": "string"
},
"SampledDataTxStartedMeasurands": {
"variable_name": "TxStartedMeasurands",
"characteristics": {
"valuesList": "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.Reactive.Export.Interval,Energy.Reactive.Import.Interval,Frequency,Power.Active.Export,Power.Active.Import,Power.Factor,Power.Offered,Power.Reactive.Export,Power.Reactive.Import,Voltage",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "Energy.Active.Import.Register,Current.Import"
}
],
"description": "Sampled measurand(s) to be taken at the start of any transaction to be included in the meterValues field of the first TransactionEventRequest message send at the start of a transaction (eventType = Started)",
"default": "Energy.Active.Import.Register,Current.Import",
"type": "string"
},
"SampledDataTxUpdatedInterval": {
"variable_name": "TxUpdatedInterval",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 120
}
],
"description": "Interval between sampling of metering (or other) data, intended to be transmitted via TransactionEventRequest (eventType = Updated) messages",
"default": "120",
"type": "integer"
},
"SampledDataTxUpdatedMeasurands": {
"variable_name": "TxUpdatedMeasurands",
"characteristics": {
"valuesList": "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.Reactive.Export.Interval,Energy.Reactive.Import.Interval,Frequency,Power.Active.Export,Power.Active.Import,Power.Factor,Power.Offered,Power.Reactive.Export,Power.Reactive.Import,Voltage,SoC",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "Energy.Active.Import.Register,Current.Import,Voltage,Power.Active.Import,Power.Reactive.Import,Frequency,SoC"
}
],
"description": "Sampled measurands to be included in the meterValues element of TransactionEventRequest (eventType = Ended)",
"default": "Energy.Active.Import.Register,Current.Import,Voltage,Power.Active.Import,Power.Reactive.Import,Frequency",
"type": "string"
},
"RegisterValuesWithoutPhases": {
"variable_name": "RegisterValuesWithoutPhases",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "If this variable reports a value of true, then meter values of measurand Energy.Active.Import.Register will only report the total energy over all phases without reporting the individual phase values. If this variable is absent or false, then the value for each phase is reported, possibly also with a total value (depending on the meter).",
"type": "boolean"
}
},
"required": [
"SampledDataTxEndedInterval",
"SampledDataTxEndedMeasurands",
"SampledDataTxStartedMeasurands",
"SampledDataTxUpdatedInterval",
"SampledDataTxUpdatedMeasurands"
]
}

View File

@@ -0,0 +1,188 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for SecurityCtrlr",
"name": "SecurityCtrlr",
"type": "object",
"properties": {
"SecurityCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": false
}
],
"default": true,
"type": "boolean"
},
"AdditionalRootCertificateCheck": {
"variable_name": "AdditionalRootCertificateCheck",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Required for all security profiles except profile 1.",
"default": false,
"type": "boolean"
},
"BasicAuthPassword": {
"variable_name": "BasicAuthPassword",
"characteristics": {
"minLimit": 16,
"maxLimit": 40,
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "WriteOnly",
"value": "DEADBEEFDEADBEEF"
}
],
"description": "The basic authentication password is used for HTTP Basic Authentication.",
"minimum": 16,
"maximum": 40,
"default": "DEADBEEFDEADBEEF",
"type": "string"
},
"CertificateEntries": {
"variable_name": "CertificateEntries",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 100
}
],
"description": "Amount of Certificates currently installed on the Charging Station",
"type": "integer"
},
"CertSigningRepeatTimes": {
"variable_name": "CertSigningRepeatTimes",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 2
}
],
"description": "Number of times to resend a SignCertificateRequest when CSMS does nor return a signed certificate.",
"default": "3",
"type": "integer"
},
"CertSigningWaitMinimum": {
"variable_name": "CertSigningWaitMinimum",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 30
}
],
"description": "Seconds to wait before generating another CSR in case CSMS does not return a signed certificate.",
"default": "30",
"type": "integer"
},
"SecurityCtrlrIdentity": {
"variable_name": "Identity",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "cp001"
}
],
"description": "The Charging Station identity.",
"default": "cp001",
"type": "string"
},
"MaxCertificateChainSize": {
"variable_name": "MaxCertificateChainSize",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "Limit of the size of the 'certificateChain' field from the CertificateSignedRequest",
"type": "integer"
},
"OrganizationName": {
"variable_name": "OrganizationName",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "Pionix"
}
],
"description": "The organization name of the CSO or an organization trusted by the CSO. This organization name is used to specify the subject field in the client certificate.",
"default": "Pionix",
"type": "string"
},
"SecurityProfile": {
"variable_name": "SecurityProfile",
"characteristics": {
"minLimit": 1,
"maxLimit": 3,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 1
}
],
"description": "The security profile used by the Charging Station.",
"minimum": 1,
"maximum": 3,
"default": "1",
"type": "integer"
}
},
"required": [
"CertificateEntries",
"OrganizationName",
"SecurityCtrlrIdentity",
"SecurityProfile"
]
}

View File

@@ -0,0 +1,463 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for SmartChargingCtrlr",
"name": "SmartChargingCtrlr",
"type": "object",
"properties": {
"ACPhaseSwitchingSupported": {
"variable_name": "ACPhaseSwitchingSupported",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "This variable can be used to indicate an on-load/in-transaction capability. If defined and true, this EVSE supports the selection of which phase to use for 1 phase AC charging.",
"type": "boolean"
},
"SmartChargingCtrlrAvailable": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"description": "Whether smart charging is supported.",
"type": "boolean"
},
"SmartChargingCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "Whether smart charging is enabled.",
"type": "boolean"
},
"EntriesChargingProfiles": {
"variable_name": "Entries",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 0
}
],
"instance": "ChargingProfiles",
"description": "Entries(ChargingProfiles) is the amount of Charging profiles currently installed on the Charging Station",
"type": "integer"
},
"ExternalControlSignalsEnabled": {
"variable_name": "ExternalControlSignalsEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Indicates whether a Charging Station should respond to external control signals that influence charging.",
"type": "boolean"
},
"LimitChangeSignificance": {
"variable_name": "LimitChangeSignificance",
"characteristics": {
"unit": "Percent",
"supportsMonitoring": true,
"dataType": "decimal"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 42
}
],
"description": "If at the Charging Station side a change in the limit in a ChargingProfile is lower than this percentage, the Charging Station MAY skip sending a NotifyChargingLimitRequest or a TransactionEventRequest message to the CSMS.",
"type": "number"
},
"NotifyChargingLimitWithSchedules": {
"variable_name": "NotifyChargingLimitWithSchedules",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Indicates if the Charging Station should include the externally set charging limit/schedule in the message when it sends a NotifyChargingLimitRequest message.",
"type": "boolean"
},
"PeriodsPerSchedule": {
"variable_name": "PeriodsPerSchedule",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 42
}
],
"description": "Maximum number of periods that may be defined per ChargingSchedule.",
"type": "integer"
},
"Phases3to1": {
"variable_name": "Phases3to1",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"description": "If defined and true, this Charging Station supports switching from 3 to 1 phase during a transaction",
"type": "boolean"
},
"ChargingProfileMaxStackLevel": {
"variable_name": "ProfileStackLevel",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": 42
}
],
"description": "Maximum acceptable value for stackLevel in a ChargingProfile. Since the lowest stackLevel is 0, this means that if SmartChargingCtrlr.ProfileStackLevel = 1, there can be at most 2 valid charging profiles per Charging Profile Purpose per EVSE.",
"type": "integer"
},
"ChargingScheduleChargingRateUnit": {
"variable_name": "RateUnit",
"characteristics": {
"valuesList": "A,W",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "A,W"
}
],
"description": "A list of supported quantities for use in a ChargingSchedule. Allowed values: 'A' and 'W\ufffd",
"type": "string"
},
"CompositeScheduleDefaultLimitAmps": {
"variable_name": "CompositeScheduleDefaultLimitAmps",
"characteristics": {
"unit": "A",
"minLimit": 0,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 48
}
],
"type": "integer",
"description": "Default amps limit applied when composite schedule is calculated and no limit was provided by the CSMS"
},
"CompositeScheduleDefaultLimitWatts": {
"variable_name": "CompositeScheduleDefaultLimitWatts",
"characteristics": {
"unit": "W",
"minLimit": 0,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 33120
}
],
"type": "integer",
"description": "Default watts limit applied when composite schedule is calculated and no limit was provided by the CSMS"
},
"CompositeScheduleDefaultNumberPhases": {
"variable_name": "CompositeScheduleDefaultNumberPhases",
"characteristics": {
"unit": "W",
"minLimit": 1,
"maxLimit": 3,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 3
}
],
"type": "integer",
"description": "Default number of phases applied when composite schedule is calculated and no limit was provided by the CSMS"
},
"SupplyVoltage": {
"variable_name": "SupplyVoltage",
"characteristics": {
"unit": "V",
"minLimit": 0,
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 230
}
],
"type": "integer",
"description": "Supply voltage of the grid. This value is only used in case a conversion between smart charging amp and watt limits is required"
},
"IgnoredProfilePurposesOffline": {
"variable_name": "IgnoredProfilePurposesOffline",
"characteristics": {
"valuesList": "ChargingStationMaxProfile,TxDefaultProfile,TxProfile",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": ""
}
],
"description": "Allows configuration of comma seperated list of ChargingProfilePurposes that are ignored in the composite schedule caluclation when offline.",
"type": "string"
},
"ChargingProfilePersistenceTxProfile": {
"variable_name": "ChargingProfilePersistence",
"instance": "TxProfile",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "true"
}
],
"description": "If defined and true, Charging profile with chargingProfilePurpose TxProfile is stored in the database (which is the current behaviour, so don't change this)",
"type": "boolean"
},
"ChargingProfilePersistenceChargingStationExternalConstraints": {
"variable_name": "ChargingProfilePersistence",
"instance": "ChargingStationExternalConstraints",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "true"
}
],
"description": "If defined and true, Charging profile with chargingProfilePurpose ChargingStationExternalConstraints is stored in the database (which is the current behaviour, so don't change this)",
"type": "boolean"
},
"ChargingProfilePersistenceLocalGeneration": {
"variable_name": "ChargingProfilePersistence",
"instance": "LocalGeneration",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "true"
}
],
"description": "If defined and true, Charging profile with chargingProfilePurpose LocalGeneration is stored in the database (which is the current behaviour, so don't change this)",
"type": "boolean"
},
"ChargingProfileUpdateRateLimit": {
"variable_name": "UpdateRateLimit",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"type": "integer",
"description": "This configuration key limits how often a persistent charging profile can be updated. It is the minimum duration in seconds between updates of charging profiles of the same chargingProfilePurpose. A Charging Station may reject SetChargingProfileRequests that occur too frequently."
},
"MaxExternalConstraintsId": {
"variable_name": "MaxExternalConstraintsId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"type": "integer",
"description": "Defines the highest value that a charging profile id of a ChargingStationExternalConstraints profile in the Charging Station can have. CSMS will use charging profile ids above this value to avoid conflicts with ChargingStationExternalConstraints profiles created by the Charging Station."
},
"SupportedAdditionalPurposes": {
"variable_name": "SupportedAdditionalPurposes",
"characteristics": {
"valuesList": "PriorityCharging,LocalGeneration",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": ""
}
],
"description": "This configuration variable lists the additional ChargingProfilePurposeEnumType, that have been introduced in OCPP 2.1, that are supported by the Charging Station. When this variable is absent or an empty list, then the purposes PriorityCharging and LocalGeneration are not supported.",
"type": "string"
},
"SupportsDynamicProfiles": {
"variable_name": "SupportsFeature",
"instance": "DynamicProfiles",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "false"
}
],
"description": "When this variable has value True, then the Charging Station supports charging profiles of ChargingProfileKindEnumType Dynamic. This implies that the fields dynUpdateInterval and dynUpdateTime in ChargingProfileType are supported. When this variable is absent or false, dynamic charging profiles are not supported.",
"type": "boolean"
},
"SupportsUseLocalTime": {
"variable_name": "SupportsFeature",
"instance": "UseLocalTime",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "false"
}
],
"description": "When this variable has value True, then the Charging Station supports the field useLocalTime in ChargingScheduleType. If useLocalTime = true in a charging schedule, then the startSchedule is treated as unqualified local time of the Charging Station. When this variable is absent or false, the useLocalTime is not supported.",
"type": "boolean"
},
"SupportsRandomizedDelay": {
"variable_name": "SupportsFeature",
"instance": "RandomizedDelay",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "false"
}
],
"description": "When this variable has value True, then the Charging Station supports the field randomizedDelay in ChargingScheduleType, which will delay the start of each charging schedule period by a random number between 0 and randomizedDelay. When this variable is absent or false, then randomizedDelay is not supported.",
"type": "boolean"
},
"SupportsLimitAtSoC": {
"variable_name": "SupportsFeature",
"instance": "LimitAtSoC",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "false"
}
],
"description": "When this variable has value True, then the Charging Station supports the field limitAtSoC in ChargingScheduleType, which will cap the limit or setpoint in the ChargingSchedulePeriodType by the value of limitAtSoC.limit. When this variable is absent or false, then limitAtSoC is not supported.",
"type": "boolean"
},
"SupportsEvseSleep": {
"variable_name": "SupportsFeature",
"instance": "EvseSleep",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "false"
}
],
"description": "When reported as true the Charging Station supports the evseSleep flag in a ChargingSchedulePeriodType, which requests the EVSE electronics to go to sleep during operationMode = 'Idle'. When absent or false this option is not supported.",
"type": "boolean"
}
},
"required": [
"ChargingProfileMaxStackLevel",
"ChargingScheduleChargingRateUnit",
"EntriesChargingProfiles",
"LimitChangeSignificance",
"PeriodsPerSchedule"
]
}

View File

@@ -0,0 +1,273 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for TariffCostCtrlr",
"name": "TariffCostCtrlr",
"type": "object",
"properties": {
"TariffCostCtrlrAvailableTariff": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"instance": "Tariff",
"description": "Instance Tariff: Whether tariffs are supported.",
"type": "boolean"
},
"TariffCostCtrlrAvailableCost": {
"variable_name": "Available",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
}
],
"instance": "Cost",
"description": "Instance Cost: Wheter costs are supported.",
"type": "boolean"
},
"TariffCostCtrlrCurrency": {
"variable_name": "Currency",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 3
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "EUR"
}
],
"description": "Currency used by this Charging Station in a ISO 4217 [ISO4217] formatted currency code.",
"type": "string"
},
"TariffCostCtrlrEnabledTariff": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"instance": "Tariff",
"description": "Instance Tariff: Whether tariffs are enabled.",
"type": "boolean"
},
"TariffCostCtrlrEnabledCost": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": false
}
],
"instance": "Cost",
"description": "Instance Cost: Whether costs are enabled.",
"type": "boolean"
},
"OfflineTariffFallbackMessage": {
"variable_name": "OfflineTariffFallbackMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 255
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": ""
}
],
"description": "Message (and/or tariff information) to be shown to an EV Driver when the Charging Station is offline and there is no driver specific tariff information available.",
"type": "string"
},
"TariffFallbackMessage": {
"variable_name": "TariffFallbackMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 255
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": ""
}
],
"description": "Message (and/or tariff information) to be shown to an EV Driver when there is no driver specific tariff information available.",
"type": "string"
},
"TotalCostFallbackMessage": {
"variable_name": "TotalCostFallbackMessage",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string",
"maxLimit": 255
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": ""
}
],
"description": "Message to be shown to an EV Driver when the Charging Station cannot retrieve the cost for a transaction at the end of the transaction.",
"type": "string"
},
"OfflineChargingPricekWhPrice": {
"variable_name": "OfflineChargingPrice",
"instance": "kWhPrice",
"characteristics": {
"supportsMonitoring": true,
"dataType": "decimal"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Charging kWh price in the default currency when charging station is offline.",
"type": "number"
},
"OfflineChargingPriceHourPrice": {
"variable_name": "OfflineChargingPrice",
"instance": "hourPrice",
"characteristics": {
"supportsMonitoring": true,
"dataType": "decimal"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Charging kWh price in the default currency when charging station is offline.",
"type": "number"
},
"TariffFallbackMessageDe": {
"variable_name": "TariffFallbackMessage",
"instance": "de",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Message (and/or tariff information) to be shown to an EV Driver when there is no driver specific tariff information available.",
"type": "string"
},
"TariffFallbackMessageNl": {
"variable_name": "TariffFallbackMessage",
"instance": "nl",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Message (and/or tariff information) to be shown to an EV Driver when there is no driver specific tariff information available.",
"type": "string"
},
"TariffFallbackMessageEn": {
"variable_name": "TariffFallbackMessage",
"instance": "en-US",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Message (and / or tariff information) to be shown to an EV Driver when there is no driver specific tariff information available.",
"type": "string"
},
"OfflineTariffFallbackMessageEn": {
"variable_name": "OfflineTariffFallbackMessage",
"instance": "en",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Message (and/or tariff information) to be shown to an EV Driver when Charging Station is offline. Note: Add a OfflineTariffFallbackMessage with correct instance for every supported language!!",
"type": "string"
},
"TotalCostFallbackMessageEn": {
"variable_name": "TotalCostFallbackMessage",
"instance": "en-US",
"characteristics": {
"supportsMonitoring": true,
"dataType": "string"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Message to be shown to an EV Driver when the Charging Station cannot retrieve the cost for a transaction at the end of the transaction. Note: Add a TotalCostFallbackMessage with correct instance for every supported language!!",
"type": "string"
},
"NumberOfDecimalsForCostValues": {
"variable_name": "NumberOfDecimalsForCostValues",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Number of decimals for the cost values. Value will be ",
"type": "integer"
}
},
"required": [
"TariffCostCtrlrCurrency",
"TariffFallbackMessage",
"TotalCostFallbackMessage"
]
}

View File

@@ -0,0 +1,165 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Schema for TxCtrlr",
"name": "TxCtrlr",
"type": "object",
"properties": {
"TxCtrlrEnabled": {
"variable_name": "Enabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": false
}
],
"default": true,
"type": "boolean"
},
"ChargingTime": {
"variable_name": "ChargingTime",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "decimal"
},
"attributes": [
{
"type": "Actual"
}
],
"description": "Time from earliest to latest substantive energy transfer",
"type": "number"
},
"EVConnectionTimeOut": {
"variable_name": "EVConnectionTimeOut",
"characteristics": {
"unit": "s",
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": 120
}
],
"description": "Interval from between \"starting\" of a transaction until incipient transaction is automatically canceled, due to failure of EV driver to (correctly) insert the charging cable connector(s) into the appropriate socket(s).",
"default": "120",
"type": "integer"
},
"MaxEnergyOnInvalidId": {
"variable_name": "MaxEnergyOnInvalidId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "integer"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Maximum amount of energy in Wh delivered when an identifier is deauthorized by the CSMS after start of a transaction.",
"default": "1000",
"type": "integer"
},
"StopTxOnEVSideDisconnect": {
"variable_name": "StopTxOnEVSideDisconnect",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": true
}
],
"description": "When set to true, the Charging Station SHALL deauthorize the transaction when the cable is unplugged from the EV.",
"default": true,
"type": "boolean"
},
"StopTxOnInvalidId": {
"variable_name": "StopTxOnInvalidId",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": true
}
],
"description": "Whether the Charging Station will deauthorize an ongoing transaction when it receives a non- Accepted authorization status in TransactionEventResponse for this transaction.",
"default": true,
"type": "boolean"
},
"TxBeforeAcceptedEnabled": {
"variable_name": "TxBeforeAcceptedEnabled",
"characteristics": {
"supportsMonitoring": true,
"dataType": "boolean"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite"
}
],
"description": "Allow charging before having received a BootNotificationResponse with RegistrationStatus: Accepted.",
"type": "boolean"
},
"TxStartPoint": {
"variable_name": "TxStartPoint",
"characteristics": {
"valuesList": "EVConnected,Authorized,PowerPathClosed,EnergyTransfer,DataSigned",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "PowerPathClosed"
}
],
"description": "Defines when the Charging Station starts a new transaction",
"default": "PowerPathClosed",
"type": "string"
},
"TxStopPoint": {
"variable_name": "TxStopPoint",
"characteristics": {
"valuesList": "EVConnected,Authorized,PowerPathClosed,EnergyTransfer",
"supportsMonitoring": true,
"dataType": "MemberList"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadWrite",
"value": "EVConnected,Authorized"
}
],
"description": "Defines when the Charging Station ends a transaction",
"default": "EVConnected,Authorized",
"type": "string"
}
},
"required": [
"EVConnectionTimeOut",
"StopTxOnEVSideDisconnect",
"StopTxOnInvalidId",
"TxStartPoint",
"TxStopPoint"
]
}

View File

@@ -0,0 +1,162 @@
PRAGMA foreign_keys = ON;
CREATE TABLE IF NOT EXISTS MUTABILITY (ID INT PRIMARY KEY, MUTABILITY TEXT);
CREATE TABLE IF NOT EXISTS DATATYPE (ID INT PRIMARY KEY, DATATYPE TEXT);
CREATE TABLE IF NOT EXISTS MONITOR (ID INTEGER PRIMARY KEY, "TYPE" TEXT);
CREATE TABLE IF NOT EXISTS MONITOR_CONFIG_TYPE (ID INTEGER PRIMARY KEY, "TYPE" TEXT);
CREATE TABLE IF NOT EXISTS SEVERITY(ID INTEGER PRIMARY KEY, SEVERITY TEXT);
CREATE TABLE IF NOT EXISTS VARIABLE_ATTRIBUTE_TYPE (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
"TYPE" TEXT
);
CREATE TABLE IF NOT EXISTS COMPONENT (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
NAME TEXT,
INSTANCE TEXT,
EVSE_ID INTEGER,
CONNECTOR_ID INTEGER
);
CREATE TABLE IF NOT EXISTS VARIABLE_ATTRIBUTE (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
VARIABLE_ID INTEGER NOT NULL,
MUTABILITY_ID INTEGER,
PERSISTENT INTEGER,
CONSTANT INTEGER,
TYPE_ID INTEGER,
VALUE_SOURCE TEXT,
"VALUE" TEXT,
FOREIGN KEY (VARIABLE_ID) REFERENCES VARIABLE (ID) ON DELETE CASCADE,
FOREIGN KEY (TYPE_ID) REFERENCES VARIABLE_ATTRIBUTE_TYPE (ID) ON DELETE RESTRICT,
FOREIGN KEY (MUTABILITY_ID) REFERENCES MUTABILITY (ID) ON DELETE RESTRICT
);
CREATE TABLE IF NOT EXISTS VARIABLE_CHARACTERISTICS (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
DATATYPE_ID INTEGER NOT NULL,
VARIABLE_ID INTEGER NOT NULL,
MAX_LIMIT REAL,
MIN_LIMIT REAL,
SUPPORTS_MONITORING INTEGER,
UNIT TEXT,
VALUES_LIST TEXT,
FOREIGN KEY (DATATYPE_ID) REFERENCES DATATYPE (ID) ON DELETE RESTRICT
FOREIGN KEY (VARIABLE_ID) REFERENCES VARIABLE (ID) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS VARIABLE_MONITORING (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
VARIABLE_ID INTEGER NOT NULL,
SEVERITY INTEGER,
"TRANSACTION" INTEGER,
TYPE_ID INTEGER NOT NULL,
CONFIG_TYPE_ID INTEGER,
"VALUE" DECIMAL,
REFERENCE_VALUE TEXT,
FOREIGN KEY (VARIABLE_ID) REFERENCES VARIABLE (ID) ON DELETE CASCADE,
FOREIGN KEY (TYPE_ID) REFERENCES MONITOR (ID) ON DELETE RESTRICT,
FOREIGN KEY (CONFIG_TYPE_ID) REFERENCES MONITOR_CONFIG_TYPE(ID) ON DELETE RESTRICT
);
CREATE TABLE IF NOT EXISTS VARIABLE (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
NAME TEXT,
INSTANCE TEXT,
COMPONENT_ID INTEGER NOT NULL,
REQUIRED INTEGER DEFAULT FALSE,
FOREIGN KEY (COMPONENT_ID) REFERENCES COMPONENT (ID) ON DELETE CASCADE
);
INSERT
OR REPLACE INTO MUTABILITY
VALUES (0, "ReadOnly");
INSERT
OR REPLACE INTO MUTABILITY
VALUES (1, "WriteOnly");
INSERT
OR REPLACE INTO MUTABILITY
VALUES (2, "ReadWrite");
INSERT
OR REPLACE INTO DATATYPE
VALUES (0, "string");
INSERT
OR REPLACE INTO DATATYPE
VALUES (1, "decimal");
INSERT
OR REPLACE INTO DATATYPE
VALUES (2, "integer");
INSERT
OR REPLACE INTO DATATYPE
VALUES (3, "dateTime");
INSERT
OR REPLACE INTO DATATYPE
VALUES (4, "boolean");
INSERT
OR REPLACE INTO DATATYPE
VALUES (5, "OptionList");
INSERT
OR REPLACE INTO DATATYPE
VALUES (6, "SequenceList");
INSERT
OR REPLACE INTO DATATYPE
VALUES (7, "MemberList");
INSERT
OR REPLACE INTO MONITOR
VALUES (0, "UpperThreshold");
INSERT
OR REPLACE INTO MONITOR
VALUES (1, "LowerThreshold");
INSERT
OR REPLACE INTO MONITOR
VALUES (2, "Delta");
INSERT
OR REPLACE INTO MONITOR
VALUES (3, "Periodic");
INSERT
OR REPLACE INTO MONITOR
VALUES (4, "PeriodicClockAligned");
INSERT
OR REPLACE INTO MONITOR_CONFIG_TYPE
VALUES (0, "HardWiredMonitor");
INSERT
OR REPLACE INTO MONITOR_CONFIG_TYPE
VALUES (1, "PreconfiguredMonitor");
INSERT
OR REPLACE INTO MONITOR_CONFIG_TYPE
VALUES (2, "CustomMonitor");
INSERT
OR REPLACE INTO SEVERITY
VALUES (0, "Danger");
INSERT
OR REPLACE INTO SEVERITY
VALUES (1, "HardwareFailure");
INSERT
OR REPLACE INTO SEVERITY
VALUES (2, "SystemFailure");
INSERT
OR REPLACE INTO SEVERITY
VALUES (3, "Critical");
INSERT
OR REPLACE INTO SEVERITY
VALUES (4, "Error");
INSERT
OR REPLACE INTO SEVERITY
VALUES (5, "Alert");
INSERT
OR REPLACE INTO SEVERITY
VALUES (6, "Warning");
INSERT
OR REPLACE INTO SEVERITY
VALUES (7, "Notice");
INSERT
OR REPLACE INTO SEVERITY
VALUES (8, "Informational");
INSERT
OR REPLACE INTO SEVERITY
VALUES (9, "Debug");
INSERT
OR REPLACE INTO VARIABLE_ATTRIBUTE_TYPE
VALUES (0, "Actual");
INSERT
OR REPLACE INTO VARIABLE_ATTRIBUTE_TYPE
VALUES (1, "Target");
INSERT
OR REPLACE INTO VARIABLE_ATTRIBUTE_TYPE
VALUES (2, "MinSet");
INSERT
OR REPLACE INTO VARIABLE_ATTRIBUTE_TYPE
VALUES (3, "MaxSet");

View File

@@ -0,0 +1,2 @@
ALTER TABLE VARIABLE
DROP COLUMN SOURCE;

View File

@@ -0,0 +1,2 @@
ALTER TABLE VARIABLE
ADD COLUMN SOURCE TEXT;

View File

@@ -0,0 +1,2 @@
ALTER TABLE VARIABLE
ADD REQUIRED INTEGER DEFAULT FALSE;

View File

@@ -0,0 +1,2 @@
ALTER TABLE VARIABLE
DROP COLUMN REQUIRED;

View File

@@ -0,0 +1,18 @@
# for documentation on this file format see:
# https://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/detailed/utilities.html#log.detailed.utilities.setup.filter_formatter
[Core]
DisableLogging=false
Filter="%Severity% >= INFO"
[Sinks.Console]
Destination=Console
# Filter="%Target% contains \"MySink1\""
Format="%TimeStamp% \033[1;32m%Process%\033[0m [\033[1;32m%ProcessID%\033[0m] [%Severity%] {\033[1;34m%ThreadID%\033[0m} \033[1;36m%function%\033[0m \033[1;30m%file%:\033[0m\033[1;32m%line%\033[0m: %Message%"
Asynchronous=false
AutoFlush=true
SeverityStringColorDebug="\033[1;30m"
SeverityStringColorInfo="\033[1;37m"
SeverityStringColorWarning="\033[1;33m"
SeverityStringColorError="\033[1;31m"
SeverityStringColorCritical="\033[1;35m"

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

View File

@@ -0,0 +1,184 @@
# OCPP 1.6 to OCPP 2.x mapping
This documents how OCPP 1.6 configuration keys map to the OCPP 2.x Device Model.
It is intended as a **human-readable reference** for integrators and maintainers.
The implementation in code (for example `known_keys` conversion logic and patching behaviour) remains authoritative.
## Core Profile
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 1 | `AllowOfflineTxForUnknownId` | VariableAttribute | `AuthCtrlr` | `OfflineTxForUnknownIdEnabled` | `Actual` |
| 2 | `AuthorizationCacheEnabled` | VariableAttribute | `AuthCacheCtrlr` | `Enabled` | `Actual` |
| 3 | `AuthorizeRemoteTxRequests` | VariableAttribute | `AuthCtrlr` | `AuthorizeRemoteStart` | `Actual` |
| 5 | `ClockAlignedDataInterval` | VariableAttribute | `AlignedDataCtrlr` | `Interval` | `Actual` |
| 6 | `ConnectionTimeOut` | VariableAttribute | `TxCtrlr` | `EVConnectionTimeOut` | `Actual` |
| 7 | `HeartbeatInterval` | VariableAttribute | `OCPPCommCtrlr` | `HeartbeatInterval` | `Actual` |
| 8 | `LocalAuthorizeOffline` | VariableAttribute | `AuthCtrlr` | `LocalAuthorizeOffline` | `Actual` |
| 9 | `LocalPreAuthorize` | VariableAttribute | `AuthCtrlr` | `LocalPreAuthorize` | `Actual` |
| 10 | `MaxEnergyOnInvalidId` | VariableAttribute | `TxCtrlr` | `MaxEnergyOnInvalidId` | `Actual` |
| 11 | `MeterValuesAlignedData` | VariableAttribute | `AlignedDataCtrlr` | `Measurands` | `Actual` |
| 12 | `MeterValuesAlignedDataMaxLength` | VariableCharacteristics | `AlignedDataCtrlr` | `Measurands` | `maxLimit` |
| 13 | `MeterValuesSampledData` | VariableAttribute | `SampledDataCtrlr` | `TxUpdatedMeasurands` | `Actual` |
| 14 | `MeterValuesSampledDataMaxLength` | VariableCharacteristics | `SampledDataCtrlr` | `TxUpdatedMeasurands` | `maxLimit` |
| 15 | `MeterValueSampleInterval` | VariableAttribute | `SampledDataCtrlr` | `TxUpdatedInterval` | `Actual` |
| 16 | `ResetRetries` | VariableAttribute | `OCPPCommCtrlr` | `ResetRetries` | `Actual` |
| 17 | `StopTransactionOnInvalidId` | VariableAttribute | `TxCtrlr` | `StopTxOnInvalidId` | `Actual` |
| 18 | `StopTxnAlignedData` | VariableAttribute | `AlignedDataCtrlr` | `TxEndedMeasurands` | `Actual` |
| 19 | `StopTxnAlignedDataMaxLength` | VariableCharacteristics | `AlignedDataCtrlr` | `TxEndedMeasurands` | `maxLimit` |
| 20 | `StopTxnSampledData` | VariableAttribute | `SampledDataCtrlr` | `TxEndedMeasurands` | `Actual` |
| 21 | `StopTxnSampledDataMaxLength` | VariableCharacteristics | `SampledDataCtrlr` | `TxEndedMeasurands` | `maxLimit` |
| 22 | `TransactionMessageAttempts` | VariableAttribute | `OCPPCommCtrlr` | `MessageAttempts` | `Actual` |
| 23 | `TransactionMessageRetryInterval` | VariableAttribute | `OCPPCommCtrlr` | `MessageAttemptInterval` | `Actual` |
| 24 | `WebSocketPingInterval` | VariableAttribute | `OCPPCommCtrlr` | `WebSocketPingInterval` | `Actual` |
| 25 | `LocalAuthListEnabled` | VariableAttribute | `LocalAuthListCtrlr` | `Enabled` | `Actual` |
| 26 | `ChargeProfileMaxStackLevel` | VariableAttribute | `SmartChargingCtrlr` | `ProfileStackLevel` | `Actual` |
| 27 | `ChargingScheduleAllowedChargingRateUnit` | VariableAttribute | `SmartChargingCtrlr` | `RateUnit` | `Actual` |
| 28 | `ChargingScheduleMaxPeriods` | VariableAttribute | `SmartChargingCtrlr` | `PeriodsPerSchedule` | `Actual` |
| 29 | `ConnectorSwitch3to1PhaseSupported` | VariableAttribute | `SmartChargingCtrlr` | `Phases3to1` | `Actual` |
| 30 | `SupportedFileTransferProtocols` | VariableAttribute | `OCPPCommCtrlr` | `FileTransferProtocols` | `Actual` |
## Internal Keys
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 31 | `ChargePointId` | VariableAttribute | `InternalCtrlr` | `ChargePointId` | `Actual` |
| 32 | `ChargeBoxSerialNumber` | VariableAttribute | `InternalCtrlr` | `ChargeBoxSerialNumber` | `Actual` |
| 33 | `ChargePointModel` | VariableAttribute | `InternalCtrlr` | `ChargePointModel` | `Actual` |
| 34 | `ChargePointSerialNumber` | VariableAttribute | `InternalCtrlr` | `ChargePointSerialNumber` | `Actual` |
| 35 | `ChargePointVendor` | VariableAttribute | `InternalCtrlr` | `ChargePointVendor` | `Actual` |
| 36 | `FirmwareVersion` | VariableAttribute | `InternalCtrlr` | `FirmwareVersion` | `Actual` |
| 37 | `ICCID` | VariableAttribute | `InternalCtrlr` | `ICCID` | `Actual` |
| 38 | `IFace` | VariableAttribute | `InternalCtrlr` | `IFace` | `Actual` |
| 39 | `IMSI` | VariableAttribute | `InternalCtrlr` | `IMSI` | `Actual` |
| 40 | `MeterSerialNumber` | VariableAttribute | `InternalCtrlr` | `MeterSerialNumber` | `Actual` |
| 41 | `MeterType` | VariableAttribute | `InternalCtrlr` | `MeterType` | `Actual` |
| 42 | `SupportedCiphers12` | VariableAttribute | `InternalCtrlr` | `SupportedCiphers12` | `Actual` |
| 43 | `SupportedCiphers13` | VariableAttribute | `InternalCtrlr` | `SupportedCiphers13` | `Actual` |
| 44 | `UseTPM` | VariableAttribute | `InternalCtrlr` | `UseTPM` | `Actual` |
| 45 | `UseTPMSeccLeafCertificate` | VariableAttribute | `InternalCtrlr` | `UseTPMSeccLeafCertificate` | `Actual` |
| 46 | `RetryBackoffRandomRange` | VariableAttribute | `OCPPCommCtrlr` | `RetryBackOffRandomRange` | `Actual` |
| 47 | `RetryBackoffRepeatTimes` | VariableAttribute | `OCPPCommCtrlr` | `RetryBackOffRepeatTimes` | `Actual` |
| 48 | `AuthorizeConnectorZeroOnConnectorOne` | VariableAttribute | `InternalCtrlr` | `AuthorizeConnectorZeroOnConnectorOne` | `Actual` |
| 49 | `LogMessages` | VariableAttribute | `InternalCtrlr` | `LogMessages` | `Actual` |
| 50 | `LogMessagesRaw` | VariableAttribute | `InternalCtrlr` | `LogMessagesRaw` | `Actual` |
| 51 | `LogMessagesFormat` | VariableAttribute | `InternalCtrlr` | `LogMessagesFormat` | `Actual` |
| 52 | `LogRotation` | VariableAttribute | `InternalCtrlr` | `LogRotation` | `Actual` |
| 53 | `LogRotationDateSuffix` | VariableAttribute | `InternalCtrlr` | `LogRotationDateSuffix` | `Actual` |
| 54 | `LogRotationMaximumFileSize` | VariableAttribute | `InternalCtrlr` | `LogRotationMaximumFileSize` | `Actual` |
| 55 | `LogRotationMaximumFileCount` | VariableAttribute | `InternalCtrlr` | `LogRotationMaximumFileCount` | `Actual` |
| 56 | `SupportedChargingProfilePurposeTypes` | VariableAttribute | `InternalCtrlr` | `SupportedChargingProfilePurposeTypes` | `Actual` |
| 57 | `IgnoredProfilePurposesOffline` | VariableAttribute | `SmartChargingCtrlr` | `IgnoredProfilePurposesOffline` | `Actual` |
| 58 | `MaxCompositeScheduleDuration` | VariableAttribute | `InternalCtrlr` | `MaxCompositeScheduleDuration` | `Actual` |
| 59 | `CompositeScheduleDefaultLimitAmps` | VariableAttribute | `SmartChargingCtrlr` | `CompositeScheduleDefaultLimitAmps` | `Actual` |
| 60 | `CompositeScheduleDefaultLimitWatts` | VariableAttribute | `SmartChargingCtrlr` | `CompositeScheduleDefaultLimitWatts` | `Actual` |
| 61 | `CompositeScheduleDefaultNumberPhases` | VariableAttribute | `SmartChargingCtrlr` | `CompositeScheduleDefaultNumberPhases` | `Actual` |
| 62 | `SupplyVoltage` | VariableAttribute | `SmartChargingCtrlr` | `SupplyVoltage` | `Actual` |
| 63 | `WebsocketPingPayload` | VariableAttribute | `InternalCtrlr` | `WebsocketPingPayload` | `Actual` |
| 64 | `WebsocketPongTimeout` | VariableAttribute | `InternalCtrlr` | `WebsocketPongTimeout` | `Actual` |
| 65 | `UseSslDefaultVerifyPaths` | VariableAttribute | `InternalCtrlr` | `UseSslDefaultVerifyPaths` | `Actual` |
| 66 | `VerifyCsmsCommonName` | VariableAttribute | `InternalCtrlr` | `VerifyCsmsCommonName` | `Actual` |
| 67 | `VerifyCsmsAllowWildcards` | VariableAttribute | `InternalCtrlr` | `VerifyCsmsAllowWildcards` | `Actual` |
| 68 | `OcspRequestInterval` | VariableAttribute | `InternalCtrlr` | `OcspRequestInterval` | `Actual` |
| 69 | `SeccLeafSubjectCommonName` | VariableAttribute | `ISO15118Ctrlr` | `SeccId` | `Actual` |
| 70 | `SeccLeafSubjectCountry` | VariableAttribute | `ISO15118Ctrlr` | `CountryName` | `Actual` |
| 71 | `SeccLeafSubjectOrganization` | VariableAttribute | `ISO15118Ctrlr` | `OrganizationName` | `Actual` |
| 72 | `QueueAllMessages` | VariableAttribute | `OCPPCommCtrlr` | `QueueAllMessages` | `Actual` |
| 73 | `MessageTypesDiscardForQueueing` | VariableAttribute | `OCPPCommCtrlr` | `MessageTypesDiscardForQueueing` | `Actual` |
| 74 | `MessageQueueSizeThreshold` | VariableAttribute | `InternalCtrlr` | `MessageQueueSizeThreshold` | `Actual` |
| 75 | `MaxMessageSize` | VariableAttribute | `InternalCtrlr` | `MaxMessageSize` | `Actual` |
| 76 | `TLSKeylogFile` | VariableAttribute | `InternalCtrlr` | `TLSKeylogFile` | `Actual` |
| 77 | `EnableTLSKeylog` | VariableAttribute | `InternalCtrlr` | `EnableTLSKeylog` | `Actual` |
| 78 | `NumberOfConnectors` | OCPP1.6-specific | `InternalCtrlr` | `NumberOfConnectors` | `Actual` |
| 79 | `RetryBackoffWaitMinimum` | VariableAttribute | `OCPPCommCtrlr` | `RetryBackOffWaitMinimum` | `Actual` |
## Local Auth List Management Profile
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 80 | `LocalAuthListMaxLength` | VariableCharacteristics | `LocalAuthListCtrlr` | `Entries` | `maxLimit` |
| 81 | `SendLocalListMaxLength` | VariableAttribute | `LocalAuthListCtrlr` | `ItemsPerMessage` | `maxLimit` |
## Smart Charging Profile
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 82 | `MaxChargingProfilesInstalled` | VariableCharacteristics | `SmartChargingCtrlr` | `Entries` | `maxLimit` |
## Security Profile
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 83 | `AdditionalRootCertificateCheck` | VariableAttribute | `SecurityCtrlr` | `AdditionalRootCertificateCheck` | `Actual` |
| 84 | `CertificateSignedMaxChainSize` | VariableAttribute | `SecurityCtrlr` | `MaxCertificateChainSize` | `Actual` |
| 85 | `CpoName` | VariableAttribute | `SecurityCtrlr` | `OrganizationName` | `Actual` |
| 86 | `CertSigningWaitMinimum` | VariableAttribute | `SecurityCtrlr` | `CertSigningWaitMinimum` | `Actual` |
| 87 | `CertSigningRepeatTimes` | VariableAttribute | `SecurityCtrlr` | `CertSigningRepeatTimes` | `Actual` |
| 88 | `CertificateStoreMaxLength` | VariableAttribute | `SecurityCtrlr` | `CertificateEntries` | `Actual` |
## PnC Profile
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 89 | `ISO15118PnCEnabled` | VariableAttribute | `ISO15118Ctrlr` | `PnCEnabled` | `Actual` |
| 90 | `CentralContractValidationAllowed` | VariableAttribute | `ISO15118Ctrlr` | `CentralContractValidationAllowed` | `Actual` |
| 91 | `ContractValidationOffline` | VariableAttribute | `ISO15118Ctrlr` | `ContractValidationOffline` | `Actual` |
## CostAndPrice Profile
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 92 | `NumberOfDecimalsForCostValues` | VariableAttribute | `TariffCostCtrlr` | `NumberOfDecimalsForCostValues` | `Actual` |
| 93 | `TimeOffset` | VariableAttribute | `ClockCtrlr` | `TimeOffset` | `Actual` |
| 94 | `NextTimeOffsetTransitionDateTime` | VariableAttribute | `ClockCtrlr` | `NextTimeOffsetTransitionDateTime` | `Actual` |
| 95 | `TimeOffsetNextTransition` | VariableAttribute | `ClockCtrlr` | `NextTransition` | `Actual` |
## Mavericks Section
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 96 | `BlinkRepeat` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `BlinkRepeat` | `Actual` |
| 97 | `ConnectorPhaseRotation` | VariableAttribute | `OCPP16LegacyCtrlr` | `PhaseRotation` | `Actual` |
| 98 | `ConnectorPhaseRotationMaxLength` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `ConnectorPhaseRotationMaxLength` | `Actual` |
| 99 | `GetConfigurationMaxKeys` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `GetConfigurationMaxKeys` | `Actual` |
| 100 | `LightIntensity` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `LightIntensity` | `Actual` |
| 101 | `MinimumStatusDuration` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `MinimumStatusDuration` | `Actual` |
| 102 | `StopTransactionOnEVSideDisconnect` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `StopTransactionOnEVSideDisconnect` | `Actual` |
| 103 | `SupportedFeatureProfiles` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `SupportedFeatureProfiles` | `Actual` |
| 104 | `SupportedFeatureProfilesMaxLength` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `SupportedFeatureProfilesMaxLength` | `Actual` |
| 105 | `UnlockConnectorOnEVSideDisconnect` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `UnlockConnectorOnEVSideDisconnect` | `Actual` |
| 106 | `ReserveConnectorZeroSupported` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `ReserveConnectorZeroSupported` | `Actual` |
| 107 | `HostName` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `HostName` | `Actual` |
| 108 | `AllowChargingProfileWithoutStartSchedule` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `AllowChargingProfileWithoutStartSchedule` | `Actual` |
| 109 | `WaitForStopTransactionsOnResetTimeout` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `WaitForStopTransactionsOnResetTimeout` | `Actual` |
| 110 | `StopTransactionIfUnlockNotSupported` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `StopTransactionIfUnlockNotSupported` | `Actual` |
| 111 | `MeterPublicKeys` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `MeterPublicKeys` | `Actual` |
| 112 | `DisableSecurityEventNotifications` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `DisableSecurityEventNotifications` | `Actual` |
| 113 | `ISO15118CertificateManagementEnabled` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `ISO15118CertificateManagementEnabled` | `Actual` |
| 114 | `CustomDisplayCostAndPrice` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `CustomDisplayCostAndPrice` | `Actual` |
| 115 | `DefaultPrice` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `DefaultPrice` | `Actual` |
| 116 | `DefaultPriceText` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `DefaultPriceText` | `Actual` |
| 117 | `CustomIdleFeeAfterStop` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `CustomIdleFeeAfterStop` | `Actual` |
| 118 | `SupportedLanguages` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `SupportedLanguages` | `Actual` |
| 119 | `CustomMultiLanguageMessages` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `CustomMultiLanguageMessages` | `Actual` |
| 120 | `Language` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `Language` | `Actual` |
| 121 | `WaitForSetUserPriceTimeout` | OCPP1.6-specific | `OCPP16LegacyCtrlr` | `WaitForSetUserPriceTimeout` | `Actual` |
## Mavericks Section
Direct mapping is not supported. An additional key is used instead.
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 122 | `AuthorizationKey` | VariableAttribute | `CustomLegacyController` | `AuthorizationKey` | `Actual` |
| 123 | `CentralSystemURI` | VariableAttribute | `CustomLegacyController` | `CentralSystemURI` | `Actual` |
| 124 | `SecurityProfile` | VariableAttribute | `CustomLegacyController` | `SecurityProfile` | `Actual` |
Special handling is required
| ID | OCPP1.6 key | Mapping type | Component | Variable | Target field |
| ---: | --- | --- | --- | --- | --- |
| 125 | `ConnectorEvseIds` | VariableAttribute | `*EVSE` | `EvseId` | `Actual` |
| 126 | `SupportedMeasurands` | VariableCharacteristics | `*` | `Measurands` | `valuesList` |

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);

View File

@@ -0,0 +1,51 @@
---
nlohmann_json:
git: https://github.com/nlohmann/json
git_tag: v3.12.0
options: ["JSON_BuildTests OFF", "JSON_MultipleHeaders ON"]
nlohmann_json_schema_validator:
git: https://github.com/pboettch/json-schema-validator
git_tag: 2.4.0
options:
[
"JSON_VALIDATOR_INSTALL OFF",
"JSON_VALIDATOR_BUILD_TESTS OFF",
"JSON_VALIDATOR_BUILD_EXAMPLES OFF",
"JSON_VALIDATOR_BUILD_SHARED_LIBS ON",
]
date:
git: https://github.com/HowardHinnant/date.git
git_tag: v3.0.4
options: ["BUILD_TZ_LIB ON", "HAS_REMOTE_API 0", "USE_AUTOLOAD 0", "USE_SYSTEM_TZ_DB ON"]
libwebsockets:
git: https://github.com/warmcat/libwebsockets.git
git_tag: v4.5.2
options:
- CMAKE_POLICY_VERSION_MINIMUM 3.5
- CMAKE_POLICY_DEFAULT_CMP0077 NEW
- LWS_ROLE_RAW_FILE OFF
- LWS_UNIX_SOCK OFF
- LWS_IPV6 ON
- LWS_WITH_SYS_STATE OFF
- LWS_WITH_SYS_SMD OFF
- LWS_WITH_UPNG OFF
- LWS_WITH_JPEG OFF
- LWS_WITH_DLO OFF
- LWS_WITH_SECURE_STREAMS OFF
- LWS_WITH_STATIC OFF
- LWS_WITH_LHP OFF
- LWS_WITH_LEJP_CONF OFF
- LWS_WITH_MINIMAL_EXAMPLES OFF
- LWS_WITH_CACHE_NSCOOKIEJAR OFF
- LWS_WITHOUT_TESTAPPS ON
- LWS_WITHOUT_TEST_SERVER ON
- LWS_WITHOUT_TEST_SERVER_EXTPOLL ON
- LWS_WITHOUT_TEST_PING ON
- LWS_WITHOUT_TEST_CLIENT ON
- LWS_INSTALL_LIB_DIR ${CMAKE_INSTALL_LIBDIR}
- DISABLE_WERROR ON
gtest:
# GoogleTest now follows the Abseil Live at Head philosophy. We recommend updating to the latest commit in the main branch as often as possible.
git: https://github.com/google/googletest.git
git_tag: release-1.12.1
cmake_condition: "LIBOCPP_BUILD_TESTING"

View File

@@ -0,0 +1,109 @@
# California Pricing Requirements
OCPP has several whitepapers, which can be found here: https://openchargealliance.org/whitepapers/
One of them is OCPP & California Pricing Requirements. This can be optionally enabled in libocpp, for OCPP 1.6 as well as OCPP 2.0.1.
## Callbacks in libocpp
To be kind of compatible with eachother, the callbacks for OCPP 1.6 and 2.0.1 use the same structs with the pricing
information.
### User-specific price / SetUserPrice
The User-specific price is used for display purposes only and can be sent as soon as the user identifies itself with an
id token. It should not be used to calculate prices.
Internally, the messages in the DataTransfer json (for 1.6) is converted to a `TariffMessage`, defined in
`common/types.hpp`. In case of multi language messages, they are all added to the TariffMessage vector.
In order to be able to use information from `SetUserPrice` before a transaction is started (e.g. for the OCMF TT field), OCPP1.6 implements a mechanism to wait for `DataTransfer.req(SetUserPrice)` from
the CSMS before the `authorize_id_token` function returns. This is required because the `Authorize.conf` in OCPP1.6 does not contain this information (unlike OCPP2.x). This allows to integrate the information
from `DataTransfer.req(SetUserPrice)` in the response of the authorization request. The timeout for waiting for this message from the CSMS can be controlled using the `WaitForSetUserPriceTimeout`
configuration key, which is specified in milliseconds. If no `DataTransfer.req(SetUserPrice)` is received within the specified timeout, the result is returned and a transaction may still start.
If the message is sent when a transaction has already started, the session id will be included in the session cost message and the `IdentifierType` will be set to `SessionId`. If it has not started yet, the id token is sent with
`IdentifierType` set to `IdToken`.
### Running cost and Final / total cost
The running cost and final cost messages are converted to a `RunningCost` struct, also defined in `common/types.hpp`.
The triggers in the message (running cost) are handled in libocpp itself.
The prices are converted to integers, because floating point numbers are not precise enough for pricing calculations.
To set the number of decimals to calculate with, you should set NumberOfDecimalsForCostValues (1.6, in CostAndPrice /
2.0.1, TariffCostCtrlr). Default is 3. There might be messages in multiple languages, they are all added to the messages
vector.
## OCPP 1.6
OCPP 1.6 mostly uses DataTransfer to send the pricing messages, and also has some extra configuration items. In libocpp,
the DataTransfer message is converted to internally used structs as described above.
### Configuration Items
| Name | Description |
| ---- | ----------- |
| `CustomDisplayCostAndPrice` | Set to `true` to enable California Pricing (readonly) |
| `DefaultPrice` | Holds the default price and default price text in a json object. Can be updated by the CSMS. Not used by libocpp. See the specification for the specific fields. |
| `NumberOfDecimalsForCostValues` | Holds the number of decimals the cost / price values are converted with. |
| `CustomIdleFeeAfterStop` | Set to `true` to extend the transaction until `ConnectorUnplugged` is sent (readonly). The chargepoint implementation should send this DataTransfer message, this is not part of libocpp (yet, 2024-08) |
| `CustomMultiLanguageMessages` | Set to `true` to enable multi language support (readonly). |
| `Language` | Default language code for the stations UI (IETF RFC5646) (readwrite). |
| `SupportedLanguages` | Comma separated list of supported languages, specified as IETF RFC5646 (readonly). |
| `DefaultPriceText` | Holds an array (`priceTexts`) of default price texts in several languages. Each item has the `priceText` (string) in the given `language` (string) and a `priceTextOffline` (string) in the given language. The CSMS sends the DefaultPriceText per language: `"DefaultPriceText,\<language code\>"`, but libocpp will convert it to the above described json object. (readwrite) |
| `TimeOffset` | As OCPP 1.6 does not have built-in support for timezones, you can set a timezone when displaying time related pricing information. This timezone is also used for the `atTime` trigger. (readwrite) |
| `NextTimeOffsetTransitionDateTime` | When to change to summer or winter time, to the offset `TimeOffsetNextTransition` |
| `TimeOffsetNextTransition` | What the new offset should be at the given `NextTimeOffsetTransationDateTime` (readwrite) |
### Callbacks
For California Pricing to work, the following callbacks must be enabled:
- `session_cost_callback`, used for running cost and final cost
- `tariff_message_callback`, used to show a user specific price
## OCPP 2.0.1
OCPP 2.0.1 uses different mechanisms to send pricing information. The messages are converted to internally used structs as described above. For California Pricing Requirements to work, TariffAndCost must be implemented as well.
### Device Model Variables
| Variable name | Instance | Component | Description |
| ------------- | -------- | --------- | ----------- |
| `CustomImplementationEnabled` | `org.openchargealliance.costmsg` | `CustomizationCtrlr` | Set to 'true' to support California Pricing (actually to indicate `customData` fields for California Pricing are supported). |
| `Enabled` | `Tariff` | `TariffCostCtrlr` | Enable showing tariffs. |
| `Enabled` | `Cost` | `TariffCostCtrlr` | Enable showing of cost. |
| `TariffFallbackMessage` | | `TariffCostCtrlr` | Fallback message to show to EV Driver when there is no driver specific tariff information. Not used by libocpp. |
| `TotalCostFallbackMessage` | | `TariffCostCtrlr` | Fallback message to sho to EV Driver when CS can not retrieve the cost for a transaction at the end of the transaction. Not used by libocpp. |
| `Currency` | | `TariffCostCtrlr` | Currency used for tariff and cost information. |
| `NumberOfDecimalsForCostValues` | | `TariffCostCtrlr` | Holds the number of decimals the cost / price values are converted with. |
| `TariffFallbackMessage` | `Offline` | `TariffCostCtrlr` | Fallback message to be shown to an EV Driver when CS is offline. Not used by libocpp. |
| `OfflineChargingPrice` | `kWhPrice` | `TariffCostCtrlr` | The energy (kWh) price for transactions started while offline. Not used by libocpp. |
| `OfflineChargingPrice` | `hourPrice` | `TariffCostCtrlr` | The time (hour) price for transactions started while offline. Not used by libocpp. |
| `QRCodeDisplayCapable` | | `DisplayMessageCtrlr` | Set to 'true' if station can display QR codes |
| `CustomImplementationEnabled` | `org.openchargealliance.multilanguage` | `CustomizationCtrlr` | Enable multilanguage |
| `TariffFallbackMessage` | `<language code>` | `TariffCostCtrlr` | TariffFallbackMessage in a specific language. There must be a variable with the language as instance for every supported language. |
| `OfflineTariffFallbackMessage` | `<language code>` | `TariffCostCtrlr` | TariffFallbackMessage when charging station is offline, in a specific language. There must be a variable with the language as instance for every supported language. |
| `TotalCostFallbackMessage` | `<language code>` | `TariffCostCtrlr` | Multi language TotalCostFallbackMessage. There must be a variable with the language as instance for every supported language. |
| `Language` | | `DisplayMessageCtrlr` | Default language code (RFC 5646). The `valuesList` holds the supported languages of the charging station. The value must be one of `valuesList`. |
> **_NOTE:_** Tariff and cost can be enabled separately. To be able to use all functionality, it is recommended to
enable both. If cost is enabled and tariff is not enabled, the total cost message will not contain the personal message (`set_running_cost_callback`).
If tariff is enabled and cost is not enabled, the total cost message will only be a TariffMessage
(`tariff_message_callback`) containing the personal message(s).
### Callbacks
For California Pricing to work, the following callbacks must be enabled:
- `set_running_cost_callback`
- `tariff_message_callback`
For the tariff information (the personal messages), the `tariff_message_callback` is used.
Driver specific tariffs / pricing information can be returned by the CSMS in the `AuthorizeResponse` message. In
libocpp, the whole message is just forwared (pricing information is not extracted from it), because the pricing
information is coupled to the authorize response. So when Tariff and Cost are enabled, the `idTokenInfo` field must be read for pricing information.
Cost information is also sent by the CSMS in the TransactionEventResponse. In that case, the pricing / cost information
is extracted from the message and a RunningCost message is sent containing the current cost and extra messages
(optional). If only Tariff is enabled and there is a personal message in the TransationEventResponse, a TariffMessage is sent.

View File

@@ -0,0 +1,13 @@
# Exception Handling of Database Operations
OCPP versions 1.6 and 2.0.1 contain several requirements for the persistent storage and retrieval of data. This library leverages SQLite to fulfill these persistent storage requirements. The DatabaseHandler classes manage all related database operations, including CREATE, SELECT, INSERT, UPDATE, and DELETE commands.
## Exception Design Considerations
The primary design decision in the development of DatabaseHandler classes is to allow exceptions to propagate to higher level logic rather than catching them internally. By propagating exceptions of database operations, it is ensured the consumer application is fully aware of any issues that occur during database operations. This transparency allows higher-level logic to make informed decisions based on the specific errors encountered. Different higher level logic may require different strategies for error handling based on their specific requirements. Propagating exceptions gives developers the flexibility to implement custom handling procedures that best fit the applications needs.
SQLite does not natively support exceptions as it is written in C. The DatabaseHandler classes check the return codes of SQLite function calls, and if an operation fails (i.e., the return code is not SQLITE_OK, SQLITE_DONE, SQLITE_ROW, etc.), an exception is thrown. This way, all database-related errors are converted into C++ exceptions, which are then propagated up to the caller.
## Implementation Strategy
The public functions of the DatabaseHandler classes are designed to throw exceptions when SQL operations fail to execute as expected Error Handling. Consumer code should implement try-catch blocks around calls to DatabaseHandler functions. This handling should be tailored to the requirements of the OCPP specification and improve the stability of the application, whether it involves the logging errors, retrying operations or other logic.

View File

@@ -0,0 +1,3 @@
# Database migrations
The migrations support has been moved to [everest-sqlite](https://github.com/EVerest/EVerest/tree/main/lib/everest/sqlite). Please see its [documentation for the migration support](https://github.com/EVerest/EVerest/tree/main/lib/everest/sqlite/docs/migrations.md).

View File

@@ -0,0 +1,72 @@
# Getting Started
## Requirements
For Debian GNU/Linux 11 you will need the following dependencies:
```bash
sudo apt install build-essential cmake python3-pip libboost-all-dev libsqlite3-dev libssl-dev
```
OpenSSL version 3.0 or above is required.
Clone this repository.
```bash
git clone https://github.com/EVerest/libocpp
```
In the libocpp folder create a folder named build and cd into it.
Execute cmake and then make:
```bash
mkdir build && cd build
cmake ..
make -j$(nproc)
```
## Unit testing
GTest is required for building the test cases target.
To build the target and run the tests you can reference the script `.ci/build-kit/install_and_test.sh`.
The script allows the GitHub Actions runner to execute.
Local testing:
```bash
mkdir build
cmake -B build -DBUILD_TESTING=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="./dist"
cd build
make -j$(nproc) install
```
Run any required tests from build/tests.
## Clarifications for directory structures, namespaces and OCPP versions
This repository contains multiple subdirectories and namespaces named v16, v2 and v21.
* The v16 directories contain files for configuring and implementing OCPP 1.6.
* The v2 directories include files for both OCPP2.0.1 and OCPP2.1, as OCPP 2.1
is fully backward compatible with OCPP 2.0.1.
* The v21 directories include files only for OCPP2.1.
## Get Started with OCPP1.6
Please see the [Getting Started documentation for OCPP1.6](../v16/getting_started.md).
## Get Started with OCPP2.0.1
Please see the [Getting Started documentation for OCPP2.0.1](../v2/getting_started.md).
## Building the doxygen documentation
```bash
cmake -S . -B build
cmake --build build --target doxygen-ocpp
```
You will find the generated doxygen documentation at:
`build/dist/docs/html/index.html`
The main reference for the integration of libocpp for OCPP1.6 is the ocpp::v16::ChargePoint class defined in `v16/charge_point.hpp` , for OCPP2.0.1 and OCPP2.1 that is the ocpp::v2::ChargePoint class defined in `v2/charge_point.hpp` .

View File

@@ -0,0 +1,244 @@
# Notes on Smart Charging Profiles and approach
There are some complexities calculating composite schedules and this note explains the approach.
The new approach is in `profile.cpp` and `profile.hpp` and then integrated into `smart_charging.cpp` maintaining the same API.
```cpp
std::vector<ChargingProfile> get_valid_profiles(
const DateTime& start_time, const DateTime& end_time,
int connector_id);
EnhancedChargingSchedule calculate_enhanced_composite_schedule(
const std::vector<ChargingProfile>& valid_profiles,
const DateTime& start_time,
const DateTime& end_time,
const int connector_id,
std::optional<ChargingRateUnit> charging_rate_unit);
```
## get_valid_profiles()
Retrieves all profiles that should be considered for calculating the composite schedule.
- checks that profiles are associated with the correct connector
- checks that profiles match the transaction ID (when there is an active transaction)
- start_time and end_time are not used in the new implementation
`start_time` and `end_time` could be used to remove profiles that would never be valid
within that period. However only the `validFrom` and `validTo` settings should be considered.
`calculate_enhanced_composite_schedule` checks the `start_time` and `end_time` so it is not essential to remove profiles at this point.
## calculate_enhanced_composite_schedule()
Assumes that profiles for other connectors and transactions have been removed.
Processes profiles:
1. obtain session/transaction start time
2. split the profiles into ChargePointMax/TxDefault/Tx sets
3. for each set calculate the composite schedule using the preferred units (Amps/Watts)
the resulting composite schedule covers the time period `start_time` to `end_time` only. Note that stack level is used where the higher level has priority
4. combines the three composite schedules into the single result
When combining; TxDefault is the starting limit, overridden by Tx and potentially lowered by ChargePointMax. The result will never be higher than a ChargePointMax limit (where there is one).
## Time handling
The approach removes all calls for obtaining the current date and time.
- where there is a transaction then the start time of the transaction is obtained
- relative schedules use the transaction start time where known or the start time
For generating a composite schedule relative schedules are included based on the transaction start time. Where there isn't a transaction in progress the `start_time` is used - i.e. the assumption is that a transaction has just started.
The removal of any relationship to the current time simplifies writing test cases and debugging test failures.
## Default limit
The OCPP 1.6 specification doesn't support gaps in charging schedules. This presents a problem while creating a composite schedule when there is a period of time when no profile is active.
- profile 1: stack level 10, Monday 10:00 for 2 hours
- profile 2: stack level 11, Monday 14:00 for 2 hours
At Monday 08:00 requesting a composite schedule for the next 9 hours needs to indicate
08:00|09:00|10:00|11:00|12:00|13:00|14:00|15:00|16:00|17:00
-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
unknown|unknown|P1|P1|unknown|unknown|P2|P2|unknown|unknown|unknown
Where the limit is not known then a default limit of `48.0 Amps` is used when calculating the final composite schedule.
A different default can be specified by installing a lower stack level TxDefault profile e.g.
```json
{
"chargingProfileId": 1,
"chargingProfileKind": "Relative",
"chargingProfilePurpose": "TxDefaultProfile",
"stackLevel": 1
"chargingSchedule": {
"chargingRateUnit": "A",
"chargingSchedulePeriod": [
{
"limit": 32.0,
"startPeriod": 0
}
],
},
}
```
## No valid profiles
Since a default limit is applied a composite schedule will always start at the `start_time` and have a fixed duration even when there are no valid profiles for that time period.
e.g. for 2024-01-01 starting at 08:00 for 10 minutes
```json
{
"status": "Accepted",
"scheduleStart": "2024-01-01T08:00:00Z",
"chargingSchedule": {
"duration:": 3600,
"startSchedule": "2024-01-01T08:00:00Z",
"chargingRateUnit": "A",
"chargingSchedulePeriod": {
"startPeriod": 0,
"limit": 0.0
}
}
}
```
When building the OCPP response "startSchedule" could be excluded however the composite schedule refers to a specific point in time, so it should be provided.
According to the OCPP specification section `7.13 ChargingSchedule` chargingSchedulePeriod is a required field and must have at least one entry. Hence the following is not a valid response:
```json
{
"status": "Accepted",
"scheduleStart": "2024-01-01T08:00:00Z",
"chargingSchedule": {
"duration:": 3600,
"startSchedule": "2024-01-01T08:00:00Z",
"chargingRateUnit": "A",
"chargingSchedulePeriod": {}
}
}
```
## Profile validity
The following items need to be considered when looking at a schedule:
- validFrom
- validTo
- transaction start time
- startSchedule
- duration
- startPeriod
The following sections explore some interesting edge cases.
### validFrom & validTo and transaction start time
For the following schedule
```json
{
"chargingProfileId": 1,
"chargingProfileKind": "Relative",
"chargingProfilePurpose": "TxDefaultProfile",
"stackLevel": 1,
"chargingSchedule": {
"chargingRateUnit": "A",
"chargingSchedulePeriod": [
{
"limit": 32.0,
"startPeriod": 0
},
{
"limit": 6.0,
"startPeriod": 3600
}
],
},
"validFrom": "2024-01-01T12:00:00Z",
"validTo": "2024-01-01T20:00:00Z"
}
```
The PEV plugs in at "2024-01-01T10:00:00Z" the result is no charging until the profile is valid at 12:00 and then the limit is 6.0A since only the first hour of a transaction is at the higher limit of 32.0A
The PEV plugs in at "2024-01-01T19:50:00Z" the result is charging for 10 minutes at 32. A and then no charge offered.
### startSchedule and daily recurring
For the following schedule
```json
{
"chargingProfileId": 1,
"chargingProfileKind": "Recurring",
"chargingProfilePurpose": "TxDefaultProfile",
"recurrencyKind": "Daily",
"stackLevel": 1,
"chargingSchedule": {
"startSchedule": "2024-01-01T12:00:00Z",
"chargingRateUnit": "A",
"chargingSchedulePeriod": [
{
"limit": 32.0,
"startPeriod": 0
},
{
"limit": 6.0,
"startPeriod": 3600
}
],
},
}
```
The PEV plugs in at "2024-01-10T11:50:00Z" the result is charging at 6.0A for 10 minutes (based on the previous day) and then at 32.0A from 12:00 when the schedule repeats.
`validFrom` and `validTo` add additional complications.
### startSchedule and daily recurring with duration
For the following schedule
```json
{
"chargingProfileId": 1,
"chargingProfileKind": "Recurring",
"chargingProfilePurpose": "TxDefaultProfile",
"recurrencyKind": "Daily",
"stackLevel": 1,
"chargingSchedule": {
"startSchedule": "2024-01-01T12:00:00Z",
"duration": 18000,
"chargingRateUnit": "A",
"chargingSchedulePeriod": [
{
"limit": 32.0,
"startPeriod": 0
},
{
"limit": 6.0,
"startPeriod": 3600
}
],
},
"validFrom": "2024-02-01T12:00:00Z",
"validTo": "2024-03-01T09:00:00Z"
}
```
The PEV plugs in at "2024-02-10T11:50:00Z" the result is based on the default limit since the profile is only valid for 5 hours. i.e. no charging for 10 minutes (based on the previous day) and then at 32.0A from 12:00 when the schedule repeats.
The PEV plugs in at "2024-02-01T11:50:00Z" the result is based on the default limit since the profile isn't valid yet. i.e. no charging for 10 minutes and then at 32.0A from 12:00 when the schedule starts.
The PEV plugs in at "2024-03-01T08:00:00Z" the result is charging at 6.0A (based on the previous day) and then no charging at 09:00 when the profile is no longer valid.

View File

@@ -0,0 +1,60 @@
# Message Dispatching Class Diagram
```mermaid
classDiagram
class MessageDispatcherInterface {
+dispatch_call(const json& call, bool triggered = false)
+dispatch_call_async(const json& call, bool triggered = false): std::future~EnhancedMessage~T~~
+dispatch_call_result(const json& call_result)
+dispatch_call_error(const json& call_error)
}
class v16_MessageDispatcher {
- MessageQueue& message_queue
- ChargePointConfiguration& configuration
- RegistrationStatus& registration_status
}
class v2_MessageDispatcher {
- MessageQueue& message_queue
- DeviceModelAbstract& device_model
- ConnectivityManager& connectivity_manager
- RegistrationStatusEnum& registration_status
}
class v2_MessageHandlerInterface {
+handle_message(EnhancedMessage~v2_MessageType~ message)
}
class v16_MessageHandlerInterface {
+handle_message(EnhancedMessage~v16_MessageType~ message)
}
class v2_DataTransferInterface {
+data_transfer_req(request: DataTransferRequest): std::optional~DataTransferResponse~
+handle_data_transfer_req(call: Call~DataTransferRequest~)
}
class v2_DataTransfer {
-MessageDispatcherInterface &message_dispatcher
-std::optional~function~ data_transfer_callback
}
class v2_ChargePoint {
std::unique_ptr~MessageDispatcherInterface~ message_dispatcher
std::unique_ptr~v2_DataTransferInterface~ data_transfer
}
class v16_ChargePoint {
std::unique_ptr~MessageDispatcherInterface~ message_dispatcher
}
MessageDispatcherInterface <|-- v16_MessageDispatcher
MessageDispatcherInterface <|-- v2_MessageDispatcher
v2_DataTransferInterface <|-- v2_DataTransfer
v2_MessageHandlerInterface <|-- v2_DataTransferInterface
MessageDispatcherInterface *-- v2_DataTransfer
MessageDispatcherInterface *-- v2_ChargePoint
v2_DataTransferInterface *-- v2_ChargePoint
MessageDispatcherInterface *-- v16_ChargePoint
```

View File

@@ -0,0 +1,313 @@
# Network connection profile interface
libocpp automatically tries to connect using the given network connection profiles.
However, if you want more control, you can use the callbacks provided for the network connection.
libocpp will automatically connect to the network profile with the highest priority.
If this fails, it will network profile with the second highest priority, and so on.
## Set up interface (optional)
A callback can be implemented to set up the interface. For example, if the interface is a modem, it must first be
be activated before it is possible to connect to this interface. To do this, you can implement the callback
`std::future<ConfigNetworkResult>(configure_network_connection_profile_callback(configuration_slot, NetworkConnectionProfile))`
In the implementation of this callback, you have to create a promise and return the future to the promise:
```cpp
std::promise<ocpp::ConfigNetworkResult> promise();
std::future<ocpp::ConfigNetworkResult> future = promise.get_future();
return future;
```
If the network was setup successfully, you can set the values in the promise with
```cpp
promise.set_value(configNetworkResult);
```
This way, libocpp knows that it can connect to the given interface and will try to do so.
A timeout can be configured using `NetworkConfigTimeout' to wait longer or shorter than the default 60 seconds.
### Bind to a specific interface
In some cases there are multiple network interfaces available and you may want to connect to a specific one.
In `ConfigNetworkResult` you can specify which interface you want the websocket to bind to.
Sometimes an interface has more than one IP address (in the case of a local/auto link for example).
In this case you want the websocket to bind to a specific IP address. The `interface_address` in ConfigNetworkResult supports both.
It will bind to the given network interface (a string containing the name of the interface) or the given ip address (a string containing the ip address in human readable format).
## Connect to higher network connection profile priority (optional)
Normally, when libocpp is connected with a network connection profile, it will not disconnect.
However, there may be a situation where libocpp is connected to a profile with priority 2 or lower, and you find out at system level that an interface (with a higher priority) has changed and is now up.
A call is added so that you can suggest that libocpp switch to this profile: `bool on_try_switch_network_connection_profile(const std::int32_t configuration_slot)`.
libocpp will inform the caller by the return value if it tries to switch to this profile.
## Disconnected / connected callbacks
libocpp provides two callbacks for when the websocket is connected and disconnected. It will provide the network slot
in these callbacks, so you can keep the network connection in use (e.g. not disable the modem), or disable the network connection (example again: disable the modem).
## External ConnectivityManager (optional)
The `ConnectivityManager` lives in the `ocpp` namespace and is not tied to a specific OCPP version. This
design allows the websocket connection to be established **before** a protocol version is determined. During the
websocket handshake the CSMS selects the OCPP protocol version (e.g. OCPP 1.6, OCPP2.0.1 or OCPP2.1). An integrating
application can use this information to instantiate the appropriate version-specific `ChargePoint` and inject the
already-connected `ConnectivityManager` into it.
By default, when no external `ConnectivityManager` is provided, libocpp creates and manages one internally.
However, you can provide your own instance of `ConnectivityManagerInterface` (or the concrete
`ConnectivityManager`) to take full control over websocket connectivity.
> **Note:** External `ConnectivityManager` injection is currently only supported for `ocpp::v2::ChargePoint`.
> Support for `ocpp::v16::ChargePoint` is not yet implemented and will follow in a future release.
### Typical flow with an external ConnectivityManager
1. Create a `ConnectivityManager`.
2. Create **all** version-specific `ChargePoint` instances (e.g. both `ocpp::v16::ChargePoint` and
`ocpp::v2::ChargePoint`), passing the shared `ConnectivityManager` to each.
3. Register a `websocket_connected_callback` on the `ConnectivityManager` that inspects the negotiated
`OcppProtocolVersion` and calls `start()` on the matching `ChargePoint`. `start()` automatically sets
the message callback in the `ConnectivityManager`, so messages are routed to the correct version.
4. On subsequent reconnects (where `start()` was already called for that version), forward the event via
`on_websocket_connected()` instead.
5. Because the CSMS may select a **different** protocol version on every websocket handshake, the integrating
application must be prepared to switch between `ChargePoint` instances at any reconnect. When a version
switch occurs, `stop()` should be called on the previously active `ChargePoint` and `start()` on the
newly selected one.
### Creating and injecting a ConnectivityManager
```cpp
// 1. Create a version-independent ConnectivityManager
auto connectivity_manager = std::make_shared<ocpp::ConnectivityManager>(device_model, evse_security);
// 2. Create all ChargePoint instances, each receiving the shared ConnectivityManager
auto charge_point_v16 = std::make_unique<ocpp::v16::ChargePoint>(
/* ... */, connectivity_manager, /* ... */);
auto charge_point_v2 = std::make_unique<ocpp::v2::ChargePoint>(
evse_connector_structure, device_model, database_handler, evse_security,
connectivity_manager, message_log_path, callbacks);
```
### Wiring up websocket event callbacks
The websocket connected callback must handle both the initial `start()` call and subsequent reconnects.
It also needs to handle potential version switches:
```cpp
// Track which ChargePoint is currently active and started
ocpp::OcppProtocolVersion active_version = ocpp::OcppProtocolVersion::Unknown;
connectivity_manager->set_websocket_connected_callback(
[&](int configuration_slot,
const ocpp::v2::NetworkConnectionProfile& profile,
const ocpp::OcppProtocolVersion version) {
if (version != active_version) {
// Version changed — stop the previously active ChargePoint (if any)
if (active_version == ocpp::OcppProtocolVersion::v16) {
charge_point_v16->stop();
} else if (active_version != ocpp::OcppProtocolVersion::Unknown) {
charge_point_v2->stop();
}
// Start the ChargePoint for the newly negotiated version.
// start() sets the message callback in the ConnectivityManager
// so that incoming messages are routed to the correct ChargePoint.
if (version == ocpp::OcppProtocolVersion::v16) {
charge_point_v16->start();
} else {
charge_point_v2->start();
}
active_version = version;
} else {
// Same version as before — just notify the active ChargePoint
if (version == ocpp::OcppProtocolVersion::v16) {
charge_point_v16->on_websocket_connected(configuration_slot, profile, version);
} else {
charge_point_v2->on_websocket_connected(configuration_slot, profile, version);
}
}
});
connectivity_manager->set_websocket_disconnected_callback(
[&](int configuration_slot,
const ocpp::v2::NetworkConnectionProfile& profile,
auto /*version*/) {
if (active_version == ocpp::OcppProtocolVersion::v16) {
charge_point_v16->on_websocket_disconnected(configuration_slot, profile);
} else {
charge_point_v2->on_websocket_disconnected(configuration_slot, profile);
}
});
connectivity_manager->set_websocket_connection_failed_callback(
[&](ocpp::ConnectionFailedReason reason) {
if (active_version == ocpp::OcppProtocolVersion::v16) {
charge_point_v16->on_websocket_connection_failed(reason);
} else {
charge_point_v2->on_websocket_connection_failed(reason);
}
});
```
Optionally, if your system requires interface setup (e.g. modem activation), set the network configuration
callback:
```cpp
connectivity_manager->set_configure_network_connection_profile_callback(
[](const int32_t configuration_slot,
const ocpp::v2::NetworkConnectionProfile& profile) {
std::promise<ocpp::ConfigNetworkResult> promise;
// ... set up the network interface ...
ocpp::ConfigNetworkResult result;
result.success = true;
result.interface_address = "eth0"; // optional: bind to specific interface or IP
promise.set_value(result);
return promise.get_future();
});
```
**Note:** `start()` automatically calls `set_message_callback` on the `ConnectivityManager`, ensuring that
incoming OCPP messages are routed to the correct `ChargePoint` instance. The `set_logging` method is called
automatically by `ChargePoint::initialize()`. You do not need to call either of these yourself.
### When to use an external ConnectivityManager
- When a single application needs to support multiple OCPP versions and switch between them at runtime
based on the CSMS's protocol selection
- When the OCPP protocol version is not known ahead of time and should be determined by the websocket
handshake before starting a version-specific `ChargePoint`
- When you want to implement a custom connectivity strategy (e.g. custom reconnection logic by implementing
`ConnectivityManagerInterface`)
### Version switching responsibility
When multi-version support is implemented (see note above), the **application** will be responsible for
implementing the version-switching logic (i.e. deciding which `ChargePoint` to `start()`/`stop()` based on
the negotiated protocol version). libocpp does not currently provide a built-in orchestrator for this, because
the v16 and v2 `ChargePoint` implementations do not share a common interface and applications may need to manage
additional version-specific state during a switch (e.g. active transactions, UI state). Such an orchestrator
may be provided in the future.
### Default (internal) behavior
If you do **not** provide a `ConnectivityManager`, libocpp creates one internally and automatically registers the
websocket event callbacks. In this case, the `on_websocket_connected`, `on_websocket_disconnected`, and
`on_websocket_connection_failed` methods on `ChargePoint` are called automatically and you do not need to call them.
This is sufficient when the OCPP protocol version is known at compile time or configuration time.
## Sequence diagram
'core' can be read as any application that implements libocpp
For step 9, ping is one way to check if a CSMS is up, but you of course can implement a way to check this yourself.
### Internal ConnectivityManager (default)
```mermaid
sequenceDiagram
participant csms
participant libocpp
participant core
autonumber
note over csms,libocpp: libocpp wants to connect to network connection profile
libocpp ->>+ core: std::future<ConfigNetworkResult>(configure_network_connection_profile_callback(<br>configuration_slot, NetworkConnectionProfile))
note over core: ... possible delay ...
core ->> core: Setup network, e.g. setup modem
core ->>- libocpp: promise.set_value(status,<br>ip_address, etc)
alt within timeout
%% core ->> libocpp: on_network_update (ip address)
libocpp ->> csms: connect websocket (ip address)
csms ->> libocpp: ACK
libocpp ->> core: websocket_connected_callback(configuration_slot, NetworkConnectionProfile)
core ->> core: disable unneeded interfaces, <br>e.g. disable modem
else timeout reached, next network connection profile selected
libocpp -->> core: std::future<ConfigNetworkResult>(configure_network_connection_profile_callback(<br>configuration_slot, NetworkConnectionProfile)) (see 1)
end
note over libocpp: CSMS is connected via connection profile prio 2 (for example modem) but prio 1 (for example eth0) comes up
loop until prio 1 csms is found
core ->> csms: ping
end
core ->> libocpp: on_try_switch_networkconnectionprofile(configuration_slot)
libocpp -->> core: std::future<ConfigNetworkResult>(configure_network_connection_profile_callback(<br>configuration_slot, NetworkConnectionProfile)) (see 1)
note over csms,libocpp: Network is disconnected (for example networkcable removed)
core ->> libocpp: disconnect csms (on_network_disconnected(configuration_slot, OCPPInterfaceEnum)
libocpp ->> core: websocket_disconnected_callback(configuration_slot, NetworkConnectionProfile)
libocpp -->> core: std::future<ConfigNetworkResult>(configure_network_connection_profile_callback(<br>configuration_slot, NetworkConnectionProfile)) (see 1)
note over csms,libocpp: Network is disconnected (websocket timeout)
libocpp ->> libocpp: disconnect csms
libocpp ->> core: websocket_disconnected_callback(configuration_slot, NetworkConnectionProfile)
libocpp -->> core: std::future<ConfigNetworkResult>(configure_network_connection_profile_callback(<br>configuration_slot, NetworkConnectionProfile)) (see 1)
```
### External ConnectivityManager
```mermaid
sequenceDiagram
participant csms
participant core
participant connectivity_manager as ConnectivityManager<br>(external)
participant cp_v16 as ChargePoint v16
participant cp_v2 as ChargePoint v2
autonumber
note over core: 1. Initialization — create all components upfront
core ->> connectivity_manager: create ConnectivityManager(device_model, evse_security)
core ->> cp_v16: create ChargePoint(..., connectivity_manager, ...)
core ->> cp_v2: create ChargePoint(..., connectivity_manager, ...)
core ->> connectivity_manager: set_websocket_connected_callback(version_dispatch)
core ->> connectivity_manager: set_websocket_disconnected_callback(version_dispatch)
core ->> connectivity_manager: set_websocket_connection_failed_callback(version_dispatch)
note over core: 2. First connection — version unknown
core ->> connectivity_manager: connect()
connectivity_manager ->> csms: websocket handshake (offering supported OCPP versions)
csms ->> connectivity_manager: ACK (selected OCPP version, e.g. v2)
note over core: 3. Connected callback triggers start() for negotiated version
connectivity_manager ->> core: websocket_connected_callback(slot, profile, v2)
core ->> core: active_version = Unknown → v2 (first time or version changed)
core ->> cp_v2: start()
note over cp_v2: start() sets message_callback<br>in ConnectivityManager
note over core: 4. Reconnect with same version
connectivity_manager ->> csms: websocket handshake
csms ->> connectivity_manager: ACK (v2 again)
connectivity_manager ->> core: websocket_connected_callback(slot, profile, v2)
core ->> core: active_version == v2, no change
core ->> cp_v2: on_websocket_connected(slot, profile, v2)
note over core: 5. Reconnect with different version (CSMS switches to v16)
connectivity_manager ->> csms: websocket handshake
csms ->> connectivity_manager: ACK (v16)
connectivity_manager ->> core: websocket_connected_callback(slot, profile, v16)
core ->> core: active_version v2 → v16 (version changed)
core ->> cp_v2: stop()
core ->> cp_v16: start()
note over cp_v16: start() sets message_callback<br>in ConnectivityManager
note over core: 6. Disconnection — forwarded to active ChargePoint
connectivity_manager ->> core: websocket_disconnected_callback(slot, profile)
core ->> cp_v16: on_websocket_disconnected(slot, profile)
note over core: 7. Network disconnected externally
core ->> cp_v16: on_network_disconnected(ocpp_interface)
cp_v16 ->> connectivity_manager: on_network_disconnected(ocpp_interface)
```

View File

@@ -0,0 +1,298 @@
# Getting Started with OCPP1.6
## Integrate this library with your Charging Station Implementation for OCPP1.6
OCPP is a protocol that affects, controls and monitors many areas of a charging station's operation.
If you want to integrate this library with your charging station implementation, you have to register a couple of **callbacks** and integrate **event handlers**. This is necessary for the library to interact with your charging station according to the requirements of OCPP.
Libocpp needs registered **callbacks** in order to execute control commands defined within OCPP (e.g Reset.req or RemoteStartTransaction.req)
The implementation must call **event handlers** of libocpp so that the library can track the state of the charging station and trigger OCPP messages accordingly (e.g. MeterValues.req , StatusNotification.req)
Your reference within libocpp to interact is a single instance to the class ocpp::v16::ChargePoint ([ChargePoint](include/ocpp/v16/charge_point.hpp)) defined in `ocpp/v16/charge_point.hpp` for OCPP 1.6.
### Overview of the required callbacks and events and what libocpp expects to happen
The following section will give you a high level overview of how to integrate libocpp with your application. Please use the [Doxygen Documentation](#building-the-doxygen-documentation) as an additional source for the ChargePoint API.
In EVerest the OCPP module leverages several other modules to perform tasks that relate to authorization, reservations, charging session handling and system tasks like rebooting or firmware updates.
- Auth orchestrates authorization, utilizing different token providers like RFID reads and token validators. Libocpp mainly acts as a token validator, but in the case of RemoteStartTransactions it acts as a token provider as well
- EvseManager manages the charging session and charging state machine by communicating with a "board support package", a driver for the charging hardware that abstracts away the control pilot, relay control, power meters, etc. The EvseManager also handles reservations.
- System handles firmware updates, log uploads and resets
The following sections explain the steps you can follow to implement their functionality on your own and integrate the libocpp directly into your charging station software without relying on EVerest. However, in most cases it's much easier to write an EVerest driver using the *EVerest/interfaces/board_support_AC.yaml* interface.
#### ChargePoint() constructor
The main entrypoint for libocpp for OCPP1.6 is the ocpp::v16::ChargePoint constructor.
This is defined in `v16/charge_point.hpp` and takes the following parameters:
- config: a std::string that contains the libocpp 1.6 config. There are example configs that work with a [SteVe](https://github.com/steve-community/steve) installation for example `config/v16/config-docker.json`.
- share_path: a std::filesystem path containing the path to the OCPP modules folder, for example pointing to */usr/share/everest/modules/OCPP*. This path contains the following files and directories and is installed by the libocpp install target:
```bash
.
├── config-docker.json
├── config-docker-tls.json
├── config.json
├── init.sql
├── logging.ini
└── profile_schemas
├── Config.json
├── Core.json
├── FirmwareManagement.json
├── Internal.json
├── LocalAuthListManagement.json
├── PnC.json
├── Reservation.json
├── Security.json
├── SmartCharging.json
└── Custom.json
```
Here you can find:
- the aforementioned config files
- a *logging.ini* that is needed to initialize logging with Everest::Logging::init(path_to_logging_ini, "name_of_binary")
- a *init.sql* file which contains the database schema used by libocpp for its sqlite database
- and a *profile_schemas* directory. This contains json schema files that are used to validate the libocpp config. The schemas are split up according to the OCPP1.6 feature profiles like Core, FirmwareManagement and so on. Additionally there is a schema for "Internal" configuration options (for example the ChargePointId, or CentralSystemURI). A "PnC" schema for the ISO 15118 Plug & Charge with OCPP 1.6 Application note, a "Security" schema for the OCPP 1.6 Security Whitepaper (3rd edition) and an exemplary "Custom" schema are provided as well. The Custom.json could be modified to be able to add custom configuration keys. Finally there's a Config.json schema that ties everything together
- user_config_path: this points to a "user config", which we call a configuration file that's merged with the config that's provided in the "config" parameter. Here you can add, remove and overwrite settings without modifying the config passed in the first parameter directly. This is also used by libocpp to persistently modify config entries that are changed by the CSMS that should persist across restarts.
- database_path: this points to the location of the sqlite database that libocpp uses to keep track of connector availability, the authorization cache and auth list, charging profiles and transaction data
- sql_init_path: this points to the aforementioned init.sql file which contains the database schema used by libocpp for its sqlite database
- message_log_path: this points to the directory in which libocpp can put OCPP communication logfiles for debugging purposes. This behavior can be controlled by the "LogMessages" (set to true by default) and "LogMessagesFormat" (set to ["log", "html", "session_logging"] by default, "console" and "console_detailed" are also available) configuration keys in the "Internal" section of the config file. Please note that this is intended for debugging purposes only as it logs all communication, including authentication messages.
- evse_security: this is a pointer to an implementation of the `common/evse_security.hpp` interface. This allows you to include your custom implementation of the security related operations according to this interface. If you set this value to nullptr, the internal implementation of the security related operations of libocpp will be used. In this case you need to specify the parameter security_configuration
- security_configuration: this parameter should only be set in case the evse_security parameter is nullptr. It specifies the file paths that are required to set up the internal evse_security implementation. Note that you need to specify bundle files for the CA certificates and directories for the certificates and keys
The directory layout expected is as follows
```bash
.
├── ca
│ ├── csms
│ │ └── CSMS_ROOT_CA.pem
│ ├── cso
│ │ ├── CPO_CERT_CHAIN.pem
│ │ ├── CPO_SUB_CA1_LEAF.der
│ │ ├── CPO_SUB_CA1.pem
│ │ ├── CPO_SUB_CA2_LEAF.der
│ │ └── CPO_SUB_CA2.pem
│ ├── mf
│ │ └── MF_ROOT_CA.pem
│ ├── mo
│ │ ├── INTERMEDIATE_MO_CA_CERTS.pem
│ │ ├── MO_ROOT_CA.der
│ │ ├── MO_ROOT_CA.pem
│ │ ├── MO_SUB_CA1.der
│ │ ├── MO_SUB_CA1.pem
│ │ ├── MO_SUB_CA2.der
│ │ └── MO_SUB_CA2.pem
│ └── v2g
│ ├── V2G_ROOT_CA.der
│ └── V2G_ROOT_CA.pem
├── client
│ ├── csms
│ │ ├── CPO_CERT_CHAIN.pem
│ │ ├── CPO_SUB_CA1.key
│ │ ├── CPO_SUB_CA2.key
│ │ ├── SECC_LEAF.der
│ │ ├── SECC_LEAF.key
│ │ └── SECC_LEAF.pem
│ ├── cso
│ │ ├── CPO_CERT_CHAIN.pem
│ │ ├── CPO_SUB_CA1.key
│ │ ├── CPO_SUB_CA2.key
│ │ ├── SECC_LEAF.der
│ │ ├── SECC_LEAF.key
│ │ └── SECC_LEAF.pem
│ └── v2g
│ └── V2G_ROOT_CA.key
```
#### registering callbacks
You can (and in many cases MUST) register a number of callbacks so libocpp can interact with the charger. In EVerest most of this functionality is orchestrated by the "EvseManager" module, but you can also register your own callbacks interacting directly with your chargers software. Following is a list of callbacks that you must register and a few words about their purpose.
TODO: in a future version of libocpp the callbacks will be organised in a struct with optional members emphasizing the required and optional callbacks.
Some general notes: the "connector" parameter of some of the callbacks refers to the connector number as understood in the OCPP 1.6 specification, "0" means the whole charging station, the connectors with EVSEs used for charging cars start at "1".
- register_pause_charging_callback
this callback is used by libocpp to request pausing of charging, the "connector" parameter tells you which connector/EVSE has to pause charging
- register_resume_charging_callback
this callback is used by libocpp the request resuming of charging, the "connector" parameter tells you which connector/EVSE can resume charging
- register_stop_transaction_callback
in EVerest this calls the EvseManagers stop_transaction command which "Stops transactions and cancels charging externally, charging can only be resumed by replugging car. EVSE will also stop transaction automatically e.g. on disconnect, so this only needs to be called if the transaction should end before."
this will then signal the following events:
- ChargingFinished
- TransactionFinished
- register_unlock_connector_callback
can be used by libocpp to force unlock a connector
- register_reserve_now_callback
libocpp can use this to reserve a connector, reservation handling is outsourced to a reservation manager in EVerest that implements the reservation interface (EVerest/interfaces/reservation.yaml)
- register_upload_diagnostics_callback
uses a function (in EVerest provided by the System module) to upload the requested diagnostics file
- register_upload_logs_callback
uses a function (in EVerest provided by the System module) to upload the requested log file
- register_update_firmware_callback
uses a function (in EVerest provided by the System module) to perform a firmware update
- register_signed_update_firmware_callback
uses a function (in EVerest provided by the System module) to perform a signed firmware update
- register_provide_token_callback
this callback is used in a remote start transaction to provide a token (prevalidated or not) to the authorization system
- register_set_connection_timeout_callback
used by libocpp to set the authorization or plug in connection timeout in the authorization system based on the "ConnectionTimeout" configuration key
- register_disable_evse_callback
used to disable the EVSE (ChangeAvailability.req)
- register_enable_evse_callback
used to enable the EVSE (ChangeAvailability.req)
- register_cancel_reservation_callback
used to cancel a reservation in the reservation manager (CancelReservation.req)
- register_signal_set_charging_profiles_callback
used to signal that new charging schedule(s) have been set, you can then use
get_all_composite_charging_schedules(duration_s) to get the new valid charging schedules
- register_is_reset_allowed_callback
used to inquire (in EVerest from the System module) if a reset is allowed
- register_reset_callback
used to perform a reset of the requested type, it is up to the user to properly stop the charge point when this callback is used
- register_connection_state_changed_callback
used to inform about the connection state to the CSMS (connected = true, disconnected = false)
- register_configuration_key_changed_callback
used to react on a changed configuration key. This callback is called when the specified configuration key has been changed by the CSMS
#### Functions that need to be triggered from the outside after new information is availble (on_... functions in the charge point API)
- on_log_status_notification(std::int32_t request_id, std::string log_status)
can be used to notify libocpp of a log status notification
- on_firmware_update_status_notification(std::int32_t request_id, std::string firmware_update_status)
can be used to notify libocpp of a firmware update status notification
- on_meter_values(std::int32_t connector, const Powermeter& powermeter)
provides a Powermeter struct to libocpp (for sending meter values during charging sessions or periodically)
- on_max_current_offered(std::int32_t connector, std::int32_t max_current)
the maximum current offered to the EV on this connector (in ampere)
#### The following functions are triggered depending on different so called "Session Events" from the EvseManager
each of these functions will have a small note what the Session Event was and what it triggers in libocpp
- on_enabled(std::int32_t connector)
Notifies libocpp that the connector is functional and operational
- on_disabled(std::int32_t connector)
Notifies libocpp that the connector is disabled
- on_transaction_started
Notifies libocpp that a transaction at the given connector has started, this means that authorization is available and the car is plugged in.
Some of its parameters:
session_id is an internal session_id originating in the EvseManager to keep track of the transaction, this is NOT to be mistaken for the transactionId from the StartTransactionResponse in OCPP!
id_token is the token with which the transaction was authenticated
meter_start contains the meter value in Wh for the connector at start of the transaction
timestamp at the start of the transaction
- on_transaction_stopped
Notifies libocpp that the transaction on the given connector with the given reason has been stopped.
Some of its parameters:
timestamp at the end of the transaction
energy_wh_import contains the meter value in Wh for the connector at end of the transaction
- on_suspend_charging_ev
Notifies libocpp that the EV has paused charging
- on_suspend_charging_evse
Notifies libocpp that the EVSE has paused charging
- on_resume_charging
Notifies libocpp that charging has resumed
- on_session_started
this is mostly used for logging and changing the connector state
- on_session_stopped
this is mostly used for logging and changing the connector state
- on_error
Notify libocpp of an error
- on_reservation_start
Notifies libocpp that a reservation has started
- on_reservation_end
Notifies libocpp that a reservation has ended
#### Authorization
In EVerest authorization is handled by the Auth module and various auth token providers and validators. The OCPP module acts as both a token provider (for pre validated tokens in RemoteStartTransactions) and a token validator (using the authorize requests, or plug & charge)
To use libocpp as a auth token validator (e.g. before starting a transaction) you can call the "authorize_id_token" function of the ChargePoint object.

View File

@@ -0,0 +1,348 @@
<mxfile host="65bd71144e">
<diagram id="enTwcsW3kJKdFbbsoOIB" name="Page-1">
<mxGraphModel dx="2808" dy="1103" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="120" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" target="107">
<mxGeometry relative="1" as="geometry">
<mxPoint x="680" y="1260" as="sourcePoint"/>
<Array as="points">
<mxPoint x="760" y="1260"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="121" value="FaultDetected" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="120">
<mxGeometry x="0.5379" relative="1" as="geometry">
<mxPoint x="-54" y="-10" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="187" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" target="100">
<mxGeometry relative="1" as="geometry">
<mxPoint x="40" y="380" as="sourcePoint"/>
<Array as="points">
<mxPoint x="160" y="380"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="188" value="UsageInitiated" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="187">
<mxGeometry x="-0.669" y="2" relative="1" as="geometry">
<mxPoint x="14" y="-8" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="200" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" source="7" target="199">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="360" y="300"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="7" value="Available" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="120" y="280" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="9" value="" style="ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="70" y="285" width="30" height="30" as="geometry"/>
</mxCell>
<mxCell id="10" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.867;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="9" target="7" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="210" y="330" as="targetPoint"/>
<mxPoint x="110" y="390" as="sourcePoint"/>
<Array as="points"/>
</mxGeometry>
</mxCell>
<mxCell id="133" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" target="7">
<mxGeometry relative="1" as="geometry">
<mxPoint x="40" y="260" as="sourcePoint"/>
<Array as="points">
<mxPoint x="160" y="260"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="134" value="BecomeAvailable" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="133">
<mxGeometry x="-0.308" y="-9" relative="1" as="geometry">
<mxPoint x="5" y="-19" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="189" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" target="104">
<mxGeometry relative="1" as="geometry">
<mxPoint x="40" y="860" as="sourcePoint"/>
<Array as="points">
<mxPoint x="160" y="860"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="190" value="TransactionStoppedAndUserActionRequired" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="189">
<mxGeometry x="-0.3632" relative="1" as="geometry">
<mxPoint x="-35" y="-10" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="204" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#000000;spacingLeft=8;" edge="1" parent="1" source="101" target="203">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="360" y="540"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="101" value="Charging" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" vertex="1" parent="1">
<mxGeometry x="120" y="520" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="193" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" target="102">
<mxGeometry relative="1" as="geometry">
<mxPoint x="40" y="620" as="sourcePoint"/>
<Array as="points">
<mxPoint x="160" y="620"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="194" value="PauseChargingEV" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="193">
<mxGeometry x="-0.176" y="5" relative="1" as="geometry">
<mxPoint x="2" y="-5" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="214" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" source="105" target="213">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="360" y="1020"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="105" value="Reserved" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" vertex="1" parent="1">
<mxGeometry x="120" y="1000" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="216" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" source="106" target="215">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="360" y="1140"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="106" value="Unavailable" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" vertex="1" parent="1">
<mxGeometry x="120" y="1120" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="217" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeColor=#000000;" edge="1" parent="1" source="107">
<mxGeometry relative="1" as="geometry">
<mxPoint x="680" y="300" as="targetPoint"/>
<Array as="points">
<mxPoint x="800" y="300"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="232" value="I1_ReturnToAvailable" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="217">
<mxGeometry x="0.9517" y="-6" relative="1" as="geometry">
<mxPoint x="33" y="-4" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="218" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeColor=#000000;" edge="1" parent="1" source="107">
<mxGeometry relative="1" as="geometry">
<mxPoint x="680" y="1140" as="targetPoint"/>
<Array as="points">
<mxPoint x="800" y="1140"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="220" value="I8_ReturnToUnavailable" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="218">
<mxGeometry x="0.7671" y="-2" relative="1" as="geometry">
<mxPoint x="30" y="-8" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="219" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeColor=#000000;" edge="1" parent="1" source="107">
<mxGeometry relative="1" as="geometry">
<mxPoint x="680" y="1020" as="targetPoint"/>
<Array as="points">
<mxPoint x="800" y="1020"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="221" value="I7_ReturnToReserved" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="219">
<mxGeometry x="0.8661" y="-4" relative="1" as="geometry">
<mxPoint x="35" y="-6" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="222" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeColor=#000000;" edge="1" parent="1" source="107">
<mxGeometry relative="1" as="geometry">
<mxPoint x="680" y="900" as="targetPoint"/>
<Array as="points">
<mxPoint x="800" y="900"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="223" value="I6_ReturnToFinishing" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="222">
<mxGeometry x="0.8928" y="-3" relative="1" as="geometry">
<mxPoint x="33" y="-7" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="224" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeColor=#000000;" edge="1" parent="1" source="107">
<mxGeometry relative="1" as="geometry">
<mxPoint x="680" y="780" as="targetPoint"/>
<Array as="points">
<mxPoint x="800" y="780"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="225" value="I5_ReturnToSuspendedEVSE" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="224">
<mxGeometry x="0.9051" y="-4" relative="1" as="geometry">
<mxPoint x="10" y="-6" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="226" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeColor=#000000;" edge="1" parent="1" source="107">
<mxGeometry relative="1" as="geometry">
<mxPoint x="680" y="660" as="targetPoint"/>
<Array as="points">
<mxPoint x="800" y="660"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="227" value="I4_ReturnToSuspendedEV" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="226">
<mxGeometry x="0.935" y="-1" relative="1" as="geometry">
<mxPoint x="26" y="-9" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="228" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeColor=#000000;" edge="1" parent="1" source="107">
<mxGeometry relative="1" as="geometry">
<mxPoint x="680" y="540" as="targetPoint"/>
<Array as="points">
<mxPoint x="800" y="540"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="229" value="I3_ReturnToCharging" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="228">
<mxGeometry x="0.9352" y="-7" relative="1" as="geometry">
<mxPoint x="32" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="230" style="edgeStyle=none;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeColor=#000000;" edge="1" parent="1" source="107">
<mxGeometry relative="1" as="geometry">
<mxPoint x="680" y="420" as="targetPoint"/>
<Array as="points">
<mxPoint x="800" y="420"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="231" value="I2_ReturnToPreparing" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="230">
<mxGeometry x="0.9511" y="-2" relative="1" as="geometry">
<mxPoint x="36" y="-8" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="107" value="Faulted" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" vertex="1" parent="1">
<mxGeometry x="720" y="1280" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="185" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" target="101">
<mxGeometry relative="1" as="geometry">
<mxPoint x="40" y="500" as="sourcePoint"/>
<Array as="points">
<mxPoint x="160" y="500"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="186" value="StartCharging" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="185">
<mxGeometry x="-0.5184" y="-1" relative="1" as="geometry">
<mxPoint x="21" y="-11" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="202" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" source="100" target="201">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="360" y="420"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="100" value="Preparing" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" vertex="1" parent="1">
<mxGeometry x="120" y="400" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="195" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" target="103">
<mxGeometry relative="1" as="geometry">
<mxPoint x="40" y="740" as="sourcePoint"/>
<Array as="points">
<mxPoint x="160" y="740"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="196" value="PauseChargingEVSE" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="195">
<mxGeometry x="-0.0756" relative="1" as="geometry">
<mxPoint x="-15" y="-10" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="206" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" source="102" target="205">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="360" y="660"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="102" value="SuspendedEV" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" vertex="1" parent="1">
<mxGeometry x="120" y="640" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="191" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" target="105">
<mxGeometry relative="1" as="geometry">
<mxPoint x="40" y="980" as="sourcePoint"/>
<Array as="points">
<mxPoint x="160" y="980"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="192" value="ReserveConnector" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="191">
<mxGeometry x="-0.2041" y="2" relative="1" as="geometry">
<mxPoint x="4" y="-8" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="212" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" source="104" target="211">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="360" y="900"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="104" value="Finishing" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" vertex="1" parent="1">
<mxGeometry x="120" y="880" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="197" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" target="106">
<mxGeometry relative="1" as="geometry">
<mxPoint x="40" y="1100" as="sourcePoint"/>
<Array as="points">
<mxPoint x="160" y="1100"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="198" value="ChangeAvailabilityToUnavailable" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="197">
<mxGeometry x="-0.1438" y="7" relative="1" as="geometry">
<mxPoint x="-30" y="-3" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="208" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#000000;" edge="1" parent="1" source="103" target="207">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="360" y="780"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="103" value="SuspendedEVSE" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" vertex="1" parent="1">
<mxGeometry x="120" y="760" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="199" value="UsageInitiated&lt;br&gt;StartCharging&lt;br&gt;PauseChargingEV&lt;br&gt;PauseChargingEVSE&lt;br&gt;ReserveConnector&lt;br&gt;ChangeAvailabilityToUnavailable" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacingLeft=8;" vertex="1" parent="1">
<mxGeometry x="360" y="280" width="240" height="120" as="geometry"/>
</mxCell>
<mxCell id="201" value="BecomeAvailable&lt;br&gt;StartCharging&lt;br&gt;PauseChargingEV&lt;br&gt;PauseChargingEVSE&lt;br&gt;TransactionStoppedAndUserActionRequired" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacingLeft=8;" vertex="1" parent="1">
<mxGeometry x="360" y="400" width="240" height="120" as="geometry"/>
</mxCell>
<mxCell id="203" value="BecomeAvailable&lt;br&gt;PauseChargingEV&lt;br&gt;PauseChargingEVSE&lt;br&gt;TransactionStoppedAndUserActionRequired&lt;br&gt;ChangeAvailabilityToUnavailable" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacingLeft=8;" vertex="1" parent="1">
<mxGeometry x="360" y="520" width="240" height="120" as="geometry"/>
</mxCell>
<mxCell id="205" value="BecomeAvailable&lt;br&gt;StartCharging&lt;br&gt;PauseChargingEVSE&lt;br&gt;TransactionStoppedAndUserActionRequired&lt;br&gt;ChangeAvailabilityToUnavailable" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacingLeft=8;" vertex="1" parent="1">
<mxGeometry x="360" y="640" width="240" height="120" as="geometry"/>
</mxCell>
<mxCell id="207" value="BecomeAvailable&lt;br&gt;StartCharging&lt;br&gt;PauseChargingEV&lt;br&gt;TransactionStoppedAndUserActionRequired&lt;br&gt;ChangeAvailabilityToUnavailable" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacingLeft=8;" vertex="1" parent="1">
<mxGeometry x="360" y="760" width="260" height="120" as="geometry"/>
</mxCell>
<mxCell id="211" value="BecomeAvailable&lt;br&gt;UsageInitiated&lt;br&gt;ChangeAvailabilityToUnavailable" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacingLeft=8;" vertex="1" parent="1">
<mxGeometry x="360" y="880" width="260" height="120" as="geometry"/>
</mxCell>
<mxCell id="213" value="BecomeAvailable&lt;br&gt;UsageInitiated&lt;br&gt;ChangeAvailabilityToUnavailable" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacingLeft=8;" vertex="1" parent="1">
<mxGeometry x="360" y="1000" width="260" height="120" as="geometry"/>
</mxCell>
<mxCell id="215" value="BecomeAvailable&lt;br&gt;UsageInitiated&lt;br&gt;StartCharging&lt;br&gt;PauseChargingEV&lt;br&gt;PauseChargingEVSE" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacingLeft=8;" vertex="1" parent="1">
<mxGeometry x="360" y="1120" width="240" height="120" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,13 @@
# Getting Started with OCPP2.0.1
## Integrate this library with your Charging Station Implementation for OCPP2.0.1
OCPP is a protocol that affects, controls and monitors many areas of a charging station's operation.
If you want to integrate this library with your charging station implementation, you have to register a couple of **callbacks** and integrate **event handlers**. This is necessary for the library to interact with your charging station according to the requirements of OCPP.
Libocpp needs registered **callbacks** in order to execute control commands defined within OCPP (e.g ResetRequest or RemoteStartTransactionRequest)
The implementation must call **event handlers** of libocpp so that the library can track the state of the charging station and trigger OCPP messages accordingly (e.g. MeterValuesRequest , StatusNotificationRequest)
Your reference within libocpp to interact is a single instance to the class ocpp::v2::ChargePoint defined in `v2/charge_point.hpp` for OCPP 2.0.1.

View File

@@ -0,0 +1,57 @@
# OCPP 2.0.1 and 2.1: Device model initialization and inserting of config values
If there is no custom database used for the device model, and 'initialize_device_model' is set to true in the
constructor of ChargePoint, the device model will be created or updated when ChargePoint is created. This document will
give more information about the files you need and what will be updated when the 'initialize_device_model' is set
to true.
## Database, component config and config file paths
Along with the 'initialize_device_model' flag, a few paths must be given to the constructor:
- The path of the device model migration files (normally `resources/v2/device_model_migration_files`).
- The path of the device model database.
- The path of the directory with the device model config. There should be two directories in it: 'standardized' and
'custom', both containing device model config.
## Component config
When the database is created for the first time, it will insert all components, variables, characteristics and
attributes from the component config.
## Update config values
Each time the ChargePoint class is instantiated, the component config is read and the values will be set to the database
accordingly. Only the initial values will be set to the values in the component config. So if for example the CSMS
changed a value, it will not be updated to the value from the component config file.
## Update component config
To update a component, just place the correct json component config in the `component_config/custom` or
`component_config/standardized` folder. When restarting the software, it will:
- Check if there are Components in the database that are not in the component config's. Those will be removed.
- Check if there are Components in the component config's that are not in the database. Those will be added.
- Check if anything has changed inside the Component (`Variable`, `Characteristics` or `Attributes`).
Those will be removed, changed or added to the database as well.
Note: When the `evse_id` or `connector_id` of a component is changed, this is seen as the removal of a Component and
addition of a new one.
Note: OCPP requires EVSE and Connector numbering starting from 1 counting upwards.
Note: There should be no duplicate components or variables in the component config files.
## Required variables
There are some required Variables, which can be found in the OCPP spec.
Some `Variables` are only required if the `Component` is `Available`, for example `Reservation` and `Smart Charging`.
There are some Components that are always required because that is how libocpp works: `AlignedDataCtrlr` and
`SampledDataCtrlr`.
When libocpp is started and initialized, all required Variables will be checked and an DeviceModelError is thrown if
one of the required Variables is not there.
This also implies, that if you write code that needs a required `Variable`, when trying to get that variable with
`DeviceModel::get_value(...)`, you should first check if the Component that Variable belongs to is `Available`.

View File

@@ -0,0 +1,76 @@
# OCPP 2.0.1: Monitors
Monitors are a mechanism for reporting based on certain criteria the internal state of the variables present on the charger. The monitors can be configured in different ways, with custom monitors being sent from the CSMS and HardWired and Preconfigured monitors set up in the config of the database.
## Basic Configuration
The monitors are evaluated from time to time in the case of periodic monitors and after a variable has been modified in the case of monitors that are triggered. Periodic monitors will be handled from time to time, the default being 1 second.
### Variables
- Enabling monitors: set the `MonitoringCtrlrEnabled` variable to true
- Periodic monitor process time: set the `MonitorsProcessingInterval` to the desired interval (default 1 second)
- To activate monitor processing: set the `ActiveMonitoringBase` variable to `All`
- To filter the verbosity level: set the `ActiveMonitoringLevel` variable to a value of 0-9 with 9 being the most verbose
- To filter the verbosity level when the charging station is offline: set the `OfflineQueuingSeverity` value to 0-9, with 9 keeping all monitor generated event while being offline
Note: There is a small overhead for the monitoring process interval. The periodic monitors that are triggered will require a database value query. However, based on the count and config of monitors it is unlikely that many of them will trigger at the same time, therefore, the database queries will be limited.
## Hardwired/Preconfigured Monitors
In order to set up pre-existing monitors that are not set up by the CSMS, for the variables that allow monitoring the configuration json file can be extended in the following way:
```json
"EVSEPower": {
"variable_name": "Power",
"characteristics": {
"unit": "W",
"maxLimit": 22000,
"supportsMonitoring": true,
"dataType": "decimal"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly"
},
{
"type": "MaxSet",
"mutability": "ReadOnly"
}
],
"monitors": [
{
"value": 21950,
"severity": 1,
"transaction": false,
"type": "UpperThreshold",
"config_type": "HardWiredMonitor"
},
{
"value": 100,
"severity": 1,
"transaction": false,
"type": "LowerThreshold",
"config_type": "HardWiredMonitor"
},
{
"value": 100,
"severity": 1,
"transaction": false,
"type": "Delta",
"reference_value": "10700",
"config_type": "PreconfiguredMonitor"
}
],
"description": "",
"type": "number",
"default": "0"
}
```
In the example for the 'EVSEPower' variable that supports monitoring there were attached three hardwired and preconfigured monitors. The monitors will report (based on the setup, see the `Basic Configuration` section) to the CSMS when the power will exceed '21950' W, when the power will fall below '100' W and when there will be a delta difference of more than `100` W from the `reference_value` in the case of the delta monitor. When the delta is exceeded the `reference_value` will be updated internally, and a new delta will be calculated based on that.
For more information related to the monitor functionality, please refer to the OCPP201 specification.
Note: for a delta monitor, an initial `reference_value` must be provided or the library will fail to initialize.

View File

@@ -0,0 +1,37 @@
@startuml Periodic Monitors
start
:DB Monitor Config Setup;
:DB Monitor Initialization;
if (Monitoring Enabled?) then (yes)
:Query Config\nProcess Time;
:Enable Monitor\nProcessor;
repeat
:Verify Periodic\nMonitors;
if(Periodic Monitor\nTime Elapsed?) then (yes)
if(Online?) then (yes)
if(Active Monitoring Severity\n> Monitor Severity?) then (yes)
:Queue \nPeriodic Monitor;
else (no)
:Discard Monitor;
endif
else (no)
if(Offline Monitoring Severity\n> Monitor Severity?) then (yes)
:Queue \nPeriodic Monitor;
else (no)
:Discard Monitor;
endif
endif
else(no)
:Update Monitor\nElapsed Time;
endif
:Verify Triggered\nMonitors\n(see trigger flowchart);
:Queue Triggered\nMonitors;
:Send Queued\nMonitors to CSMS;
repeat while (Each N Seconds)
else (no)
:Do Nothing;
endif
stop
@enduml

View File

@@ -0,0 +1,35 @@
@startuml Periodic Monitors
start
:DB Monitor Config Setup;
:DB Monitor Initialization;
if (Monitoring Enabled?) then (yes)
:Inject Device\nModel Listener;
:Enable Monitor\nProcessor;
repeat
:Verify Variable\nMonitors;
if(Variable Monitor\nTriggered?) then (yes)
if(Online?) then (yes)
if(Active Monitoring Severity\n> Monitor Severity?) then (yes)
:Queue Monitor;
else (no)
:Discard Monitor;
endif
else (no)
if(Offline Monitoring Severity\n> Monitor Severity?) then (yes)
:Queue Monitor;
else (no)
:Discard Monitor;
endif
endif
else(no)
:Do Nothing;
endif
:Process Queued\nMonitors;
repeat while (DB Variable Updated)
else (no)
:Do Nothing;
endif
stop
@enduml

Some files were not shown because too many files have changed in this diff Show More