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,10 @@
build
__pycache__
*.egg-info
.pytest_cache
.venv
results.xml
result.xml
report.html
**/.DS_Store
**/.idea

View File

@@ -0,0 +1,43 @@
# OCPP Integration Tests
This directory contains some test tooling and integration tests
for OCPP1.6 and OCPP2.0.1.
## Run the tests
All tests are run via the unified `tests/run-tests.sh` script from the
repository root. The script handles parallel execution, network-isolation
setup/teardown and certificate/config installation automatically.
```bash
# From the repository root:
tests/run-tests.sh ocpp # all OCPP tests (1.6, 2.0.1, 2.1)
tests/run-tests.sh ocpp16 # OCPP 1.6 only
tests/run-tests.sh ocpp201 # OCPP 2.0.1 only
tests/run-tests.sh ocpp21 # OCPP 2.1 only
tests/run-tests.sh --serial ocpp # run serially
tests/run-tests.sh -j4 ocpp # limit to 4 parallel workers
tests/run-tests.sh --help # show all options
```
Tests run in parallel by default. The time depends on your system;
it usually takes a couple of minutes.
Check the generated `report.html` for detailed results.
You can also run individual test sets or test cases using
```bash
python3 -m pytest test_sets/ocpp201/remote_control.py::test_F01_F02_F03
```
This runs test case `test_F01_F02_F03`
specified in `test_sets/ocpp201/remote_control.py`.
If you run the test cases individually,
make sure to have all required certificates and configs
for the test cases installed using the
convenience scripts inside [test_sets/everest-aux](test_sets/everest-aux/)
```bash
./install_certs <path-to-EVerest-installation-directory>
./install_configs <path-to-EVerest-installation-directory>

View File

@@ -0,0 +1,487 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright Pionix GmbH and Contributors to EVerest
# noinspection PyUnresolvedReferences
from everest.testing.core_utils.fixtures import *
from everest.testing.core_utils.probe_module import ProbeModule
from everest.testing.ocpp_utils.charge_point_utils import OcppTestConfiguration
# pylint: disable-next=unused-import
from everest.testing.ocpp_utils.fixtures import (
ocpp_config,
ocpp_version,
charge_point,
charge_point_v201,
charge_point_v21,
central_system,
central_system_v16,
central_system_v201,
central_system_v21,
central_system_v16_standalone,
test_utility,
)
import test_sets.everest_test_utils as everest_test_utils
from typing import Any, Callable
import logging
import pytest
def pytest_addoption(parser):
# Guard against duplicate registration when tests/conftest.py is also loaded
# (e.g. when invoked via run-tests.sh with --config-file pointing to tests/pytest.ini).
try:
parser.addoption(
"--everest-prefix",
action="store",
default="../../build/dist",
help="everest prefix path; default = '../../build/dist'",
)
except ValueError:
logging.error("Option --everest-prefix already registered, skipping duplicate registration.")
def pytest_sessionfinish(session, exitstatus):
pass
@pytest.fixture(scope="session")
def exi_generator():
certs_path = str(Path(__file__).parent / "test_sets" / "everest-aux" / "certs")
return everest_test_utils.EXIGenerator(certs_path)
@pytest.fixture
def test_config() -> OcppTestConfiguration:
return everest_test_utils.load_test_config()
@pytest.fixture
def core_config(request) -> EverestEnvironmentCoreConfiguration:
everest_prefix = Path(request.config.getoption("--everest-prefix"))
marker = request.node.get_closest_marker("everest_core_config")
if marker is None:
test_function_name = request.function.__name__
test_module_name = request.module.__name__
everest_config_path = everest_test_utils.get_everest_config(
test_function_name, test_module_name
)
else:
everest_config_path = (
Path(__file__).parent /
"test_sets/everest-aux/config" / marker.args[0]
)
return EverestEnvironmentCoreConfiguration(
everest_core_path=everest_prefix,
template_everest_config_path=everest_config_path,
)
@pytest.fixture
def started_test_controller(test_controller):
test_controller.start()
yield test_controller
test_controller.stop()
@pytest.fixture
def skip_implementation():
return None
@pytest.fixture
def overwrite_implementation():
return None
def implement_command(
module: ProbeModule,
skip_implementation: dict,
implementation_id: str,
command_name: str,
handler: Callable[[dict], Any],
):
skip = False
if skip_implementation:
if implementation_id in skip_implementation:
to_skip = skip_implementation[implementation_id]
if command_name in to_skip:
logging.info(f"Skipping implementation of {command_name}")
skip = True
if not skip:
module.implement_command(implementation_id, command_name, handler)
@pytest.fixture
def probe_module(
started_test_controller, everest_core, skip_implementation
) -> ProbeModule:
# initiate the probe module, connecting to the same runtime session the test controller started
module = ProbeModule(everest_core.get_runtime_session())
logging.info(f"hello: {skip_implementation}")
# implement necessary commands for initialization in the module
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"get_evse",
lambda arg: {"id": 1, "connectors": [{"id": 1}]},
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"enable_disable",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"authorize_response",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"update_allowed_energy_transfer_modes",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"withdraw_authorization",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"reserve",
lambda arg: False,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"cancel_reservation",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"pause_charging",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"resume_charging",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"stop_transaction",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"force_unlock",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleIso15118Extensions",
"set_get_certificate_response",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"external_ready_to_start_charging",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorA",
"set_plug_and_charge_configuration",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"get_evse",
lambda arg: {"id": 2, "connectors": [{"id": 1}]},
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"enable_disable",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"authorize_response",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"update_allowed_energy_transfer_modes",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"withdraw_authorization",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"reserve",
lambda arg: False,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"cancel_reservation",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"pause_charging",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"resume_charging",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"stop_transaction",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"force_unlock",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"external_ready_to_start_charging",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleConnectorB",
"set_plug_and_charge_configuration",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleSystem",
"get_boot_reason",
lambda arg: "PowerUp",
)
implement_command(
module,
skip_implementation,
"ProbeModuleSystem",
"update_firmware",
lambda arg: "Accepted",
)
implement_command(
module,
skip_implementation,
"ProbeModuleSystem",
"allow_firmware_installation",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleSystem",
"upload_logs",
lambda arg: "Accepted",
)
implement_command(
module,
skip_implementation,
"ProbeModuleSystem",
"is_reset_allowed",
lambda arg: True,
)
implement_command(
module, skip_implementation, "ProbeModuleSystem", "reset", lambda arg: None
)
implement_command(
module,
skip_implementation,
"ProbeModuleSystem",
"set_system_time",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"get_leaf_expiry_days_count",
lambda arg: 42,
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"get_v2g_ocsp_request_data",
lambda arg: {"ocsp_request_data_list": []},
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"get_mo_ocsp_request_data",
lambda arg: {"ocsp_request_data_list": []},
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"install_ca_certificate",
lambda arg: "Accepted",
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"delete_certificate",
lambda arg: "Accepted",
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"update_leaf_certificate",
lambda arg: "Accepted",
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"verify_certificate",
lambda arg: "Valid",
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"get_installed_certificates",
lambda arg: {"status": "Accepted", "certificate_hash_data_chain": []},
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"update_ocsp_cache",
lambda arg: None,
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"is_ca_certificate_installed",
lambda arg: False,
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"generate_certificate_signing_request",
lambda arg: {"status": "Accepted"},
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"get_leaf_certificate_info",
lambda arg: {"status": "Accepted"},
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"get_verify_file",
lambda arg: "",
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"get_verify_location",
lambda arg: "",
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"verify_file_signature",
lambda arg: True,
)
implement_command(
module,
skip_implementation,
"ProbeModuleSecurity",
"get_all_valid_certificates_info",
lambda arg: {"status": "NotFound", "info": []},
)
return module
@pytest.fixture()
def ocpp_config_reader(ocpp_config, ocpp_configuration):
"""
Returns a reader over the final OCPP config (after all adaptations during test setup) for convenience.
"""
return everest_test_utils.OCPPConfigReader(ocpp_configuration)

View File

@@ -0,0 +1,18 @@
[pytest]
log_cli=true
log_level=DEBUG
asyncio_mode=strict
asyncio_default_fixture_loop_scope=function
markers=
ocpp_version: Ocpp version
everest_core_config: Override EVerest config file to use in the test
inject_csms_mock: Inject a unittest.mock into chargepoint methods
probe_module: Enable the use of the probe module in this test.
source_certs_dir: Specify a Path to a directory to copy the initial certificates from
use_temporary_persistent_store: Use a test-local temporary file for the persistent store database
csms_tls: Use a CSMS with TLS
ocpp_config_adaptions: Adaptions to the libocpp configuration
ocpp_config: Select a specific libocpp configuration file
everest_config_adaptions: Adaptions to the EVerest configuration
python_files=test_sets/*.py
pythonpath=test_sets

View File

@@ -0,0 +1,30 @@
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIQp0AVHO1RxECAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBAi8SQDuVzHGLigOLpx49A7BIIE
0I5Z4VrRDtaRX1RiLyn8+XulrA9c3LbcLwLG54fMTLhpoT5D0gUYwlyLXogNQQeK
ad9Y0xfKzHTlWSRxMDuO9AnZ8XGWi8AuezIbBXsmDdkYHxT4RLN/XB86wT2jS53H
1pxzu+dmv1A650rQv2Mo8rOH4vyBiBFiGHNcrBL9JMVu7wRseWxY5riAf/1A/EH9
eSwvYWNOTuNJBNEJWQo3g97brACMR3CKzvCCXNAyrtk6dBzn81JJCqHskFUAAVf8
Rb1VrgIth4Oh58bAJvs7A1ZubdDbesMP4GG6uaeJxfgbIyWuIrEBHUNRy8MzDtmu
QLSqJ09enIfEX0TuZaycMFsrWHkyTF4T7A8LmFGRaiBmRNgGHhR+5au+Qp+sFUwp
6cOLAP5Mr/wwhlLFt3CTM3Fe++NGxpd7qp6g0VfhdGDy7dKtgVLwdnWMCm3PT8LS
MsDlsHDl/Dxp33EPHcAHhP+KUFWHL5PZ5aw4J8o4IPNzOd91wyWcg8UCKO2ULQph
dvfu2/7wphv6UVdvjdOmj6a9cqiPE/5gcgsaf7eAkYkhkydi4K5j6Z1LBCx/SJs6
XMYSRfKOZ8jUSFrimF7wGbnEQj3jt2KRWh9mHI+6YjOT040Rk/Xl9sJ9JXqka++3
QKdDpMAv7cWtAOYozI3B/MrES75BbmCACds8566rSeC5MSj6y+ed+CclNrV256iR
az8NXaTI/Cd9rz13d7CRjHTXPhYI446b+KiKJ6xpzK+2vQdoYtZRcTSsLkQ43l1+
cZ1LhzbeTgCy5flizfkv7pDSk84ff81pcJrCctUxHJWwtr5bvSmCam9Flq0LOcMy
6BtXbL7RgTzCb/cdGuHoSSgjhA64qR7iBRlG3plzthbKh1KJpGScgxCkHf8BAEqf
6fzX+X2dpnbzaA+NoQDzuvJGHosZ7lTNuZdAgm2VQWm96YeX0gk/+Pra8fZfc8FY
N22dTHN5YAVh8Y46VaE00Rq+bgcoedZPMgyHrpNnHNojoOsOkoBXRN7OuuGlxuJW
me09XbC1bxdz/OnLZQTLbUBXcVy+rsX0nCFGnBcmkSwsvztejoc1RvHhM6vfAVH7
pPhyCcmXzM8bu5AtktQ+OI1OcxhAOgONgTbarKR4B0zNfXM0mFrZMbSvhikITvvY
9YSc30LM6ntVDKq0u00v3WMbFsMQhA6npobj8TQRv5/3wtdhbckk7t+NJ4HJjGze
fNWUGayiZfq3TN2bZ4aL373EzvX5F4cyEjJf6EoWOLdKF+sMn65mmvorloQwNjYZ
v7ZKnmOlB+bEiYXs7kLviQacNxHBKlSuVsKhGrDT6nDOBmb8ZfhTzKdG742idYoZ
nLwQdrIDq5Mm8EKR9mqhAORLhQ3fcXVM5/WPzNaZ60pExEjg7XNtdL/VS3h3UfWb
wrrDIggc92yTpL1Py3R+ILCwxPzf9SfDjhHmVblsd1PUAOFgDtMY+5QYgJBd/4fe
N76KCtpbamni6keggi1im9zvt+hHExR/N1hQDT9aT2WoGRsWvlvBtPaXGKwC55o/
/2D9kFfTmiskLJZyG06N8JjPD/cWZ6/VQsEbufXwvQiBeemvZex51hBRHsIyOYVy
3TobYslI9r1scv7rat2K4zNAMFtbuJdmCrd97i89R6UW
-----END ENCRYPTED PRIVATE KEY-----

View File

@@ -0,0 +1,18 @@
-----BEGIN CERTIFICATE-----
MIIC9DCCAdwCFCIpbxSzML1UlNW/bodFk/00Hfu+MA0GCSqGSIb3DQEBCwUAMDMx
CzAJBgNVBAYTAkRFMQ8wDQYDVQQKDAZQaW9uaXgxEzARBgNVBAMMCkNTTVNSb290
Q0EwIBcNMjQxMTA2MTAzMDA1WhgPMjEyNDEwMTMxMDMwMDVaMDgxCzAJBgNVBAYT
AkRFMQ8wDQYDVQQKDAZQaW9uaXgxGDAWBgNVBAMMD3Bpb25peC5jc21zLmNvbTCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOhTRohwKCuqYsXP0lhVNSNf
G6AbB71SWwD4Sp3fNbMk5i67I0VpSYpf6pS/GoMgcjEiPP0KLirNaMsMedM/RU/a
7jJhjDN3fQPsG+CO2ia6uFkQuntJXMyncQImfxL+ursJR5SB7Q2lh6bRyWxDcXff
wdDL62ZBfjZtTg9ppdB/3BM2Mxd+/Hu1BpiWtn+k73PqWJt0GKa9E+Ue2l2Y0FTh
Bw39LdVn1ZIDgrS5Xe6M/wpG9hMKPqnXYmTnXH1mBM5lukgRGzutP3WrfEdNXX2n
W0tDFqW9Qx6BqgLsvYnWgPq3GMmrNDJ5++/FASyntCQhPSl9Lbjvq3EJQAQvhJkC
AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAM2tUtCQXSB21LwflnvhDRNrrM5UoCu1B
5qHr1XJaYrH14fgdj24iORLVzecNdU0HS4F7yYP6M67reURntY0Ctaw6u0QbV1wU
5ruaWkSBIYsEc7Tujm8QqVSz4cwvdmzkTTgVFfPRkOpvZ1PgPbq8Q9GyitUEJXuJ
sqB+Q2/JFPwh+6y1TckPq70/gWu0z4CSap9VQU3ed3Fr+RMf9lNh4+q88Mt2tdIV
cvlpQrlneKGbo8mBv9gZ9dOFFjYMWAZWSx8lsJeV6uFlq+7VSGRVmNTva3XAuTcs
WOvMQ5AiSxGVasGIUmbm2mybTMO7eypXXCvKBWidtsBlNnGNqfpNwA==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,13 @@
-----BEGIN CERTIFICATE-----
MIIB6DCCAY+gAwIBAgICMEUwCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJVjJHUm9v
dENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA1YyRzAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSTETMBEG
A1UEAwwKUHJvdlN1YkNBMTEQMA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMCREUx
EzARBgoJkiaJk/IsZAEZFgNDUFMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATv
5jV2NbYx1OebIXgjbp+fImlGtDoDaH9plx/+DkjpI5MTb1/SngF5eW7ik0Bk82K2
+IZ/+IP4vP47GBk67ovAo2YwZDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB
/wQEAwIBBjAdBgNVHQ4EFgQUQJMEvROBa1y6eidJyuk0pnGeNEUwHwYDVR0jBBgw
FoAUZ8ap4nueZjMRXRWNB7elswXz4z4wCgYIKoZIzj0EAwIDRwAwRAIgTBwzZ2ke
NLzUKTaXRItUjIathvG+UGSnMEUYTR0M3XgCIES1rMZ7vw0lDCDZfcs21O6YL+c1
u319fD6e/O/PWYga
-----END CERTIFICATE-----

View File

@@ -0,0 +1,13 @@
-----BEGIN CERTIFICATE-----
MIIB6TCCAZCgAwIBAgICMEYwCgYIKoZIzj0EAwIwSTETMBEGA1UEAwwKUHJvdlN1
YkNBMTEQMA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMCREUxEzARBgoJkiaJk/Is
ZAEZFgNDUFMwIBcNMjMwOTI2MDczODM0WhgPMjIyMzA4MDkwNzM4MzRaMEkxEzAR
BgNVBAMMClByb3ZTdWJDQTIxEDAOBgNVBAoMB0VWZXJlc3QxCzAJBgNVBAYTAkRF
MRMwEQYKCZImiZPyLGQBGRYDQ1BTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
MUw55nn9M8smH52TtU8LkM6n8szWVIRAJmz88z1dY5UPrA4Zvd0ad+YdVJRnGUoK
QRLGsqBg0PzPcySqpc/uuKNmMGQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8B
Af8EBAMCAQYwHQYDVR0OBBYEFD2NLMFiCvyvVwx6mXCv304tovlQMB8GA1UdIwQY
MBaAFECTBL0TgWtcunonScrpNKZxnjRFMAoGCCqGSM49BAMCA0cAMEQCID2D0Jkb
I+nwsJdMGv0Al0QxnHyRVYfWUmBHiaLpAHiqAiARcpQm91Q8Q7oZQ/S3OFeCnai3
67cHM5XXmueZ/ZLSXw==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIB6TCCAZCgAwIBAgICMEYwCgYIKoZIzj0EAwIwSTETMBEGA1UEAwwKUHJvdlN1
YkNBMTEQMA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMCREUxEzARBgoJkiaJk/Is
ZAEZFgNDUFMwIBcNMjMwOTI2MDczODM0WhgPMjIyMzA4MDkwNzM4MzRaMEkxEzAR
BgNVBAMMClByb3ZTdWJDQTIxEDAOBgNVBAoMB0VWZXJlc3QxCzAJBgNVBAYTAkRF
MRMwEQYKCZImiZPyLGQBGRYDQ1BTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
MUw55nn9M8smH52TtU8LkM6n8szWVIRAJmz88z1dY5UPrA4Zvd0ad+YdVJRnGUoK
QRLGsqBg0PzPcySqpc/uuKNmMGQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8B
Af8EBAMCAQYwHQYDVR0OBBYEFD2NLMFiCvyvVwx6mXCv304tovlQMB8GA1UdIwQY
MBaAFECTBL0TgWtcunonScrpNKZxnjRFMAoGCCqGSM49BAMCA0cAMEQCID2D0Jkb
I+nwsJdMGv0Al0QxnHyRVYfWUmBHiaLpAHiqAiARcpQm91Q8Q7oZQ/S3OFeCnai3
67cHM5XXmueZ/ZLSXw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB6DCCAY+gAwIBAgICMEUwCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJVjJHUm9v
dENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA1YyRzAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSTETMBEG
A1UEAwwKUHJvdlN1YkNBMTEQMA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMCREUx
EzARBgoJkiaJk/IsZAEZFgNDUFMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATv
5jV2NbYx1OebIXgjbp+fImlGtDoDaH9plx/+DkjpI5MTb1/SngF5eW7ik0Bk82K2
+IZ/+IP4vP47GBk67ovAo2YwZDASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB
/wQEAwIBBjAdBgNVHQ4EFgQUQJMEvROBa1y6eidJyuk0pnGeNEUwHwYDVR0jBBgw
FoAUZ8ap4nueZjMRXRWNB7elswXz4z4wCgYIKoZIzj0EAwIDRwAwRAIgTBwzZ2ke
NLzUKTaXRItUjIathvG+UGSnMEUYTR0M3XgCIES1rMZ7vw0lDCDZfcs21O6YL+c1
u319fD6e/O/PWYga
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDCAs2pQSpksFxt
Xcvt/Fnu+nQ/VxfkhdrPB1plrCOGdy+2HtbZ6hwHeKfdGmcCRt1eAlJPUrgLWiT3
LIVMjrJ9qTtZOpfhCt0YOSD97ZP7vTVLE7bW/lSsRmuqMsvymxttAk3TIdGQpBQ0
BZZENhDYCSbbCAcWq948dtXKyNzX0BZdCSDkd1b0AbnY7LE0x0atQZFm9jHr9irb
AgK6QZdYp9HMERewWxgta7jtDCusHDCit5Yt9ahtBfB5pS/pmk5gnRAlYpOEGhlb
CdD5dTKQOLKbHmW94c6p0G7BTOl1EtN2CTW06KZxxZaipVQzqz2WGwGjYmcdnhVQ
MDU0hy+pAgMBAAECggEAR/BcLC9ytcVDcHZAQO26t0d9RWNZA66ylOPIHD05KwoU
0fYbetA5NngB3pWErq5yNQKtXKZyghsZ6+FBSEL9YmUXEZ4NZS/vDaVZW2712Xmu
Qjl8KbpC0WKHV6PgRgRHpiMdknVOzNBagXO05XQayNCT7NHMNxbhoA/8dGYIpajo
qyaJpNx3zin3k87RigBtbLf4w6BWyv6pmzxby4aeiesJtwzx4jf8h6KdwlHpNbrF
unIDlpooRtdx0ALPefyJvnJ/95D4tndGOdgiRnuz9I9VvjsVOfKkzAmWOgC/M0IS
7Z/bE+2URuzu/ry6Urp0U5b+JLstcbRsirdL7qnlxQKBgQDS5lSKGOD8nJYAJiuh
q4kxdmqOGzwgb7u2M5NgkMyi8SUJJZXG7ALoCdQe1OHfAIhwsE6slJYHWpzaTXAN
p2MAbKt5VK6yvq1mUE1A47pi3ihGNctpd3xAw4haP9cDtw1Iqu2yJYo10Vn7QKl2
cIetJMcUMptAbgT0hL03ZoByNwKBgQDrf+Zgogmy+6giGRUiHENTF7TFQGau1hVN
9jMHVkGDisZC7IInMihwBkXkT5n7LcNkiU8yg0Oj4niAln6bbdxJ8y7CRQEy2g0n
gAZALzPWjQAk9IBCE5m5W58v/qHd0ftSWjtqZ+OYLbUbect6/v+hXFb0J2l3Ln+p
27SoLi/9HwKBgFJfLfPGJdHkYt3qCq6ZbftIsfORBZnxqhJO8KgNxi96GioJaQeJ
1NTGSfhE03ejIKdK5V+YpUR4Cr1k83gRwaQ/zXWVMqqTuOw2PwYyK/FDrd1GU418
4qX0+QOu3Y8Q5vpT8ITdDq9Ydlmg9s9Qwl1I+QyVe3fdwMe0NKc3vMFfAoGAXzXW
bjsUsMgNsbtyT9gdX/q1mwnuecET2/EtsEmvMv9oKKZ1+GLO9nuSxjtohaR62qqo
2kM3lYp6LYKqrSw9Y6htvx0m3uhJaS7ZWBm9W4CmDkrLj+tcuxPPyBeqWYQLl7/j
RaG64kuYbQNQwOlXcGVkwlEs0oJ6GrI418XUoQECgYEAtUwMgJr5xeqvDqNJ065H
SdRSOewUaUPxOtYITqihj0YR22BSWs3X4PPXGDJ2yyRCuvs0gHpPX/F7cmEjF+N5
QHb/AlePECiCSb8rcMF4phEXZOE+1poVcPvn5dckNeg2YrSo6WMOS7e7NP6hZcrt
+/FBHitjRK8olut1Y/bz+x4=
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,18 @@
-----BEGIN CERTIFICATE-----
MIIC7zCCAdcCFFnSdVg5iSwTLqqaSa1scWOM6AErMA0GCSqGSIb3DQEBCwUAMDMx
CzAJBgNVBAYTAkRFMQ8wDQYDVQQKDAZQaW9uaXgxEzARBgNVBAMMCkNTTVNSb290
Q0EwIBcNMjQwOTIwMTMyNTUzWhgPMjA1MjAzMDExMzI1NTNaMDMxCzAJBgNVBAYT
AkRFMQ8wDQYDVQQKDAZQaW9uaXgxEzARBgNVBAMMCkNTTVNSb290Q0EwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDCAs2pQSpksFxtXcvt/Fnu+nQ/Vxfk
hdrPB1plrCOGdy+2HtbZ6hwHeKfdGmcCRt1eAlJPUrgLWiT3LIVMjrJ9qTtZOpfh
Ct0YOSD97ZP7vTVLE7bW/lSsRmuqMsvymxttAk3TIdGQpBQ0BZZENhDYCSbbCAcW
q948dtXKyNzX0BZdCSDkd1b0AbnY7LE0x0atQZFm9jHr9irbAgK6QZdYp9HMERew
Wxgta7jtDCusHDCit5Yt9ahtBfB5pS/pmk5gnRAlYpOEGhlbCdD5dTKQOLKbHmW9
4c6p0G7BTOl1EtN2CTW06KZxxZaipVQzqz2WGwGjYmcdnhVQMDU0hy+pAgMBAAEw
DQYJKoZIhvcNAQELBQADggEBAI085Iyhy9dLD4Dz5HEyY1sCrWZRcbwScCMOyjkI
yMQbWl3HNrwNvd57L18E/Co61qz8m+ZsvFh7VZMnw/tVxOAyzEyTK+iwsj2XLcs0
P93LeqNXemmO3OcyOjrjGToOCGTqIJVSrPzPsrTxSLPQyUt0llvfPGF2p9fid9eK
wBc2mE34lfdMl1dfWCDiMk8gngOo5cPOvnGob9Mc2m4U517iGyYbQAe/Ew6r6Mrg
GCh1uUaBIkW9Diiq+1Dox5Hp4jWPoSJ4laoTXk27zRxDmAaVCqCM/CtuZdNws6qA
Pa0mUpan/kSQO+RLbScnbFOE4gfBQJaCgxyeuFMJqRqoVhg=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICWTCCAf+gAwIBAgICMDowCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJVjJHUm9v
dENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA1YyRzAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSDESMBAG
A1UEAwwJQ1BPU3ViQ0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA1YyRzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMqy
mpvtNjA3+U5TdcucSgdWpXFj8XXwAlb6luBEYCytUD7AREB9P+ksVgcN6GiiZGn8
0Pdnu+NCuyDLwlUvX6ejgdYwgdMwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8B
Af8EBAMCAQYwHQYDVR0OBBYEFCcnBk2/j/EjG9W6yXgudPVyOgWwMG0GCCsGAQUF
BwEBBGEwXzAkBggrBgEFBQcwAYYYaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vMDcG
CCsGAQUFBzAChitodHRwczovL3d3dy5leGFtcGxlLmNvbS9JbnRlcm1lZGlhdGUt
Q0EuY2VyMB8GA1UdIwQYMBaAFGfGqeJ7nmYzEV0VjQe3pbMF8+M+MAoGCCqGSM49
BAMCA0gAMEUCICZt4DhW92hiDyUr8oqOUHocKfLRMf5I0vTvajqTbQiVAiEA6as1
yudx0oHSYf7e7IZBQ6KP1gjC6wcRvfvlBQNbySQ=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICWTCCAf+gAwIBAgICMDswCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJQ1BPU3Vi
Q0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA1YyRzAgFw0yMzA5MjYwNzM4MzRaGA8yMTIzMDkwMjA3MzgzNFowSDESMBAG
A1UEAwwJQ1BPU3ViQ0EyMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA1YyRzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEat
pC4ruZ4wc/Hb5JA68ICxU7TQNvLDTJ+Qjc9QetO91h8gAoVRAHKvg8Hoe+lqfu5d
+Q6Ax05xUuFwTzyc3eejgdYwgdMwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8B
Af8EBAMCAQYwHQYDVR0OBBYEFDYZY4lJbs1mKm1gGVf3Jw9cDOWPMG0GCCsGAQUF
BwEBBGEwXzAkBggrBgEFBQcwAYYYaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vMDcG
CCsGAQUFBzAChitodHRwczovL3d3dy5leGFtcGxlLmNvbS9JbnRlcm1lZGlhdGUt
Q0EuY2VyMB8GA1UdIwQYMBaAFCcnBk2/j/EjG9W6yXgudPVyOgWwMAoGCCqGSM49
BAMCA0gAMEUCIQDsQM6q7ecToESugkNzZS3R6il0TKNXeeVgwC84kgb0RAIgfjZh
VXfKo/V7VIHRG9zgM5mO8XdLp+ip25FZbc+V5wU=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,22 @@
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIUefSpxKT9V9AskQWsKw26gKbfryIwDQYJKoZIhvcNAQEL
BQAwZzELMAkGA1UEBhMCREUxCzAJBgNVBAgMAkJXMRMwEQYDVQQHDApIZWlkZWxi
ZXJnMQ8wDQYDVQQKDAZQaW9uaXgxFDASBgNVBAsMC0RldmVsb3BtZW50MQ8wDQYD
VQQDDAZQaW9uaXgwHhcNMjIwNTI1MDgxMjE1WhcNMzIwNTIyMDgxMjE1WjBnMQsw
CQYDVQQGEwJERTELMAkGA1UECAwCQlcxEzARBgNVBAcMCkhlaWRlbGJlcmcxDzAN
BgNVBAoMBlBpb25peDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxDzANBgNVBAMMBlBp
b25peDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALovuIM86s4FrYts
Ordg6SO9PhTr4Cd9xyux53XttAlCP2GmPC3XWSWUFHj8Mn9UB+8UInvfpIieHCbP
wG/wJGycvIDy2IiteS/bei9H3W25BpDTW7aaIsXauwlGfHJR70GoFXjl3NqrFdeH
IKSPX7haMHDvnTL3YK5d7LdIFPEB8m8rGtYEg7sVN+cqqQDbHNGuDmGto86OIEXh
+mXvDBuoDi3jxCCFaro9FGnE1LddI/FiZvHHPpGvfFFBqQtgXhIc0qdkH6xJL4oY
zvzVlc83wPsTZqmQOiG/+3VCWISLkQRZ94X7SU3KEQ7vTxU7um0O/6NmTOLwEgHY
pNqHNy8CAwEAAaNTMFEwHQYDVR0OBBYEFIsoJXpl8ZCHAGmvi7A2l7ncKjpYMB8G
A1UdIwQYMBaAFIsoJXpl8ZCHAGmvi7A2l7ncKjpYMA8GA1UdEwEB/wQFMAMBAf8w
DQYJKoZIhvcNAQELBQADggEBAHxzfbjod5nzxv0s7PjZ2t5S/RhmW43C6fkveB3o
earwORJaEHY0I8tBizfha39JaF/b1JyGBi4anqluXNRM/1dRXIDxsrIX/z3Un/0f
18wHWZAL5FpG8PqseNFR6zaLYcLIouqRPTLX+rtbQ+l1N+0lAemR4TC7zV+2iyAj
fppq49jwQXZhi7iBotoV4uZJ0ZnWXpFPp67dyRoyAJUKOGVWuKCuQqsWULlkx4i8
bIW8QQ9uCY/YDUldkONT+LE+uD8inmekaOsxtCkcIv4jKHP3Znxe4iooVqCI/vpn
AL+JtFpWF+lBqjIg7LYKhb4EL41CcF2jp2nsNTEGz4mHZZA=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIICdzCCAh2gAwIBAgICMEMwCgYIKoZIzj0EAwIwVzEiMCAGA1UEAwwZUEtJLUV4
dF9DUlRfTU9fU1VCMV9WQUxJRDEQMA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMC
REUxEjAQBgoJkiaJk/IsZAEZFgJNTzAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYy
MTA3MzgzNFowVzEiMCAGA1UEAwwZUEtJLUV4dF9DUlRfTU9fU1VCMl9WQUxJRDEQ
MA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMCREUxEjAQBgoJkiaJk/IsZAEZFgJN
TzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCy609nf5hPrm5RTmxDGx/NIZBUT
mMjTmzJdeFeNv/KR8vhA7ttt4U71fdkXnV7v9wqhUKzdZ1/aY/UPxdmTYNWjgdYw
gdMwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0OBBYE
FA1kQYEMG643y6vTSx9WZwZU5LKZMG0GCCsGAQUFBwEBBGEwXzAkBggrBgEFBQcw
AYYYaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vMDcGCCsGAQUFBzAChitodHRwczov
L3d3dy5leGFtcGxlLmNvbS9JbnRlcm1lZGlhdGUtQ0EuY2VyMB8GA1UdIwQYMBaA
FCERWVHh0/KaD6/4zx8a/IFC+bleMAoGCCqGSM49BAMCA0gAMEUCIHyiGWfR0Blg
fBmNz1vgcce+DWlZXhtucfkZnu0iFSKnAiEA24l7RzuuPhEWQVcZiCz4JNYlRQCi
DJMbo6rhh2OkFg4=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICZjCCAgygAwIBAgICMEIwCgYIKoZIzj0EAwIwRjERMA8GA1UEAwwITU9Sb290
Q0ExEDAOBgNVBAoMB0VWZXJlc3QxCzAJBgNVBAYTAkRFMRIwEAYKCZImiZPyLGQB
GRYCTU8wIBcNMjMwOTI2MDczODM0WhgPMjQyMzA2MjEwNzM4MzRaMFcxIjAgBgNV
BAMMGVBLSS1FeHRfQ1JUX01PX1NVQjFfVkFMSUQxEDAOBgNVBAoMB0VWZXJlc3Qx
CzAJBgNVBAYTAkRFMRIwEAYKCZImiZPyLGQBGRYCTU8wWTATBgcqhkjOPQIBBggq
hkjOPQMBBwNCAATCeOBV70uDeFPTzSn/0q/vtTIIUoyi17jtJcBJIJ6HKQ5erQWX
LNHNeWAb67AzhveWaNEidGTCEy8FEfpKQMTJo4HWMIHTMBIGA1UdEwEB/wQIMAYB
Af8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQhEVlR4dPymg+v+M8fGvyB
Qvm5XjBtBggrBgEFBQcBAQRhMF8wJAYIKwYBBQUHMAGGGGh0dHBzOi8vd3d3LmV4
YW1wbGUuY29tLzA3BggrBgEFBQcwAoYraHR0cHM6Ly93d3cuZXhhbXBsZS5jb20v
SW50ZXJtZWRpYXRlLUNBLmNlcjAfBgNVHSMEGDAWgBTzye4wMVvPhaamN7ESwws6
ssEXDjAKBggqhkjOPQQDAgNIADBFAiB+nBAlxposIDJxiloT2ELP5+o0MiUTxshl
t3OtZTc7WAIhANJEMAyviGwEpO+EcBFjMKkMUYujjpLQFufl4lnmYIn0
-----END CERTIFICATE-----

View File

@@ -0,0 +1,14 @@
-----BEGIN CERTIFICATE-----
MIICMTCCAdegAwIBAgICMEEwCgYIKoZIzj0EAwIwRjERMA8GA1UEAwwITU9Sb290
Q0ExEDAOBgNVBAoMB0VWZXJlc3QxCzAJBgNVBAYTAkRFMRIwEAYKCZImiZPyLGQB
GRYCTU8wIBcNMjMwOTI2MDczODM0WhgPMzAyMzAxMjcwNzM4MzRaMEYxETAPBgNV
BAMMCE1PUm9vdENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTESMBAG
CgmSJomT8ixkARkWAk1PMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOPhLNwtB
1KK0b2zA/+s3UTSeonYiynypWR77zac0/wRBicfWI6BbN5ASCs7AeStsfMclRyzN
/BMTZicBr3hzn6OBsjCBrzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
BjAdBgNVHQ4EFgQU88nuMDFbz4WmpjexEsMLOrLBFw4wbQYIKwYBBQUHAQEEYTBf
MCQGCCsGAQUFBzABhhhodHRwczovL3d3dy5leGFtcGxlLmNvbS8wNwYIKwYBBQUH
MAKGK2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tL0ludGVybWVkaWF0ZS1DQS5jZXIw
CgYIKoZIzj0EAwIDSAAwRQIhANeKAfZicdBRO4KfW7+E6aPCkyYWPIJzTKqXVvOZ
gVREAiABTYfSqnxXUMkdRWb5ku7gZLdsvFJStRKt1UuQTeOnUQ==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICZjCCAgygAwIBAgICMEIwCgYIKoZIzj0EAwIwRjERMA8GA1UEAwwITU9Sb290
Q0ExEDAOBgNVBAoMB0VWZXJlc3QxCzAJBgNVBAYTAkRFMRIwEAYKCZImiZPyLGQB
GRYCTU8wIBcNMjMwOTI2MDczODM0WhgPMjQyMzA2MjEwNzM4MzRaMFcxIjAgBgNV
BAMMGVBLSS1FeHRfQ1JUX01PX1NVQjFfVkFMSUQxEDAOBgNVBAoMB0VWZXJlc3Qx
CzAJBgNVBAYTAkRFMRIwEAYKCZImiZPyLGQBGRYCTU8wWTATBgcqhkjOPQIBBggq
hkjOPQMBBwNCAATCeOBV70uDeFPTzSn/0q/vtTIIUoyi17jtJcBJIJ6HKQ5erQWX
LNHNeWAb67AzhveWaNEidGTCEy8FEfpKQMTJo4HWMIHTMBIGA1UdEwEB/wQIMAYB
Af8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQhEVlR4dPymg+v+M8fGvyB
Qvm5XjBtBggrBgEFBQcBAQRhMF8wJAYIKwYBBQUHMAGGGGh0dHBzOi8vd3d3LmV4
YW1wbGUuY29tLzA3BggrBgEFBQcwAoYraHR0cHM6Ly93d3cuZXhhbXBsZS5jb20v
SW50ZXJtZWRpYXRlLUNBLmNlcjAfBgNVHSMEGDAWgBTzye4wMVvPhaamN7ESwws6
ssEXDjAKBggqhkjOPQQDAgNIADBFAiB+nBAlxposIDJxiloT2ELP5+o0MiUTxshl
t3OtZTc7WAIhANJEMAyviGwEpO+EcBFjMKkMUYujjpLQFufl4lnmYIn0
-----END CERTIFICATE-----

View File

@@ -0,0 +1,16 @@
-----BEGIN CERTIFICATE-----
MIICdzCCAh2gAwIBAgICMEMwCgYIKoZIzj0EAwIwVzEiMCAGA1UEAwwZUEtJLUV4
dF9DUlRfTU9fU1VCMV9WQUxJRDEQMA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMC
REUxEjAQBgoJkiaJk/IsZAEZFgJNTzAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYy
MTA3MzgzNFowVzEiMCAGA1UEAwwZUEtJLUV4dF9DUlRfTU9fU1VCMl9WQUxJRDEQ
MA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMCREUxEjAQBgoJkiaJk/IsZAEZFgJN
TzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCy609nf5hPrm5RTmxDGx/NIZBUT
mMjTmzJdeFeNv/KR8vhA7ttt4U71fdkXnV7v9wqhUKzdZ1/aY/UPxdmTYNWjgdYw
gdMwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0OBBYE
FA1kQYEMG643y6vTSx9WZwZU5LKZMG0GCCsGAQUFBwEBBGEwXzAkBggrBgEFBQcw
AYYYaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vMDcGCCsGAQUFBzAChitodHRwczov
L3d3dy5leGFtcGxlLmNvbS9JbnRlcm1lZGlhdGUtQ0EuY2VyMB8GA1UdIwQYMBaA
FCERWVHh0/KaD6/4zx8a/IFC+bleMAoGCCqGSM49BAMCA0gAMEUCIHyiGWfR0Blg
fBmNz1vgcce+DWlZXhtucfkZnu0iFSKnAiEA24l7RzuuPhEWQVcZiCz4JNYlRQCi
DJMbo6rhh2OkFg4=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIB6DCCAY6gAwIBAgICMD8wCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJT0VNU3Vi
Q0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA09FTTAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSDESMBAG
A1UEAwwJT0VNU3ViQ0EyMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA09FTTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABE+5
Jw399yjF4tspXmzAomIEET7u6OZ4794J3rmtQBzrwdWi6PXNK1XlwQBw9tgkF1/G
7ASHMNMk02nUQVRoIv2jZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/
BAQDAgEGMB0GA1UdDgQWBBQ4i1PCQGVLiFD8YkvM3DP3yrGWTTAfBgNVHSMEGDAW
gBRzjJliU3xcjw98B5VT04G6ZyGxDzAKBggqhkjOPQQDAgNIADBFAiEA+UA/zGcv
HttMd1GtcU4IGW78jmP6SlLizNytu3Yg++cCIC0CGpCPsUKPbHBzyCvMwp0DebYL
+atLjhDjPqVGQvYJ
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB5zCCAY6gAwIBAgICMD4wCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJT0VNUm9v
dENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA09FTTAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSDESMBAG
A1UEAwwJT0VNU3ViQ0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA09FTTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGx6
mv9UeTG4ywVfu1GJ6prtuX7WNbFP377RChPD4sL4TWHldLMKOJu0b0bc2KGWyBu3
tmq+CbiHJTkEZ+ekEDOjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/
BAQDAgEGMB0GA1UdDgQWBBRzjJliU3xcjw98B5VT04G6ZyGxDzAfBgNVHSMEGDAW
gBTpHbunA9uW7U/2N8XBh9uc22LiwTAKBggqhkjOPQQDAgNHADBEAiB6OibJal2K
JE1xAU7Wp7K/iDb6XxCkI+EmPd4mE1JG4wIgFbI0VgPlDNioRWfExCqgzMWNeEj+
xXt2PfIIpifz3Sk=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,39 @@
-----BEGIN CERTIFICATE-----
MIIB5DCCAYqgAwIBAgICMEAwCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJT0VNU3Vi
Q0EyMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA09FTTAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSjEUMBIG
A1UEAwwLT0VNUHJvdkNlcnQxEDAOBgNVBAoMB0VWZXJlc3QxCzAJBgNVBAYTAkRF
MRMwEQYKCZImiZPyLGQBGRYDT0VNMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
1Qza34iaHRAxMwvGUOTnBvlFicTCFl1cddIvnsd1qbaEyIIRotrOkXhfIQDv4kmi
ue85Cpa2vdn+m1p48W7icaNgMF4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMC
A4gwHQYDVR0OBBYEFK5Xv8jMo4+1pvU2GWsZU7BG/kQEMB8GA1UdIwQYMBaAFDiL
U8JAZUuIUPxiS8zcM/fKsZZNMAoGCCqGSM49BAMCA0gAMEUCIQDxjoscE/RMTLZh
9u/ElkpavrVQpkhVmhYOEbQWr/4ijQIgQaHykyPuRZMen3ZCVXqioqsDj6Dq5WAw
Nsf1XdB+Nz8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB6DCCAY6gAwIBAgICMD8wCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJT0VNU3Vi
Q0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA09FTTAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSDESMBAG
A1UEAwwJT0VNU3ViQ0EyMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA09FTTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABE+5
Jw399yjF4tspXmzAomIEET7u6OZ4794J3rmtQBzrwdWi6PXNK1XlwQBw9tgkF1/G
7ASHMNMk02nUQVRoIv2jZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/
BAQDAgEGMB0GA1UdDgQWBBQ4i1PCQGVLiFD8YkvM3DP3yrGWTTAfBgNVHSMEGDAW
gBRzjJliU3xcjw98B5VT04G6ZyGxDzAKBggqhkjOPQQDAgNIADBFAiEA+UA/zGcv
HttMd1GtcU4IGW78jmP6SlLizNytu3Yg++cCIC0CGpCPsUKPbHBzyCvMwp0DebYL
+atLjhDjPqVGQvYJ
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIB5zCCAY6gAwIBAgICMD4wCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJT0VNUm9v
dENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA09FTTAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSDESMBAG
A1UEAwwJT0VNU3ViQ0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA09FTTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGx6
mv9UeTG4ywVfu1GJ6prtuX7WNbFP377RChPD4sL4TWHldLMKOJu0b0bc2KGWyBu3
tmq+CbiHJTkEZ+ekEDOjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/
BAQDAgEGMB0GA1UdDgQWBBRzjJliU3xcjw98B5VT04G6ZyGxDzAfBgNVHSMEGDAW
gBTpHbunA9uW7U/2N8XBh9uc22LiwTAKBggqhkjOPQQDAgNHADBEAiB6OibJal2K
JE1xAU7Wp7K/iDb6XxCkI+EmPd4mE1JG4wIgFbI0VgPlDNioRWfExCqgzMWNeEj+
xXt2PfIIpifz3Sk=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBxTCCAWqgAwIBAgICMD0wCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJT0VNUm9v
dENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA09FTTAgFw0yMzA5MjYwNzM4MzRaGA8zMDIzMDEyNzA3MzgzNFowSDESMBAG
A1UEAwwJT0VNUm9vdENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA09FTTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIX6
D9hpCtQJnHR0+E3EmCsn03Bnx9HxnmFxz8S1i5M6Bp3Poap8Gi12WW06sHAp1UFV
hVzew+MZryodYsO58+6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBTpHbunA9uW7U/2N8XBh9uc22LiwTAKBggqhkjOPQQDAgNJ
ADBGAiEA8bIzMNN3MhUXQvoBTli9wDBJLbr/ZFDFoIhFczKcgdUCIQCaUomBA4Gb
VIGVs3tKXn5XDG1YO2bqNlbycy5Ktb+xVA==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,13 @@
-----BEGIN CERTIFICATE-----
MIIB5zCCAY6gAwIBAgICMD4wCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJT0VNUm9v
dENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA09FTTAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSDESMBAG
A1UEAwwJT0VNU3ViQ0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA09FTTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGx6
mv9UeTG4ywVfu1GJ6prtuX7WNbFP377RChPD4sL4TWHldLMKOJu0b0bc2KGWyBu3
tmq+CbiHJTkEZ+ekEDOjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/
BAQDAgEGMB0GA1UdDgQWBBRzjJliU3xcjw98B5VT04G6ZyGxDzAfBgNVHSMEGDAW
gBTpHbunA9uW7U/2N8XBh9uc22LiwTAKBggqhkjOPQQDAgNHADBEAiB6OibJal2K
JE1xAU7Wp7K/iDb6XxCkI+EmPd4mE1JG4wIgFbI0VgPlDNioRWfExCqgzMWNeEj+
xXt2PfIIpifz3Sk=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,13 @@
-----BEGIN CERTIFICATE-----
MIIB6DCCAY6gAwIBAgICMD8wCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJT0VNU3Vi
Q0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA09FTTAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSDESMBAG
A1UEAwwJT0VNU3ViQ0EyMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA09FTTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABE+5
Jw399yjF4tspXmzAomIEET7u6OZ4794J3rmtQBzrwdWi6PXNK1XlwQBw9tgkF1/G
7ASHMNMk02nUQVRoIv2jZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/
BAQDAgEGMB0GA1UdDgQWBBQ4i1PCQGVLiFD8YkvM3DP3yrGWTTAfBgNVHSMEGDAW
gBRzjJliU3xcjw98B5VT04G6ZyGxDzAKBggqhkjOPQQDAgNIADBFAiEA+UA/zGcv
HttMd1GtcU4IGW78jmP6SlLizNytu3Yg++cCIC0CGpCPsUKPbHBzyCvMwp0DebYL
+atLjhDjPqVGQvYJ
-----END CERTIFICATE-----

View File

@@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBxTCCAWqgAwIBAgICMDkwCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJVjJHUm9v
dENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA1YyRzAgFw0yMzA5MjYwNzM4MzRaGA8zMDIzMDEyNzA3MzgzNFowSDESMBAG
A1UEAwwJVjJHUm9vdENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA1YyRzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJjZ
qKsQaffrsSSRTQE57gcpjuxtkKluOMbQWHmpBHgK7coPhm/xlmfDn/rRmQ0fvEqi
zx/oDCt8yAObxSTyj3CjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBRnxqnie55mMxFdFY0Ht6WzBfPjPjAKBggqhkjOPQQDAgNJ
ADBGAiEAzmGWz+ES3AskIzWkpyLReF5uumL3P9M6oGbuWQNI7oUCIQCxMh9YfpQ9
ODORWoaQhzzcGylXRfW0Vo+KbGSUIM5UJQ==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,28FD4B20429D2EE2D5A4CD16DC96D9E7
6mD0qWchx9nnoG0k6OWhYHAnO/Kt096OWdC2zb7LpxJpPR1QeSLLbGD2C2ZR1HIV
BU6JC5oK4WaLx/n9nN/inyJxnukc+PcsPJfPFMapVB/6cf21TrTQRBo8FXCORzVU
RGbxT7lGQ6N0ygBWy5gen+4Fgvj3ZvCovtHT3E0776Q=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,13 @@
-----BEGIN CERTIFICATE-----
MIIB4TCCAYagAwIBAgICMEcwCgYIKoZIzj0EAwIwSTETMBEGA1UEAwwKUHJvdlN1
YkNBMjEQMA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMCREUxEzARBgoJkiaJk/Is
ZAEZFgNDUFMwHhcNMjMwOTI2MDczODM0WhcNNDgwNTE3MDczODM0WjBHMREwDwYD
VQQDDAhDUFMgTGVhZjEQMA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMCREUxEzAR
BgoJkiaJk/IsZAEZFgNDUFMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASindZ1
hlVRT/odxEf1LFbYuoTyOh2Oa6CqDX8Um/RSmLG52OVxdKfAGk4R8ORJRNh7QyLd
H09I0ie8IjK4icZeo2AwXjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDAd
BgNVHQ4EFgQUZv5eVYYpEgF/SaUSX3f0y0fHPi4wHwYDVR0jBBgwFoAUPY0swWIK
/K9XDHqZcK/fTi2i+VAwCgYIKoZIzj0EAwIDSQAwRgIhAOyfs/F2IngcG+zT68sb
NyRXTGZSxlwT/lCxM8CyGkR6AiEAo6N6SCi7PLplvLUFqSzZv+71QWiuXptDa+s+
EWTROjA=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,92A9EC2A77B81ABF10BC8E6AE11B43B6
nnH3OCZrUZBdMhocSDduVmuce8nVFaJF4jcq29d+jDABB8ibYppoPHxR6b8+etui
Qhd6iE2TZXtlSctsZvIp4LVh2Tri0WUO678YndrGg06oZgIf+Y8nXyx6G8VyxUGb
QzTtj+wLR1NJVPZtLJcih8GpIHQHUyn5N0c+LzvgoB4=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,73E1007AF27ADEF53BF5063E7FABAF83
Qc1kobAi7yJ3Acx/rsb6+RUE81jv1WY8sFQ172b77P2Yaq7vL+TjWLlChLmFm0No
KiNK+5gY+ylgvItcvrSiCj2UoJgJuHY8MPGGMeVs841VkI8B+cqvnmbfGOcOpl4s
AbTzenCYKABWlsgv+6evQCqHA0DFmFNmH7xbyflh55Q=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDlaoH7m9gUXbSb
AvKGZr7/9iOLa5pewkPkgKkBzcFW4clJyFfnk8R84JO1zk9AsIhsjs4sDtePl1I2
cvmKUcZTi07Et/LbIDyur4DFGQIHwDNVHjElWmm6N1SfyKSx4rhInMwMhvx4JBBH
l8OupQdwroIkCsT2OfFoD198+rwzdaPkrE1854+FvMSdKyF+KeLjSG5xcl2MTO9T
YQ8e4Ql1PcSvQHhxuAdG03pLiMiVTCFEFqzu3vd8VqNwbABhVNH6O/SxyUvePuUn
6VCd8//D6fG9FmlTUIMO1C+MTIwU6cKCL0cI/MZo88BjYvzntpxsscut34iR8/WF
S+J/O9HlAgMBAAECggEAFORy5O263mC9CooL3+bqFjGD6Cj+KT4D/jW9uzvR+e5C
+gF3bxzH/cVbJLXrbFoHR1E0AAaNmMNWydc4cXr9lp/u2VkuxS51rqtHjOuFNOmx
SXTTISWcNkireYer5yuqAHbcpqsBjmFeZPhMHXkxXCop3bI0+kvcxIJasSBWblGB
2fCIdgLpmfhbVENE/z1iUDiE2/eEVT17sRAdBjIEDxpMunzLQ4/Hdc7VcKAOjA7y
fjGwGkLzRPkzbLZFFzOrvTkRKOu8bVBH6giN411xxQYIRCpa+BDjb3syoyVHgw6q
o2KYanJ1He41wF0+9o0KlFrz0pXpOgjsYd1vWD3iqwKBgQD42F14RoWI6HbquFQi
wQ6LXcurHT3rcRvHOMUzD3dvelkr7L4thqtYNOSlBM/8QBo1xkMi3k6CgwUuScRi
yHHyMxjXgGsZRcR6ICMDvVVRc+DoC5195OL/HW6PXqD6CNJR5+0NH1JdCruaXzrx
NpcYxfbQFajc+qXcTBoNwvKuDwKBgQDsAyI8l4h2QxQiMalo6XwpoTQfw7p6incQ
EaBzIl+4iDplEu25qo7BvxA5Nfaudy35zaA1hRlKGvcHsxvqlmvoaITC5yrDIqIB
5N6Rgpirie/Wp5Winny8+Iu9aIcUJkqtE1qEQxy4LkFBacz+sxvfDplzJA2Elypp
G75OXEN0ywKBgFIdQ6q+yq3E2AjYTpsxTZVbnCuY+KfKqTnyV9BjmCvnGanO82qe
d8ghnBmAHwnENWHtTJYi+ZFDnuAJY46dSkx75ASo0a6DQTRzilpfjdnU/TBVNOEo
OGeq1KLmvQQFCTIR8D1WSp19Py7Poema8/0uxiUgIJra8wRg8G/+FoqtAoGAbW/i
j0Agyd2+10A58ujZZyBV4CjNLodIQE48HUciJZodocKOMxqwSYzEBBNOyIWA7yV3
FXobSO6J/6sA1d1cOg9FCG9St9s2TjSHM+ffzSMP8HQTAa4F30ZM3c47XI+I7wpb
XZsVFR51qdRadvwsf1jwtKBSGFpUExsHOqSzrtMCgYAuCoK7JHZUU+U8RqfJkpci
m522Ldhz+rICT/rByItKFpm9WaKwouZfNB2I45kIHvcl7h9RSCPkFcMs2kTjNF1h
AyAlGnawOe8EOzVc2jVR+0PPcgwSoZ9ZHyPDUXdHCdAzdA256z1zipk1rIEqp7ZH
Y2XZai5tF8r3+sAv5Umr1Q==
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,18 @@
-----BEGIN CERTIFICATE-----
MIIC7TCCAdUCFGQ2LxV6E0juGIHth9kSN7+JXgf0MA0GCSqGSIb3DQEBCwUAMDMx
CzAJBgNVBAYTAkRFMQ8wDQYDVQQKDAZQaW9uaXgxEzARBgNVBAMMCkNTTVNSb290
Q0EwIBcNMjQwOTIwMTMzMzEyWhgPMjA1MjAyMDYxMzMzMTJaMDExCzAJBgNVBAYT
AkRFMQ8wDQYDVQQKDAZQaW9uaXgxETAPBgNVBAMMCENzbXNMZWFmMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5WqB+5vYFF20mwLyhma+//Yji2uaXsJD
5ICpAc3BVuHJSchX55PEfOCTtc5PQLCIbI7OLA7Xj5dSNnL5ilHGU4tOxLfy2yA8
rq+AxRkCB8AzVR4xJVppujdUn8ikseK4SJzMDIb8eCQQR5fDrqUHcK6CJArE9jnx
aA9ffPq8M3Wj5KxNfOePhbzEnSshfini40hucXJdjEzvU2EPHuEJdT3Er0B4cbgH
RtN6S4jIlUwhRBas7t73fFajcGwAYVTR+jv0sclL3j7lJ+lQnfP/w+nxvRZpU1CD
DtQvjEyMFOnCgi9HCPzGaPPAY2L857acbLHLrd+IkfP1hUvifzvR5QIDAQABMA0G
CSqGSIb3DQEBCwUAA4IBAQA0d5+3ml1bXHbusG8kINGV81sXX6HyusBFPDGYROaW
5HR2CsLPIHdKWn7gyQV9holsI4aB+ZtQ/XVlZmtUTpHZkRFN2SmAs1tXbbQTBsWG
5tVBO1/JtbRwxOsPU249y8xKFCslPCMLgbaw7FBUpFDpHDd2Q2YimqF3VY49cRjf
vwEaWDqmPPPdF3pNtvS5KeiSsAQdQYB4wF26/nO52qAEpt7FaoG8GNUJqLRpLQj3
/4fWPo7nxdntTKkaushW/XlfbvgS47lgiuQqzyDZF5lC/LLGs0Ml7N/k1nBsg7wZ
0KLKRNKUb01kz/Na6WpkVY/8T9KL1D0mymHhDAaIVrWc
-----END CERTIFICATE-----

View File

@@ -0,0 +1,43 @@
-----BEGIN CERTIFICATE-----
MIIB3jCCAYWgAwIBAgICMDwwCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJQ1BPU3Vi
Q0EyMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA1YyRzAeFw0yMzA5MjYwNzM4MzRaFw00MDAyMjkwNzM4MzRaMEcxETAPBgNV
BAMMCFNFQ0NDZXJ0MRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEG
CgmSJomT8ixkARkWA0NQTzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKBdMxlw
3aS5nb5nJcL6wrXy7wpHuA1zQUHd4Lu9JjJjsmbFJ1aU/YjeNjd486cBnNFjef2J
k7ugxFPGzgcgCRijYDBeMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOIMB0G
A1UdDgQWBBTsh2ntDu+kucMCihpJHD7K+ayx2TAfBgNVHSMEGDAWgBQ2GWOJSW7N
ZiptYBlX9ycPXAzljzAKBggqhkjOPQQDAgNHADBEAiBm1ez6tTr5EBCL4lc0GxE2
gFBov4vf4QbI4V5/a8XlaAIgB+XyVyd20UJsJu6zIZS3mowJ1OMzZ8lWJxXAJznu
hQQ=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICWTCCAf+gAwIBAgICMDswCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJQ1BPU3Vi
Q0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA1YyRzAgFw0yMzA5MjYwNzM4MzRaGA8yMTIzMDkwMjA3MzgzNFowSDESMBAG
A1UEAwwJQ1BPU3ViQ0EyMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA1YyRzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEat
pC4ruZ4wc/Hb5JA68ICxU7TQNvLDTJ+Qjc9QetO91h8gAoVRAHKvg8Hoe+lqfu5d
+Q6Ax05xUuFwTzyc3eejgdYwgdMwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8B
Af8EBAMCAQYwHQYDVR0OBBYEFDYZY4lJbs1mKm1gGVf3Jw9cDOWPMG0GCCsGAQUF
BwEBBGEwXzAkBggrBgEFBQcwAYYYaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vMDcG
CCsGAQUFBzAChitodHRwczovL3d3dy5leGFtcGxlLmNvbS9JbnRlcm1lZGlhdGUt
Q0EuY2VyMB8GA1UdIwQYMBaAFCcnBk2/j/EjG9W6yXgudPVyOgWwMAoGCCqGSM49
BAMCA0gAMEUCIQDsQM6q7ecToESugkNzZS3R6il0TKNXeeVgwC84kgb0RAIgfjZh
VXfKo/V7VIHRG9zgM5mO8XdLp+ip25FZbc+V5wU=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICWTCCAf+gAwIBAgICMDowCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJVjJHUm9v
dENBMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA1YyRzAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSDESMBAG
A1UEAwwJQ1BPU3ViQ0ExMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTET
MBEGCgmSJomT8ixkARkWA1YyRzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMqy
mpvtNjA3+U5TdcucSgdWpXFj8XXwAlb6luBEYCytUD7AREB9P+ksVgcN6GiiZGn8
0Pdnu+NCuyDLwlUvX6ejgdYwgdMwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8B
Af8EBAMCAQYwHQYDVR0OBBYEFCcnBk2/j/EjG9W6yXgudPVyOgWwMG0GCCsGAQUF
BwEBBGEwXzAkBggrBgEFBQcwAYYYaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vMDcG
CCsGAQUFBzAChitodHRwczovL3d3dy5leGFtcGxlLmNvbS9JbnRlcm1lZGlhdGUt
Q0EuY2VyMB8GA1UdIwQYMBaAFGfGqeJ7nmYzEV0VjQe3pbMF8+M+MAoGCCqGSM49
BAMCA0gAMEUCICZt4DhW92hiDyUr8oqOUHocKfLRMf5I0vTvajqTbQiVAiEA6as1
yudx0oHSYf7e7IZBQ6KP1gjC6wcRvfvlBQNbySQ=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E286B477F370D35ED00DFB2037181B4E
WidZNEVp7+k899BFCl9vEI5GtR3xQlHtyRmtUxB26EnHWlNZkNv7WqIZcH0ovLrs
ycR9YteLo6mVW/ecDYkkfiaaog1YOylyxWjYwEB1A6zySU+tav/o6TNqRcynLCpX
ypWR6wIDkjOso56mnD24hT0dFQL94ZCjYHb5d0tNPBs=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,13 @@
-----BEGIN CERTIFICATE-----
MIIB3jCCAYWgAwIBAgICMDwwCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJQ1BPU3Vi
Q0EyMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA1YyRzAeFw0yMzA5MjYwNzM4MzRaFw00MDAyMjkwNzM4MzRaMEcxETAPBgNV
BAMMCFNFQ0NDZXJ0MRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEG
CgmSJomT8ixkARkWA0NQTzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKBdMxlw
3aS5nb5nJcL6wrXy7wpHuA1zQUHd4Lu9JjJjsmbFJ1aU/YjeNjd486cBnNFjef2J
k7ugxFPGzgcgCRijYDBeMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOIMB0G
A1UdDgQWBBTsh2ntDu+kucMCihpJHD7K+ayx2TAfBgNVHSMEGDAWgBQ2GWOJSW7N
ZiptYBlX9ycPXAzljzAKBggqhkjOPQQDAgNHADBEAiBm1ez6tTr5EBCL4lc0GxE2
gFBov4vf4QbI4V5/a8XlaAIgB+XyVyd20UJsJu6zIZS3mowJ1OMzZ8lWJxXAJznu
hQQ=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,524C74F543317C05FACD9FAFCA52345A
WTtugwCb+B1t64NAsJlhcSJlyWvNfi2/i+X5YjsCoLVksBEdrhaXmNgBNKC2jD3j
y+Y+ljw1pGyAvBhNjHOyCno/0HBZrCSMFXRrwp4g0rqDK16yF/ZjMI9k8F1qtv7m
kfy2xqSLcHYc0+ntlD1mgIWCsnlTejWbsdAl9BFB2ps=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICZjCCAg2gAwIBAgICMEQwCgYIKoZIzj0EAwIwVzEiMCAGA1UEAwwZUEtJLUV4
dF9DUlRfTU9fU1VCMl9WQUxJRDEQMA4GA1UECgwHRVZlcmVzdDELMAkGA1UEBhMC
REUxEjAQBgoJkiaJk/IsZAEZFgJNTzAgFw0yMzA5MjYwNzM4MzRaGA8yMjIzMDgw
OTA3MzgzNFowTTEYMBYGA1UEAwwPVUtTV0kxMjM0NTY3ODlBMRAwDgYDVQQKDAdF
VmVyZXN0MQswCQYDVQQGEwJERTESMBAGCgmSJomT8ixkARkWAk1PMFkwEwYHKoZI
zj0CAQYIKoZIzj0DAQcDQgAE9isd5jdi0yk3WytwQk6YuYRwN0ZaZ/WqRGetcHxi
uHO+xp4cEIMHSLzUgp1FuXm6ypD9SQSPSnj0nGUc1It2ZKOB0DCBzTAMBgNVHRMB
Af8EAjAAMA4GA1UdDwEB/wQEAwID6DAdBgNVHQ4EFgQUTc1VvSACKpeoXyBwGuzU
zZcOQNEwbQYIKwYBBQUHAQEEYTBfMCQGCCsGAQUFBzABhhhodHRwczovL3d3dy5l
eGFtcGxlLmNvbS8wNwYIKwYBBQUHMAKGK2h0dHBzOi8vd3d3LmV4YW1wbGUuY29t
L0ludGVybWVkaWF0ZS1DQS5jZXIwHwYDVR0jBBgwFoAUDWRBgQwbrjfLq9NLH1Zn
BlTkspkwCgYIKoZIzj0EAwIDRwAwRAIgDHw5J2ecr7QCbgfa1EhfueoqYSIVCFBD
Am9629lXT+ACIAVcRW8WgW/ZuR5/wCeejntf2Xg94ywrZuRIVNLFQuVY
-----END CERTIFICATE-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,60045B8B69CF8543559A43B31FD9CA7B
20P+XV/6fRKTiQ4l0pKeluDw1txdq0IdejYAfAH65MME9NKoSTagLTHRYAEdczJ5
oQqven3M25hAVN+X0QRUl6ZcbyVThM7U0zL1pFtdG8Rwb3l3tk60qBr4S5yJpDel
U674NwEC5gKNhSQiwiTBij2CJGVidOpKIDT6IYubIK0=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,AAC5A3AA533020F7E51F4B27F20A57D9
+VYyK1UaLoZHmjn9pCKblfjUfp/daTvhH9gnDVlU34gKFOeqs+jqnqhdPXO5bboW
uljn51J17IvJ3Z8K62mQ//t/13f5FXRG/66pukF2/8qRknk9gNswI0FA7g6hndS2
2fFcJp1kmW8qaS+/uzVQ5+JVthbu37UXyJTgFDakoNk=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,11DD29A4D8FA7BE406A00F6F753D69F4
h94ykrzzFgmAYtzcc2LPIKuyqgyi9fUMTA0bxvQSq/8ftXY+2gC6Rpm5RLyiSFvo
ok71wI//901HIKlY37Qf7BSaGK7hVQDphF2PpyVKm3j/P/ADah8aQBQov4Qb1G0i
tfg5wvk4uTk5qq8ake6npLQ/ub0XVIU03TrJMd6GFHU=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,2E1E9BBA33EED7A28A60F6807E4ED742
fuKzuGIoh9KQVmL1iYdbxxBfIzcCMdwAkLUSF8m1nLTzW+9mSFrkA3wjRMmjOBbf
LsiSFawr0fOcf1N80jpoc2jsXAyOBcxhL9rucLc11uCFaxNFtowCO+g/B8vqSDYo
Pu/QI3P1c5XNPoELhPGfN6tTCc9dGhXzWMCFSW8aRm4=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,13 @@
-----BEGIN CERTIFICATE-----
MIIB5DCCAYqgAwIBAgICMEAwCgYIKoZIzj0EAwIwSDESMBAGA1UEAwwJT0VNU3Vi
Q0EyMRAwDgYDVQQKDAdFVmVyZXN0MQswCQYDVQQGEwJERTETMBEGCgmSJomT8ixk
ARkWA09FTTAgFw0yMzA5MjYwNzM4MzRaGA8yNDIzMDYyMTA3MzgzNFowSjEUMBIG
A1UEAwwLT0VNUHJvdkNlcnQxEDAOBgNVBAoMB0VWZXJlc3QxCzAJBgNVBAYTAkRF
MRMwEQYKCZImiZPyLGQBGRYDT0VNMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
1Qza34iaHRAxMwvGUOTnBvlFicTCFl1cddIvnsd1qbaEyIIRotrOkXhfIQDv4kmi
ue85Cpa2vdn+m1p48W7icaNgMF4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMC
A4gwHQYDVR0OBBYEFK5Xv8jMo4+1pvU2GWsZU7BG/kQEMB8GA1UdIwQYMBaAFDiL
U8JAZUuIUPxiS8zcM/fKsZZNMAoGCCqGSM49BAMCA0gAMEUCIQDxjoscE/RMTLZh
9u/ElkpavrVQpkhVmhYOEbQWr/4ijQIgQaHykyPuRZMen3ZCVXqioqsDj6Dq5WAw
Nsf1XdB+Nz8=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,68D8ECF4F203CAE620E97FB653C99ED8
vf/skaF4qWk9CUE/Ng1axJV1H5TMX4j3+LlQOBEWg8sMgfhmEvSdS0G6TX0vYF+/
31dz5e9+YIMQDmW2u5uUTM9Gi714TDHG5u284OgmHtAo7fAu+EQ13/uBqJEAs4yl
hEqbosHz6/j/GeiJHAmAq+QO9EG1ebFuMPCb6UFCfjA=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,F7E3640B1C8474AA78E0129947CD6737
6TiKhKc0a0UaGxzajYDDk/Zcy8YVZWY2XGSTdlGtpcfTxWyzFWhWoNUce/aEBYOD
x1pZg6gIZTR7KCEt8T9ItMHg0OY6q2Ug+r8UTc0hgkFDUIQ3UQiRNEJh4Ke3Kzra
q9oJ72gO78bfc/zqFvwXb2pyAtr2gkVFuBdjb4SLWgA=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,71F99C97FCE7E48910234807353204A9
dv2wPXFoffxT5UJhk1r+Owrc7Mm0wR5FUNWTE2RNs8HlWmXHWkyzAk6g6wteh27H
m7FhVpzEK56VvTW+vHgUx6ux6xKz9qJzyBi+AQvyi2Rcf40CarOBqpJahkA2lJ4w
XNyN16eTnjloztq/ZG/lO02++sOQ0VysdF+bzGd/oMA=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,8 @@
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,B8F5097C93B64415AC2940579510AFAA
rTMIQLlcPnSkAH8ZWNUKCtue0KYoKK+AtaNwQkdenavGpQ5gl3wlzH6hf2pYLVAX
ADUtPwz6WGDMuH1qT9vQ20FdfPde4TIdXbmX1GsIS8VrHh3JRG5gkYnktdki6m4F
u+UTTLgZJ+qcDVA/6InzuBBffUkie91y1T1d3TMw0Kk=
-----END EC PRIVATE KEY-----

View File

@@ -0,0 +1,100 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: '1'
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver
implementation_id: powermeter
yeti_driver:
module: YetiSimulator
config_module:
connector_id: 1
car_simulator:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-042_1.json
UserConfigPath: user_config.json
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
evse_security:
module: EvseSecurity
auth:
module: Auth
config_module:
connection_timeout: 20
connections:
token_provider:
- module_id: token_provider_manual
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
token_provider_manual:
module: DummyTokenProviderManual
connections: {}
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
token: '123'
type: dummy
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 63.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,99 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: '1'
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver
implementation_id: powermeter
yeti_driver:
module: YetiSimulator
config_module:
connector_id: 1
car_simulator:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-078.json
EnableExternalWebsocketControl: true
UserConfigPath: user_config.json
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: ca/csms/CSMS_ROOT_CA.pem
auth:
module: Auth
config_module:
connection_timeout: 20
connections:
token_provider:
- module_id: token_provider_manual
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
token_provider_manual:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 63.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,111 @@
active_modules:
evse_manager:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: "1"
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver
implementation_id: powermeter
yeti_driver:
module: YetiSimulator
config_module:
connector_id: 1
ev_manager:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
auth:
module: Auth
config_module:
connection_timeout: 10
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: token_provider
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: evse_manager
implementation_id: evse
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-costandprice.json
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: evse_manager
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
session_cost:
module: TerminalCostAndPriceMessage
connections:
session_cost:
- module_id: ocpp
implementation_id: session_cost
evse_security:
module: EvseSecurity
config_module:
private_key_password: "123456"
token_provider:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: evse_manager
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
error_history:
module: ErrorHistory
config_implementation:
error_history:
database_path: /tmp/error_history.db
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,27 @@
active_modules:
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-test.json
UserConfigPath: user_config.json
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: probe
implementation_id: evse_manager
- module_id: probe
implementation_id: evse_manager_b
reservation:
- module_id: probe
implementation_id: reservation
auth:
- module_id: probe
implementation_id: auth
system:
- module_id: probe
implementation_id: system
security:
- module_id: probe
implementation_id: security
x-module-layout: {}

View File

@@ -0,0 +1,167 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: "1"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_1
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_1
implementation_id: powermeter
connector_2:
module: EvseManager
config_module:
connector_id: 2
has_ventilation: true
evse_id: "2"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_2
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_2
implementation_id: powermeter
yeti_driver_1:
module: YetiSimulator
config_module:
connector_id: 1
yeti_driver_2:
module: YetiSimulator
config_module:
connector_id: 2
auth:
module: Auth
config_module:
connection_timeout: 30
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: ocpp
implementation_id: auth_provider
- module_id: token_provider_manual
implementation_id: main
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
ocpp:
module: OCPP201
config_module:
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
display_message:
- module_id: display_message
implementation_id: display_message
persistent_store:
module: PersistentStore
config_module:
sqlite_db_file_path: persistent_store.db
display_message:
module: TerminalDisplayMessage
session_cost:
module: TerminalCostAndPriceMessage
connections:
session_cost:
- module_id: ocpp
implementation_id: session_cost
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: "ca/csms/CSMS_ROOT_CA.pem"
csms_leaf_cert_directory: "client/csms"
csms_leaf_key_directory: "client/csms"
mf_ca_bundle: "ca/mf/MF_ROOT_CA.pem"
mo_ca_bundle: "ca/mo/MO_ROOT_CA.pem"
v2g_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
secc_leaf_cert_directory: "client/cso"
secc_leaf_key_directory: "client/cso"
private_key_password: "123456"
token_provider_manual:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
- module_id: connector_2
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver_1
implementation_id: powermeter
ev_manager_1:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver_1
implementation_id: ev_board_support
ev_manager_2:
module: EvManager
config_module:
connector_id: 2
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver_2
implementation_id: ev_board_support
error_history:
module: ErrorHistory
config_implementation:
error_history:
database_path: /tmp/error_history.db
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,129 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: "1"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_1
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_1
implementation_id: powermeter
connector_2:
module: EvseManager
config_module:
connector_id: 2
has_ventilation: true
evse_id: "2"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_2
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_2
implementation_id: powermeter
yeti_driver_1:
module: YetiSimulator
config_module:
connector_id: 1
yeti_driver_2:
module: YetiSimulator
config_module:
connector_id: 2
ocpp:
module: OCPP201
config_module:
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
persistent_store:
module: PersistentStore
config_module:
sqlite_db_file_path: persistent_store.db
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: "ca/csms/CSMS_ROOT_CA.pem"
csms_leaf_cert_directory: "client/csms"
csms_leaf_key_directory: "client/csms"
mf_ca_bundle: "ca/mf/MF_ROOT_CA.pem"
mo_ca_bundle: "ca/mo/MO_ROOT_CA.pem"
v2g_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
secc_leaf_cert_directory: "client/cso"
secc_leaf_key_directory: "client/cso"
private_key_password: "123456"
auth:
module: Auth
config_module:
connection_timeout: 30
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: ocpp
implementation_id: auth_provider
- module_id: token_provider_manual
implementation_id: main
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
token_provider_manual:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
- module_id: connector_2
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver_1
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,28 @@
active_modules:
ocpp:
module: OCPP201
config_module:
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: probe
implementation_id: ProbeModuleConnectorA
- module_id: probe
implementation_id: ProbeModuleConnectorB
auth:
- module_id: auth
implementation_id: main
system:
- module_id: probe
implementation_id: ProbeModuleSystem
security:
- module_id: probe
implementation_id: ProbeModuleSecurity
data_transfer:
- module_id: probe
implementation_id: ProbeModuleDataTransfer
extensions_15118:
- module_id: probe
implementation_id: ProbeModuleIso15118Extensions
x-module-layout: {}

View File

@@ -0,0 +1,42 @@
active_modules:
ocpp:
module: OCPP201
config_module:
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: probe
implementation_id: ProbeModuleConnectorA
- module_id: probe
implementation_id: ProbeModuleConnectorB
auth:
- module_id: auth
implementation_id: main
system:
- module_id: probe
implementation_id: ProbeModuleSystem
security:
- module_id: probe
implementation_id: ProbeModuleSecurity
extensions_15118:
- module_id: probe
implementation_id: ProbeModuleIso15118Extensions
auth:
module: Auth
config_module:
connection_timeout: 30
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: probe
implementation_id: ProbeModuleConnectorA
- module_id: probe
implementation_id: ProbeModuleConnectorB
x-module-layout: {}

View File

@@ -0,0 +1,159 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: "1"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_1
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_1
implementation_id: powermeter
store:
- module_id: persistent_store
implementation_id: main
connector_2:
module: EvseManager
config_module:
connector_id: 2
has_ventilation: true
evse_id: "2"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_2
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_2
implementation_id: powermeter
store:
- module_id: persistent_store
implementation_id: main
yeti_driver_1:
module: YetiSimulator
config_module:
connector_id: 1
yeti_driver_2:
module: YetiSimulator
config_module:
connector_id: 2
car_simulator_1:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver_1
implementation_id: ev_board_support
car_simulator_2:
module: EvManager
config_module:
connector_id: 2
auto_enable: true
auto_exec: false
connections:
ev_board_support:
- module_id: yeti_driver_2
implementation_id: ev_board_support
ocpp:
module: OCPP201
config_module:
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
reservation:
- module_id: auth
implementation_id: reservation
persistent_store:
module: PersistentStore
config_module:
sqlite_db_file_path: persistent_store.db
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: "ca/csms/CSMS_ROOT_CA.pem"
csms_leaf_cert_directory: "client/csms"
csms_leaf_key_directory: "client/csms"
mf_ca_bundle: "ca/mf/MF_ROOT_CA.pem"
mo_ca_bundle: "ca/mo/MO_ROOT_CA.pem"
v2g_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
secc_leaf_cert_directory: "client/cso"
secc_leaf_key_directory: "client/cso"
private_key_password: "123456"
auth:
module: Auth
config_module:
connection_timeout: 30
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: ocpp
implementation_id: auth_provider
- module_id: token_provider_manual
implementation_id: main
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
token_provider_manual:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
- module_id: connector_2
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver_1
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,229 @@
active_modules:
iso15118_charger:
module: EvseV2G
config_module:
device: auto
tls_security: allow
verify_contract_cert_chain: true
connections:
security:
- module_id: evse_security
implementation_id: main
mapping:
module:
evse: 1
iso15118_car:
module: PyEvJosev
config_module:
device: auto
supported_DIN70121: false
supported_ISO15118_2: true
tls_active: true
is_cert_install_needed: true
evse_manager:
module: EvseManager
config_module:
connector_id: 1
evse_id: DE*PNX*E12345*1
evse_id_din: 49A80737A45678
session_logging: true
session_logging_xml: false
session_logging_path: /tmp/everest-logs
charge_mode: DC
hack_allow_bpt_with_iso2: true
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_car_side:
- module_id: powersupply_dc
implementation_id: powermeter
slac:
- module_id: slac
implementation_id: evse
hlc:
- module_id: iso15118_charger
implementation_id: charger
powersupply_DC:
- module_id: powersupply_dc
implementation_id: main
imd:
- module_id: imd
implementation_id: main
over_voltage_monitor:
- module_id: ovm
implementation_id: main
powersupply_dc:
module: DCSupplySimulator
slac:
module: SlacSimulator
imd:
config_implementation:
main:
selftest_success: true
module: IMDSimulator
ovm:
module: OVMSimulator
config_implementation:
main:
simulate_error: false
simulate_error_delay: 5
ev_manager:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
dc_target_current: 20
dc_target_voltage: 400
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
ev:
- module_id: iso15118_car
implementation_id: ev
slac:
- module_id: slac
implementation_id: ev
connector_2:
module: EvseManager
config_module:
connector_id: 2
has_ventilation: true
evse_id: "2"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_2
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_2
implementation_id: powermeter
slac:
- module_id: slac
implementation_id: evse
hlc:
- module_id: iso15118_charger
implementation_id: charger
yeti_driver:
module: YetiSimulator
config_module:
connector_id: 1
yeti_driver_2:
module: YetiSimulator
config_module:
connector_id: 2
ocpp:
module: OCPP201
config_module:
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: evse_manager
implementation_id: evse
- module_id: connector_2
implementation_id: evse
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
reservation:
- module_id: auth
implementation_id: reservation
extensions_15118:
- module_id: iso15118_charger
implementation_id: extensions
system:
module: System
auth:
module: Auth
config_module:
connection_timeout: 10
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: token_provider_1
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
- module_id: evse_manager
implementation_id: token_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: evse_manager
implementation_id: evse
token_provider_1:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
token_validator:
module: DummyTokenValidator
config_implementation:
main:
validation_result: Accepted
validation_reason: Token seems valid
sleep: 0.25
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
mf_ca_bundle: "ca/mf/MF_ROOT_CA.pem"
mo_ca_bundle: "ca/mo/MO_ROOT_CA.pem"
v2g_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
csms_leaf_cert_directory: "client/csms"
csms_leaf_key_directory: "client/csms"
secc_leaf_cert_directory: "client/cso"
secc_leaf_key_directory: "client/cso"
private_key_password: "123456"
energy_manager:
module: EnergyManager
config_module:
schedule_total_duration: 1
schedule_interval_duration: 60
debug: false
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: evse_manager
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
api:
module: API
connections:
evse_manager:
- module_id: evse_manager
implementation_id: evse
error_history:
- module_id: error_history
implementation_id: error_history
error_history:
module: ErrorHistory
config_implementation:
error_history:
database_path: /tmp/error_history.db
x-module-layout: {}

View File

@@ -0,0 +1,200 @@
active_modules:
iso15118_charger:
module: Evse15118D20
config_module:
device: auto
connections:
security:
- module_id: evse_security
implementation_id: main
mapping:
module:
evse: 1
iso15118_car:
module: PyEvJosev
config_module:
device: auto
supported_DIN70121: false
supported_ISO15118_2: false
supported_ISO15118_20_DC: true
tls_active: true
evse_manager:
module: EvseManager
mapping:
module:
evse: 1
config_module:
connector_id: 1
evse_id: DE*PNX*E12345*1
evse_id_din: 49A80737A45678
session_logging: true
session_logging_xml: false
session_logging_path: /tmp/everest-logs
charge_mode: DC
payment_enable_contract: false
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver
implementation_id: powermeter
powermeter_car_side:
- module_id: powersupply_dc
implementation_id: powermeter
slac:
- module_id: slac
implementation_id: evse
hlc:
- module_id: iso15118_charger
implementation_id: charger
powersupply_DC:
- module_id: powersupply_dc
implementation_id: main
imd:
- module_id: imd
implementation_id: main
powersupply_dc:
module: DCSupplySimulator
yeti_driver:
module: YetiSimulator
mapping:
module:
evse: 1
config_module:
connector_id: 1
slac:
module: SlacSimulator
imd:
config_implementation:
main:
selftest_success: true
module: IMDSimulator
ev_manager:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 3;iso_wait_slac_matched;
dc_target_current: 20
dc_target_voltage: 400
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
ev:
- module_id: iso15118_car
implementation_id: ev
slac:
- module_id: slac
implementation_id: ev
ocpp:
module: OCPP201
config_module:
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: evse_manager
implementation_id: evse
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
reservation:
- module_id: auth
implementation_id: reservation
evse_energy_sink:
- module_id: grid_connection_point
implementation_id: external_limits
- module_id: evse_manager_1_ocpp_sink
implementation_id: external_limits
extensions_15118:
- module_id: iso15118_charger
implementation_id: extensions
evse_manager_1_ocpp_sink:
module: EnergyNode
mapping:
module:
evse: 1
config_module:
fuse_limit_A: 32.0
phase_count: 3
connections:
energy_consumer:
- module_id: evse_manager
implementation_id: energy_grid
system:
module: System
token_provider:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
auth:
module: Auth
config_module:
connection_timeout: 10
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: token_provider
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: evse_manager
implementation_id: evse
evse_security:
module: EvseSecurity
config_module:
private_key_password: "123456"
energy_manager:
module: EnergyManager
config_module:
schedule_total_duration: 1
schedule_interval_duration: 60
debug: false
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
mapping:
module:
evse: 0
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: evse_manager_1_ocpp_sink
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
api:
module: API
connections:
evse_manager:
- module_id: evse_manager
implementation_id: evse
error_history:
- module_id: error_history
implementation_id: error_history
error_history:
module: ErrorHistory
config_implementation:
error_history:
database_path: /tmp/error_history.db
x-module-layout: {}

View File

@@ -0,0 +1,210 @@
active_modules:
iso15118_charger:
module: Evse15118D20
config_module:
device: auto
connections:
security:
- module_id: evse_security
implementation_id: main
mapping:
module:
evse: 1
iso15118_car:
module: PyEvJosev
config_module:
device: auto
supported_DIN70121: false
supported_ISO15118_2: false
supported_ISO15118_20_DC: true
tls_active: true
evse_manager:
module: EvseManager
config_module:
connector_id: 1
evse_id: DE*PNX*E12345*1
evse_id_din: 49A80737A45678
session_logging: true
session_logging_xml: false
session_logging_path: /tmp/everest-logs
charge_mode: DC
payment_enable_contract: false
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_car_side:
- module_id: powersupply_dc
implementation_id: powermeter
slac:
- module_id: slac
implementation_id: evse
hlc:
- module_id: iso15118_charger
implementation_id: charger
powersupply_DC:
- module_id: powersupply_dc
implementation_id: main
imd:
- module_id: imd
implementation_id: main
connector_2:
module: EvseManager
config_module:
connector_id: 2
has_ventilation: true
evse_id: "2"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_2
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_2
implementation_id: powermeter
slac:
- module_id: slac
implementation_id: evse
hlc:
- module_id: iso15118_charger
implementation_id: charger
powersupply_dc:
module: DCSupplySimulator
yeti_driver:
module: YetiSimulator
config_module:
connector_id: 1
yeti_driver_2:
module: YetiSimulator
config_module:
connector_id: 2
slac:
module: SlacSimulator
imd:
config_implementation:
main:
selftest_success: true
module: IMDSimulator
ev_manager:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 3;iso_wait_slac_matched;
dc_target_current: 20
dc_target_voltage: 400
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
ev:
- module_id: iso15118_car
implementation_id: ev
slac:
- module_id: slac
implementation_id: ev
ocpp:
module: OCPP201
config_module:
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: evse_manager
implementation_id: evse
- module_id: connector_2
implementation_id: evse
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
reservation:
- module_id: auth
implementation_id: reservation
extensions_15118:
- module_id: iso15118_charger
implementation_id: extensions
system:
module: System
auth:
module: Auth
config_module:
connection_timeout: 10
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: token_provider
implementation_id: main
token_validator:
- module_id: token_validator
implementation_id: main
evse_manager:
- module_id: evse_manager
implementation_id: evse
token_provider:
module: DummyTokenProvider
config_implementation:
main:
token: TOKEN1
connections:
evse:
- module_id: evse_manager
implementation_id: evse
token_validator:
module: DummyTokenValidator
config_implementation:
main:
validation_result: Accepted
validation_reason: Token seems valid
sleep: 0.25
evse_security:
module: EvseSecurity
config_module:
private_key_password: "123456"
energy_manager:
module: EnergyManager
config_module:
schedule_total_duration: 1
schedule_interval_duration: 60
debug: false
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: evse_manager
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
api:
module: API
connections:
evse_manager:
- module_id: evse_manager
implementation_id: evse
error_history:
- module_id: error_history
implementation_id: error_history
error_history:
module: ErrorHistory
config_implementation:
error_history:
database_path: /tmp/error_history.db
x-module-layout: {}

View File

@@ -0,0 +1,153 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: "1"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_1
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_1
implementation_id: powermeter
connector_2:
module: EvseManager
config_module:
connector_id: 2
has_ventilation: true
evse_id: "2"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
connections:
bsp:
- module_id: yeti_driver_2
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_2
implementation_id: powermeter
yeti_driver_1:
module: YetiSimulator
config_module:
connector_id: 1
yeti_driver_2:
module: YetiSimulator
config_module:
connector_id: 2
car_simulator_1:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver_1
implementation_id: ev_board_support
car_simulator_2:
module: EvManager
config_module:
connector_id: 2
auto_enable: true
auto_exec: false
connections:
ev_board_support:
- module_id: yeti_driver_2
implementation_id: ev_board_support
ocpp:
module: OCPP201
config_module:
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
reservation:
- module_id: auth
implementation_id: reservation
persistent_store:
module: PersistentStore
config_module:
sqlite_db_file_path: persistent_store.db
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: "ca/csms/CSMS_ROOT_CA.pem"
csms_leaf_cert_directory: "client/csms"
csms_leaf_key_directory: "client/csms"
mf_ca_bundle: "ca/mf/MF_ROOT_CA.pem"
mo_ca_bundle: "ca/mo/MO_ROOT_CA.pem"
v2g_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
secc_leaf_cert_directory: "client/cso"
secc_leaf_key_directory: "client/cso"
private_key_password: "123456"
auth:
module: Auth
config_module:
connection_timeout: 30
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: ocpp
implementation_id: auth_provider
- module_id: token_provider_manual
implementation_id: main
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
token_provider_manual:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
- module_id: connector_2
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver_1
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,99 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: '1'
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver
implementation_id: powermeter
yeti_driver:
module: YetiSimulator
config_module:
connector_id: 1
car_simulator:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-test-security-profile-1.json
EnableExternalWebsocketControl: true
UserConfigPath: user_config.json
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: ca/csms/CSMS_ROOT_CA.pem
auth:
module: Auth
config_module:
connection_timeout: 20
connections:
token_provider:
- module_id: token_provider_manual
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
token_provider_manual:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 63.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,99 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: '1'
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver
implementation_id: powermeter
yeti_driver:
module: YetiSimulator
config_module:
connector_id: 1
car_simulator:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-test-security-profile-2.json
EnableExternalWebsocketControl: true
UserConfigPath: user_config.json
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: ca/csms/CSMS_ROOT_CA.pem
auth:
module: Auth
config_module:
connection_timeout: 20
connections:
token_provider:
- module_id: token_provider_manual
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
token_provider_manual:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 63.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,150 @@
active_modules:
iso15118_charger:
module: EvseV2G
mapping:
module:
evse: 1
config_module:
device: auto
tls_security: allow
connections:
security:
- module_id: evse_security
implementation_id: main
iso15118_car:
module: PyEvJosev
config_module:
device: auto
supported_ISO15118_2: true
tls_active: false
is_cert_install_needed: false
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
enable_autocharge: true
evse_id: "DE*PNX*100001"
session_logging: true
session_logging_xml: false
session_logging_path: /tmp/everest-logs
ac_hlc_enabled: true
ac_hlc_use_5percent: false
ac_enforce_hlc: false
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver_1
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_1
implementation_id: powermeter
slac:
- module_id: slac
implementation_id: evse
hlc:
- module_id: iso15118_charger
implementation_id: charger
yeti_driver_1:
module: YetiSimulator
config_module:
connector_id: 1
slac:
module: SlacSimulator
car_simulator_1:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver_1
implementation_id: ev_board_support
ev:
- module_id: iso15118_car
implementation_id: ev
slac:
- module_id: slac
implementation_id: ev
auth:
module: Auth
config_module:
connection_timeout: 60
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: token_provider_1
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
- module_id: connector_1
implementation_id: token_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-iso-pnc.json
UserConfigPath: user_config.json
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
mf_ca_bundle: "ca/mf/MF_ROOT_CA.pem"
mo_ca_bundle: "ca/mo/MO_ROOT_CA.pem"
v2g_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
csms_leaf_cert_directory: "client/csms"
csms_leaf_key_directory: "client/csms"
secc_leaf_cert_directory: "client/cso"
secc_leaf_key_directory: "client/cso"
private_key_password: "123456"
token_provider_1:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver_1
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,154 @@
active_modules:
iso15118_charger:
module: EvseV2G
mapping:
module:
evse: 1
config_module:
device: auto
tls_security: allow
verify_contract_cert_chain: true
connections:
security:
- module_id: evse_security
implementation_id: main
iso15118_car:
module: PyEvJosev
config_module:
device: auto
supported_ISO15118_2: true
tls_active: true
is_cert_install_needed: true
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: "DE*PNX*100001"
session_logging: true
session_logging_xml: false
session_logging_path: /tmp/everest-logs
ac_hlc_enabled: true
ac_hlc_use_5percent: false
ac_enforce_hlc: false
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver_1
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_1
implementation_id: powermeter
slac:
- module_id: slac
implementation_id: evse
hlc:
- module_id: iso15118_charger
implementation_id: charger
yeti_driver_1:
module: YetiSimulator
config_module:
connector_id: 1
slac:
module: SlacSimulator
car_simulator_1:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver_1
implementation_id: ev_board_support
ev:
- module_id: iso15118_car
implementation_id: ev
slac:
- module_id: slac
implementation_id: ev
auth:
module: Auth
config_module:
connection_timeout: 60
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: token_provider_1
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
- module_id: connector_1
implementation_id: token_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-iso-pnc.json
UserConfigPath: user_config.json
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
extensions_15118:
- module_id: iso15118_charger
implementation_id: extensions
evse_security:
module: EvseSecurity
config_module:
csms_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
mf_ca_bundle: "ca/mf/MF_ROOT_CA.pem"
mo_ca_bundle: "ca/mo/MO_ROOT_CA.pem"
v2g_ca_bundle: "ca/v2g/V2G_ROOT_CA.pem"
csms_leaf_cert_directory: "client/csms"
csms_leaf_key_directory: "client/csms"
secc_leaf_cert_directory: "client/cso"
secc_leaf_key_directory: "client/cso"
private_key_password: "123456"
token_provider_1:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver_1
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,109 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: '1'
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver
implementation_id: powermeter
yeti_driver:
module: YetiSimulator
config_module:
connector_id: 1
car_simulator:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-test.json
UserConfigPath: user_config.json
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
evse_security:
module: EvseSecurity
probe_module:
module: PyProbeModule
connections:
test_control:
- module_id: car_simulator
implementation_id: main
connector_1:
- module_id: connector_1
implementation_id: evse
ocpp:
- module_id: ocpp
implementation_id: main
auth:
module: Auth
config_module:
connection_timeout: 20
connections:
token_provider:
- module_id: token_provider_manual
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
token_provider_manual:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 63.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,106 @@
active_modules:
connector_1:
module: EvseManager
mapping:
module:
evse: 1
config_module:
connector_id: 1
has_ventilation: true
evse_id: '1'
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver
implementation_id: powermeter
connector_lock:
- module_id: yeti_driver
implementation_id: connector_lock
yeti_driver:
mapping:
module:
evse: 1
module: YetiSimulator
config_module:
connector_id: 1
car_simulator:
module: EvManager
config_module:
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connector_id: 1
connections:
ev_board_support:
- module_id: yeti_driver
implementation_id: ev_board_support
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-test.json
UserConfigPath: user_config.json
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
evse_security:
module: EvseSecurity
auth:
module: Auth
config_module:
connection_timeout: 20
connections:
token_provider:
- module_id: token_provider_manual
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
token_provider_manual:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 63.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,143 @@
active_modules:
connector_1:
module: EvseManager
config_module:
connector_id: 1
has_ventilation: true
evse_id: "1"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver_1
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_1
implementation_id: powermeter
connector_2:
module: EvseManager
config_module:
connector_id: 2
has_ventilation: true
evse_id: "2"
session_logging: true
session_logging_xml: false
ac_hlc_enabled: false
ac_hlc_use_5percent: false
ac_enforce_hlc: false
external_ready_to_start_charging: true
connections:
bsp:
- module_id: yeti_driver_2
implementation_id: board_support
powermeter_grid_side:
- module_id: yeti_driver_2
implementation_id: powermeter
yeti_driver_1:
module: YetiSimulator
config_module:
connector_id: 1
yeti_driver_2:
module: YetiSimulator
config_module:
connector_id: 2
car_simulator_1:
module: EvManager
config_module:
connector_id: 1
auto_enable: true
auto_exec: false
auto_exec_commands: sleep 1;iec_wait_pwr_ready;sleep 1;draw_power_regulated 16,3;sleep 30;unplug
connections:
ev_board_support:
- module_id: yeti_driver_1
implementation_id: ev_board_support
car_simulator_2:
module: EvManager
config_module:
connector_id: 2
auto_enable: true
auto_exec: false
connections:
ev_board_support:
- module_id: yeti_driver_2
implementation_id: ev_board_support
auth:
module: Auth
config_module:
connection_timeout: 10
selection_algorithm: FindFirst
connections:
token_provider:
- module_id: token_provider_1
implementation_id: main
- module_id: ocpp
implementation_id: auth_provider
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: libocpp-config-test.json
UserConfigPath: user_config.json
EnableExternalWebsocketControl: true
connections:
evse_manager:
- module_id: connector_1
implementation_id: evse
- module_id: connector_2
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
security:
- module_id: evse_security
implementation_id: main
evse_security:
module: EvseSecurity
token_provider_1:
module: DummyTokenProviderManual
config_implementation:
main:
mqtt_topic: 'everest_api/dummy_token_provider/cmd/provide'
energy_manager:
module: EnergyManager
connections:
energy_trunk:
- module_id: grid_connection_point
implementation_id: energy_grid
grid_connection_point:
module: EnergyNode
config_module:
fuse_limit_A: 40.0
phase_count: 3
connections:
price_information: []
energy_consumer:
- module_id: connector_1
implementation_id: energy_grid
- module_id: connector_2
implementation_id: energy_grid
powermeter:
- module_id: yeti_driver_1
implementation_id: powermeter
system:
module: System
x-module-layout: {}

View File

@@ -0,0 +1,48 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:9000/cp001",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1"
},
"Core": {
"AllowOfflineTxForUnknownId": true,
"AuthorizeRemoteTxRequests": true,
"AuthorizationCacheEnabled": true,
"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,SmartCharging",
"TransactionMessageAttempts": 1,
"TransactionMessageRetryInterval": 10,
"UnlockConnectorOnEVSideDisconnect": true
},
"FirmwareManagement": {
"SupportedFileTransferProtocols": "FTP"
},
"Security": {
"AuthorizationKey": "AABBCCDDEEFFGGHH",
"SecurityProfile": 0
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current,Power",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
}
}

View File

@@ -0,0 +1,58 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:9000/cp001",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1"
},
"Core": {
"AllowOfflineTxForUnknownId": true,
"AuthorizeRemoteTxRequests": true,
"AuthorizationCacheEnabled": true,
"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"
},
"Security": {
"AuthorizationKey": "AABBCCDDEEFFGGHH",
"SecurityProfile": 0,
"CpoName": "Pionix",
"AdditionalRootCertificateCheck": false
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"Reservation": {
"ReserveConnectorZeroSupported": true
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current,Power",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
}
}

View File

@@ -0,0 +1,94 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:9000/cp001",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1",
"LogMessages": true
},
"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,
"StopTransactionOnEVSideDisconnect": true,
"StopTransactionOnInvalidId": true,
"StopTxnAlignedData": "Energy.Active.Import.Register",
"StopTxnSampledData": "Energy.Active.Import.Register",
"SupportedFeatureProfiles": "Core,FirmwareManagement,RemoteTrigger,Reservation,LocalAuthListManagement,SmartCharging,CostAndPrice",
"TransactionMessageAttempts": 5,
"TransactionMessageRetryInterval": 1,
"UnlockConnectorOnEVSideDisconnect": true
},
"FirmwareManagement": {
"SupportedFileTransferProtocols": "FTP"
},
"Security": {
"CpoName": "Pionix",
"AuthorizationKey": "AABBCCDDEEFFGGHH",
"SecurityProfile": 0,
"AdditionalRootCertificateCheck": true
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"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": "00:00",
"NextTimeOffsetTransitionDateTime": "2024-01-01T00:00:00",
"TimeOffsetNextTransition": "01:00",
"CustomIdleFeeAfterStop": false,
"SupportedLanguages": "en, nl, de, nb_NO",
"CustomMultiLanguageMessages": true,
"Language": "en",
"WaitForSetUserPriceTimeout": 2000
},
"Reservation": {
"ReserveConnectorZeroSupported": true
}
}

View File

@@ -0,0 +1,65 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:9000/cp001",
"ChargeBoxSerialNumber": "SECCCert",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1",
"LogMessages": true
},
"Core": {
"AllowOfflineTxForUnknownId": true,
"AuthorizeRemoteTxRequests": true,
"AuthorizationCacheEnabled": 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",
"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": 3,
"TransactionMessageRetryInterval": 1,
"UnlockConnectorOnEVSideDisconnect": true
},
"FirmwareManagement": {
"SupportedFileTransferProtocols": "FTP"
},
"Security": {
"AuthorizationKey": "AABBCCDDEEFFGGHH",
"SecurityProfile": 0,
"CpoName": "Pionix",
"AdditionalRootCertificateCheck": false
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"Reservation": {
"ReserveConnectorZeroSupported": true
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current,Power",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
},
"PnC": {
"ISO15118CertificateManagementEnabled": true,
"ISO15118PnCEnabled": true,
"ContractValidationOffline": true,
"CentralContractValidationAllowed": true
}
}

View File

@@ -0,0 +1,57 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:9000/cp001",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1",
"LogMessages": true
},
"Core": {
"AllowOfflineTxForUnknownId": true,
"AuthorizeRemoteTxRequests": true,
"AuthorizationCacheEnabled": true,
"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"
},
"Security": {
"AuthorizationKey": "AABBCCDDEEFFGGHH",
"SecurityProfile": 1
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"Reservation": {
"ReserveConnectorZeroSupported": false
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current,Power",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
}
}

View File

@@ -0,0 +1,59 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:9000/cp001",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1",
"LogMessages": true,
"UseSslDefaultVerifyPaths": false
},
"Core": {
"AllowOfflineTxForUnknownId": true,
"AuthorizeRemoteTxRequests": true,
"AuthorizationCacheEnabled": true,
"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"
},
"Security": {
"AuthorizationKey": "AABBCCDDEEFFGGHH",
"SecurityProfile": 2,
"AdditionalRootCertificateCheck": false
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"Reservation": {
"ReserveConnectorZeroSupported": false
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current,Power",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
}
}

View File

@@ -0,0 +1,59 @@
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:9000/cp001",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1",
"LogMessages": true
},
"Core": {
"AllowOfflineTxForUnknownId": true,
"AuthorizeRemoteTxRequests": true,
"AuthorizationCacheEnabled": true,
"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": 5,
"TransactionMessageRetryInterval": 1,
"UnlockConnectorOnEVSideDisconnect": true
},
"FirmwareManagement": {
"SupportedFileTransferProtocols": "FTP"
},
"Security": {
"AuthorizationKey": "AABBCCDDEEFFGGHH",
"SecurityProfile": 0,
"CpoName": "Pionix",
"AdditionalRootCertificateCheck": true
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"Reservation": {
"ReserveConnectorZeroSupported": true
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current,Power",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
}
}

View File

@@ -0,0 +1 @@
This is a firmware update file

View File

@@ -0,0 +1,6 @@
dGdE6NN9ZiReWDzB8kQaEGjEYJzwh0FOPfbjJ3jwc1VeV3wtJzOTfPaUhBEmSd/K
Erb+GOsP74otgm00/pv/pZQ+0nNfd+ZGrPfZK/RsNFJosM3CGAS1w55+tqUVRyhC
CZ4l1GCAzpdStn8c90gyD1IyF6LccMw6Odwq7XDYyIYPMZigZ8fJYKKiQxVYVf7i
BGSsmbG655OKKSS5JX1nE5i0gZt0ZuMaAjQOoA4etu8rXI0KRBueQbmHk1oNscYl
eT50T0JZfSQ2M0pZrzjcSuCIgWYf6L6uGP7tMvA/m/KGu/ufSXwt4hFdbYxp+ofk
1RmNOPjhPnT2XuvsT12UbA==

View File

@@ -0,0 +1,17 @@
#!/usr/bin/env bash
usage() {
echo "Usage: $0 <EVerest-installation-directory>"
exit 1
}
if [ $# -ne 1 ] ; then
usage
else
EVEREST_CERTS_PATH="$1/etc/everest/certs"
rm -rf "$EVEREST_CERTS_PATH"
mkdir "$EVEREST_CERTS_PATH"
cp -r certs/ca "$EVEREST_CERTS_PATH"
cp -r certs/client "$EVEREST_CERTS_PATH"
fi

View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
usage() {
echo "Usage: $0 <EVerest-installation-directory>"
exit 1
}
if [ $# -ne 1 ] ; then
usage
else
EVEREST_OCPP_CONFIGS_PATH="$1/share/everest/modules/OCPP"
mkdir -p "$EVEREST_OCPP_CONFIGS_PATH"
cp config/libocpp-config-* "$EVEREST_OCPP_CONFIGS_PATH"
cp config/everest-config-* "$EVEREST_OCPP_CONFIGS_PATH"
fi

View File

@@ -0,0 +1,680 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright Pionix GmbH and Contributors to EVerest
from __future__ import annotations
import asyncio
import hashlib
import queue
import os
from pathlib import Path
import threading
from types import FunctionType
from typing import Optional
from OpenSSL import crypto
from datetime import datetime, timedelta
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.x509 import load_pem_x509_certificate
from everest.testing.core_utils._configuration.libocpp_configuration_helper import (
GenericOCPP2XConfigAdjustment,
OCPP2XConfigVariableIdentifier,
)
from iso15118.shared.security import (
CertPath,
KeyEncoding,
KeyPasswordPath,
KeyPath,
create_signature,
encrypt_priv_key,
get_cert_cn,
load_cert,
load_priv_key,
)
from iso15118.shared.messages.iso15118_2.msgdef import V2GMessage as V2GMessageV2
from iso15118.shared.messages.iso15118_2.header import MessageHeader as MessageHeaderV2
from iso15118.shared.messages.iso15118_2.datatypes import (
EMAID,
CertificateChain,
DHPublicKey,
EncryptedPrivateKey,
ResponseCode,
SubCertificates,
)
from iso15118.shared.messages.iso15118_2.body import Body, CertificateInstallationRes
from iso15118.shared.messages.enums import Namespace
from iso15118.shared.exi_codec import EXI
from iso15118.shared.exificient_exi_codec import ExificientEXICodec
from iso15118.shared.exceptions import EncryptionError, PrivateKeyReadError
import json
import base64
from everest.testing.ocpp_utils.charge_point_utils import (
OcppTestConfiguration,
ChargePointInfo,
CertificateInfo,
FirmwareInfo,
AuthorizationInfo,
)
from ocpp.charge_point import snake_to_camel_case, asdict, remove_nones
from ocpp.messages import _DecimalEncoder
from ocpp.v16 import call, call_result
from ocpp.v201 import call as call201
from ocpp.v16.enums import Action, DataTransferStatus
from ocpp.v201.enums import Action as Action201
from ocpp.routing import on
# for OCPP1.6 PnC whitepaper:
from ocpp.v201 import call_result as call_result201
from ocpp.v201.datatypes import IdTokenInfoType
from ocpp.v201.enums import (
AuthorizationStatusEnumType,
GenericStatusEnumType,
Iso15118EVCertificateStatusEnumType,
GetCertificateStatusEnumType,
)
class EXIGenerator:
def __init__(self, certs_path):
self.certs_path = certs_path
EXI().set_exi_codec(ExificientEXICodec())
self.oem_leaf_der = load_cert(
os.path.join(self.certs_path, CertPath.OEM_LEAF_DER)
)
self.contract_leaf_key = load_priv_key(
os.path.join(self.certs_path, KeyPath.CONTRACT_LEAF_PEM),
KeyEncoding.PEM,
os.path.join(
self.certs_path, KeyPasswordPath.CONTRACT_LEAF_KEY_PASSWORD
),
)
self.contract_cert_chain = CertificateChain(
id="id1",
certificate=load_cert(
os.path.join(self.certs_path, CertPath.CONTRACT_LEAF_DER)
),
sub_certificates=SubCertificates(
certificates=[
load_cert(os.path.join(self.certs_path,
CertPath.MO_SUB_CA2_DER)),
load_cert(os.path.join(self.certs_path,
CertPath.MO_SUB_CA1_DER)),
]
),
)
self.emaid = EMAID(
id="id4",
value=get_cert_cn(
load_cert(os.path.join(self.certs_path,
CertPath.CONTRACT_LEAF_DER))
),
)
self.cps_certificate_chain = CertificateChain(
certificate=load_cert(os.path.join(
self.certs_path, CertPath.CPS_LEAF_DER)),
sub_certificates=SubCertificates(
certificates=[
load_cert(os.path.join(self.certs_path,
CertPath.CPS_SUB_CA2_DER)),
load_cert(os.path.join(self.certs_path,
CertPath.CPS_SUB_CA1_DER)),
]
),
)
self.signature_key = load_priv_key(
os.path.join(self.certs_path, KeyPath.CPS_LEAF_PEM),
KeyEncoding.PEM,
os.path.join(self.certs_path,
KeyPasswordPath.CPS_LEAF_KEY_PASSWORD),
)
self.contract_cert_chain_exi = EXI().to_exi(
self.contract_cert_chain, Namespace.ISO_V2_MSG_DEF
)
self.emaid_exi = EXI().to_exi(
self.emaid, Namespace.ISO_V2_MSG_DEF
)
def generate_certificate_installation_res(
self, base64_encoded_cert_installation_req: str, namespace: str
) -> str:
cert_install_req_exi = base64.b64decode(base64_encoded_cert_installation_req)
cert_install_req = EXI().from_exi(cert_install_req_exi, namespace)
try:
dh_pub_key, encrypted_priv_key_bytes = encrypt_priv_key(
oem_prov_cert=self.oem_leaf_der,
priv_key_to_encrypt=self.contract_leaf_key,
)
except EncryptionError:
raise EncryptionError(
"EncryptionError while trying to encrypt the private key for the "
"contract certificate"
)
except PrivateKeyReadError as exc:
raise PrivateKeyReadError(
f"Can't read private key to encrypt for CertificateInstallationRes:"
f" {exc}"
)
encrypted_priv_key = EncryptedPrivateKey(id="id2", value=encrypted_priv_key_bytes)
dh_public_key = DHPublicKey(id="id3", value=dh_pub_key)
cert_install_res = CertificateInstallationRes(
response_code=ResponseCode.OK,
cps_cert_chain=self.cps_certificate_chain,
contract_cert_chain=self.contract_cert_chain,
encrypted_private_key=encrypted_priv_key,
dh_public_key=dh_public_key,
emaid=self.emaid,
)
try:
elements_to_sign = [
(cert_install_res.contract_cert_chain.id, self.contract_cert_chain_exi),
(
cert_install_res.encrypted_private_key.id,
EXI().to_exi(cert_install_res.encrypted_private_key, Namespace.ISO_V2_MSG_DEF),
),
(
cert_install_res.dh_public_key.id,
EXI().to_exi(cert_install_res.dh_public_key, Namespace.ISO_V2_MSG_DEF),
),
(cert_install_res.emaid.id, self.emaid_exi),
]
signature = create_signature(elements_to_sign, self.signature_key)
except PrivateKeyReadError as exc:
raise Exception(
"Can't read private key needed to create signature "
f"for CertificateInstallationRes: {exc}",
)
except Exception as exc:
raise Exception(f"Error creating signature {exc}")
header = MessageHeaderV2(
session_id=cert_install_req.header.session_id,
signature=signature,
)
body = Body.parse_obj({"CertificateInstallationRes": cert_install_res.dict()})
to_be_exi_encoded = V2GMessageV2(header=header, body=body)
exi_encoded_cert_installation_res = EXI().to_exi(
to_be_exi_encoded, Namespace.ISO_V2_MSG_DEF
)
return base64.b64encode(exi_encoded_cert_installation_res).decode("utf-8")
def certificate_signed_response(csr: crypto.X509Req):
certs_path: str = Path(__file__).parent.resolve() / "everest-aux/certs/"
ca_cert_file = certs_path / "ca/v2g/V2G_ROOT_CA.pem"
ca_key_file = certs_path / "client/v2g/V2G_ROOT_CA.key"
with open(ca_cert_file, "rb") as ca_cert_file, open(
ca_key_file, "rb"
) as ca_key_file:
ca_cert_data = ca_cert_file.read()
ca_key_data = ca_key_file.read()
ca_cert = crypto.load_certificate(crypto.FILETYPE_PEM, ca_cert_data)
ca_key = crypto.load_privatekey(
crypto.FILETYPE_PEM, ca_key_data, b"123456")
signed_cert = crypto.X509()
signed_cert.set_version(3)
signed_cert.set_serial_number(1)
signed_cert.set_subject(csr.get_subject())
signed_cert.set_issuer(ca_cert.get_subject())
signed_cert.set_pubkey(csr.get_pubkey())
validity_days = 365
not_before = datetime.utcnow()
not_after = not_before + timedelta(days=validity_days)
signed_cert.set_notBefore(not_before.strftime(
"%Y%m%d%H%M%SZ").encode("utf-8"))
signed_cert.set_notAfter(not_after.strftime(
"%Y%m%d%H%M%SZ").encode("utf-8"))
signed_cert.sign(ca_key, "sha256")
return crypto.dump_certificate(crypto.FILETYPE_PEM, signed_cert).decode("utf-8")
def on_data_transfer(accept_pnc_authorize, exi_generator: EXIGenerator, **kwargs):
req = call.DataTransfer(**kwargs)
if req.vendor_id == "org.openchargealliance.iso15118pnc":
if req.message_id == "Authorize":
if accept_pnc_authorize:
status = AuthorizationStatusEnumType.accepted
else:
status = AuthorizationStatusEnumType.invalid
response = call_result201.Authorize(
id_token_info=IdTokenInfoType(status=status)
)
return call_result.DataTransfer(
status=DataTransferStatus.accepted,
data=json.dumps(remove_nones(
snake_to_camel_case(asdict(response)))),
)
# Should not be part of DataTransfer.req from CP->CSMS
elif req.message_id == "CertificateSigned":
return call_result.DataTransfer(
status=DataTransferStatus.unknown_message_id, data="Please implement me"
)
# Should not be part of DataTransfer.req from CP->CSMS
elif req.message_id == "DeleteCertificate":
return call_result.DataTransfer(
status=DataTransferStatus.unknown_message_id, data="Please implement me"
)
elif req.message_id == "Get15118EVCertificate":
data_payload = json.loads(kwargs["data"])
exi_request = data_payload["exiRequest"]
namespace = data_payload["iso15118SchemaVersion"]
return call_result.DataTransfer(
status=DataTransferStatus.accepted,
data=json.dumps(
remove_nones(
snake_to_camel_case(
asdict(
call_result201.Get15118EVCertificate(
status=Iso15118EVCertificateStatusEnumType.accepted,
exi_response=exi_generator.generate_certificate_installation_res(
exi_request, namespace
),
)
)
)
)
),
)
elif req.message_id == "GetCertificateStatus":
return call_result.DataTransfer(
status=DataTransferStatus.accepted,
data=json.dumps(
remove_nones(
snake_to_camel_case(
asdict(
call_result201.GetCertificateStatus(
status=GetCertificateStatusEnumType.accepted,
ocsp_result="anwfdiefnwenfinfinef",
)
)
)
)
),
)
# Should not be part of DataTransfer.req from CP->CSMS
elif req.message_id == "InstallCertificate":
return call_result.DataTransfer(
status=DataTransferStatus.unknown_message_id, data="Please implement me"
)
elif req.message_id == "SignCertificate":
return call_result.DataTransfer(
status=DataTransferStatus.accepted,
data=json.dumps(
asdict(
call_result201.SignCertificate(
status=GenericStatusEnumType.accepted
)
)
),
)
# Should not be part of DataTransfer.req from CP->CSMS
elif req.message_id == "TriggerMessage":
return call_result.DataTransfer(
status=DataTransferStatus.unknown_message_id, data="Please implement me"
)
else:
return call_result.DataTransfer(
status=DataTransferStatus.unknown_message_id, data="Please implement me"
)
else:
return call_result.DataTransfer(
status=DataTransferStatus.unknown_vendor_id, data="Please implement me"
)
def make_on_data_transfer_accept_authorize(exi_generator: EXIGenerator):
@on(Action.data_transfer)
def handler(**kwargs):
return on_data_transfer(accept_pnc_authorize=True, exi_generator=exi_generator, **kwargs)
return handler
def make_on_data_transfer_reject_authorize(exi_generator: EXIGenerator):
@on(Action.data_transfer)
def handler(**kwargs):
return on_data_transfer(accept_pnc_authorize=False, exi_generator=exi_generator, **kwargs)
return handler
def make_on_get_15118_ev_certificate(exi_generator: EXIGenerator):
@on(Action201.get_15118_ev_certificate)
def handler(**kwargs):
payload = call201.Get15118EVCertificate(**kwargs)
return call_result201.Get15118EVCertificate(
status=GenericStatusEnumType.accepted,
exi_response=exi_generator.generate_certificate_installation_res(
payload.exi_request, payload.iso15118_schema_version
),
)
return handler
def get_everest_config_path_str(config_name):
return (Path(__file__).parent / "everest-aux" / "config" / config_name).as_posix()
def get_everest_config(function_name, module_name):
if module_name == "plug_and_charge_tests":
return Path(__file__).parent / Path(
"everest-aux/config/everest-config-sil-iso.yaml"
)
elif module_name in [
"provisioning",
"authorization",
"remote_control",
"security",
"local_authorization_list",
"transactions",
"meterValues",
"reservations",
"everest_device_model"
]:
return Path(__file__).parent / Path(
"everest-aux/config/everest-config-ocpp201.yaml"
)
else:
return Path(__file__).parent / Path(
"everest-aux/config/everest-config-sil-ocpp.yaml"
)
def load_test_config() -> OcppTestConfiguration:
data = json.loads((Path(__file__).parent / "test_config.json").read_text())
ocpp_test_config = OcppTestConfiguration(
charge_point_info=ChargePointInfo(**data["charge_point_info"]),
authorization_info=AuthorizationInfo(**data["authorization_info"]),
certificate_info=CertificateInfo(**data["certificate_info"]),
firmware_info=FirmwareInfo(**data["firmware_info"]),
)
ocpp_test_config.certificate_info.csms_cert = (
Path(__file__).parent / ocpp_test_config.certificate_info.csms_cert
)
ocpp_test_config.certificate_info.csms_key = (
Path(__file__).parent / ocpp_test_config.certificate_info.csms_key
)
ocpp_test_config.certificate_info.csms_root_ca = (
Path(__file__).parent / ocpp_test_config.certificate_info.csms_root_ca
)
ocpp_test_config.certificate_info.csms_root_ca_invalid = (
Path(__file__).parent /
ocpp_test_config.certificate_info.csms_root_ca_invalid
)
ocpp_test_config.certificate_info.csms_root_ca_key = (
Path(__file__).parent /
ocpp_test_config.certificate_info.csms_root_ca_key
)
ocpp_test_config.certificate_info.mf_root_ca = (
Path(__file__).parent / ocpp_test_config.certificate_info.mf_root_ca
)
ocpp_test_config.firmware_info.update_file = (
Path(__file__).parent / ocpp_test_config.firmware_info.update_file
)
ocpp_test_config.firmware_info.update_file_signature = (
Path(__file__).parent /
ocpp_test_config.firmware_info.update_file_signature
)
return ocpp_test_config
async def call_test_function_and_wait(test_function: FunctionType, timeout=20) -> bool:
q = queue.Queue()
def tst(q):
res = test_function(timeout)
q.put(res)
test_thread = threading.Thread(target=tst, kwargs={"q": q})
test_thread.start()
result = False
while q.empty():
await asyncio.sleep(1)
result = q.get()
return result
async def send_message_without_validation(charge_point, call_msg):
json_data = json.dumps(
[
call_msg.message_type_id,
call_msg.unique_id,
call_msg.action,
call_msg.payload,
],
# By default json.dumps() adds a white space after every separator.
# By setting the separator manually that can be avoided.
separators=(",", ":"),
cls=_DecimalEncoder,
)
async with charge_point._call_lock:
await charge_point._send(json_data)
class CertificateHashDataGenerator:
"""
Compute the hash values for certificates.
Note: EVSE Security uses the X509_pubkey_digest OpenSSL function for this.
The hashes are not generated from the whole DER-encoded "Subject Public Key Information"
field, but rather only from the bit-string representing the actual key bits (without the ASN.1
tag and length).
Unfortunately, there doesn't seem to be a generic method for
doing this, so RSA and ECDSA keys are handled differently.
If we need to add support for Ed25519 or others, we'd need to
extend the logic here as well.
Cf:
- https://groups.google.com/g/mailing.openssl.users/c/1hhY2uECxsc
- https://github.com/openssl/openssl/issues/8777
- https://datatracker.ietf.org/doc/html/rfc5480
"""
@staticmethod
def _sha256(b: bytes) -> str:
return hashlib.sha256(b).hexdigest()
@classmethod
def get_hash_data(
cls, certificate_path: Path, issuer_certificate_path: Optional[Path] = None
):
issuer_certificate_path = (
issuer_certificate_path if issuer_certificate_path else certificate_path
)
certificate = load_pem_x509_certificate(
certificate_path.read_bytes(), default_backend()
)
issuer_certificate = load_pem_x509_certificate(
issuer_certificate_path.read_bytes(), default_backend()
)
issuer_name_hash = cls._get_name_hash(issuer_certificate)
issuer_key_hash = cls._get_public_key_hash(issuer_certificate_path)
assert issuer_name_hash == cls._get_issuer_name_hash(certificate)
return {
"hash_algorithm": "SHA256",
"issuer_key_hash": issuer_key_hash,
"issuer_name_hash": issuer_name_hash,
"serial_number": hex(certificate.serial_number)[2:].lower(),
# strip 0x according to OCPP spec (CertificateHashDataType)
}
@classmethod
def _get_public_key_hash(cls, file: Path):
certificate = load_pem_x509_certificate(
file.read_bytes(), default_backend())
# Get the raw key bytes - the method to do this differs by key type
# try RSA
try:
return cls._sha256(
certificate.public_key().public_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PublicFormat.PKCS1,
)
)
# try ECDSA (Note: We assume we're working with the uncompressed-point format here)
except Exception:
return cls._sha256(
certificate.public_key().public_bytes(
encoding=serialization.Encoding.X962,
format=serialization.PublicFormat.UncompressedPoint,
)
)
# if ECDSA also fails, then we need to adjust this method to add more options (e.g. Ed25519)
@classmethod
def _get_name_hash(cls, certificate: x509.Certificate):
return cls._sha256(certificate.subject.public_bytes())
@classmethod
def _get_issuer_name_hash(cls, certificate: x509.Certificate):
return cls._sha256(certificate.issuer.public_bytes())
class CertificateHelper:
@staticmethod
def _verify_private_key_matches_cert(private_key: crypto.PKey, cert: crypto.X509):
cert_public_key = (
cert.get_pubkey()
.to_cryptography_key()
.public_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PublicFormat.SubjectPublicKeyInfo,
)
)
pkey_public_key = (
private_key.to_cryptography_key()
.public_key()
.public_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PublicFormat.SubjectPublicKeyInfo,
)
)
assert (
cert_public_key == pkey_public_key
), f"Private key is for {pkey_public_key}; certificat has public key {pkey_public_key}"
@classmethod
def generate_certificate_request(
cls, common_name: str, passphrase: str | bytes | None = None
) -> tuple[str, str]:
"""
Returns: tuple of certificate request and private key
"""
key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)
req = crypto.X509Req()
req.get_subject().CN = common_name
req.set_pubkey(key)
req.get_subject().C = "DE"
req.sign(key, "sha256")
csr_data = crypto.dump_certificate_request(crypto.FILETYPE_PEM, req)
private_key = crypto.dump_privatekey(
crypto.FILETYPE_PEM,
pkey=key,
cipher="aes256" if passphrase else None,
passphrase=(
passphrase.encode("utf-8")
if isinstance(passphrase, str)
else passphrase
),
)
return csr_data.decode("utf-8"), private_key.decode("utf-8")
@classmethod
def sign_certificate_request(
cls,
csr_data: str | bytes,
issuer_certificate_path: Path,
issuer_private_key_path: Path,
issuer_private_key_passphrase: str | bytes | None = None,
relative_valid_time: int = 0,
relative_expiration_time: int = 9999999,
serial: int = 42,
) -> str:
if isinstance(issuer_private_key_passphrase, str):
issuer_private_key_passphrase = issuer_private_key_passphrase.encode(
"utf-8"
)
if isinstance(csr_data, str):
csr_data = csr_data.encode("utf-8")
issuer_private_key = crypto.load_privatekey(
crypto.FILETYPE_PEM,
issuer_private_key_path.read_bytes(),
passphrase=issuer_private_key_passphrase,
)
issuer_cert = crypto.load_certificate(
crypto.FILETYPE_PEM, issuer_certificate_path.read_bytes()
)
cls._verify_private_key_matches_cert(issuer_private_key, issuer_cert)
csr = crypto.load_certificate_request(crypto.FILETYPE_PEM, csr_data)
# Create a new certificate
cert = crypto.X509()
cert.set_subject(csr.get_subject())
cert.set_pubkey(csr.get_pubkey())
cert.gmtime_adj_notBefore(
min(relative_valid_time, relative_expiration_time - 1)
)
cert.gmtime_adj_notAfter(relative_expiration_time)
cert.set_issuer(issuer_cert.get_subject())
cert.set_serial_number(serial)
cert.sign(issuer_private_key, "SHA256")
signed_certificate = crypto.dump_certificate(crypto.FILETYPE_PEM, cert)
return signed_certificate.decode(encoding="utf-8")
class OCPPConfigReader:
def __init__(self, config):
self._config_json = config
def get_variable(self, section: str, variable: str):
identifier = OCPP2XConfigVariableIdentifier(section, variable)
return GenericOCPP2XConfigAdjustment._get_value_from_v2_config(
self._config_json, identifier
)

View File

@@ -0,0 +1,75 @@
import pytest
import pytest_asyncio
from copy import deepcopy
from typing import Dict, List
from everest.testing.ocpp_utils.central_system import CentralSystem
from everest.testing.core_utils.probe_module import ProbeModule
from everest.testing.core_utils import EverestConfigAdjustmentStrategy
@pytest.fixture
def probe_module(started_test_controller, everest_core) -> ProbeModule:
# initiate the probe module, connecting to the same runtime session the test controller started
module = ProbeModule(everest_core.get_runtime_session())
return module
@pytest_asyncio.fixture
async def chargepoint_with_pm(central_system: CentralSystem, probe_module: ProbeModule):
"""Fixture for ChargePoint201. Requires central_system_v201
"""
# wait for libocpp to go online
cp = await central_system.wait_for_chargepoint()
yield cp
await cp.stop()
class ProbeModuleCostAndPriceMetervaluesConfigurationAdjustment(EverestConfigAdjustmentStrategy):
"""
Probe module to be able to 'inject' metervalues
"""
def __init__(self, evse_manager_ids: List[str]):
self.evse_manager_ids = evse_manager_ids
def adjust_everest_configuration(self, everest_config: Dict):
adjusted_config = deepcopy(everest_config)
adjusted_config["active_modules"]["grid_connection_point"]["connections"]["powermeter"] = [
{"module_id": "probe", "implementation_id": "ProbeModulePowerMeter"}]
for evse_manager_id in self.evse_manager_ids:
adjusted_config["active_modules"][evse_manager_id]["connections"]["powermeter_grid_side"] = [
{"module_id": "probe", "implementation_id": "ProbeModulePowerMeter"}]
return adjusted_config
class ProbeModuleCostAndPriceDisplayMessageConfigurationAdjustment(EverestConfigAdjustmentStrategy):
"""
Probe module to be able to mock display messages
"""
def adjust_everest_configuration(self, everest_config: Dict):
adjusted_config = deepcopy(everest_config)
adjusted_config["active_modules"]["ocpp"]["connections"]["display_message"] = [
{"module_id": "probe", "implementation_id": "ProbeModuleDisplayMessage"}]
return adjusted_config
class ProbeModuleCostAndPriceSessionCostConfigurationAdjustment(EverestConfigAdjustmentStrategy):
"""
Probe module to be able to mock the session cost interface calls
"""
def adjust_everest_configuration(self, everest_config: Dict):
adjusted_config = deepcopy(everest_config)
adjusted_config["active_modules"]["probe"]["connections"]["session_cost"] = [
{"module_id": "ocpp", "implementation_id": "session_cost"}]
return adjusted_config

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,597 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright Pionix GmbH and Contributors to EVerest
from everest.testing.core_utils.controller.test_controller_interface import (
TestController,
)
# fmt: off
from ocpp.routing import create_route_map, on
from ocpp.v16.enums import *
from ocpp.v16 import call
from datetime import datetime, timezone
import asyncio
import logging
import pytest
from validations import (validate_standard_start_transaction,
validate_standard_stop_transaction,
validate_boot_notification
)
from everest.testing.ocpp_utils.charge_point_utils import wait_for_and_validate, TestUtility, OcppTestConfiguration
from everest.testing.ocpp_utils.fixtures import charge_point_v16
from everest.testing.ocpp_utils.charge_point_v16 import ChargePoint16
from everest.testing.ocpp_utils.central_system import CentralSystem
from everest.testing.core_utils._configuration.libocpp_configuration_helper import GenericOCPP16ConfigAdjustment
from everest_test_utils import *
# fmt: on
@pytest.mark.asyncio
async def test_stop_pending_transactions(
test_config: OcppTestConfiguration,
charge_point_v16: ChargePoint16,
test_utility: TestUtility,
test_controller: TestController,
central_system_v16: CentralSystem,
):
logging.info("######### test_stop_pending_transactions #########")
# start charging session
test_controller.plug_in()
# send RemoteStartTransaction.req
await charge_point_v16.remote_start_transaction_req(
id_tag=test_config.authorization_info.valid_id_tag_1, connector_id=1
)
# expect StartTransaction.req
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"StartTransaction",
call.StartTransaction(
1, test_config.authorization_info.valid_id_tag_1, 0, ""
),
validate_standard_start_transaction,
)
# expect StatusNotification with status charging
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"StatusNotification",
call.StatusNotification(
1, ChargePointErrorCode.no_error, ChargePointStatus.charging
),
)
# charge for some time...
logging.debug("Charging for a while...")
await asyncio.sleep(2)
test_controller.stop()
await asyncio.sleep(2)
test_controller.start()
charge_point_v16 = await central_system_v16.wait_for_chargepoint(
wait_for_bootnotification=False
)
await asyncio.sleep(2)
# expect StopTransaction.req
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"StopTransaction",
call.StopTransaction(0, "", 1, Reason.power_loss),
validate_standard_stop_transaction,
)
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-security-profile-1.yaml")
)
@pytest.mark.asyncio
async def test_change_authorization_key_in_pending(
test_config: OcppTestConfiguration,
central_system_v16: CentralSystem,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info(
"######### test_change_authorization_key_in_pending #########")
@on(Action.boot_notification)
def on_boot_notification_pending(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=10,
status=RegistrationStatus.pending,
)
@on(Action.boot_notification)
def on_boot_notification_accepted(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=5,
status=RegistrationStatus.accepted,
)
central_system_v16.function_overrides.append(
("on_boot_notification", on_boot_notification_pending)
)
test_controller.start()
charge_point_v16 = await central_system_v16.wait_for_chargepoint()
charge_point_v16.pipe = True
response = await charge_point_v16.get_configuration_req()
assert len(response.configuration_key) > 20
await charge_point_v16.change_configuration_req(
key="MeterValueSampleInterval", value="10"
)
await charge_point_v16.change_configuration_req(
key="AuthorizationKey", value="DEADBEEFDEADBEEF"
)
# wait for reconnect
await central_system_v16.wait_for_chargepoint(wait_for_bootnotification=False)
charge_point_v16 = central_system_v16.chargepoint
setattr(charge_point_v16, "on_boot_notification",
on_boot_notification_accepted)
central_system_v16.chargepoint.route_map = create_route_map(
central_system_v16.chargepoint
)
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"BootNotification",
call.BootNotification(
test_config.charge_point_info.charge_point_model,
charge_box_serial_number=test_config.charge_point_info.charge_point_id,
charge_point_vendor=test_config.charge_point_info.charge_point_vendor,
firmware_version=test_config.charge_point_info.firmware_version,
),
validate_boot_notification,
)
# expect StatusNotification.req with status available
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"StatusNotification",
call.StatusNotification(
1, ChargePointErrorCode.no_error, ChargePointStatus.available
),
)
assert await wait_for_and_validate(
test_utility, charge_point_v16, "Heartbeat", call.Heartbeat()
)
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-security-profile-1.yaml")
)
@pytest.mark.asyncio
async def test_remote_start_stop_in_pending(
test_config: OcppTestConfiguration,
central_system_v16: CentralSystem,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info(
"######### test_change_authorization_key_in_pending #########")
@on(Action.boot_notification)
def on_boot_notification_pending(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=10,
status=RegistrationStatus.pending,
)
central_system_v16.function_overrides.append(
("on_boot_notification", on_boot_notification_pending)
)
test_controller.start()
charge_point_v16 = await central_system_v16.wait_for_chargepoint()
charge_point_v16.pipe = True
await charge_point_v16.remote_start_transaction_req(id_tag="DEADBEEF")
assert await wait_for_and_validate(
test_utility, charge_point_v16, "RemoteStartTransaction", {
"status": "Rejected"}
)
await charge_point_v16.remote_stop_transaction_req(transaction_id=20)
assert await wait_for_and_validate(
test_utility, charge_point_v16, "RemoteStopTransaction", {
"status": "Rejected"}
)
@pytest.mark.asyncio
async def test_boot_notification_rejected(
test_config: OcppTestConfiguration,
central_system_v16: CentralSystem,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_boot_notification_rejected #########")
@on(Action.boot_notification)
def on_boot_notification_rejected(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=10,
status=RegistrationStatus.rejected,
)
@on(Action.boot_notification)
def on_boot_notification_accepted(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=5,
status=RegistrationStatus.accepted,
)
central_system_v16.function_overrides.append(
("on_boot_notification", on_boot_notification_rejected)
)
test_controller.start()
charge_point_v16: ChargePoint16 = await central_system_v16.wait_for_chargepoint()
charge_point_v16.pipe = True
setattr(charge_point_v16, "on_boot_notification",
on_boot_notification_accepted)
central_system_v16.chargepoint.route_map = create_route_map(
central_system_v16.chargepoint
)
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"BootNotification",
call.BootNotification(
test_config.charge_point_info.charge_point_model,
charge_box_serial_number=test_config.charge_point_info.charge_point_id,
charge_point_vendor=test_config.charge_point_info.charge_point_vendor,
firmware_version=test_config.charge_point_info.firmware_version,
),
validate_boot_notification,
)
# expect StatusNotification.req with status available
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"StatusNotification",
call.StatusNotification(
1, ChargePointErrorCode.no_error, ChargePointStatus.available
),
)
assert await wait_for_and_validate(
test_utility, charge_point_v16, "Heartbeat", call.Heartbeat()
)
@pytest.mark.asyncio
async def test_boot_notification_callerror(
test_config: OcppTestConfiguration,
central_system_v16: CentralSystem,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_boot_notification_callerror #########")
@on(Action.boot_notification)
def on_boot_notification_accepted(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=5,
status=RegistrationStatus.accepted,
)
# Provoke a CALLERROR as a response to a BootNotification.req
central_system_v16.function_overrides.append(
("on_boot_notification", None))
test_controller.start()
charge_point_v16: ChargePoint16 = await central_system_v16.wait_for_chargepoint()
charge_point_v16.pipe = True
setattr(charge_point_v16, "on_boot_notification",
on_boot_notification_accepted)
central_system_v16.chargepoint.route_map = create_route_map(
central_system_v16.chargepoint
)
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"BootNotification",
call.BootNotification(
test_config.charge_point_info.charge_point_model,
charge_box_serial_number=test_config.charge_point_info.charge_point_id,
charge_point_vendor=test_config.charge_point_info.charge_point_vendor,
firmware_version=test_config.charge_point_info.firmware_version,
),
validate_boot_notification,
timeout=100,
)
# expect StatusNotification.req with status available
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"StatusNotification",
call.StatusNotification(
1, ChargePointErrorCode.no_error, ChargePointStatus.available
),
)
assert await wait_for_and_validate(
test_utility, charge_point_v16, "Heartbeat", call.Heartbeat()
)
@pytest.mark.asyncio
async def test_boot_notification_no_response(
test_config: OcppTestConfiguration,
central_system_v16: CentralSystem,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_boot_notification_no_response #########")
async def route_message(msg):
return
# do not respond at all
central_system_v16.function_overrides.append(
("route_message", route_message))
test_controller.start()
charge_point_v16: ChargePoint16 = await central_system_v16.wait_for_chargepoint()
charge_point_v16.pipe = True
# this is the second BootNotification.req
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"BootNotification",
call.BootNotification(
test_config.charge_point_info.charge_point_model,
charge_box_serial_number=test_config.charge_point_info.charge_point_id,
charge_point_vendor=test_config.charge_point_info.charge_point_vendor,
firmware_version=test_config.charge_point_info.firmware_version,
),
validate_boot_notification,
timeout=100,
)
@pytest.mark.asyncio
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-security-profile-2.yaml")
)
@pytest.mark.source_certs_dir(Path(__file__).parent / "../everest-aux/certs")
@pytest.mark.asyncio
@pytest.mark.csms_tls
@pytest.mark.ocpp_config_adaptions(
GenericOCPP16ConfigAdjustment(
[("Internal", "VerifyCsmsCommonName", False)])
)
async def test_initiate_message_in_pending(
test_config: OcppTestConfiguration,
central_system_v16: CentralSystem,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_initiate_message_in_pending #########")
@on(Action.boot_notification)
def on_boot_notification_pending(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=10,
status=RegistrationStatus.pending,
)
@on(Action.boot_notification)
def on_boot_notification_accepted(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=5,
status=RegistrationStatus.accepted,
)
central_system_v16.function_overrides.append(
("on_boot_notification", on_boot_notification_pending)
)
test_utility.forbidden_actions.append("SecurityEventNotification")
test_controller.start()
charge_point_v16: ChargePoint16 = await central_system_v16.wait_for_chargepoint()
charge_point_v16.pipe = True
await charge_point_v16.change_configuration_req(key="CpoName", value="VENID")
await charge_point_v16.extended_trigger_message_req(
requested_message=MessageTrigger.status_notification
)
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"StatusNotification",
call.StatusNotification(
1, ChargePointErrorCode.no_error, ChargePointStatus.available
),
)
test_utility.messages.clear()
await charge_point_v16.extended_trigger_message_req(
requested_message=MessageTrigger.boot_notification
)
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"BootNotification",
call.BootNotification(
test_config.charge_point_info.charge_point_model,
charge_box_serial_number=test_config.charge_point_info.charge_point_id,
charge_point_vendor=test_config.charge_point_info.charge_point_vendor,
firmware_version=test_config.charge_point_info.firmware_version,
),
validate_boot_notification,
)
test_utility.messages.clear()
await charge_point_v16.extended_trigger_message_req(
requested_message=MessageTrigger.heartbeat
)
assert await wait_for_and_validate(
test_utility, charge_point_v16, "Heartbeat", call.Heartbeat()
)
test_utility.messages.clear()
await charge_point_v16.trigger_message_req(
requested_message=MessageTrigger.diagnostics_status_notification
)
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"DiagnosticsStatusNotification",
call.DiagnosticsStatusNotification(DiagnosticsStatus.idle),
)
test_utility.messages.clear()
await charge_point_v16.trigger_message_req(
requested_message=MessageTrigger.firmware_status_notification
)
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"FirmwareStatusNotification",
call.FirmwareStatusNotification(FirmwareStatus.idle),
)
test_utility.messages.clear()
await charge_point_v16.trigger_message_req(
requested_message=MessageTrigger.status_notification
)
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"StatusNotification",
call.StatusNotification(
1, ChargePointErrorCode.no_error, ChargePointStatus.available
),
)
await charge_point_v16.extended_trigger_message_req(
requested_message=MessageTrigger.sign_charge_point_certificate
)
# expect ExtendedTriggerMessage.conf with status Accepted
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"ExtendedTriggerMessage",
call_result.ExtendedTriggerMessage(TriggerMessageStatus.accepted),
)
assert await wait_for_and_validate(
test_utility, charge_point_v16, "SignCertificate", {}
)
setattr(charge_point_v16, "on_boot_notification",
on_boot_notification_accepted)
central_system_v16.chargepoint.route_map = create_route_map(
central_system_v16.chargepoint
)
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"BootNotification",
call.BootNotification(
test_config.charge_point_info.charge_point_model,
charge_box_serial_number=test_config.charge_point_info.charge_point_id,
charge_point_vendor=test_config.charge_point_info.charge_point_vendor,
firmware_version=test_config.charge_point_info.firmware_version,
),
validate_boot_notification,
)
test_utility.forbidden_actions.clear()
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"SecurityEventNotification",
{"type": "StartupOfTheDevice"},
)
# expect StatusNotification.req with status available
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"StatusNotification",
call.StatusNotification(
1, ChargePointErrorCode.no_error, ChargePointStatus.available
),
)
assert await wait_for_and_validate(
test_utility, charge_point_v16, "Heartbeat", call.Heartbeat()
)
@pytest.mark.asyncio
async def test_boot_notification_rejected_and_call_by_csms(
test_config: OcppTestConfiguration,
central_system_v16: CentralSystem,
test_controller: TestController,
test_utility: TestUtility,
):
@on(Action.boot_notification)
def on_boot_notification_rejected(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=10,
status=RegistrationStatus.rejected,
)
central_system_v16.function_overrides.append(
("on_boot_notification", on_boot_notification_rejected)
)
test_controller.start()
charge_point_v16: ChargePoint16 = await central_system_v16.wait_for_chargepoint()
charge_point_v16.pipe = True
# Response to this message is not allowed
test_utility.forbidden_actions.append("RemoteStartTransaction")
t = threading.Thread(
target=asyncio.run,
args=(
charge_point_v16.remote_start_transaction_req(
id_tag=test_config.authorization_info.valid_id_tag_1, connector_id=1
),
),
)
t.start()
assert await wait_for_and_validate(
test_utility, charge_point_v16, "BootNotification", {}
)

View File

@@ -0,0 +1,428 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright Pionix GmbH and Contributors to EVerest
import pytest
import logging
from datetime import datetime, timezone
from everest.testing.core_utils.controller.test_controller_interface import (
TestController,
)
from everest.testing.core_utils.everest_core import EverestCore, Requirement
from everest.testing.core_utils.probe_module import ProbeModule
from ocpp.v16 import call, call_result
from ocpp.v16.enums import *
from ocpp.v16.datatypes import IdTagInfo
from ocpp.messages import Call, _DecimalEncoder
from ocpp.charge_point import snake_to_camel_case
from ocpp.routing import on, create_route_map
# fmt: off
from validations import wait_for_callerror_and_validate, validate_boot_notification
from everest.testing.ocpp_utils.fixtures import charge_point_v16, test_utility
from everest.testing.ocpp_utils.central_system import CentralSystem
from everest.testing.ocpp_utils.charge_point_v16 import ChargePoint16
from everest.testing.ocpp_utils.charge_point_utils import wait_for_and_validate, TestUtility
from everest_test_utils import *
# fmt: on
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-sil-ocpp.yaml")
)
@pytest.mark.asyncio
async def test_missing_payload_field(
test_config,
charge_point_v16: ChargePoint16,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_missing_payload_field #########")
payload = call.ChangeConfiguration(key="WebSocketPingInterval", value="0")
camel_case_payload = snake_to_camel_case(asdict(payload))
call_msg = Call(
unique_id=str(charge_point_v16._unique_id_generator()),
action=payload.__class__.__name__,
payload=remove_nones(camel_case_payload),
)
# remove a required payload field
del call_msg.payload["value"]
await send_message_without_validation(charge_point_v16, call_msg)
assert await wait_for_callerror_and_validate(
test_utility, charge_point_v16, "FormationViolation"
)
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-sil-ocpp.yaml")
)
@pytest.mark.skip(reason="libocpp currently does not support this")
@pytest.mark.asyncio
async def test_additional_payload_field(
test_config,
charge_point_v16: ChargePoint16,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_additional_payload_field #########")
payload = call.ChangeConfiguration(key="WebSocketPingInterval", value="0")
camel_case_payload = snake_to_camel_case(asdict(payload))
call_msg = Call(
unique_id=str(charge_point_v16._unique_id_generator()),
action=payload.__class__.__name__,
payload=remove_nones(camel_case_payload),
)
# add a payload field
call_msg.payload["additional"] = "123"
await send_message_without_validation(charge_point_v16, call_msg)
# FIXME: this message seems to be accepted, should be rejected according to spec...
assert await wait_for_callerror_and_validate(
test_utility, charge_point_v16, "FormationViolation"
)
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-sil-ocpp.yaml")
)
@pytest.mark.asyncio
async def test_wrong_payload_type(
test_config,
charge_point_v16: ChargePoint16,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_wrong_payload_type #########")
# key should just be string, but here we set it to array of string
payload = call.ChangeConfiguration(
key=["WebSocketPingInterval"], value="0")
camel_case_payload = snake_to_camel_case(asdict(payload))
call_msg = Call(
unique_id=str(charge_point_v16._unique_id_generator()),
action=payload.__class__.__name__,
payload=remove_nones(camel_case_payload),
)
await send_message_without_validation(charge_point_v16, call_msg)
assert await wait_for_callerror_and_validate(
test_utility, charge_point_v16, "FormationViolation"
)
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-sil-ocpp.yaml")
)
@pytest.mark.asyncio
async def test_wrong_auth_payload(
test_config,
charge_point_v16: ChargePoint16,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_wrong_auth_payload #########")
@on(Action.authorize)
def on_authorize(**kwargs):
# send an empty id_tag_info, this should not crash EVerest
id_tag_info = {}
res = call_result.Authorize(id_tag_info=id_tag_info)
return res
setattr(charge_point_v16, "on_authorize", on_authorize)
charge_point_v16.route_map = create_route_map(charge_point_v16)
charge_point_v16.route_map[Action.authorize]["_skip_schema_validation"] = True
await charge_point_v16.change_configuration_req(
key="AuthorizeRemoteTxRequests", value="true"
)
test_controller.plug_in()
test_controller.swipe(test_config.authorization_info.valid_id_tag_1)
# expect authorize.req
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"Authorize",
call.Authorize(test_config.authorization_info.valid_id_tag_1),
)
# this only works if we don't crash from the broken response
test_controller.swipe(test_config.authorization_info.valid_id_tag_2)
# expect authorize.req
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"Authorize",
call.Authorize(test_config.authorization_info.valid_id_tag_2),
)
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-sil-ocpp.yaml")
)
@pytest.mark.probe_module(
connections={"ocpp_data_transfer": [Requirement("ocpp", "data_transfer")]}
)
@pytest.mark.inject_csms_mock
@pytest.mark.asyncio
async def test_data_transfer_with_probe_module(
central_system_v16_standalone: CentralSystem, everest_core: EverestCore
):
logging.info("######### test_data_transfer_with_probe_module #########")
@on(Action.data_transfer)
def on_data_transfer(**kwargs):
logging.info(f"Received a data transfer message {datetime.now()}")
req = call.DataTransfer(**kwargs)
if req.vendor_id == "PIONIX" and req.message_id == "test_message":
return call_result.DataTransfer(
status=DataTransferStatus.accepted, data="Hello there"
)
elif req.vendor_id == "PIONIX" and req.message_id == "test_message_broken":
# purposefully return a wrong payload
return call_result.Authorize(id_tag_info={})
return call_result.DataTransfer(
status=DataTransferStatus.unknown_message_id, data="Please implement me"
)
cs = central_system_v16_standalone.mock
cs.on_data_transfer.side_effect = on_data_transfer
probe_module = ProbeModule(everest_core.get_runtime_session())
probe_module.start()
await probe_module.wait_to_be_ready()
charge_point_v16 = await central_system_v16_standalone.wait_for_chargepoint()
charge_point_v16.route_map[Action.data_transfer]["_skip_schema_validation"] = True
result = await probe_module.call_command(
"ocpp_data_transfer",
"data_transfer",
{
"request": {
"vendor_id": "PIONIX",
"message_id": "test_message",
"data": "test",
}
},
)
assert "data" in result and "status" in result and result["status"] == "Accepted"
result = await probe_module.call_command(
"ocpp_data_transfer",
"data_transfer",
{
"request": {
"vendor_id": "PIONIX",
"message_id": "test_message_unknown",
"data": "test",
}
},
)
assert "status" in result and result["status"] == "UnknownMessageId"
result = await probe_module.call_command(
"ocpp_data_transfer",
"data_transfer",
{
"request": {
"vendor_id": "PIONIX",
"message_id": "test_message_broken",
"data": "test",
}
},
)
assert "status" in result and result["status"] == "Rejected"
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-sil-ocpp.yaml")
)
@pytest.mark.asyncio
async def test_boot_notification_call_error(
test_config,
central_system_v16: CentralSystem,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_boot_notification_call_error #########")
test_controller.start()
@on(Action.boot_notification)
def on_boot_notification_error(**kwargs):
raise InternalError()
@on(Action.boot_notification)
def on_boot_notification_accepted(**kwargs):
return call_result.BootNotification(
current_time=datetime.now(timezone.utc).isoformat(),
interval=5,
status=RegistrationStatus.accepted,
)
central_system_v16.function_overrides.append(
("on_boot_notification", on_boot_notification_error)
)
charge_point_v16 = await central_system_v16.wait_for_chargepoint(
wait_for_bootnotification=False
)
# charge_point_v16.route_map[Action.authorize]['_skip_schema_validation'] = True
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"BootNotification",
call.BootNotification(
charge_box_serial_number="cp001",
charge_point_model="Yeti",
charge_point_vendor="Pionix",
firmware_version="0.1",
),
validate_boot_notification,
)
central_system_v16.function_overrides.append(
("on_boot_notification", on_boot_notification_accepted)
)
logging.info("disconnect the ws connection...")
test_controller.disconnect_websocket()
await asyncio.sleep(1)
logging.info("connecting the ws connection")
test_controller.connect_websocket()
# wait for reconnect
charge_point_v16 = await central_system_v16.wait_for_chargepoint(
wait_for_bootnotification=False
)
# charge_point_v16.route_map[Action.authorize]['_skip_schema_validation'] = True
assert await wait_for_and_validate(
test_utility,
charge_point_v16,
"BootNotification",
call.BootNotification(
charge_box_serial_number="cp001",
charge_point_model="Yeti",
charge_point_vendor="Pionix",
firmware_version="0.1",
),
validate_boot_notification,
timeout=70,
)
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-sil-ocpp.yaml")
)
@pytest.mark.asyncio
@pytest.mark.inject_csms_mock
async def test_start_transaction_call_error_or_timeout(
test_config,
central_system_v16: CentralSystem,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info(
"######### test_start_transaction_call_error_or_timeout #########")
test_controller.start()
central_system_v16.mock.on_start_transaction.side_effect = [
NotImplementedError(),
NotImplementedError(),
NotImplementedError(),
NotImplementedError(),
call_result.StartTransaction(
transaction_id=1, id_tag_info=IdTagInfo(status=AuthorizationStatus.accepted)
),
]
charge_point_v16 = await central_system_v16.wait_for_chargepoint(
wait_for_bootnotification=False
)
test_controller.swipe("DEADBEEF")
test_controller.plug_in()
# expect StartTransaction.req
assert await wait_for_and_validate(
test_utility, charge_point_v16, "StartTransaction", {}
)
await asyncio.sleep(2)
test_controller.plug_out()
assert await wait_for_and_validate(
test_utility, charge_point_v16, "StopTransaction", {"transactionId": 1}
)
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-sil-ocpp.yaml")
)
@pytest.mark.asyncio
async def test_too_long_payload_field(
test_config,
charge_point_v16: ChargePoint16,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_too_long_payload_field #########")
payload = call.ChangeConfiguration(
key="ThisIsMuchLongerThan50charactersThisIsMuchLongerThan50charactersThisIsMuchLongerThan50charactersThisIsMuchLongerThan50charactersThisIsMuchLongerThan50characters", value="0")
camel_case_payload = snake_to_camel_case(asdict(payload))
call_msg = Call(
unique_id=str(charge_point_v16._unique_id_generator()),
action=payload.__class__.__name__,
payload=remove_nones(camel_case_payload),
)
await send_message_without_validation(charge_point_v16, call_msg)
assert await wait_for_callerror_and_validate(
test_utility, charge_point_v16, "FormationViolation"
)
@pytest.mark.everest_core_config(
get_everest_config_path_str("everest-config-sil-ocpp.yaml")
)
@pytest.mark.asyncio
async def test_invalid_encoding_in_payload(
test_config,
charge_point_v16: ChargePoint16,
test_controller: TestController,
test_utility: TestUtility,
):
logging.info("######### test_invalid_encoding_in_payload #########")
# a malformed CALL should trigger a RpcFrameworkError CALLERROR
call_msg = b"\xd8\x00\x00\x00"
async with charge_point_v16._call_lock:
await charge_point_v16._send(call_msg)
assert await wait_for_callerror_and_validate(
test_utility, charge_point_v16, "GenericError"
)

File diff suppressed because it is too large Load Diff

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