victron_gx/
pvinverter.rs

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}