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:
@@ -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-----
|
||||
@@ -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-----
|
||||
Binary file not shown.
@@ -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-----
|
||||
Binary file not shown.
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
Binary file not shown.
@@ -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-----
|
||||
Binary file not shown.
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
Binary file not shown.
@@ -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-----
|
||||
Binary file not shown.
Binary file not shown.
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -0,0 +1 @@
|
||||
123456
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -0,0 +1 @@
|
||||
123456
|
||||
Binary file not shown.
Binary file not shown.
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -0,0 +1 @@
|
||||
123456
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -0,0 +1 @@
|
||||
123456
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -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-----
|
||||
@@ -0,0 +1 @@
|
||||
123456
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
|
||||
@@ -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: {}
|
||||
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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: {}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
This is a firmware update file
|
||||
@@ -0,0 +1,6 @@
|
||||
dGdE6NN9ZiReWDzB8kQaEGjEYJzwh0FOPfbjJ3jwc1VeV3wtJzOTfPaUhBEmSd/K
|
||||
Erb+GOsP74otgm00/pv/pZQ+0nNfd+ZGrPfZK/RsNFJosM3CGAS1w55+tqUVRyhC
|
||||
CZ4l1GCAzpdStn8c90gyD1IyF6LccMw6Odwq7XDYyIYPMZigZ8fJYKKiQxVYVf7i
|
||||
BGSsmbG655OKKSS5JX1nE5i0gZt0ZuMaAjQOoA4etu8rXI0KRBueQbmHk1oNscYl
|
||||
eT50T0JZfSQ2M0pZrzjcSuCIgWYf6L6uGP7tMvA/m/KGu/ufSXwt4hFdbYxp+ofk
|
||||
1RmNOPjhPnT2XuvsT12UbA==
|
||||
17
tools/EVerest-main/tests/ocpp_tests/test_sets/everest-aux/install_certs.sh
Executable file
17
tools/EVerest-main/tests/ocpp_tests/test_sets/everest-aux/install_certs.sh
Executable 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
|
||||
16
tools/EVerest-main/tests/ocpp_tests/test_sets/everest-aux/install_configs.sh
Executable file
16
tools/EVerest-main/tests/ocpp_tests/test_sets/everest-aux/install_configs.sh
Executable 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
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
597
tools/EVerest-main/tests/ocpp_tests/test_sets/ocpp16/booting.py
Normal file
597
tools/EVerest-main/tests/ocpp_tests/test_sets/ocpp16/booting.py
Normal 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", {}
|
||||
)
|
||||
428
tools/EVerest-main/tests/ocpp_tests/test_sets/ocpp16/broken.py
Normal file
428
tools/EVerest-main/tests/ocpp_tests/test_sets/ocpp16/broken.py
Normal 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
@@ -0,0 +1,224 @@
|
||||
import pytest
|
||||
|
||||
from ocpp.v16.enums import AvailabilityType, AvailabilityStatus, ReservationStatus
|
||||
from ocpp.v16.call_result import ChangeAvailability
|
||||
|
||||
from everest.testing.ocpp_utils.charge_point_utils import (
|
||||
wait_for_and_validate,
|
||||
TestUtility,
|
||||
)
|
||||
from everest.testing.ocpp_utils.fixtures import *
|
||||
from everest_test_utils import get_everest_config_path_str
|
||||
from everest.testing.ocpp_utils.charge_point_v16 import ChargePoint16
|
||||
from everest.testing.core_utils.controller.test_controller_interface import (
|
||||
TestController,
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_change_availability(
|
||||
charge_point_v16: ChargePoint16,
|
||||
test_utility: TestUtility
|
||||
):
|
||||
|
||||
r: ChangeAvailability = await charge_point_v16.change_availability_req(
|
||||
type=AvailabilityType.inoperative, connector_id=1
|
||||
)
|
||||
|
||||
assert r.status == AvailabilityStatus.accepted
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 1, "status": "Unavailable", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
# verify the same request is accepted and no further StatusNotification.req is sent
|
||||
r: ChangeAvailability = await charge_point_v16.change_availability_req(
|
||||
type=AvailabilityType.inoperative, connector_id=1
|
||||
)
|
||||
|
||||
assert r.status == AvailabilityStatus.accepted
|
||||
|
||||
test_utility.messages.clear()
|
||||
test_utility.forbidden_actions.append("StatusNotification")
|
||||
|
||||
# verify connector can be set back to operational
|
||||
r: ChangeAvailability = await charge_point_v16.change_availability_req(
|
||||
type=AvailabilityType.operative, connector_id=1
|
||||
)
|
||||
|
||||
assert r.status == AvailabilityStatus.accepted
|
||||
|
||||
test_utility.forbidden_actions.clear()
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 1, "status": "Available", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.everest_core_config(
|
||||
get_everest_config_path_str("everest-config-two-connectors.yaml")
|
||||
)
|
||||
async def test_change_availability_connector_zero(
|
||||
charge_point_v16: ChargePoint16,
|
||||
test_utility: TestUtility
|
||||
):
|
||||
|
||||
r: ChangeAvailability = await charge_point_v16.change_availability_req(
|
||||
type=AvailabilityType.inoperative, connector_id=0
|
||||
)
|
||||
|
||||
assert r.status == AvailabilityStatus.accepted
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 0, "status": "Unavailable", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 1, "status": "Unavailable", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 2, "status": "Unavailable", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
# verify connector can be set back to operational
|
||||
r: ChangeAvailability = await charge_point_v16.change_availability_req(
|
||||
type=AvailabilityType.operative, connector_id=0
|
||||
)
|
||||
|
||||
assert r.status == AvailabilityStatus.accepted
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 0, "status": "Available", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 1, "status": "Available", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 2, "status": "Available", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.everest_core_config(
|
||||
get_everest_config_path_str("everest-config-two-connectors.yaml")
|
||||
)
|
||||
async def test_change_availability_scheduled_in_preparing(
|
||||
charge_point_v16: ChargePoint16,
|
||||
test_utility: TestUtility,
|
||||
test_controller: TestController,
|
||||
):
|
||||
|
||||
test_controller.plug_in()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 1, "status": "Preparing", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
r: ChangeAvailability = await charge_point_v16.change_availability_req(
|
||||
type=AvailabilityType.inoperative, connector_id=0
|
||||
)
|
||||
|
||||
assert r.status == AvailabilityStatus.scheduled
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 0, "status": "Unavailable", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 2, "status": "Unavailable", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
test_controller.plug_out()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 1, "status": "Unavailable", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_change_availability_scheduled_in_transaction(
|
||||
charge_point_v16: ChargePoint16,
|
||||
test_utility: TestUtility,
|
||||
test_controller: TestController,
|
||||
):
|
||||
|
||||
test_controller.plug_in()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 1, "status": "Preparing", "errorCode": "NoError"},
|
||||
)
|
||||
|
||||
test_controller.swipe("DEADBEEF")
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility, charge_point_v16, "StartTransaction", {"connectorId": 1}
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
r: ChangeAvailability = await charge_point_v16.change_availability_req(
|
||||
type=AvailabilityType.inoperative, connector_id=1
|
||||
)
|
||||
|
||||
assert r.status == AvailabilityStatus.scheduled
|
||||
|
||||
test_controller.plug_out()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility, charge_point_v16, "StopTransaction", {
|
||||
"reason": "EVDisconnected"}
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"StatusNotification",
|
||||
{"connectorId": 1, "status": "Unavailable", "errorCode": "NoError"},
|
||||
)
|
||||
@@ -0,0 +1,127 @@
|
||||
import pytest
|
||||
|
||||
from everest.testing.core_utils.controller.test_controller_interface import (
|
||||
TestController,
|
||||
)
|
||||
from everest.testing.ocpp_utils.charge_point_utils import (
|
||||
wait_for_and_validate,
|
||||
TestUtility,
|
||||
)
|
||||
from everest.testing.ocpp_utils.central_system import ChargePoint16
|
||||
from everest.testing.ocpp_utils.fixtures import test_utility, charge_point_v16
|
||||
from everest_test_utils import get_everest_config_path_str
|
||||
|
||||
from ocpp.v16 import call_result
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.everest_core_config(
|
||||
get_everest_config_path_str("everest-config-two-connectors.yaml")
|
||||
)
|
||||
async def test_meter_public_key(
|
||||
charge_point_v16: ChargePoint16, test_utility: TestUtility
|
||||
):
|
||||
await charge_point_v16.get_configuration_req(key=["MeterPublicKey1"])
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetConfiguration",
|
||||
call_result.GetConfiguration(
|
||||
[{"key": "MeterPublicKey1", "readonly": True, "value": "TESTPUBLICKEY1"}]
|
||||
),
|
||||
)
|
||||
|
||||
await charge_point_v16.get_configuration_req(key=["MeterPublicKey2"])
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetConfiguration",
|
||||
call_result.GetConfiguration(
|
||||
[{"key": "MeterPublicKey2", "readonly": True, "value": "TESTPUBLICKEY2"}]
|
||||
),
|
||||
)
|
||||
|
||||
await charge_point_v16.get_configuration_req(key=["MeterPublicKey3"])
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetConfiguration",
|
||||
{"unknownKey": ["MeterPublicKey3"]}
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
response : call_result.GetConfiguration = await charge_point_v16.get_configuration_req()
|
||||
|
||||
assert any(
|
||||
entry['key'] == "MeterPublicKey1" and entry['value'] == "TESTPUBLICKEY1"
|
||||
for entry in response.configuration_key)
|
||||
|
||||
assert any(
|
||||
entry['key'] == "MeterPublicKey2" and entry['value'] == "TESTPUBLICKEY2"
|
||||
for entry in response.configuration_key)
|
||||
|
||||
await charge_point_v16.get_configuration_req(key=["MeterPublicKey"])
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetConfiguration",
|
||||
{"unknownKey": ["MeterPublicKey"]}
|
||||
)
|
||||
|
||||
await charge_point_v16.get_configuration_req(key=["MeterPublicKeyMeterPublicKey1"])
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetConfiguration",
|
||||
{"unknownKey": ["MeterPublicKeyMeterPublicKey1"]}
|
||||
)
|
||||
|
||||
await charge_point_v16.get_configuration_req(key=["MeterPublicKey1X"])
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetConfiguration",
|
||||
{"unknownKey": ["MeterPublicKey1X"]}
|
||||
)
|
||||
|
||||
await charge_point_v16.get_configuration_req(key=["MeterPublicKey1X"])
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetConfiguration",
|
||||
{"unknownKey": ["MeterPublicKey1X"]}
|
||||
)
|
||||
|
||||
await charge_point_v16.get_configuration_req(key=["MeterPublicKeybanana"])
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetConfiguration",
|
||||
{"unknownKey": ["MeterPublicKeybanana"]}
|
||||
)
|
||||
|
||||
await charge_point_v16.get_configuration_req(key=["MeterPublicKey0"])
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetConfiguration",
|
||||
{"unknownKey": ["MeterPublicKey0"]}
|
||||
)
|
||||
|
||||
await charge_point_v16.change_configuration_req(
|
||||
key="MeterPublicKey1", value="TEST"
|
||||
)
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"ChangeConfiguration",
|
||||
{"status": "Rejected"}
|
||||
)
|
||||
@@ -0,0 +1,347 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright Pionix GmbH and Contributors to EVerest
|
||||
|
||||
import pytest
|
||||
from datetime import datetime, timedelta, timezone
|
||||
import logging
|
||||
import asyncio
|
||||
import getpass
|
||||
|
||||
from ocpp.v16 import call, call_result
|
||||
from ocpp.v16.enums import *
|
||||
|
||||
# fmt: off
|
||||
from validations import (validate_get_log)
|
||||
from everest.testing.ocpp_utils.charge_point_utils import wait_for_and_validate, TestUtility
|
||||
from everest.testing.ocpp_utils.fixtures import charge_point_v16
|
||||
from everest.testing.ocpp_utils.charge_point_v16 import ChargePoint16
|
||||
from everest_test_utils import *
|
||||
# fmt: on
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_diagnostics_retries(
|
||||
charge_point_v16: ChargePoint16, test_utility: TestUtility
|
||||
):
|
||||
logging.info("######### test_get_diagnostics_retries #########")
|
||||
|
||||
await asyncio.sleep(1)
|
||||
|
||||
# FIXME: make sure this port does not exist? or username and password are wrong?
|
||||
location = f"ftp://{getpass.getuser()}:12345@localhost:2121"
|
||||
start_time = datetime.now(timezone.utc)
|
||||
stop_time = start_time + timedelta(days=3)
|
||||
retries = 2
|
||||
retry_interval = 2
|
||||
|
||||
test_utility.messages.clear()
|
||||
await charge_point_v16.get_diagnostics_req(
|
||||
location=location,
|
||||
start_time=start_time.isoformat(),
|
||||
stop_time=stop_time.isoformat(),
|
||||
retries=retries,
|
||||
retry_interval=retry_interval,
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"DiagnosticsStatusNotification",
|
||||
call.DiagnosticsStatusNotification(DiagnosticsStatus.uploading),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"DiagnosticsStatusNotification",
|
||||
call.DiagnosticsStatusNotification(DiagnosticsStatus.upload_failed),
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"DiagnosticsStatusNotification",
|
||||
call.DiagnosticsStatusNotification(DiagnosticsStatus.uploading),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"DiagnosticsStatusNotification",
|
||||
call.DiagnosticsStatusNotification(DiagnosticsStatus.upload_failed),
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"DiagnosticsStatusNotification",
|
||||
call.DiagnosticsStatusNotification(DiagnosticsStatus.uploading),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"DiagnosticsStatusNotification",
|
||||
call.DiagnosticsStatusNotification(DiagnosticsStatus.upload_failed),
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_upload_security_log_retries(
|
||||
charge_point_v16: ChargePoint16, test_utility: TestUtility
|
||||
):
|
||||
logging.info("######### test_upload_security_log_retries #########")
|
||||
|
||||
oldest_timestamp = datetime.now(timezone.utc)
|
||||
latest_timestamp = oldest_timestamp + timedelta(days=3)
|
||||
retries = 2
|
||||
retry_interval = 2
|
||||
|
||||
log = {
|
||||
"remoteLocation": f"ftp://{getpass.getuser()}:12345@localhost:2121",
|
||||
"oldestTimestamp": oldest_timestamp.isoformat(),
|
||||
"latestTimestamp": latest_timestamp.isoformat(),
|
||||
}
|
||||
|
||||
test_utility.messages.clear()
|
||||
await charge_point_v16.get_log_req(
|
||||
log=log,
|
||||
log_type=Log.security_log,
|
||||
retries=retries,
|
||||
retry_interval=retry_interval,
|
||||
request_id=1,
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"GetLog",
|
||||
call_result.GetLog(LogStatus.accepted),
|
||||
validate_get_log,
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"LogStatusNotification",
|
||||
call.LogStatusNotification(UploadLogStatus.uploading, 1),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"LogStatusNotification",
|
||||
call.LogStatusNotification(UploadLogStatus.upload_failure, 1),
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"LogStatusNotification",
|
||||
call.LogStatusNotification(UploadLogStatus.uploading, 1),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"LogStatusNotification",
|
||||
call.LogStatusNotification(UploadLogStatus.upload_failure, 1),
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"LogStatusNotification",
|
||||
call.LogStatusNotification(UploadLogStatus.uploading, 1),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"LogStatusNotification",
|
||||
call.LogStatusNotification(UploadLogStatus.upload_failure, 1),
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_firwmare_update_retries(
|
||||
charge_point_v16: ChargePoint16, test_utility: TestUtility
|
||||
):
|
||||
# not supported when implemented security extensions
|
||||
logging.info("######### test_firwmare_update_retries #########")
|
||||
|
||||
await asyncio.sleep(1)
|
||||
|
||||
retrieve_date = datetime.now(timezone.utc)
|
||||
location = f"ftp://{getpass.getuser()}:12345@localhost:2121/firmware_update.pnx"
|
||||
retries = 2
|
||||
retry_interval = 2
|
||||
|
||||
await charge_point_v16.update_firmware_req(
|
||||
location=location,
|
||||
retrieve_date=retrieve_date.isoformat(),
|
||||
retries=retries,
|
||||
retry_interval=retry_interval,
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"FirmwareStatusNotification",
|
||||
call.DiagnosticsStatusNotification(FirmwareStatus.downloading),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"FirmwareStatusNotification",
|
||||
call.DiagnosticsStatusNotification(FirmwareStatus.download_failed),
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"FirmwareStatusNotification",
|
||||
call.DiagnosticsStatusNotification(FirmwareStatus.downloading),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"FirmwareStatusNotification",
|
||||
call.DiagnosticsStatusNotification(FirmwareStatus.download_failed),
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"FirmwareStatusNotification",
|
||||
call.DiagnosticsStatusNotification(FirmwareStatus.downloading),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"FirmwareStatusNotification",
|
||||
call.DiagnosticsStatusNotification(FirmwareStatus.download_failed),
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_signed_update_firmware_retries(
|
||||
test_config: OcppTestConfiguration,
|
||||
charge_point_v16: ChargePoint16,
|
||||
test_utility: TestUtility,
|
||||
):
|
||||
logging.info("######### test_signed_update_firmware_retries #########")
|
||||
|
||||
await asyncio.sleep(1)
|
||||
|
||||
await charge_point_v16.change_configuration_req(key="HeartbeatInterval", value="20")
|
||||
|
||||
certificate = open(test_config.certificate_info.mf_root_ca).read()
|
||||
|
||||
await charge_point_v16.install_certificate_req(
|
||||
certificate_type=CertificateUse.manufacturer_root_certificate,
|
||||
certificate=certificate,
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"InstallCertificate",
|
||||
call_result.InstallCertificate(CertificateStatus.accepted),
|
||||
)
|
||||
|
||||
location = f"ftp://{getpass.getuser()}:12345@localhost:2121/firmware_update.pnx"
|
||||
retries = 2
|
||||
retry_interval = 2
|
||||
retrieve_date_time = datetime.now(timezone.utc)
|
||||
mf_root_ca = open(test_config.certificate_info.mf_root_ca).read()
|
||||
fw_signature = open(test_config.firmware_info.update_file_signature).read()
|
||||
|
||||
firmware = {
|
||||
"location": location,
|
||||
"retrieveDateTime": retrieve_date_time.isoformat(),
|
||||
"signingCertificate": mf_root_ca,
|
||||
"signature": fw_signature,
|
||||
}
|
||||
|
||||
await charge_point_v16.signed_update_firmware_req(
|
||||
request_id=1, retries=retries, retry_interval=retry_interval, firmware=firmware
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"SignedUpdateFirmware",
|
||||
call_result.SignedUpdateFirmware(UpdateFirmwareStatus.accepted),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"SignedFirmwareStatusNotification",
|
||||
call.SignedFirmwareStatusNotification(FirmwareStatus.downloading, 1),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"SignedFirmwareStatusNotification",
|
||||
call.SignedFirmwareStatusNotification(
|
||||
FirmwareStatus.download_failed, 1),
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"SignedFirmwareStatusNotification",
|
||||
call.SignedFirmwareStatusNotification(FirmwareStatus.downloading, 1),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"SignedFirmwareStatusNotification",
|
||||
call.SignedFirmwareStatusNotification(
|
||||
FirmwareStatus.download_failed, 1),
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"SignedFirmwareStatusNotification",
|
||||
call.SignedFirmwareStatusNotification(FirmwareStatus.downloading, 1),
|
||||
)
|
||||
|
||||
assert await wait_for_and_validate(
|
||||
test_utility,
|
||||
charge_point_v16,
|
||||
"SignedFirmwareStatusNotification",
|
||||
call.SignedFirmwareStatusNotification(
|
||||
FirmwareStatus.download_failed, 1),
|
||||
)
|
||||
|
||||
# no SignedFirmwareStatusNotification.req should be sent anymore
|
||||
test_utility.forbidden_actions.append("SignedFirmwareStatusNotification")
|
||||
test_utility.messages.clear()
|
||||
assert await wait_for_and_validate(
|
||||
test_utility, charge_point_v16, "Heartbeat", call.Heartbeat()
|
||||
)
|
||||
@@ -0,0 +1,147 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# Copyright Pionix GmbH and Contributors to EVerest
|
||||
|
||||
from unittest.mock import call as mock_call, ANY
|
||||
import pytest
|
||||
from everest.testing.core_utils.common import Requirement
|
||||
from everest.testing.core_utils.controller.test_controller_interface import (
|
||||
TestController,
|
||||
)
|
||||
from everest.testing.core_utils.probe_module import ProbeModule
|
||||
|
||||
from ocpp.routing import create_route_map
|
||||
|
||||
from ocpp.v16 import call
|
||||
from ocpp.v16.enums import *
|
||||
|
||||
# fmt: off
|
||||
from validations import (validate_standard_start_transaction)
|
||||
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.central_system import CentralSystem
|
||||
from everest.testing.ocpp_utils.charge_point_v16 import ChargePoint16
|
||||
from everest_test_utils import *
|
||||
# fmt: on
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_call_error_to_transaction_message(
|
||||
test_config: OcppTestConfiguration,
|
||||
charge_point_v16: ChargePoint16,
|
||||
test_utility: TestUtility,
|
||||
test_controller: TestController,
|
||||
):
|
||||
|
||||
setattr(charge_point_v16, "on_start_transaction", None)
|
||||
charge_point_v16.route_map = create_route_map(charge_point_v16)
|
||||
|
||||
await charge_point_v16.change_configuration_req(
|
||||
key="TransactionMessageAttempts", value="3"
|
||||
)
|
||||
|
||||
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),
|
||||
)
|
||||
|
||||
# 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 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 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,
|
||||
)
|
||||
|
||||
test_utility.messages.clear()
|
||||
test_utility.forbidden_actions.append("StartTransaction")
|
||||
|
||||
test_controller.plug_out()
|
||||
|
||||
# expect StopTransaction.req
|
||||
assert await wait_for_and_validate(
|
||||
test_utility, charge_point_v16, "StopTransaction", {
|
||||
"reason": "EVDisconnected"}
|
||||
)
|
||||
|
||||
|
||||
async def wait_for_mock_called(mock, call=None, timeout=2):
|
||||
async def _await_called():
|
||||
while not mock.call_count or (call and call not in mock.mock_calls):
|
||||
await asyncio.sleep(0.1)
|
||||
|
||||
await asyncio.wait_for(_await_called(), timeout=timeout)
|
||||
|
||||
|
||||
@pytest.mark.ocpp_version("ocpp1.6")
|
||||
@pytest.mark.everest_core_config("everest-config-sil-ocpp.yaml")
|
||||
@pytest.mark.inject_csms_mock
|
||||
@pytest.mark.probe_module(connections={"ocpp": [Requirement("ocpp", "main")]})
|
||||
@pytest.mark.asyncio
|
||||
async def test_security_event_delivery_after_reconnect(
|
||||
everest_core, test_controller, central_system: CentralSystem
|
||||
):
|
||||
"""Tests A04.FR.02 of OCPP 1.6 Security White Paper"""
|
||||
|
||||
# Setup: Init Probe module, start EVerest and CSMS
|
||||
test_controller.start()
|
||||
csms_mock = central_system.mock
|
||||
|
||||
probe_module = ProbeModule(everest_core.get_runtime_session())
|
||||
|
||||
probe_module.start()
|
||||
await probe_module.wait_to_be_ready()
|
||||
await central_system.wait_for_chargepoint()
|
||||
|
||||
# Act: disconnect, send security event
|
||||
test_controller.disconnect_websocket()
|
||||
|
||||
csms_mock.on_security_event_notification.reset_mock()
|
||||
# Since on boot we expect a count of security events
|
||||
await probe_module.call_command(
|
||||
"ocpp", "security_event", {
|
||||
"type": "SecurityLogWasCleared", "info": "test_info"}
|
||||
)
|
||||
|
||||
# Verify: CSMS has not received any event (since offline), reconnect and verify event is received
|
||||
await asyncio.sleep(1)
|
||||
csms_mock.on_security_event_notification.assert_not_called()
|
||||
|
||||
test_controller.connect_websocket()
|
||||
|
||||
await wait_for_mock_called(
|
||||
csms_mock.on_security_event_notification,
|
||||
mock_call(tech_info="test_info", timestamp=ANY,
|
||||
type="SecurityLogWasCleared"),
|
||||
10,
|
||||
)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user