From 2928f6fc9e87540701cedd60b8a1220385fe97e3 Mon Sep 17 00:00:00 2001 From: Avii Date: Sun, 9 Aug 2026 16:31:02 +0200 Subject: [PATCH] 1786285862 --- dashboard/src/home_assistant.rs | 20 ++++++++++---------- dashboard/src/main.rs | 9 ++++++--- dashboard/src/messages.rs | 4 ++-- dashboard/src/ui.rs | 21 ++++++++++++--------- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/dashboard/src/home_assistant.rs b/dashboard/src/home_assistant.rs index e258a9b..b323aff 100644 --- a/dashboard/src/home_assistant.rs +++ b/dashboard/src/home_assistant.rs @@ -6,12 +6,12 @@ use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender}; use crate::{ error::AppError, - messages::{C2sMessage, S2cMessage}, + messages::{CommandMessage, EventMessage}, }; pub async fn hass( - s2c_tx: UnboundedSender, - mut c2s_rx: UnboundedReceiver, + s2c_tx: UnboundedSender, + mut c2s_rx: UnboundedReceiver, ) -> Result<(), AppError> { let Ok(url) = var("HASS_URL") else { return Err(AppError::MissingUrl); @@ -48,7 +48,7 @@ pub async fn hass( let mut initial_state = state.values().cloned().collect::>(); initial_state.sort_by(|a, b| a.entity_id.cmp(&b.entity_id)); - s2c_tx.send(S2cMessage::InitialState(initial_state)).ok(); + s2c_tx.send(EventMessage::InitialState(initial_state)).ok(); let mut event_receiver = client .subscribe_event("state_changed") @@ -62,17 +62,17 @@ pub async fn hass( (None, Some(entity)) => { // New Entity Added state.insert(entity.entity_id.clone(), entity.clone()); - s2c_tx.send(S2cMessage::EntityUpdated(entity.clone())).ok(); + s2c_tx.send(EventMessage::EntityUpdated(entity.clone())).ok(); } (Some(entity), None) => { // Entity Removed state.remove(&entity.entity_id); - s2c_tx.send(S2cMessage::EntityRemoved(entity.clone())).ok(); + s2c_tx.send(EventMessage::EntityRemoved(entity.clone())).ok(); } (Some(_), Some(entity)) => { // Entity Updated state.insert(entity.entity_id.clone(), entity.clone()); - s2c_tx.send(S2cMessage::EntityUpdated(entity.clone())).ok(); + s2c_tx.send(EventMessage::EntityUpdated(entity.clone())).ok(); } _ => {} } @@ -80,7 +80,7 @@ pub async fn hass( Some(message) = c2s_rx.recv() => { if let Err(err) = match message { - C2sMessage::ToggleLight { entity_id } => { + CommandMessage::ToggleLight { entity_id } => { if let Some(entity) = state.get(&entity_id) { let payload = json!({ "entity_id": entity_id @@ -95,7 +95,7 @@ pub async fn hass( Err(AppError::NoEntity(entity_id)) } } - C2sMessage::ToggleThermostat { entity_id } => { + CommandMessage::ToggleThermostat { entity_id } => { if let Some(entity) = state.get(&entity_id) { let payload = json!({ "entity_id": entity_id @@ -110,7 +110,7 @@ pub async fn hass( Err(AppError::NoEntity(entity_id)) } } - C2sMessage::SetTemperature { + CommandMessage::SetTemperature { entity_id, temperature, } => { diff --git a/dashboard/src/main.rs b/dashboard/src/main.rs index 927d1bc..566c879 100644 --- a/dashboard/src/main.rs +++ b/dashboard/src/main.rs @@ -8,7 +8,10 @@ use tokio::sync::mpsc::unbounded_channel; use slint::ComponentHandle; -use crate::error::AppError; +use crate::{ + error::AppError, + messages::{CommandMessage, EventMessage}, +}; #[tokio::main] async fn main() -> Result<(), AppError> { @@ -19,8 +22,8 @@ async fn main() -> Result<(), AppError> { let app = ui::AppWindow::new()?; - let (c2s_tx, c2s_rx) = unbounded_channel::(); - let (s2c_tx, s2c_rx) = unbounded_channel::(); + let (c2s_tx, c2s_rx) = unbounded_channel::(); + let (s2c_tx, s2c_rx) = unbounded_channel::(); ui::bind_buttons(&app, c2s_tx); diff --git a/dashboard/src/messages.rs b/dashboard/src/messages.rs index 7f73c3e..306ccbc 100644 --- a/dashboard/src/messages.rs +++ b/dashboard/src/messages.rs @@ -1,7 +1,7 @@ use hass_rs::HassEntity; #[derive(Clone)] -pub enum C2sMessage { +pub enum CommandMessage { ToggleLight { entity_id: String }, ToggleThermostat { entity_id: String }, @@ -10,7 +10,7 @@ pub enum C2sMessage { } #[derive(Clone)] -pub enum S2cMessage { +pub enum EventMessage { InitialState(Vec), EntityUpdated(HassEntity), EntityRemoved(HassEntity), diff --git a/dashboard/src/ui.rs b/dashboard/src/ui.rs index 019b532..1850e80 100644 --- a/dashboard/src/ui.rs +++ b/dashboard/src/ui.rs @@ -2,7 +2,7 @@ slint::include_modules!(); use crate::{ ha_ext::*, - messages::{C2sMessage, S2cMessage}, + messages::{CommandMessage, EventMessage}, }; use hass_rs::HassEntity; @@ -109,14 +109,14 @@ pub fn apply_state(app: &Weak, entities: Vec) { } } -pub fn bind_buttons(app: &AppWindow, c2s_tx: UnboundedSender) { +pub fn bind_buttons(app: &AppWindow, c2s_tx: UnboundedSender) { // Button Bindings app.on_toggle_light({ let c2s_tx = c2s_tx.clone(); move |entity_id| { let id = entity_id.to_string(); - if let Err(err) = c2s_tx.send(C2sMessage::ToggleLight { entity_id: id }) { + if let Err(err) = c2s_tx.send(CommandMessage::ToggleLight { entity_id: id }) { eprintln!("Failed to send message to server.\n\t{:?}", err); } } @@ -125,7 +125,7 @@ pub fn bind_buttons(app: &AppWindow, c2s_tx: UnboundedSender) { app.on_set_temperature({ let c2s_tx = c2s_tx.clone(); move |entity_id, value| { - if let Err(err) = c2s_tx.send(C2sMessage::SetTemperature { + if let Err(err) = c2s_tx.send(CommandMessage::SetTemperature { entity_id: entity_id.to_string(), temperature: value, }) { @@ -139,23 +139,26 @@ pub fn bind_buttons(app: &AppWindow, c2s_tx: UnboundedSender) { move |entity_id| { let id = entity_id.to_string(); - if let Err(err) = c2s_tx.send(C2sMessage::ToggleThermostat { entity_id: id }) { + if let Err(err) = c2s_tx.send(CommandMessage::ToggleThermostat { entity_id: id }) { eprintln!("Failed to send message to server.\n\t{:?}", err); } } }); } -pub async fn update_listener(app_weak: Weak, mut s2c_rx: UnboundedReceiver) { +pub async fn update_listener( + app_weak: Weak, + mut s2c_rx: UnboundedReceiver, +) { while let Some(message) = s2c_rx.recv().await { match message { - S2cMessage::InitialState(items) => { + EventMessage::InitialState(items) => { apply_state(&app_weak, items); } - S2cMessage::EntityUpdated(hass_entity) => { + EventMessage::EntityUpdated(hass_entity) => { apply_state(&app_weak, vec![hass_entity]); } - S2cMessage::EntityRemoved(hass_entity) => { + EventMessage::EntityRemoved(hass_entity) => { apply_state(&app_weak, vec![hass_entity]); } }