1use tracing::debug;
2
3use crate::traits::HandleFrame;
4
5#[derive(Debug, Clone, Default)]
6pub struct PvInverter {
7 pub power: Option<f64>,
8 pub max_power: Option<f64>,
9
10 pub total_energy: Option<f64>,
11}
12
13#[derive(Debug, Clone, Default)]
14pub struct PvInverterSummary {
15 pub total_power: Option<f64>,
16}
17
18impl HandleFrame for PvInverter {
19 fn handle_frame(&mut self, parts: &[&str], value: Option<f64>) {
20 match parts {
21 ["Ac", "Power"] => self.power = value,
22 ["Ac", "MaxPower"] => self.max_power = value,
23 ["Ac", "Energy", "Forward"] => self.total_energy = value,
24 _ => {
25 debug!(
26 "Unhandled PvInverter parts: {:?}, value: {:?}",
27 parts, value
28 );
29 }
30 }
31 }
32}
33
34impl PvInverterSummary {
35 pub fn from_pv_inverters<'a, I>(inverters: I) -> Self
36 where
37 I: Iterator<Item = &'a PvInverter> + Clone,
38 {
39 Self {
40 total_power: {
41 let values: Vec<f64> = inverters.clone().filter_map(|b| b.power).collect();
42 if values.is_empty() {
43 None
44 } else {
45 Some(values.into_iter().sum())
46 }
47 },
48 }
49 }
50}