Files
cariflex/tools/EVerest-main/modules/EnergyManagement/EnergyManager/Market.hpp
Eric F d398a6ced2 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
2026-06-08 00:38:27 -04:00

105 lines
3.5 KiB
C++

// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#ifndef MARKET_HPP
#define MARKET_HPP
// headers for required interface implementations
#include <generated/interfaces/energy/Interface.hpp>
#include <utils/date.hpp>
#include <vector>
using namespace std::chrono_literals;
namespace module {
typedef std::vector<types::energy::ScheduleReqEntry> ScheduleReq;
typedef std::vector<types::energy::ScheduleResEntry> ScheduleRes;
typedef std::vector<types::energy::ScheduleSetpointEntry> ScheduleSetpoints;
class globals_t {
public:
void init(date::utc_clock::time_point _start_time, int _interval_duration, int _schedule_duration,
float _slice_ampere, float _slice_watt, bool _debug,
const types::energy::EnergyFlowRequest& energy_flow_request);
date::utc_clock::time_point start_time; // common start point
std::chrono::minutes interval_duration; // interval duration
int schedule_length; // total forcast length (in counts of (non-regular) intervals)
float slice_ampere; // ampere_slices for trades
float slice_watt; // ampere_slices for trades
bool debug{false};
ScheduleReq zero_schedule_req, empty_schedule_req;
ScheduleRes zero_schedule_res, empty_schedule_res;
ScheduleSetpoints empty_schedule_setpoints;
private:
void create_timestamps(const types::energy::EnergyFlowRequest& energy_flow_request);
void add_timestamps(const types::energy::EnergyFlowRequest& energy_flow_request);
template <typename T> void create_empty_schedule(T& s);
std::vector<date::utc_clock::time_point> timestamps;
};
extern globals_t globals;
class time_probe {
public:
void start();
void pause();
int stop();
private:
std::chrono::high_resolution_clock::time_point timepoint_start;
std::chrono::nanoseconds total_duration{0};
bool running{false};
};
class Market {
public:
Market(const types::energy::EnergyFlowRequest& _energy_flow_request, const float __nominal_ac_voltage,
Market* __parent = nullptr);
void trade(const ScheduleRes& s);
bool is_root();
void get_list_of_evses(std::vector<Market*>& list);
std::vector<Market*> get_list_of_evses();
ScheduleReq get_available_energy_import();
ScheduleReq get_available_energy_export();
ScheduleSetpoints get_setpoints() {
return setpoints;
};
ScheduleRes get_sold_energy();
Market* parent();
float nominal_ac_voltage();
// local request only for this node
const types::energy::EnergyFlowRequest& energy_flow_request;
private:
Market* _parent;
std::list<Market> _children;
float _nominal_ac_voltage;
// main data structures
ScheduleReq import_max_available, export_max_available;
ScheduleSetpoints setpoints;
ScheduleRes sold_root;
std::vector<ScheduleRes> sold_leaves;
ScheduleReq get_max_available_energy(const ScheduleReq& request);
ScheduleReq get_available_energy(const ScheduleReq& available, bool add_sold);
ScheduleSetpoints resample(const ScheduleSetpoints& request);
};
float get_watt_from_freq_table(const std::vector<types::energy::FrequencyWattPoint>& table, float freq);
void apply_limit_if_smaller(std::optional<types::energy::NumberWithSource>& base, float limit,
const std::string& source);
void apply_setpoints(ScheduleReq& imp, ScheduleReq& exp, const ScheduleSetpoints& setpoints, std::optional<float> freq);
} // namespace module
#endif // MARKET_HPP