Skip to main content

frequenz_microgrid/client/proto/
graph.rs

1// License: MIT
2// Copyright © 2025 Frequenz Energy-as-a-Service GmbH
3
4//! Component graph implementation for the microgrid API.
5
6use tracing::{error, warn};
7
8impl frequenz_microgrid_component_graph::Node
9    for super::common::microgrid::electrical_components::ElectricalComponent
10{
11    fn component_id(&self) -> u64 {
12        self.id
13    }
14
15    fn category(&self) -> frequenz_microgrid_component_graph::ComponentCategory {
16        use super::common::microgrid::electrical_components as pb;
17        use frequenz_microgrid_component_graph as gr;
18
19        let category =
20            pb::ElectricalComponentCategory::try_from(self.category).unwrap_or_else(|e| {
21                error!("Error converting component category: {}", e);
22                pb::ElectricalComponentCategory::Unspecified
23            });
24
25        match category {
26            pb::ElectricalComponentCategory::Unspecified => gr::ComponentCategory::Unspecified,
27            pb::ElectricalComponentCategory::GridConnectionPoint => {
28                gr::ComponentCategory::GridConnectionPoint
29            }
30            pb::ElectricalComponentCategory::Meter => gr::ComponentCategory::Meter,
31            pb::ElectricalComponentCategory::Inverter => {
32                gr::ComponentCategory::Inverter(match self.category_specific_info {
33                    Some(pb::ElectricalComponentCategorySpecificInfo { kind }) => match kind {
34                        Some(pb::electrical_component_category_specific_info::Kind::Inverter(
35                            inverter,
36                        )) => {
37                            match pb::InverterType::try_from(inverter.r#type).unwrap_or_else(|e| {
38                                error!("Error converting inverter type: {}", e);
39                                pb::InverterType::Unspecified
40                            }) {
41                                pb::InverterType::Pv => gr::InverterType::Pv,
42                                pb::InverterType::Battery => gr::InverterType::Battery,
43                                pb::InverterType::Hybrid => gr::InverterType::Hybrid,
44                                pb::InverterType::Unspecified => gr::InverterType::Unspecified,
45                            }
46                        }
47                        Some(_) => {
48                            warn!("Unknown component specific info for inverter: {:?}", kind);
49                            gr::InverterType::Unspecified
50                        }
51                        None => gr::InverterType::Unspecified,
52                    },
53                    _ => gr::InverterType::Unspecified,
54                })
55            }
56            pb::ElectricalComponentCategory::Converter => gr::ComponentCategory::Converter,
57            pb::ElectricalComponentCategory::Battery => {
58                gr::ComponentCategory::Battery(match self.category_specific_info {
59                    Some(pb::ElectricalComponentCategorySpecificInfo { kind }) => match kind {
60                        Some(pb::electrical_component_category_specific_info::Kind::Battery(
61                            battery,
62                        )) => {
63                            match pb::BatteryType::try_from(battery.r#type).unwrap_or_else(|e| {
64                                error!("Error converting battery type: {}", e);
65                                pb::BatteryType::Unspecified
66                            }) {
67                                pb::BatteryType::LiIon => gr::BatteryType::LiIon,
68                                pb::BatteryType::NaIon => gr::BatteryType::NaIon,
69                                pb::BatteryType::Unspecified => gr::BatteryType::Unspecified,
70                            }
71                        }
72                        Some(_) => {
73                            warn!("Unknown component specific info for battery: {:?}", kind);
74                            gr::BatteryType::Unspecified
75                        }
76                        None => gr::BatteryType::Unspecified,
77                    },
78                    _ => gr::BatteryType::Unspecified,
79                })
80            }
81            pb::ElectricalComponentCategory::EvCharger => {
82                gr::ComponentCategory::EvCharger(match self.category_specific_info {
83                    Some(pb::ElectricalComponentCategorySpecificInfo { kind }) => match kind {
84                        Some(pb::electrical_component_category_specific_info::Kind::EvCharger(
85                            ev_charger,
86                        )) => match pb::EvChargerType::try_from(ev_charger.r#type).unwrap_or_else(
87                            |e| {
88                                error!("Error converting ev charger type: {}", e);
89                                pb::EvChargerType::Unspecified
90                            },
91                        ) {
92                            pb::EvChargerType::Ac => gr::EvChargerType::Ac,
93                            pb::EvChargerType::Dc => gr::EvChargerType::Dc,
94                            pb::EvChargerType::Hybrid => gr::EvChargerType::Hybrid,
95                            pb::EvChargerType::Unspecified => gr::EvChargerType::Unspecified,
96                        },
97                        Some(_) => {
98                            warn!("Unknown component specific info for ev charger: {:?}", kind);
99                            gr::EvChargerType::Unspecified
100                        }
101                        None => gr::EvChargerType::Unspecified,
102                    },
103                    _ => gr::EvChargerType::Unspecified,
104                })
105            }
106            pb::ElectricalComponentCategory::CryptoMiner => gr::ComponentCategory::CryptoMiner,
107            pb::ElectricalComponentCategory::Electrolyzer => gr::ComponentCategory::Electrolyzer,
108            pb::ElectricalComponentCategory::Chp => gr::ComponentCategory::Chp,
109            pb::ElectricalComponentCategory::Hvac => gr::ComponentCategory::Hvac,
110            pb::ElectricalComponentCategory::Breaker => gr::ComponentCategory::Breaker,
111            pb::ElectricalComponentCategory::Precharger => gr::ComponentCategory::Precharger,
112            pb::ElectricalComponentCategory::PowerTransformer => {
113                gr::ComponentCategory::PowerTransformer
114            }
115            pb::ElectricalComponentCategory::Plc => gr::ComponentCategory::Plc,
116            pb::ElectricalComponentCategory::StaticTransferSwitch => {
117                gr::ComponentCategory::StaticTransferSwitch
118            }
119            pb::ElectricalComponentCategory::UninterruptiblePowerSupply => {
120                gr::ComponentCategory::UninterruptiblePowerSupply
121            }
122            pb::ElectricalComponentCategory::CapacitorBank => gr::ComponentCategory::CapacitorBank,
123            pb::ElectricalComponentCategory::WindTurbine => gr::ComponentCategory::WindTurbine,
124        }
125    }
126}
127
128impl frequenz_microgrid_component_graph::Edge
129    for super::common::microgrid::electrical_components::ElectricalComponentConnection
130{
131    fn source(&self) -> u64 {
132        self.source_electrical_component_id
133    }
134
135    fn destination(&self) -> u64 {
136        self.destination_electrical_component_id
137    }
138}