diff --git a/src/sensors/mod.rs b/src/sensors/mod.rs index 8c73ec2..080d92c 100644 --- a/src/sensors/mod.rs +++ b/src/sensors/mod.rs @@ -10,6 +10,7 @@ mod network_connections; mod network_traffic; mod people_now_present; mod power_consumption; +mod power_generation; mod radiation; mod temperature; mod total_member_count; @@ -31,6 +32,7 @@ pub use network_traffic::{ }; pub use people_now_present::{PeopleNowPresentSensor, PeopleNowPresentSensorTemplate}; pub use power_consumption::{PowerConsumptionSensor, PowerConsumptionSensorTemplate}; +pub use power_generation::{PowerGenerationSensor, PowerGenerationSensorTemplate}; pub use radiation::{RadiationSensor, RadiationSensorUnit, RadiationSensors}; pub use temperature::{TemperatureSensor, TemperatureSensorTemplate}; pub use total_member_count::{TotalMemberCountSensor, TotalMemberCountSensorTemplate}; @@ -120,6 +122,8 @@ pub struct Sensors { #[serde(default, skip_serializing_if = "Vec::is_empty")] pub power_consumption: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub power_generation: Vec, + #[serde(default, skip_serializing_if = "Vec::is_empty")] pub wind: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub network_connections: Vec, diff --git a/src/sensors/power_generation.rs b/src/sensors/power_generation.rs new file mode 100644 index 0000000..5c16142 --- /dev/null +++ b/src/sensors/power_generation.rs @@ -0,0 +1,40 @@ +//! Module providing power generation sensor functionality. + +use super::{FromSensorTemplate, SensorMetadataWithLocation, SensorTemplate, SensorTemplateError, Sensors}; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Default, Debug, Clone, PartialEq)] +pub struct PowerGenerationSensor { + #[serde(flatten)] + pub metadata: SensorMetadataWithLocation, + pub unit: String, + pub value: f64, +} + +#[derive(Debug, Clone)] +pub struct PowerGenerationSensorTemplate { + pub metadata: SensorMetadataWithLocation, + pub unit: String, +} + +impl FromSensorTemplate for PowerGenerationSensor { + fn try_from_template( + template: &PowerGenerationSensorTemplate, + value: &str, + ) -> Result { + Ok(Self { + metadata: template.metadata.clone(), + unit: template.unit.clone(), + value: value.parse()?, + }) + } +} + +impl SensorTemplate for PowerGenerationSensorTemplate { + fn try_to_sensor(&self, value_str: &str, sensors: &mut Sensors) -> Result<(), SensorTemplateError> { + sensors + .power_generation + .push(PowerGenerationSensor::try_from_template(self, value_str)?); + Ok(()) + } +}