ocpp 0.24.1
A C++ implementation of the Open Charge Point Protocol
monitoring_updater.hpp
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2020 - 2024 Pionix GmbH and Contributors to EVerest
3
4#pragma once
5
6#include <unordered_map>
7
8#include <everest/timer.hpp>
9
10#include <ocpp/v2/enums.hpp>
11#include <ocpp/v2/ocpp_enums.hpp>
12#include <ocpp/v2/ocpp_types.hpp>
13
14#include <ocpp/v2/device_model_storage_interface.hpp>
15
16namespace ocpp::v2 {
17
18class DeviceModel;
19
20enum UpdateMonitorMetaType {
21 TRIGGER,
22 PERIODIC
23};
24
28 std::uint32_t is_csms_sent_triggered : 1;
29
32 std::uint32_t is_event_generated : 1;
33
36 std::uint32_t is_csms_sent : 1;
37
43 std::uint32_t is_cleared : 1;
44};
45
48 std::chrono::time_point<std::chrono::steady_clock> last_trigger_steady;
49
52 std::chrono::time_point<std::chrono::system_clock> next_trigger_clock_aligned;
53};
54
57 UpdateMonitorMetaType type;
58
59 VariableMonitoringMeta monitor_meta;
60 Component component;
61 Variable variable;
62
64 std::int32_t monitor_id;
65
66 std::string value_previous;
67 std::string value_current;
68
70 std::uint32_t is_writeonly : 1;
71
72 TriggerMetadata meta_trigger;
73 PeriodicMetadata meta_periodic;
74
76 std::vector<EventData> generated_monitor_events;
77
78public:
80 void set_trigger_clear_state(bool is_cleared) {
81 if (type != UpdateMonitorMetaType::TRIGGER) {
82 throw std::runtime_error("Clear state should never be used on a non-trigger meta!");
83 }
84
85 if (meta_trigger.is_cleared != is_cleared) {
86 meta_trigger.is_cleared = is_cleared;
87
88 // On a state change reset the CSMS sent status and
89 // event generation status
90 meta_trigger.is_csms_sent = 0;
91 meta_trigger.is_event_generated = 0;
92 }
93 }
94};
95
96typedef std::function<void(const std::vector<EventData>&)> notify_events;
97typedef std::function<bool()> is_offline;
98
100
101public:
102 MonitoringUpdater() = delete;
103
109 MonitoringUpdater(DeviceModel& device_model, notify_events notify_csms_events, is_offline is_chargepoint_offline);
111
112public:
114 void start_monitoring();
116 void stop_monitoring();
117
123
124private:
132 void on_variable_changed(const std::unordered_map<int64_t, VariableMonitoringMeta>& monitors,
133 const Component& component, const Variable& variable,
134 const VariableCharacteristics& characteristics, const VariableAttribute& attribute,
135 const std::string& value_old, const std::string& value_current);
136
140 void on_monitor_updated(const VariableMonitoringMeta& updated_monitor, const Component& component,
141 const Variable& variable, const VariableCharacteristics& characteristics,
142 const VariableAttribute& attribute, const std::string& current_value);
143
146 void evaluate_monitor(const VariableMonitoringMeta& monitor_meta, const Component& component,
147 const Variable& variable, const VariableCharacteristics& characteristics,
148 const VariableAttribute& attribute, const std::string& value_previous,
149 const std::string& value_current);
150
154 // there are also any pending alert triggered monitors, those will be processed too
155 void process_monitors_internal(bool allow_periodics, bool allow_trigger);
156
160 void process_monitor_meta_internal(UpdaterMonitorMeta& updater_meta_data);
161
165 bool should_remove_monitor_meta_internal(const UpdaterMonitorMeta& updater_meta_data);
166
169 void update_periodic_monitors_internal();
170
171 void get_monitoring_info(bool& out_is_offline, int& out_offline_severity, int& out_active_monitoring_level,
172 MonitoringBaseEnum& out_active_monitoring_base);
173
174 bool is_monitoring_enabled();
175
176private:
177 DeviceModel& device_model;
178 Everest::SteadyTimer monitors_timer;
179
180 // Charger to CSMS message unique ID for EventData
181 std::int32_t unique_id;
182
183 notify_events notify_csms_events;
184 is_offline is_chargepoint_offline;
185
186 std::unordered_map<std::int32_t, UpdaterMonitorMeta> updater_monitors_meta;
187};
188
189} // namespace ocpp::v2
This class manages access to the device model representation and to the device model interface and pr...
Definition: device_model.hpp:96
Definition: monitoring_updater.hpp:99
void process_triggered_monitors()
Processes the variable triggered monitors. Will be called after relevant variable modification operat...
Definition: monitoring_updater.cpp:178
void start_monitoring()
Starts monitoring the variables, kicking the timer.
Definition: monitoring_updater.cpp:148
void stop_monitoring()
Stops monitoring the variables, canceling the timer.
Definition: monitoring_updater.cpp:174
Definition: ocpp_types.hpp:303
Definition: monitoring_updater.hpp:46
std::chrono::time_point< std::chrono::system_clock > next_trigger_clock_aligned
Next time when we require to trigger a clock aligned value. Has meaning only for periodic monitors.
Definition: monitoring_updater.hpp:52
std::chrono::time_point< std::chrono::steady_clock > last_trigger_steady
Last time this monitor was triggered.
Definition: monitoring_updater.hpp:48
Definition: monitoring_updater.hpp:25
std::uint32_t is_csms_sent
If the current state was was sent to the CSMS, resets on each state change.
Definition: monitoring_updater.hpp:36
std::uint32_t is_event_generated
If the event was generated for the current state, resets on each state change.
Definition: monitoring_updater.hpp:32
std::uint32_t is_cleared
The trigger has been cleared, that is it returned to normal after a problem was detected....
Definition: monitoring_updater.hpp:43
std::uint32_t is_csms_sent_triggered
If we had at least one trigger event sent to the CSMS, which in turn results that we will only clear ...
Definition: monitoring_updater.hpp:28
Meta data required for our internal keeping needs.
Definition: monitoring_updater.hpp:56
std::uint32_t is_writeonly
Write-only values will not have the value reported.
Definition: monitoring_updater.hpp:70
void set_trigger_clear_state(bool is_cleared)
Can trigger/clear an event.
Definition: monitoring_updater.hpp:80
std::int32_t monitor_id
database ID for quick instant retrieval if required
Definition: monitoring_updater.hpp:64
std::vector< EventData > generated_monitor_events
Generated monitor events, that are related to this meta.
Definition: monitoring_updater.hpp:76
Definition: ocpp_types.hpp:701
Definition: ocpp_types.hpp:719
Helper struct that holds database only values that don't have spec coverage.
Definition: device_model_storage_interface.hpp:19
Definition: ocpp_types.hpp:319