diff --git a/central_backend/src/server/servers.rs b/central_backend/src/server/servers.rs index ca990f6..f083465 100644 --- a/central_backend/src/server/servers.rs +++ b/central_backend/src/server/servers.rs @@ -48,6 +48,10 @@ pub async fn unsecure_server(energy_actor: EnergyActorAddr) -> anyhow::Result<() "/relay/{id}/legacy_state", web::get().to(unsecure_relay_controller::legacy_state), ) + .route( + "/relay/relays_full_state", + web::get().to(unsecure_relay_controller::relays_full_state), + ) }) .bind(&AppConfig::get().unsecure_listen_address)? .run() diff --git a/central_backend/src/server/unsecure_server/unsecure_relay_controller.rs b/central_backend/src/server/unsecure_server/unsecure_relay_controller.rs index 8e1a6d1..32b321f 100644 --- a/central_backend/src/server/unsecure_server/unsecure_relay_controller.rs +++ b/central_backend/src/server/unsecure_server/unsecure_relay_controller.rs @@ -1,5 +1,6 @@ use crate::devices::device::DeviceRelayID; -use crate::energy::{energy_actor, relay_state_history}; +use crate::energy::engine::RelayForcedState; +use crate::energy::{consumption, energy_actor, relay_state_history}; use crate::server::WebEnergyActor; use crate::server::custom_error::HttpResult; use actix_web::{HttpResponse, web}; @@ -58,3 +59,66 @@ pub async fn legacy_state( required_uptime: relay.daily_runtime.map(|r| r.min_runtime).unwrap_or(0), })) } + +#[derive(serde::Serialize)] +pub struct FullRelayState { + /// Indicates if the relay (or its parent device) is enabled or not + enabled: bool, + /// Indicates if relay is on or off + is_on: bool, + /// Relay name + name: String, + /// Relay priority (0 = lowest) + priority: usize, + /// Duration since last change of state + r#for: usize, + /// Total uptime since last reset + total_uptime: usize, + /// Required uptime during a day (in seconds) + daily_requirement: Option, + /// Forced relay state + relay_forced_state: RelayForcedState, +} + +#[derive(serde::Serialize)] +pub struct RelaysFullState { + /// Current global consumption, if successful + curr_consumption: Option, + /// Cached consumption + cached_consumption: i32, + /// Total relays consumptions + relays_consumption: usize, + /// Individual relays state + relays: Vec, +} + +pub async fn relays_full_state(energy_actor: WebEnergyActor) -> HttpResult { + let cached_consumption = energy_actor.send(energy_actor::GetCurrConsumption).await?; + let relays_consumption = energy_actor.send(energy_actor::RelaysConsumption).await?; + let curr_consumption = consumption::get_curr_consumption().await.ok(); + let mut relays = energy_actor.send(energy_actor::GetRelaysList).await?; + relays.sort_by_key(|r| -(r.priority as i64)); + let relays_state = energy_actor.send(energy_actor::GetAllRelaysState).await?; + + Ok(HttpResponse::Ok().json(RelaysFullState { + curr_consumption, + cached_consumption, + relays_consumption, + relays: relays + .into_iter() + .map(|r| { + let state = relays_state.iter().find(|s| s.id == r.id); + FullRelayState { + enabled: r.enabled, + is_on: state.map(|s| s.on).unwrap_or(false), + name: r.name, + priority: r.priority, + r#for: state.map(|s| s.r#for).unwrap_or(0), + total_uptime: 0, + daily_requirement: r.daily_runtime.map(|r| r.min_runtime), + relay_forced_state: state.map(|s| s.forced_state.clone()).unwrap_or_default(), + } + }) + .collect(), + })) +}