Skip to main content

cimstructs/
EnergySource.rs

1/// A generic equivalent for an energy supplier on a transmission or distribution voltage level.
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct EnergySource {
4    #[serde(flatten)]
5    pub base: super::EnergyConnection,
6    /// Energy Scheduling Type of an Energy Source.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub energy_scheduling_type: Option<super::base::MridRef>,
9    /// High voltage source active injection. Load sign convention is used, i.e. positive sign means flow out from a node. Starting value for steady state solutions.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub active_power: Option<f64>,
12    /// Phase-to-phase nominal voltage.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub nominal_voltage: Option<f64>,
15    /// This is the maximum active power that can be produced by the source. Load sign convention is used, i.e. positive sign means flow out from a TopologicalNode (bus) into the conducting equipment.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub p_max: Option<f64>,
18    /// This is the minimum active power that can be produced by the source. Load sign convention is used, i.e. positive sign means flow out from a TopologicalNode (bus) into the conducting equipment.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub p_min: Option<f64>,
21    /// Positive sequence Thevenin resistance.
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub r: Option<f64>,
24    /// Zero sequence Thevenin resistance.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub r0: Option<f64>,
27    /// High voltage source reactive injection. Load sign convention is used, i.e. positive sign means flow out from a node. Starting value for steady state solutions.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub reactive_power: Option<f64>,
30    /// Negative sequence Thevenin resistance.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub rn: Option<f64>,
33    /// Phase angle of a-phase open circuit used when voltage characteristics need to be imposed at the node associated with the terminal of the energy source, such as when voltages and angles from the transmission level are used as input to the distribution network. The attribute shall be a positive value or zero.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub voltage_angle: Option<f64>,
36    /// Phase-to-phase open circuit voltage magnitude used when voltage characteristics need to be imposed at the node associated with the terminal of the energy source, such as when voltages and angles from the transmission level are used as input to the distribution network. The attribute shall be a positive value or zero.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub voltage_magnitude: Option<f64>,
39    /// Positive sequence Thevenin reactance.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub x: Option<f64>,
42    /// Zero sequence Thevenin reactance.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub x0: Option<f64>,
45    /// Negative sequence Thevenin reactance.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub xn: Option<f64>,
48}
49impl crate::base::CimElement for EnergySource {
50    fn mrid(&self) -> &str { &self.base.base.base.base.base.id }
51    fn type_name(&self) -> &'static str { "EnergySource" }
52    fn as_any(&self) -> &dyn std::any::Any { self }
53    fn to_json_value(&self) -> serde_json::Value {
54        serde_json::to_value(self).unwrap_or(serde_json::Value::Null)
55    }
56    fn to_block(&self) -> crate::base::RdfBlock {
57        let mut block = self.base.to_block();
58        block.type_name = "EnergySource".to_string();
59        if let Some(ref v) = self.energy_scheduling_type {
60            block.fields.insert("EnergySource.EnergySchedulingType".into(), crate::base::FieldValue::Resource(v.mrid.clone()));
61        }
62        if let Some(v) = self.active_power {
63            block.fields.insert("EnergySource.activePower".into(), crate::base::FieldValue::Text(v.to_string()));
64        }
65        if let Some(v) = self.nominal_voltage {
66            block.fields.insert("EnergySource.nominalVoltage".into(), crate::base::FieldValue::Text(v.to_string()));
67        }
68        if let Some(v) = self.p_max {
69            block.fields.insert("EnergySource.pMax".into(), crate::base::FieldValue::Text(v.to_string()));
70        }
71        if let Some(v) = self.p_min {
72            block.fields.insert("EnergySource.pMin".into(), crate::base::FieldValue::Text(v.to_string()));
73        }
74        if let Some(v) = self.r {
75            block.fields.insert("EnergySource.r".into(), crate::base::FieldValue::Text(v.to_string()));
76        }
77        if let Some(v) = self.r0 {
78            block.fields.insert("EnergySource.r0".into(), crate::base::FieldValue::Text(v.to_string()));
79        }
80        if let Some(v) = self.reactive_power {
81            block.fields.insert("EnergySource.reactivePower".into(), crate::base::FieldValue::Text(v.to_string()));
82        }
83        if let Some(v) = self.rn {
84            block.fields.insert("EnergySource.rn".into(), crate::base::FieldValue::Text(v.to_string()));
85        }
86        if let Some(v) = self.voltage_angle {
87            block.fields.insert("EnergySource.voltageAngle".into(), crate::base::FieldValue::Text(v.to_string()));
88        }
89        if let Some(v) = self.voltage_magnitude {
90            block.fields.insert("EnergySource.voltageMagnitude".into(), crate::base::FieldValue::Text(v.to_string()));
91        }
92        if let Some(v) = self.x {
93            block.fields.insert("EnergySource.x".into(), crate::base::FieldValue::Text(v.to_string()));
94        }
95        if let Some(v) = self.x0 {
96            block.fields.insert("EnergySource.x0".into(), crate::base::FieldValue::Text(v.to_string()));
97        }
98        if let Some(v) = self.xn {
99            block.fields.insert("EnergySource.xn".into(), crate::base::FieldValue::Text(v.to_string()));
100        }
101        block
102    }
103}
104
105impl EnergySource {
106    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
107        let mut obj = Self::default();
108        obj.base.base.base.base.base.id.clone_from(&b.mrid);
109        for (key, val) in &b.fields {
110            match key.as_str() {
111                "EnergySource.EnergySchedulingType" => {
112                    if let crate::base::FieldValue::Resource(sv) = val {
113                        obj.energy_scheduling_type = Some(crate::base::MridRef { mrid: sv.clone() });
114                    }
115                }
116                "EnergySource.activePower" => {
117                    match val {
118                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.active_power = Some(v); } }
119                        crate::base::FieldValue::TextList(svs) => {
120                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.active_power = Some(v); } }
121                        }
122                        _ => {}
123                    }
124                }
125                "EnergySource.nominalVoltage" => {
126                    match val {
127                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.nominal_voltage = Some(v); } }
128                        crate::base::FieldValue::TextList(svs) => {
129                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.nominal_voltage = Some(v); } }
130                        }
131                        _ => {}
132                    }
133                }
134                "EnergySource.pMax" => {
135                    match val {
136                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.p_max = Some(v); } }
137                        crate::base::FieldValue::TextList(svs) => {
138                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.p_max = Some(v); } }
139                        }
140                        _ => {}
141                    }
142                }
143                "EnergySource.pMin" => {
144                    match val {
145                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.p_min = Some(v); } }
146                        crate::base::FieldValue::TextList(svs) => {
147                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.p_min = Some(v); } }
148                        }
149                        _ => {}
150                    }
151                }
152                "EnergySource.r" => {
153                    match val {
154                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.r = Some(v); } }
155                        crate::base::FieldValue::TextList(svs) => {
156                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.r = Some(v); } }
157                        }
158                        _ => {}
159                    }
160                }
161                "EnergySource.r0" => {
162                    match val {
163                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.r0 = Some(v); } }
164                        crate::base::FieldValue::TextList(svs) => {
165                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.r0 = Some(v); } }
166                        }
167                        _ => {}
168                    }
169                }
170                "EnergySource.reactivePower" => {
171                    match val {
172                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.reactive_power = Some(v); } }
173                        crate::base::FieldValue::TextList(svs) => {
174                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.reactive_power = Some(v); } }
175                        }
176                        _ => {}
177                    }
178                }
179                "EnergySource.rn" => {
180                    match val {
181                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.rn = Some(v); } }
182                        crate::base::FieldValue::TextList(svs) => {
183                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.rn = Some(v); } }
184                        }
185                        _ => {}
186                    }
187                }
188                "EnergySource.voltageAngle" => {
189                    match val {
190                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.voltage_angle = Some(v); } }
191                        crate::base::FieldValue::TextList(svs) => {
192                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.voltage_angle = Some(v); } }
193                        }
194                        _ => {}
195                    }
196                }
197                "EnergySource.voltageMagnitude" => {
198                    match val {
199                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.voltage_magnitude = Some(v); } }
200                        crate::base::FieldValue::TextList(svs) => {
201                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.voltage_magnitude = Some(v); } }
202                        }
203                        _ => {}
204                    }
205                }
206                "EnergySource.x" => {
207                    match val {
208                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.x = Some(v); } }
209                        crate::base::FieldValue::TextList(svs) => {
210                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.x = Some(v); } }
211                        }
212                        _ => {}
213                    }
214                }
215                "EnergySource.x0" => {
216                    match val {
217                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.x0 = Some(v); } }
218                        crate::base::FieldValue::TextList(svs) => {
219                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.x0 = Some(v); } }
220                        }
221                        _ => {}
222                    }
223                }
224                "EnergySource.xn" => {
225                    match val {
226                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.xn = Some(v); } }
227                        crate::base::FieldValue::TextList(svs) => {
228                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.xn = Some(v); } }
229                        }
230                        _ => {}
231                    }
232                }
233                "ConductingEquipment.BaseVoltage" => {
234                    if let crate::base::FieldValue::Resource(sv) = val {
235                        obj.base.base.base_voltage = Some(crate::base::MridRef { mrid: sv.clone() });
236                    }
237                }
238                "Equipment.EquipmentContainer" => {
239                    if let crate::base::FieldValue::Resource(sv) = val {
240                        obj.base.base.base.equipment_container = Some(crate::base::MridRef { mrid: sv.clone() });
241                    }
242                }
243                "Equipment.aggregate" => {
244                    match val {
245                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.aggregate = Some(sv.trim() == "true"); }
246                        crate::base::FieldValue::TextList(svs) => {
247                            if let Some(sv) = svs.last() { obj.base.base.base.aggregate = Some(sv.trim() == "true"); }
248                        }
249                        _ => {}
250                    }
251                }
252                "Equipment.inService" => {
253                    match val {
254                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.in_service = Some(sv.trim() == "true"); }
255                        crate::base::FieldValue::TextList(svs) => {
256                            if let Some(sv) = svs.last() { obj.base.base.base.in_service = Some(sv.trim() == "true"); }
257                        }
258                        _ => {}
259                    }
260                }
261                "Equipment.normallyInService" => {
262                    match val {
263                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.normally_in_service = Some(sv.trim() == "true"); }
264                        crate::base::FieldValue::TextList(svs) => {
265                            if let Some(sv) = svs.last() { obj.base.base.base.normally_in_service = Some(sv.trim() == "true"); }
266                        }
267                        _ => {}
268                    }
269                }
270                "IdentifiedObject.description" => {
271                    match val {
272                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.description = sv.clone(); }
273                        crate::base::FieldValue::TextList(svs) => {
274                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.description = sv.clone(); }
275                        }
276                        _ => {}
277                    }
278                }
279                "IdentifiedObject.energyIdentCodeEic" => {
280                    match val {
281                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.energy_ident_code_eic = sv.clone(); }
282                        crate::base::FieldValue::TextList(svs) => {
283                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.energy_ident_code_eic = sv.clone(); }
284                        }
285                        _ => {}
286                    }
287                }
288                "IdentifiedObject.mRID" => {
289                    match val {
290                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.m_rid = sv.clone(); }
291                        crate::base::FieldValue::TextList(svs) => {
292                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.m_rid = sv.clone(); }
293                        }
294                        _ => {}
295                    }
296                }
297                "IdentifiedObject.name" => {
298                    match val {
299                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.name = sv.clone(); }
300                        crate::base::FieldValue::TextList(svs) => {
301                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.name = sv.clone(); }
302                        }
303                        _ => {}
304                    }
305                }
306                "IdentifiedObject.shortName" => {
307                    match val {
308                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.short_name = sv.clone(); }
309                        crate::base::FieldValue::TextList(svs) => {
310                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.short_name = sv.clone(); }
311                        }
312                        _ => {}
313                    }
314                }
315                _ => {}
316            }
317        }
318        obj
319    }
320}