From e5416e848c8caeed59e8aca6fb3e191fbc621b1b Mon Sep 17 00:00:00 2001 From: diogo464 Date: Sat, 6 Dec 2025 14:31:54 +0000 Subject: Refactor sensor API to support generic sensor types with configurable display precision MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced TemperatureSensor with a generic Sensor type that accepts sensor class, state class, unit, and display precision to support various sensor types. Added suggested_display_precision field to control decimal places in Home Assistant UI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- examples/sensor.rs | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ examples/temperature.rs | 68 --------------------------------------------- 2 files changed, 74 insertions(+), 68 deletions(-) create mode 100644 examples/sensor.rs delete mode 100644 examples/temperature.rs (limited to 'examples') diff --git a/examples/sensor.rs b/examples/sensor.rs new file mode 100644 index 0000000..69bd87a --- /dev/null +++ b/examples/sensor.rs @@ -0,0 +1,74 @@ +mod common; + +use common::AsyncTcp; +use embassy_executor::{Executor, Spawner}; +use embassy_time::Timer; +use static_cell::StaticCell; + +static RESOURCES: StaticCell = StaticCell::new(); + +#[embassy_executor::task] +async fn main_task(spawner: Spawner) { + let mut stream = AsyncTcp::connect(std::env!("MQTT_ADDRESS")); + + let mut device = embassy_ha::Device::new( + RESOURCES.init(Default::default()), + embassy_ha::DeviceConfig { + device_id: "example-device-id", + device_name: "Example Device Name", + manufacturer: "Example Device Manufacturer", + model: "Example Device Model", + }, + ); + + let temperature_sensor = device.create_sensor( + "random-temperature-sensor-id", + embassy_ha::SensorConfig { + common: embassy_ha::EntityCommonConfig { + name: Some("Random Temperature Sensor"), + ..Default::default() + }, + class: embassy_ha::SensorClass::Temperature, + state_class: embassy_ha::StateClass::Measurement, + unit: Some(embassy_ha::constants::HA_UNIT_TEMPERATURE_CELSIUS), + suggested_display_precision: Some(1), + }, + ); + + let humidity_sensor = device.create_sensor( + "random-humidity-sensor-id", + embassy_ha::SensorConfig { + common: embassy_ha::EntityCommonConfig { + name: Some("Random Humidity Sensor"), + ..Default::default() + }, + class: embassy_ha::SensorClass::Humidity, + state_class: embassy_ha::StateClass::Measurement, + unit: Some(embassy_ha::constants::HA_UNIT_PERCENTAGE), + suggested_display_precision: Some(0), + }, + ); + + spawner.must_spawn(random_temperature_task(temperature_sensor)); + spawner.must_spawn(random_humidity_task(humidity_sensor)); + + device.run(&mut stream).await.unwrap(); +} + +#[embassy_executor::task] +async fn random_temperature_task(mut sensor: embassy_ha::Sensor<'static>) { + loop { + sensor.publish(rand::random_range(0.0..50.0)); + Timer::after_secs(1).await; + } +} + +#[embassy_executor::task] +async fn random_humidity_task(mut sensor: embassy_ha::Sensor<'static>) { + loop { + sensor.publish(rand::random_range(0.0..100.0)); + Timer::after_secs(1).await; + } +} + +example_main!(); diff --git a/examples/temperature.rs b/examples/temperature.rs deleted file mode 100644 index d449cd4..0000000 --- a/examples/temperature.rs +++ /dev/null @@ -1,68 +0,0 @@ -mod common; - -use common::AsyncTcp; -use embassy_executor::{Executor, Spawner}; -use embassy_time::Timer; -use static_cell::StaticCell; - -static RESOURCES: StaticCell = StaticCell::new(); - -#[embassy_executor::task] -async fn main_task(spawner: Spawner) { - let mut stream = AsyncTcp::connect(std::env!("MQTT_ADDRESS")); - - let mut device = embassy_ha::Device::new( - RESOURCES.init(Default::default()), - embassy_ha::DeviceConfig { - device_id: "example-device-id", - device_name: "Example Device Name", - manufacturer: "Example Device Manufacturer", - model: "Example Device Model", - }, - ); - - let constant_temperature_sensor = device.create_temperature_sensor( - "constant-temperature-sensor-id", - embassy_ha::TemperatureSensorConfig { - common: embassy_ha::EntityCommonConfig { - name: Some("Constant Temperature Sensor"), - ..Default::default() - }, - unit: embassy_ha::TemperatureUnit::Celcius, - }, - ); - - let random_temperature_sensor = device.create_temperature_sensor( - "random-temperature-sensor-id", - embassy_ha::TemperatureSensorConfig { - common: embassy_ha::EntityCommonConfig { - name: Some("Random Temperature Sensor"), - ..Default::default() - }, - unit: embassy_ha::TemperatureUnit::Celcius, - }, - ); - - spawner.must_spawn(constant_temperature_task(constant_temperature_sensor)); - spawner.must_spawn(random_temperature_task(random_temperature_sensor)); - - device.run(&mut stream).await.unwrap(); -} - -#[embassy_executor::task] -async fn constant_temperature_task(mut sensor: embassy_ha::TemperatureSensor<'static>) { - loop { - sensor.publish(42.0); - Timer::after_secs(1).await; - } -} - -#[embassy_executor::task] -async fn random_temperature_task(mut sensor: embassy_ha::TemperatureSensor<'static>) { - loop { - sensor.publish(rand::random_range(0.0..50.0)); - Timer::after_secs(1).await; - } -} - -example_main!(); -- cgit