Skip to content
Snippets Groups Projects
Commit c74d5d2c authored by Armin Co's avatar Armin Co
Browse files

Turn off model after shutdown.

parent 4eac231e
Branches main
No related tags found
No related merge requests found
/// @file main.cpp
///
#include <i2c/Node.hpp>
#include <SmartGridModell.hpp>
#include <spdlog/spdlog.h>
#include <thread>
#include <cstdlib>
#include <ctime>
#include <Socket.hpp>
#include <Protocol.hpp>
struct CleanPower
{
double solar = 0.0;
double wind = 0.0;
};
struct PowerProduction
{
double conventional;
CleanPower renewable;
double clean(){return renewable.solar + renewable.wind;}
double sum(){return conventional + clean();}
};
struct PowerUsage
{
double village = 0.0;
double industry = 0.0;
double sum() {return village + industry;}
};
/// @brief Peak Power consumption or production in MW
///
struct MaxPower
{
static constexpr double village = 600;
static constexpr double industry = 200;
static constexpr double wind = 250;
static constexpr double solar = 110;
};
constexpr double village_consumption_at[] {
98, 95, 93, 94, 95, 101, 115,
127, 132, 134, 136, 139, 138,
136, 134, 132, 130, 132, 132,
131, 125, 119, 114, 105, 98
};
constexpr double sunnshine_percentage[] {
0, 0, 0, 0, 0, 0, 3,
12, 30, 52, 73, 88, 97,
100, 98, 91, 81, 66, 46,
25, 10, 2, 0, 0, 0
};
constexpr double power_wind[] {
0, 3, 25, 82, 174,
321, 532, 815, 1180,
1612, 1890, 2000, 2100
};
class ModelState
{
public:
ModelState(SmartGridModell &modell)
: m_modell{modell}
{
std::srand(std::time(nullptr));
}
void next_hour()
{
update_time();
update_sun();
update_wind();
update_power_consumption();
update_power_production();
update_modell();
print_states();
}
float excess_power()
{
auto sum_prod = m_production.conventional + m_production.renewable.solar + m_production.renewable.wind;
auto sum_used = m_usage.industry + m_usage.village;
return sum_prod - sum_used;
}
private:
void update_time()
{
if (m_time < 23)
{
++m_time;
}
else
{
m_time = 0;
}
}
void update_sun()
{
m_sun = sunnshine_percentage[m_time];
}
void update_wind()
{
double wind_by_sun = m_sun * 7.0 / 100.0; // wind by sun should by 5 max.
auto random_wind = ((std::rand() * 1.0) / RAND_MAX) * 5.0;
m_wind = power_wind[static_cast<int>(wind_by_sun + random_wind)];
}
void update_power_consumption()
{
m_usage.village = village_consumption_at[m_time] * village_size;
if (m_producing == true)
{
m_usage.industry = MaxPower::industry;
}
else
{
m_usage.industry = 0.0;
}
}
void update_power_production()
{
m_production.renewable.solar = m_sun * solar_size;
m_production.renewable.wind = m_wind * windpark_size;
if (m_usage.sum() > m_production.clean())
{
m_excess_power = 0.0;
m_production.conventional = m_usage.sum() - m_production.clean();
}
else
{
m_excess_power = m_production.clean() - m_usage.sum();
m_production.conventional = 0;
}
}
void update_modell()
{
auto sun = m_sun * 2.5;
auto wind = m_wind / 8.3;
auto renewable = (sun + wind) / 2;
m_modell.set_solar_plant(sun);
m_modell.update_windmill_speed(wind);
m_modell.set_windmill_net(wind);
m_modell.set_renewable_net(renewable);
if (m_production.conventional > 0)
{
m_modell.set_power_plant(200);
m_modell.set_village_color(200, renewable);
}
else
{
m_modell.set_power_plant(0);
m_modell.set_village_color(0, renewable);
}
}
#include "spdlog/spdlog.h"
static constexpr double solar_size {10};
static constexpr double windpark_size {1.0};
static constexpr double village_size {10};
#include "i2c/Node.hpp"
#include "SmartGridModell.hpp"
int m_time {0};
double m_sun {0};
double m_wind {0};
double m_excess_power {0.0};
PowerProduction m_production;
PowerUsage m_usage;
bool m_producing {false};
SmartGridModell &m_modell;
void print_states()
{
spdlog::debug("Time <{}> Sun <{}> Wind<{}>", m_time, m_sun, m_wind);
spdlog::debug("Power Conv <{}> Solar <{}> Wind<{}>", m_production.conventional, m_production.renewable.solar, m_production.renewable.wind);
spdlog::debug("Usage Village<{}> Industry<{}>", m_usage.village, m_usage.industry);
spdlog::debug("excess_power<{}>", excess_power());
}
};
#include "Socket.hpp"
#include "Protocol.hpp"
#include "ModelState.hpp"
void run_sim()
{
i2c::Node i2c_device{0x14};
if (false == i2c_device.open_device("/dev/i2c-1"))
{
exit(1);
......@@ -198,64 +23,32 @@ void run_sim()
spdlog::debug("Node created");
}
SmartGridModell modell{i2c_device, SmartGridModell::DefaultState::Fancy};
spdlog::debug("Modell created");
modell.put_modell_into_state(SmartGridModell::DefaultState::Off);
SmartGridModell modell{i2c_device};
ModelState day{modell};
bool active{true};
while (active)
{
day.next_hour();
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
}
void test_x64()
void log_args(int argc, char **argv)
{
i2c::Node i2c_device {0x14};
bool done = i2c_device.open_device("/dev/i2c-1");
if (done == false)
{
spdlog::debug("You could try running as root");
}
ServerSocket server(8080);
bool finished {false};
SmartGridModell modell{i2c_device, SmartGridModell::DefaultState::Fancy};
ModelState day{modell};
while (!finished)
for (int i = 0; i < argc; ++i)
{
DataSocket accept = server.accept();
ProtocolSimple accept_simple(accept);
std::string message;
accept_simple.recv_message(message);
spdlog::info("RECV: {}", message);
accept_simple.send_message("", "OK");
day.next_hour();
spdlog::debug("[{}] {}", i, argv[i]);
}
}
int main(int argc, char **argv)
{
spdlog::set_level(spdlog::level::debug);
spdlog::info("Starting - Smart Grid Modell");
log_args(argc, argv);
if (argc > 1)
{
test_x64();
}
else
{
run_sim();
}
spdlog::info("End");
return 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment