From 8b966c1210e46f9ed655b5b41e2ed20639dd2389 Mon Sep 17 00:00:00 2001 From: J / Jacob Babich Date: Wed, 15 Jul 2026 00:57:59 -0400 Subject: [PATCH] feat: make power sensor signal support any numeric type --- .../src/sensor/device_classes/power.rs | 41 +++++++++++++++---- .../src/unit_of_measurement/power.rs | 2 +- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/home-assistant/src/sensor/device_classes/power.rs b/home-assistant/src/sensor/device_classes/power.rs index 09a0b94..cd11bea 100644 --- a/home-assistant/src/sensor/device_classes/power.rs +++ b/home-assistant/src/sensor/device_classes/power.rs @@ -1,10 +1,19 @@ -use std::{future::Future, sync::Arc}; +use std::{future::Future, str::FromStr, sync::Arc}; use emitter_and_signal::{Signal, SignalExt}; use pyo3::{FromPyObject, Py, PyAny, PyErr, Python}; use python_utils::{FromPyFromStr, ToStrToPy}; use snafu::{ResultExt, Snafu}; use string_literal::StringLiteral; +use uom::{ + si::{ + energy::btu, + power::{gigawatt, kilowatt, megawatt, milliwatt, terawatt, watt}, + time::hour, + Units, SI, + }, + Conversion, +}; use super::super::state_classes::measurement::Measurement; use crate::{ @@ -42,7 +51,7 @@ pub enum CreateSignalError { }, } -pub fn signal<'py>( +pub fn signal<'py, V>( py: Python<'py>, home_assistant: &'py HomeAssistant, object_id: ObjectId, @@ -50,17 +59,33 @@ pub fn signal<'py>( ( Signal< Option< - Result, StateObjectSignalError>>, + Result< + HomeAssistantState>, + StateObjectSignalError>, + >, >, >, impl Future>, ), CreateSignalError, -> { +> +where + V: 'static + uom::num::Num + Clone + Send + Sync + FromStr, + V: uom::num::Num + uom::Conversion, + milliwatt: Conversion, + watt: Conversion, + kilowatt: Conversion, + megawatt: Conversion, + gigawatt: Conversion, + terawatt: Conversion, + btu: Conversion, + hour: Conversion, + SI: Units, +{ let entity_id = EntityId(Domain::Sensor, object_id); let (signal, task1) = - StateObject::, PowerSensorAttributes, Py>::signal( + StateObject::, PowerSensorAttributes, Py>::signal( py, home_assistant, entity_id, @@ -75,9 +100,9 @@ pub fn signal<'py>( |StateObject { state, attributes, .. }| { - state - .as_ref() - .map(|&amount| attributes.unit_of_measurement.into_uom(amount)) + state.as_ref().map(|amount| { + attributes.unit_of_measurement.into_uom(amount.clone()) + }) }, ) .map_err(Clone::clone) diff --git a/home-assistant/src/unit_of_measurement/power.rs b/home-assistant/src/unit_of_measurement/power.rs index b6207b6..1fbea7a 100644 --- a/home-assistant/src/unit_of_measurement/power.rs +++ b/home-assistant/src/unit_of_measurement/power.rs @@ -34,7 +34,7 @@ pub enum UnitOfMeasurement { impl UnitOfMeasurement { pub fn into_uom(&self, amount: V) -> Power where - V: uom::num::Num + uom::Conversion, + V: uom::num::Num + Conversion, milliwatt: Conversion, watt: Conversion, kilowatt: Conversion,