diff --git a/dashboard/src/home_assistant.rs b/dashboard/src/home_assistant.rs index b323aff..383dfc1 100644 --- a/dashboard/src/home_assistant.rs +++ b/dashboard/src/home_assistant.rs @@ -9,6 +9,59 @@ use crate::{ messages::{CommandMessage, EventMessage}, }; +async fn handle_command( + message: CommandMessage, + state: &HashMap, + client: &mut HassClient, +) -> Result<(), AppError> { + match message { + CommandMessage::ToggleLight { entity_id } => { + if let Some(entity) = state.get(&entity_id) { + let payload = json!({ + "entity_id": entity_id + }); + let service = toggle_action(&entity.state, "on"); + client + .call_service("light".into(), service.into(), Some(payload)) + .await + .map_err(Box::new) + .map_err(Into::into) + } else { + Err(AppError::NoEntity(entity_id)) + } + } + CommandMessage::ToggleThermostat { entity_id } => { + if let Some(entity) = state.get(&entity_id) { + let payload = json!({ + "entity_id": entity_id + }); + let service = toggle_action(&entity.state, "heat"); + client + .call_service("climate".into(), service.into(), Some(payload)) + .await + .map_err(Box::new) + .map_err(Into::into) + } else { + Err(AppError::NoEntity(entity_id)) + } + } + CommandMessage::SetTemperature { + entity_id, + temperature, + } => { + let payload = json!({ + "entity_id": entity_id, + "temperature": temperature + }); + client + .call_service("climate".into(), "set_temperature".into(), Some(payload)) + .await + .map_err(Box::new) + .map_err(Into::into) + } + } +} + pub async fn hass( s2c_tx: UnboundedSender, mut c2s_rx: UnboundedReceiver, @@ -79,52 +132,7 @@ pub async fn hass( } Some(message) = c2s_rx.recv() => { - if let Err(err) = match message { - CommandMessage::ToggleLight { entity_id } => { - if let Some(entity) = state.get(&entity_id) { - let payload = json!({ - "entity_id": entity_id - }); - let service = toggle_action(&entity.state, "on"); - client - .call_service("light".into(), service.into(), Some(payload)) - .await - .map_err(Box::new) - .map_err(Into::into) - } else { - Err(AppError::NoEntity(entity_id)) - } - } - CommandMessage::ToggleThermostat { entity_id } => { - if let Some(entity) = state.get(&entity_id) { - let payload = json!({ - "entity_id": entity_id - }); - let service = toggle_action(&entity.state, "heat"); - client - .call_service("climate".into(), service.into(), Some(payload)) - .await - .map_err(Box::new) - .map_err(Into::into) - } else { - Err(AppError::NoEntity(entity_id)) - } - } - CommandMessage::SetTemperature { - entity_id, - temperature, - } => { - let payload = json!({ - "entity_id": entity_id, - "temperature": temperature - }); - client - .call_service("climate".into(), "set_temperature".into(), Some(payload)) - .await - .map_err(Box::new) - .map_err(Into::into) - } - } { + if let Err(err) = handle_command(message, &state, &mut client).await { eprintln!("Failed to execute Service Call.\n\t{:?}", err); } }