Start to implement energy consumption backend

This commit is contained in:
Pierre HUBERT 2024-06-29 10:11:31 +02:00
parent 9d3e2beb81
commit 49a3e3a669
8 changed files with 66 additions and 2 deletions

View File

@ -455,6 +455,7 @@ dependencies = [
"log", "log",
"openssl", "openssl",
"openssl-sys", "openssl-sys",
"rand",
"reqwest", "reqwest",
"serde", "serde",
"serde_json", "serde_json",

View File

@ -20,3 +20,4 @@ futures = "0.3.30"
serde = { version = "1.0.203", features = ["derive"] } serde = { version = "1.0.203", features = ["derive"] }
reqwest = "0.12.5" reqwest = "0.12.5"
serde_json = "1.0.118" serde_json = "1.0.118"
rand = "0.8.5"

View File

@ -1,6 +1,24 @@
use clap::Parser; use clap::{Parser, Subcommand};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
/// Electrical consumption fetcher backend
#[derive(Subcommand, Debug, Clone)]
pub enum ConsumptionBackend {
/// Constant consumption value
Constant {
#[clap(long, default_value_t = 500)]
value: i32,
},
/// Generate random consumption value
Random {
#[clap(long, default_value_t = -5000)]
min: i32,
#[clap(long, default_value_t = 20000)]
max: i32,
},
}
/// Solar system central backend /// Solar system central backend
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
#[command(version, about, long_about = None)] #[command(version, about, long_about = None)]
@ -20,6 +38,10 @@ pub struct AppConfig {
/// Server storage path /// Server storage path
#[arg(short, long, env, default_value = "storage")] #[arg(short, long, env, default_value = "storage")]
storage: String, storage: String,
/// Consumption backend provider
#[clap(subcommand)]
pub consumption_backend: Option<ConsumptionBackend>,
} }
lazy_static::lazy_static! { lazy_static::lazy_static! {

View File

@ -0,0 +1,18 @@
use crate::app_config::{AppConfig, ConsumptionBackend};
use rand::{thread_rng, Rng};
pub type EnergyConsumption = i32;
/// Get current electrical energy consumption
pub async fn get_curr_consumption() -> anyhow::Result<EnergyConsumption> {
let backend = AppConfig::get()
.consumption_backend
.as_ref()
.unwrap_or(&ConsumptionBackend::Constant { value: 300 });
match backend {
ConsumptionBackend::Constant { value } => Ok(*value),
ConsumptionBackend::Random { min, max } => Ok(thread_rng().gen_range(*min..*max)),
}
}

View File

@ -0,0 +1 @@
pub mod consumption;

View File

@ -1,4 +1,5 @@
pub mod app_config; pub mod app_config;
pub mod crypto; pub mod crypto;
pub mod energy;
pub mod server; pub mod server;
pub mod utils; pub mod utils;

View File

@ -0,0 +1,15 @@
use crate::energy::consumption;
use crate::server::custom_error::HttpResult;
use actix_web::HttpResponse;
#[derive(serde::Serialize)]
struct CurrConsumption {
consumption: i32,
}
/// Get current energy consumption
pub async fn curr_consumption() -> HttpResult {
let consumption = consumption::get_curr_consumption().await?;
Ok(HttpResponse::Ok().json(CurrConsumption { consumption }))
}

View File

@ -6,6 +6,7 @@ use crate::app_config::AppConfig;
use crate::crypto::pki; use crate::crypto::pki;
pub mod custom_error; pub mod custom_error;
pub mod energy_controller;
pub mod pki_controller; pub mod pki_controller;
pub mod server_controller; pub mod server_controller;
@ -48,6 +49,10 @@ pub async fn secure_server() -> anyhow::Result<()> {
App::new() App::new()
.wrap(Logger::default()) .wrap(Logger::default())
.route("/", web::get().to(server_controller::secure_home)) .route("/", web::get().to(server_controller::secure_home))
.route(
"/api/energy/curr_consumption",
web::get().to(energy_controller::curr_consumption),
)
}) })
.bind_openssl(&AppConfig::get().listen_address, builder)? .bind_openssl(&AppConfig::get().listen_address, builder)?
.run() .run()