Skip to content

Commit 25f6d43

Browse files
Log telemetry (#186)
Signed-off-by: Cornelius Claussen <cc@pionix.de> Signed-off-by: Kai-Uwe Hermann <kai-uwe.hermann@pionix.de> Signed-off-by: pietfried <piet.goempel@pionix.de> Co-authored-by: Cornelius Claussen <cc@pionix.de>
1 parent 690012a commit 25f6d43

32 files changed

+501
-431
lines changed

cmake/ev-project-bootstrap.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/config-run-script.cmake)
55
include(${CMAKE_CURRENT_LIST_DIR}/config-run-nodered-script.cmake)
66

77
# dependencies
8-
require_ev_cli_version("0.0.17")
8+
require_ev_cli_version("0.0.18")
99

1010
# source generate scripts / setup
1111
include(${CMAKE_CURRENT_LIST_DIR}/everest-generate.cmake)

config/config-sil-dc.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ active_modules:
2020
evse_id_din: 49A80737A45678
2121
session_logging: true
2222
session_logging_xml: false
23-
session_logging_path: /tmp
23+
session_logging_path: /tmp/everest-logs
2424
charge_mode: DC
2525
connections:
2626
bsp:

config/config-sil-four-evse.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ active_modules:
2121
evse_id: DE*PNX*E12345*1
2222
session_logging: true
2323
session_logging_xml: false
24-
session_logging_path: /tmp
24+
session_logging_path: /tmp/everest-logs
2525
ac_hlc_enabled: false
2626
ac_hlc_use_5percent: false
2727
ac_enforce_hlc: false

config/config-sil-ocpp.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ active_modules:
2323
evse_id: "1"
2424
session_logging: true
2525
session_logging_xml: false
26-
session_logging_path: /tmp
26+
session_logging_path: /tmp/everest-logs
2727
ac_hlc_enabled: false
2828
ac_hlc_use_5percent: false
2929
ac_enforce_hlc: false

config/config-sil-two-evse-dc.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ active_modules:
2323
evse_id_din: 49A80737A45678
2424
session_logging: true
2525
session_logging_xml: false
26-
session_logging_path: /tmp
26+
session_logging_path: /tmp/everest-logs
2727
charge_mode: DC
2828
connections:
2929
bsp:

config/config-sil-two-evse.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ active_modules:
2121
evse_id: DE*PNX*E12345*1
2222
session_logging: true
2323
session_logging_xml: false
24-
session_logging_path: /tmp
24+
session_logging_path: /tmp/everest-logs
2525
ac_hlc_enabled: true
2626
ac_hlc_use_5percent: false
2727
ac_enforce_hlc: false

config/config-sil.yaml

