Skip to main content

cimstructs/
EnergyConsumer.rs

1/// Generic user of energy - a point of consumption on the power system model. EnergyConsumer.pfixed, .qfixed, .pfixedPct and .qfixedPct have meaning only if there is no LoadResponseCharacteristic associated with EnergyConsumer or if LoadResponseCharacteristic.exponentModel is set to False.
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct EnergyConsumer {
4    #[serde(flatten)]
5    pub base: super::EnergyConnection,
6    /// Load dynamics model used to describe dynamic behaviour of this energy consumer.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub load_dynamics: Option<super::base::MridRef>,
9    /// The load response characteristic of this load. If missing, this load is assumed to be constant power.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub load_response: Option<super::base::MridRef>,
12    /// Active power of the load. Load sign convention is used, i.e. positive sign means flow out from a node. For voltage dependent loads the value is at rated voltage. Starting value for a steady state solution.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub p: Option<f64>,
15    /// Active power of the load that is a fixed quantity and does not vary as load group value varies. Load sign convention is used, i.e. positive sign means flow out from a node.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub pfixed: Option<f64>,
18    /// Fixed active power as a percentage of load group fixed active power. Used to represent the time-varying components. Load sign convention is used, i.e. positive sign means flow out from a node.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub pfixed_pct: Option<f64>,
21    /// Reactive power of the load. Load sign convention is used, i.e. positive sign means flow out from a node. For voltage dependent loads the value is at rated voltage. Starting value for a steady state solution.
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub q: Option<f64>,
24    /// Reactive power of the load that is a fixed quantity and does not vary as load group value varies. Load sign convention is used, i.e. positive sign means flow out from a node.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub qfixed: Option<f64>,
27    /// Fixed reactive power as a percentage of load group fixed reactive power. Used to represent the time-varying components. Load sign convention is used, i.e. positive sign means flow out from a node.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub qfixed_pct: Option<f64>,
30}
31impl crate::base::CimElement for EnergyConsumer {
32    fn mrid(&self) -> &str { &self.base.base.base.base.base.id }
33    fn type_name(&self) -> &'static str { "EnergyConsumer" }
34    fn as_any(&self) -> &dyn std::any::Any { self }
35    fn to_json_value(&self) -> serde_json::Value {
36        serde_json::to_value(self).unwrap_or(serde_json::Value::Null)
37    }
38    fn to_block(&self) -> crate::base::RdfBlock {
39        let mut block = self.base.to_block();
40        block.type_name = "EnergyConsumer".to_string();
41        if let Some(ref v) = self.load_dynamics {
42            block.fields.insert("EnergyConsumer.LoadDynamics".into(), crate::base::FieldValue::Resource(v.mrid.clone()));
43        }
44        if let Some(ref v) = self.load_response {
45            block.fields.insert("EnergyConsumer.LoadResponse".into(), crate::base::FieldValue::Resource(v.mrid.clone()));
46        }
47        if let Some(v) = self.p {
48            block.fields.insert("EnergyConsumer.p".into(), crate::base::FieldValue::Text(v.to_string()));
49        }
50        if let Some(v) = self.pfixed {
51            block.fields.insert("EnergyConsumer.pfixed".into(), crate::base::FieldValue::Text(v.to_string()));
52        }
53        if let Some(v) = self.pfixed_pct {
54            block.fields.insert("EnergyConsumer.pfixedPct".into(), crate::base::FieldValue::Text(v.to_string()));
55        }
56        if let Some(v) = self.q {
57            block.fields.insert("EnergyConsumer.q".into(), crate::base::FieldValue::Text(v.to_string()));
58        }
59        if let Some(v) = self.qfixed {
60            block.fields.insert("EnergyConsumer.qfixed".into(), crate::base::FieldValue::Text(v.to_string()));
61        }
62        if let Some(v) = self.qfixed_pct {
63            block.fields.insert("EnergyConsumer.qfixedPct".into(), crate::base::FieldValue::Text(v.to_string()));
64        }
65        block
66    }
67}
68
69impl EnergyConsumer {
70    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
71        let mut obj = Self::default();
72        obj.base.base.base.base.base.id.clone_from(&b.mrid);
73        for (key, val) in &b.fields {
74            match key.as_str() {
75                "EnergyConsumer.LoadDynamics" => {
76                    if let crate::base::FieldValue::Resource(sv) = val {
77                        obj.load_dynamics = Some(crate::base::MridRef { mrid: sv.clone() });
78                    }
79                }
80                "EnergyConsumer.LoadResponse" => {
81                    if let crate::base::FieldValue::Resource(sv) = val {
82                        obj.load_response = Some(crate::base::MridRef { mrid: sv.clone() });
83                    }
84                }
85                "EnergyConsumer.p" => {
86                    match val {
87                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.p = Some(v); } }
88                        crate::base::FieldValue::TextList(svs) => {
89                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.p = Some(v); } }
90                        }
91                        _ => {}
92                    }
93                }
94                "EnergyConsumer.pfixed" => {
95                    match val {
96                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.pfixed = Some(v); } }
97                        crate::base::FieldValue::TextList(svs) => {
98                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.pfixed = Some(v); } }
99                        }
100                        _ => {}
101                    }
102                }
103                "EnergyConsumer.pfixedPct" => {
104                    match val {
105                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.pfixed_pct = Some(v); } }
106                        crate::base::FieldValue::TextList(svs) => {
107                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.pfixed_pct = Some(v); } }
108                        }
109                        _ => {}
110                    }
111                }
112                "EnergyConsumer.q" => {
113                    match val {
114                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.q = Some(v); } }
115                        crate::base::FieldValue::TextList(svs) => {
116                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.q = Some(v); } }
117                        }
118                        _ => {}
119                    }
120                }
121                "EnergyConsumer.qfixed" => {
122                    match val {
123                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.qfixed = Some(v); } }
124                        crate::base::FieldValue::TextList(svs) => {
125                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.qfixed = Some(v); } }
126                        }
127                        _ => {}
128                    }
129                }
130                "EnergyConsumer.qfixedPct" => {
131                    match val {
132                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.qfixed_pct = Some(v); } }
133                        crate::base::FieldValue::TextList(svs) => {
134                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.qfixed_pct = Some(v); } }
135                        }
136                        _ => {}
137                    }
138                }
139                "ConductingEquipment.BaseVoltage" => {
140                    if let crate::base::FieldValue::Resource(sv) = val {
141                        obj.base.base.base_voltage = Some(crate::base::MridRef { mrid: sv.clone() });
142                    }
143                }
144                "Equipment.EquipmentContainer" => {
145                    if let crate::base::FieldValue::Resource(sv) = val {
146                        obj.base.base.base.equipment_container = Some(crate::base::MridRef { mrid: sv.clone() });
147                    }
148                }
149                "Equipment.aggregate" => {
150                    match val {
151                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.aggregate = Some(sv.trim() == "true"); }
152                        crate::base::FieldValue::TextList(svs) => {
153                            if let Some(sv) = svs.last() { obj.base.base.base.aggregate = Some(sv.trim() == "true"); }
154                        }
155                        _ => {}
156                    }
157                }
158                "Equipment.inService" => {
159                    match val {
160                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.in_service = Some(sv.trim() == "true"); }
161                        crate::base::FieldValue::TextList(svs) => {
162                            if let Some(sv) = svs.last() { obj.base.base.base.in_service = Some(sv.trim() == "true"); }
163                        }
164                        _ => {}
165                    }
166                }
167                "Equipment.normallyInService" => {
168                    match val {
169                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.normally_in_service = Some(sv.trim() == "true"); }
170                        crate::base::FieldValue::TextList(svs) => {
171                            if let Some(sv) = svs.last() { obj.base.base.base.normally_in_service = Some(sv.trim() == "true"); }
172                        }
173                        _ => {}
174                    }
175                }
176                "IdentifiedObject.description" => {
177                    match val {
178                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.description = sv.clone(); }
179                        crate::base::FieldValue::TextList(svs) => {
180                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.description = sv.clone(); }
181                        }
182                        _ => {}
183                    }
184                }
185                "IdentifiedObject.energyIdentCodeEic" => {
186                    match val {
187                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.energy_ident_code_eic = sv.clone(); }
188                        crate::base::FieldValue::TextList(svs) => {
189                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.energy_ident_code_eic = sv.clone(); }
190                        }
191                        _ => {}
192                    }
193                }
194                "IdentifiedObject.mRID" => {
195                    match val {
196                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.m_rid = sv.clone(); }
197                        crate::base::FieldValue::TextList(svs) => {
198                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.m_rid = sv.clone(); }
199                        }
200                        _ => {}
201                    }
202                }
203                "IdentifiedObject.name" => {
204                    match val {
205                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.name = sv.clone(); }
206                        crate::base::FieldValue::TextList(svs) => {
207                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.name = sv.clone(); }
208                        }
209                        _ => {}
210                    }
211                }
212                "IdentifiedObject.shortName" => {
213                    match val {
214                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.short_name = sv.clone(); }
215                        crate::base::FieldValue::TextList(svs) => {
216                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.short_name = sv.clone(); }
217                        }
218                        _ => {}
219                    }
220                }
221                _ => {}
222            }
223        }
224        obj
225    }
226}