From 88a24565b4bcdea0fbbdb60824779fc919d09839 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Wed, 29 Oct 2025 16:12:17 +0100 Subject: [PATCH] Add new engine tests for forced state --- .../engine_test/test_turn_forced_off.yaml | 33 +++++++++++++ .../engine_test/test_turn_forced_on.yaml | 49 +++++++++++++++++++ central_backend/src/energy/engine.rs | 32 +++++++++++- .../src/server/web_api/relays_controller.rs | 26 +--------- 4 files changed, 115 insertions(+), 25 deletions(-) create mode 100644 central_backend/engine_test/test_turn_forced_off.yaml create mode 100644 central_backend/engine_test/test_turn_forced_on.yaml diff --git a/central_backend/engine_test/test_turn_forced_off.yaml b/central_backend/engine_test/test_turn_forced_off.yaml new file mode 100644 index 0000000..e13b2d2 --- /dev/null +++ b/central_backend/engine_test/test_turn_forced_off.yaml @@ -0,0 +1,33 @@ +devices: + - id: dev1 + info: + reference: A + version: 0.0.1 + max_relays: 1 + time_create: 1 + time_update: 1 + name: Dev1 + description: Day1 + validated: true + enabled: true + relays: + - id: dcb3fd91-bf9b-4de3-99e5-92c1c7dd72e9 + name: R1 + enabled: true + priority: 1 + consumption: 100 + minimal_uptime: 10 + minimal_downtime: 10 + depends_on: [] + conflicts_with: [] + + on: false + for: 5000 + forced_state: + type: Off + for_secs: 500 + should_be_on: false + + online: true + +curr_consumption: -10000 \ No newline at end of file diff --git a/central_backend/engine_test/test_turn_forced_on.yaml b/central_backend/engine_test/test_turn_forced_on.yaml new file mode 100644 index 0000000..924e504 --- /dev/null +++ b/central_backend/engine_test/test_turn_forced_on.yaml @@ -0,0 +1,49 @@ +devices: + - id: dev1 + info: + reference: A + version: 0.0.1 + max_relays: 1 + time_create: 1 + time_update: 1 + name: Dev1 + description: Day1 + validated: true + enabled: true + relays: + - id: dcb3fd91-bf9b-4de3-99e5-92c1c7dd72e9 + name: R1 + enabled: true + priority: 1 + consumption: 100 + minimal_uptime: 10 + minimal_downtime: 10 + depends_on: [] + conflicts_with: [] + + on: false + for: 500 + forced_state: + type: On + for_secs: 500 + should_be_on: true + + - id: dcb3fd91-bf9b-4de3-99e5-92c1c7dd72f0 + name: R2 + enabled: true + priority: 1 + consumption: 100 + minimal_uptime: 10 + minimal_downtime: 10 + depends_on: [ ] + conflicts_with: [ ] + + on: false + for: 500 + forced_state: + type: None + should_be_on: false + + online: true + +curr_consumption: 10000 \ No newline at end of file diff --git a/central_backend/src/energy/engine.rs b/central_backend/src/energy/engine.rs index a7f8eb4..c875aa3 100644 --- a/central_backend/src/energy/engine.rs +++ b/central_backend/src/energy/engine.rs @@ -25,6 +25,33 @@ impl DeviceState { } } +#[derive(Default, Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)] +#[serde(tag = "type")] +pub enum SetRelayForcedStateReq { + #[default] + None, + Off { + for_secs: u64, + }, + On { + for_secs: u64, + }, +} + +impl SetRelayForcedStateReq { + pub fn to_forced_state(&self) -> RelayForcedState { + match &self { + SetRelayForcedStateReq::None => RelayForcedState::None, + SetRelayForcedStateReq::Off { for_secs } => RelayForcedState::Off { + until: time_secs() + for_secs, + }, + SetRelayForcedStateReq::On { for_secs } => RelayForcedState::On { + until: time_secs() + for_secs, + }, + } + } +} + #[derive(Default, Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "type")] pub enum RelayForcedState { @@ -440,7 +467,7 @@ impl EnergyEngine { mod test { use crate::devices::device::{Device, DeviceId, DeviceRelayID}; use crate::energy::consumption::EnergyConsumption; - use crate::energy::engine::EnergyEngine; + use crate::energy::engine::{EnergyEngine, SetRelayForcedStateReq}; use crate::utils::time_utils::time_secs; use rust_embed::Embed; @@ -449,6 +476,8 @@ mod test { id: DeviceRelayID, on: bool, r#for: usize, + #[serde(default)] + forced_state: SetRelayForcedStateReq, should_be_on: bool, } @@ -496,6 +525,7 @@ mod test { let s = engine.relay_state(r.id); s.on = r.on; s.since = time_secs() as usize - r.r#for; + s.forced_state = r.forced_state.to_forced_state() } } diff --git a/central_backend/src/server/web_api/relays_controller.rs b/central_backend/src/server/web_api/relays_controller.rs index 7749218..3a72a86 100644 --- a/central_backend/src/server/web_api/relays_controller.rs +++ b/central_backend/src/server/web_api/relays_controller.rs @@ -1,9 +1,8 @@ use crate::devices::device::{DeviceId, DeviceRelay, DeviceRelayID}; use crate::energy::energy_actor; -use crate::energy::engine::RelayForcedState; +use crate::energy::engine::SetRelayForcedStateReq; use crate::server::WebEnergyActor; use crate::server::custom_error::HttpResult; -use crate::utils::time_utils::time_secs; use actix_web::{HttpResponse, web}; /// Get the full list of relays @@ -87,19 +86,6 @@ pub async fn update( Ok(HttpResponse::Accepted().finish()) } -#[derive(Default, Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)] -#[serde(tag = "type")] -pub enum SetRelayForcedStateReq { - #[default] - None, - Off { - for_secs: u64, - }, - On { - for_secs: u64, - }, -} - /// Set relay forced status pub async fn set_forced_state( actor: WebEnergyActor, @@ -116,15 +102,7 @@ pub async fn set_forced_state( actor .send(energy_actor::SetRelayForcedState( path.id, - match &req.0 { - SetRelayForcedStateReq::None => RelayForcedState::None, - SetRelayForcedStateReq::Off { for_secs } => RelayForcedState::Off { - until: time_secs() + for_secs, - }, - SetRelayForcedStateReq::On { for_secs } => RelayForcedState::On { - until: time_secs() + for_secs, - }, - }, + req.to_forced_state(), )) .await??;