+20-14
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
settings:
2+
telemetry_enabled: true
13
active_modules:
24
api:
35
connections:
46
evse_manager:
57
- implementation_id: evse
6-
module_id: evse_manager
8+
module_id: connector_1
79
module: API
810
auth:
911
config_module:
@@ -13,7 +15,7 @@ active_modules:
1315
connections:
1416
evse_manager:
1517
- implementation_id: evse
16-
module_id: evse_manager
18+
module_id: connector_1
1719
token_provider:
1820
- implementation_id: main
1921
module_id: token_provider
@@ -33,7 +35,7 @@ active_modules:
3335
module_id: iso15118_car
3436
simulation_control:
3537
- implementation_id: yeti_simulation_control
36-
module_id: yeti_driver
38+
module_id: connector_1_powerpath
3739
slac:
3840
- implementation_id: ev
3941
module_id: slac
@@ -44,7 +46,7 @@ active_modules:
4446
- implementation_id: energy_grid
4547
module_id: grid_connection_point
4648
module: EnergyManager
47-
evse_manager:
49+
connector_1:
4850
config_module:
4951
ac_enforce_hlc: false
5052
ac_hlc_enabled: true
@@ -61,31 +63,33 @@ active_modules:
6163
payment_enable_eim: true
6264
rcd_enabled: true
6365
session_logging: true
64-
session_logging_path: /tmp
66+
session_logging_path: /tmp/everest-logs
6567
session_logging_xml: false
6668
three_phases: true
6769
connections:
6870
bsp:
6971
- implementation_id: board_support
70-
module_id: yeti_driver
72+
module_id: connector_1_powerpath
7173
hlc:
7274
- implementation_id: charger
7375
module_id: iso15118_charger
7476
powermeter_grid_side:
7577
- implementation_id: powermeter
76-
module_id: yeti_driver
78+
module_id: connector_1_powerpath
7779
slac:
7880
- implementation_id: evse
7981
module_id: slac
8082
module: EvseManager
83+
telemetry:
84+
id: 1
8185
grid_connection_point:
8286
config_module:
8387
fuse_limit_A: 40
8488
phase_count: 3
8589
connections:
8690
energy_consumer:
8791
- implementation_id: energy_grid
88-
module_id: evse_manager
92+
module_id: connector_1
8993
module: EnergyNode
9094
iso15118_car:
9195
config_implementation:
@@ -135,7 +139,7 @@ active_modules:
135139
connections:
136140
evse:
137141
- implementation_id: evse
138-
module_id: evse_manager
142+
module_id: connector_1
139143
module: JsDummyTokenProvider
140144
token_validator:
141145
config_implementation:
@@ -145,9 +149,11 @@ active_modules:
145149
validation_result: Accepted
146150
connections: {}
147151
module: JsDummyTokenValidator
148-
yeti_driver:
152+
connector_1_powerpath:
149153
connections: {}
150154
module: JsYetiSimulator
155+
telemetry:
156+
id: 1
151157
x-module-layout:
152158
api:
153159
position:
@@ -160,7 +166,7 @@ x-module-layout:
160166
- id: main
161167
interface: empty
162168
type: provide
163-
- id: evse_manager
169+
- id: connector_1
164170
interface: evse_manager
165171
type: requirement
166172
top: []
@@ -170,7 +176,7 @@ x-module-layout:
170176
y: -6
171177
terminals:
172178
bottom:
173-
- id: evse_manager
179+
- id: connector_1
174180
interface: evse_manager
175181
type: requirement
176182
left: []
@@ -224,7 +230,7 @@ x-module-layout:
224230
interface: energy
225231
type: requirement
226232
top: []
227-
evse_manager:
233+
connector_1:
228234
position:
229235
x: 17
230236
y: 13
@@ -377,7 +383,7 @@ x-module-layout:
377383
type: provide
378384
right: []
379385
top: []
380-
yeti_driver:
386+
connector_1_powerpath:
381387
position:
382388
x: 15
383389
y: 26

dependencies.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
everest-framework:
33
git: https://github.com/EVerest/everest-framework.git
4-
git_tag: v0.3.0
4+
git_tag: v0.4.0
55
sigslot:
66
git: https://github.com/palacaze/sigslot
77
git_tag: v1.2.0
@@ -38,7 +38,7 @@ RISE-V2G:
3838
# OCPP
3939
libocpp:
4040
git: https://github.com/EVerest/libocpp.git
41-
git_tag: v0.5.0
41+
git_tag: 904343c96f945710586b45975beb5b6dfed811d6
4242
# Josev
4343
Josev:
4444
git: https://github.com/EVerest/ext-switchev-iso15118.git

modules/EvseManager/EvseManager.cpp

