diff --git a/google_home/google_home/src/traits.rs b/google_home/google_home/src/traits.rs index 03d1c07..fbefba3 100644 --- a/google_home/google_home/src/traits.rs +++ b/google_home/google_home/src/traits.rs @@ -1,3 +1,4 @@ +#![allow(non_snake_case)] use automation_cast::Cast; use google_home_macro::traits; use serde::Serialize; @@ -33,6 +34,13 @@ traits! { query_only_humidity_setting: Option, fn humidity_ambient_percent(&self) -> Result, + }, + "action.devices.traits.TemperatureControl" => trait TemperatureSetting { + query_only_temperature_control: Option, + // TODO: Add rename + temperatureUnitForUX: TemperatureUnit, + + fn temperature_ambient_celsius(&self) -> f32, } } @@ -53,3 +61,11 @@ pub struct AvailableSpeeds { pub speeds: Vec, pub ordered: bool, } + +#[derive(Debug, Serialize)] +pub enum TemperatureUnit { + #[serde(rename = "C")] + Celsius, + #[serde(rename = "F")] + Fahrenheit, +} diff --git a/google_home/google_home_macro/src/lib.rs b/google_home/google_home_macro/src/lib.rs index 14e8e41..67c11c6 100644 --- a/google_home/google_home_macro/src/lib.rs +++ b/google_home/google_home_macro/src/lib.rs @@ -248,7 +248,7 @@ fn get_state_struct(t: &Trait) -> proc_macro2::TokenStream { let name = get_state_struct_ident(t); quote! { - #[derive(Debug, Default, serde::Serialize)] + #[derive(Debug, serde::Serialize)] #[serde(rename_all = "camelCase")] struct #name { #(#fields,)* diff --git a/src/devices/air_filter.rs b/src/devices/air_filter.rs index 93f05db..6ebf02c 100644 --- a/src/devices/air_filter.rs +++ b/src/devices/air_filter.rs @@ -2,7 +2,10 @@ use async_trait::async_trait; use automation_macro::{LuaDevice, LuaDeviceConfig}; use google_home::device::Name; use google_home::errors::ErrorCode; -use google_home::traits::{AvailableSpeeds, FanSpeed, HumiditySetting, OnOff, Speed, SpeedValue}; +use google_home::traits::{ + AvailableSpeeds, FanSpeed, HumiditySetting, OnOff, Speed, SpeedValue, TemperatureSetting, + TemperatureUnit, +}; use google_home::types::Type; use rumqttc::Publish; use tracing::{debug, error, trace, warn}; @@ -69,6 +72,7 @@ impl LuaDeviceCreate for AirFilter { last_known_state: AirFilterState { state: AirFilterFanState::Off, humidity: 0.0, + temperature: 0.0, }, }) } @@ -229,3 +233,19 @@ impl HumiditySetting for AirFilter { Ok(self.last_known_state.humidity.round() as isize) } } + +impl TemperatureSetting for AirFilter { + fn query_only_temperature_control(&self) -> Option { + Some(true) + } + + #[allow(non_snake_case)] + fn temperatureUnitForUX(&self) -> TemperatureUnit { + TemperatureUnit::Celsius + } + + fn temperature_ambient_celsius(&self) -> f32 { + // HACK: Round to one decimal place + (10.0 * self.last_known_state.temperature).round() / 10.0 + } +} diff --git a/src/messages.rs b/src/messages.rs index 822036e..b39330e 100644 --- a/src/messages.rs +++ b/src/messages.rs @@ -261,6 +261,7 @@ pub struct SetAirFilterFanState { pub struct AirFilterState { pub state: AirFilterFanState, pub humidity: f32, + pub temperature: f32, } impl SetAirFilterFanState {