feat: make power sensor signal support any numeric type
This commit is contained in:
@@ -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<HomeAssistantState<uom::si::f64::Power>, StateObjectSignalError<Arc<PyErr>>>,
|
||||
Result<
|
||||
HomeAssistantState<uom::si::quantities::Power<V>>,
|
||||
StateObjectSignalError<Arc<PyErr>>,
|
||||
>,
|
||||
>,
|
||||
>,
|
||||
impl Future<Output = Result<(), emitter_and_signal::signal::JoinError>>,
|
||||
),
|
||||
CreateSignalError,
|
||||
> {
|
||||
>
|
||||
where
|
||||
V: 'static + uom::num::Num + Clone + Send + Sync + FromStr,
|
||||
V: uom::num::Num + uom::Conversion<V, T = V>,
|
||||
milliwatt: Conversion<V, T = V>,
|
||||
watt: Conversion<V, T = V>,
|
||||
kilowatt: Conversion<V, T = V>,
|
||||
megawatt: Conversion<V, T = V>,
|
||||
gigawatt: Conversion<V, T = V>,
|
||||
terawatt: Conversion<V, T = V>,
|
||||
btu: Conversion<V, T = V>,
|
||||
hour: Conversion<V, T = V>,
|
||||
SI<V>: Units<V>,
|
||||
{
|
||||
let entity_id = EntityId(Domain::Sensor, object_id);
|
||||
|
||||
let (signal, task1) =
|
||||
StateObject::<HomeAssistantState<f64>, PowerSensorAttributes, Py<PyAny>>::signal(
|
||||
StateObject::<HomeAssistantState<V>, PowerSensorAttributes, Py<PyAny>>::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)
|
||||
|
||||
@@ -34,7 +34,7 @@ pub enum UnitOfMeasurement {
|
||||
impl UnitOfMeasurement {
|
||||
pub fn into_uom<V>(&self, amount: V) -> Power<V>
|
||||
where
|
||||
V: uom::num::Num + uom::Conversion<V, T = V>,
|
||||
V: uom::num::Num + Conversion<V, T = V>,
|
||||
milliwatt: Conversion<V, T = V>,
|
||||
watt: Conversion<V, T = V>,
|
||||
kilowatt: Conversion<V, T = V>,
|
||||
|
||||
Reference in New Issue
Block a user