Files
cariflex/tools/EVerest-main/modules/EnergyManagement/EnergyManager/Broker.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

110 lines
3.5 KiB
C++

// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#ifndef BROKER_HPP
#define BROKER_HPP
#include "Market.hpp"
#include "Offer.hpp"
namespace module {
enum class SlotType {
Import,
Export,
Undecided
};
// All context data that is stored in between optimization runs
struct BrokerContext {
BrokerContext() {
clear();
};
void clear() {
number_1ph3ph_cycles = 0;
last_ac_number_of_active_phases_import = 0;
ts_1ph_optimal = date::utc_clock::now();
};
int number_1ph3ph_cycles;
int last_ac_number_of_active_phases_import;
std::chrono::time_point<date::utc_clock> ts_1ph_optimal;
};
// base class for different Brokers
class Broker {
public:
// Enums and config for 3ph switching
// Check manifest.yaml of this module for description
enum class Switch1ph3phMode {
Never,
Oneway,
Both,
};
enum class StickyNess {
SinglePhase,
ThreePhase,
DontChange,
};
struct EnergyManagerConfig {
Switch1ph3phMode switch_1ph_3ph_mode{Switch1ph3phMode::Never};
StickyNess stickyness{StickyNess::DontChange};
int max_nr_of_switches_per_session{0};
int power_hysteresis_W{200};
int time_hysteresis_s{600};
};
Broker(Market& market, BrokerContext& context, EnergyManagerConfig config);
virtual ~Broker(){};
// Asks this broker to trade based on the given offer.
// The broker will decide how much / if it wants to trade and
// execute the trade directly on its local market (which was passed in the constructor)
// This function is called from the optimization loop whenever a new offer is available for this
// broker.
bool trade(Offer& offer);
// Actual implementation of the trading algorithm. This function must be overriden by the
// specific implementation class. It will be called from the trade() function of the base class.
virtual void tradeImpl() = 0;
Market& get_local_market();
protected:
void buy_ampere_unchecked(int index, types::energy::NumberWithSource ampere,
types::energy::IntegerWithSource number_of_phases);
void buy_watt_unchecked(int index, types::energy::NumberWithSource watt);
bool buy_ampere_import(int index, float ampere, bool allow_less, types::energy::IntegerWithSource number_of_phases);
bool buy_ampere_export(int index, float ampere, bool allow_less, types::energy::IntegerWithSource number_of_phases);
bool buy_ampere(const types::energy::ScheduleReqEntry& _offer, int index, float ampere, bool allow_less,
bool import, types::energy::IntegerWithSource number_of_phases);
bool buy_watt_import(int index, float watt, bool allow_less);
bool buy_watt_export(int index, float watt, bool allow_less);
bool buy_watt(const types::energy::ScheduleReqEntry& _offer, int index, float watt, bool allow_less, bool import);
date::utc_clock::time_point to_timestamp(const types::energy::ScheduleReqEntry& entry);
bool time_slot_active(const int i, const ScheduleReq& offer);
// reference to local market at the broker's node
Market& local_market;
std::vector<bool> first_trade;
std::vector<SlotType> slot_type;
std::vector<types::energy::IntegerWithSource> num_phases;
Offer* offer{nullptr};
BrokerContext& context;
ScheduleRes trading;
bool traded{false};
EnergyManagerConfig config;
};
} // namespace module
#endif // BROKER_HPP