use core::ops::Deref;
use serde::Serialize;
use crate::{homeassistant::Component, Error, Publishable, Topic};
#[derive(Serialize)]
#[serde(rename_all = "snake_case")]
#[allow(missing_docs)]
pub enum SensorClass {
ApparentPower,
Aqi,
AtmosphericPressure,
Battery,
CarbonDioxide,
CarbonMonoxide,
Current,
DataRate,
DataSize,
Date,
Distance,
Duration,
Energy,
EnergyStorage,
Enum,
Frequency,
Gas,
Humidity,
Illuminance,
Irradiance,
Moisture,
Monetary,
NitrogenDioxide,
NitrogenMonoxide,
NitrousOxide,
Ozone,
Ph,
Pm1,
Pm25,
Pm10,
PowerFactor,
Power,
Precipitation,
PrecipitationIntensity,
Pressure,
ReactivePower,
SignalStrength,
SoundPressure,
Speed,
SulphurDioxide,
Temperature,
Timestamp,
VolatileOrganicCompounds,
VolatileOrganicCompoundsParts,
Voltage,
Volume,
VolumeFlowRate,
VolumeStorage,
Water,
Weight,
WindSpeed,
}
#[derive(Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SensorStateClass {
Measurement,
Total,
TotalIncreasing,
}
#[derive(Serialize)]
pub struct Sensor<'u> {
pub device_class: Option<SensorClass>,
pub state_class: Option<SensorStateClass>,
pub unit_of_measurement: Option<&'u str>,
}
impl Component for Sensor<'_> {
type State = f32;
fn platform() -> &'static str {
"sensor"
}
async fn publish_state<T: Deref<Target = str>>(
&self,
topic: &Topic<T>,
state: Self::State,
) -> Result<(), Error> {
topic.with_display(state).publish().await
}
}