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 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 examples/sensor.rs (limited to 'examples/sensor.rs') 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!(); -- cgit