+106-2
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ void EvseManager::ready() {
375375
hlc_waiting_for_auth_pnc = false;
376376
}
377377
r_hlc[0]->call_set_Auth_Okay_PnC(types::authorization::AuthorizationStatus::Accepted,
378-
types::authorization::CertificateStatus::Accepted);
378+
types::authorization::CertificateStatus::Accepted);
379379
} else {
380380
std::scoped_lock lock(hlc_mutex);
381381
hlc_waiting_for_auth_eim = false;
@@ -614,6 +614,110 @@ void EvseManager::ready() {
614614
charger->setMaxCurrent(0.0F, date::utc_clock::now());
615615
charger->run();
616616
charger->enable();
617+
618+
telemetryThreadHandle = std::thread([this]() {
619+
while (!telemetryThreadHandle.shouldExit()) {
620+
sleep(10);
621+
auto p = get_latest_powermeter_data_billing();
622+
Everest::TelemetryMap telemetry_data{{"timestamp", p.timestamp},
623+
{"type", "power_meter"},
624+
{"meter_id", p.meter_id.get_value_or("N/A")},
625+
{"energy_import_total_Wh", p.energy_Wh_import.total}};
626+
627+
if (p.energy_Wh_import.L1.is_initialized()) {
628+
telemetry_data["energy_import_L1_Wh"] = p.energy_Wh_import.L1.get();
629+
}
630+
if (p.energy_Wh_import.L2.is_initialized()) {
631+
telemetry_data["energy_import_L2_Wh"] = p.energy_Wh_import.L2.get();
632+
}
633+
if (p.energy_Wh_import.L3.is_initialized()) {
634+
telemetry_data["energy_import_L3_Wh"] = p.energy_Wh_import.L3.get();
635+
}
636+
637+
if (p.energy_Wh_export.is_initialized()) {
638+
telemetry_data["energy_export_total_Wh"] = p.energy_Wh_export.get().total;
639+
}
640+
if (p.energy_Wh_export.is_initialized() && p.energy_Wh_export.get().L1.is_initialized()) {
641+
telemetry_data["energy_export_L1_Wh"] = p.energy_Wh_export.get().L1.get();
642+
}
643+
if (p.energy_Wh_export.is_initialized() && p.energy_Wh_export.get().L2.is_initialized()) {
644+
telemetry_data["energy_export_L2_Wh"] = p.energy_Wh_export.get().L2.get();
645+
}
646+
if (p.energy_Wh_export.is_initialized() && p.energy_Wh_export.get().L3.is_initialized()) {
647+
telemetry_data["energy_export_L3_Wh"] = p.energy_Wh_export.get().L3.get();
648+
}
649+
650+
if (p.power_W.is_initialized()) {
651+
telemetry_data["power_total_W"] = p.power_W.get().total;
652+
}
653+
if (p.power_W.is_initialized() && p.power_W.get().L1.is_initialized()) {
654+
telemetry_data["power_L1_W"] = p.power_W.get().L1.get();
655+
}
656+
if (p.power_W.is_initialized() && p.power_W.get().L2.is_initialized()) {
657+
telemetry_data["power_L3_W"] = p.power_W.get().L2.get();
658+
}
659+
if (p.power_W.is_initialized() && p.power_W.get().L3.is_initialized()) {
660+
telemetry_data["power_L3_W"] = p.power_W.get().L3.get();
661+
}
662+
663+
if (p.VAR.is_initialized()) {
664+
telemetry_data["var_total"] = p.VAR.get().total;
665+
}
666+
if (p.VAR.is_initialized() && p.VAR.get().L1.is_initialized()) {
667+
telemetry_data["var_L1"] = p.VAR.get().L1.get();
668+
}
669+
if (p.VAR.is_initialized() && p.VAR.get().L2.is_initialized()) {
670+
telemetry_data["var_L1"] = p.VAR.get().L2.get();
671+
}
672+
if (p.VAR.is_initialized() && p.VAR.get().L3.is_initialized()) {
673+
telemetry_data["var_L1"] = p.VAR.get().L3.get();
674+
}
675+
676+
if (p.voltage_V.is_initialized() && p.voltage_V.get().L1.is_initialized()) {
677+
telemetry_data["voltage_L1_V"] = p.voltage_V.get().L1.get();
678+
}
679+
if (p.voltage_V.is_initialized() && p.voltage_V.get().L2.is_initialized()) {
680+
telemetry_data["voltage_L2_V"] = p.voltage_V.get().L2.get();
681+
}
682+
if (p.voltage_V.is_initialized() && p.voltage_V.get().L3.is_initialized()) {
683+
telemetry_data["voltage_L3_V"] = p.voltage_V.get().L3.get();
684+
}
685+
if (p.voltage_V.is_initialized() && p.voltage_V.get().DC.is_initialized()) {
686+
telemetry_data["voltage_DC_V"] = p.voltage_V.get().DC.get();
687+
}
688+
689+
if (p.current_A.is_initialized() && p.current_A.get().L1.is_initialized()) {
690+
telemetry_data["current_L1_A"] = p.current_A.get().L1.get();
691+
}
692+
if (p.current_A.is_initialized() && p.current_A.get().L2.is_initialized()) {
693+
telemetry_data["current_L2_A"] = p.current_A.get().L2.get();
694+
}
695+
if (p.current_A.is_initialized() && p.current_A.get().L3.is_initialized()) {
696+
telemetry_data["current_L3_A"] = p.current_A.get().L3.get();
697+
}
698+
if (p.current_A.is_initialized() && p.current_A.get().DC.is_initialized()) {
699+
telemetry_data["current_DC_A"] = p.current_A.get().DC.get();
700+
}
701+
702+
if (p.frequency_Hz.is_initialized()) {
703+
telemetry_data["frequency_L1_Hz"] = p.frequency_Hz.get().L1;
704+
}
705+
if (p.frequency_Hz.is_initialized() && p.frequency_Hz.get().L2.is_initialized()) {
706+
telemetry_data["frequency_L2_Hz"] = p.frequency_Hz.get().L2.get();
707+
}
708+
if (p.frequency_Hz.is_initialized() && p.frequency_Hz.get().L3.is_initialized()) {
709+
telemetry_data["frequency_L3_Hz"] = p.frequency_Hz.get().L3.get();
710+
}
711+
712+
if (p.phase_seq_error.is_initialized()) {
713+
telemetry_data["phase_seq_error"] = p.phase_seq_error.get();
714+
}
715+
716+
// Publish as external telemetry data
717+
telemetry.publish("livedata", "power_meter", telemetry_data);
718+
}
719+
});
720+
617721
EVLOG_info << fmt::format(fmt::emphasis::bold | fg(fmt::terminal_color::green), "🌀🌀🌀 Ready to start charging 🌀🌀🌀");
618722
}
619723

@@ -791,7 +895,7 @@ void EvseManager::charger_was_authorized() {
791895
std::scoped_lock lock(hlc_mutex);
792896
if (hlc_waiting_for_auth_pnc && charger->Authorized_PnC()) {
793897
r_hlc[0]->call_set_Auth_Okay_PnC(types::authorization::AuthorizationStatus::Accepted,
794-
types::authorization::CertificateStatus::Accepted);
898+
types::authorization::CertificateStatus::Accepted);
795899
hlc_waiting_for_auth_eim = false;
796900
hlc_waiting_for_auth_pnc = false;
797901
}

modules/EvseManager/EvseManager.hpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
//
77
// AUTO GENERATED - MARKED REGIONS WILL BE KEPT
8-
// template version 1
8+
// template version 2
99
//
1010

1111
#include "ld-ev.hpp"
@@ -75,7 +75,7 @@ struct Conf {
7575
class EvseManager : public Everest::ModuleBase {
7676
public:
7777
EvseManager() = delete;
78-
EvseManager(const ModuleInfo& info, Everest::MqttProvider& mqtt_provider,
78+
EvseManager(const ModuleInfo& info, Everest::MqttProvider& mqtt_provider, Everest::TelemetryProvider& telemetry,
7979
std::unique_ptr<evse_managerImplBase> p_evse, std::unique_ptr<energyImplBase> p_energy_grid,
8080
std::unique_ptr<auth_token_providerImplBase> p_token_provider,
8181
std::unique_ptr<board_support_ACIntf> r_bsp,
@@ -86,6 +86,7 @@ class EvseManager : public Everest::ModuleBase {
8686
std::vector<std::unique_ptr<power_supply_DCIntf>> r_powersupply_DC, Conf& config) :
8787
ModuleBase(info),
8888
mqtt(mqtt_provider),
89+
telemetry(telemetry),
8990
p_evse(std::move(p_evse)),
9091
p_energy_grid(std::move(p_energy_grid)),
9192
p_token_provider(std::move(p_token_provider)),
@@ -100,6 +101,7 @@ class EvseManager : public Everest::ModuleBase {
100101

101102
const Conf& config;
102103
Everest::MqttProvider& mqtt;
104+
Everest::TelemetryProvider& telemetry;
103105
const std::unique_ptr<evse_managerImplBase> p_evse;
104106
const std::unique_ptr<energyImplBase> p_energy_grid;
105107
const std::unique_ptr<auth_token_providerImplBase> p_token_provider;
@@ -201,6 +203,7 @@ class EvseManager : public Everest::ModuleBase {
201203

202204
void imd_stop();
203205
void imd_start();
206+
Everest::Thread telemetryThreadHandle;
204207
// ev@211cfdbe-f69a-4cd6-a4ec-f8aaa3d1b6c8:v1
205208
};
206209

0 commit comments

Comments
 (0)