1use serde::{Deserialize, Serialize};
12use uuid::Uuid;
13
14pub type TransactionId = Uuid;
18pub type InitialTransactionId = Uuid;
20pub type ReferenceId = Uuid;
22pub type MarketPartnerId = i64;
24
25#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
27pub struct NeloId(pub String);
28
29#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
31pub struct SrId(pub String);
32
33#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
35#[serde(untagged)]
36pub enum LocationId {
37 NetworkLocation(NeloId),
38 ControllableResource(SrId),
39}
40
41impl std::fmt::Display for NeloId {
42 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43 f.write_str(&self.0)
44 }
45}
46impl std::fmt::Display for SrId {
47 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
48 f.write_str(&self.0)
49 }
50}
51impl std::fmt::Display for LocationId {
52 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
53 match self {
54 LocationId::NetworkLocation(id) => id.fmt(f),
55 LocationId::ControllableResource(id) => id.fmt(f),
56 }
57 }
58}
59
60#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
64pub struct MaximumPowerValue(pub String);
65
66#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
68#[serde(rename_all = "camelCase")]
69pub struct CommandControl {
70 pub maximum_power_value: MaximumPowerValue,
71 pub execution_time_from: String,
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub execution_time_until: Option<String>,
76}
77
78#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
80#[serde(rename_all = "camelCase")]
81pub struct CommandRegular {
82 pub execution_time_from: String,
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
88pub enum ReasonNegative {
89 #[serde(rename = "communicationFailure")]
91 CommunicationFailure,
92 #[serde(rename = "overload")]
94 Overload,
95 #[serde(rename = "unable")]
97 Unable,
98}
99
100#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
102pub enum StateNegative {
103 #[serde(rename = "failed")]
104 Failed,
105}
106
107#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
109pub enum StatePositive {
110 #[serde(rename = "succeeded")]
111 Succeeded,
112}
113
114#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
116pub enum PreliminaryStatePositive {
117 #[serde(rename = "possible")]
118 Possible,
119}
120
121#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
123pub enum StateUnknown {
124 #[serde(rename = "unknown")]
125 Unknown,
126}
127
128#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
132pub struct MaloId(pub String);
133
134#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
136pub struct MeloId(pub String);
137
138#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
140pub struct TrId(pub String);
141
142#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
144pub enum EnergyDirection {
145 #[serde(rename = "consumption")]
146 Consumption,
147 #[serde(rename = "production")]
148 Production,
149}
150
151#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
153pub enum MeasurementTechnologyClassification {
154 #[serde(rename = "intelligentMeasuringSystem")]
155 IntelligentMeasuringSystem,
156 #[serde(rename = "conventionalMeasuringSystem")]
157 ConventionalMeasuringSystem,
158 #[serde(rename = "noMeasurement")]
159 NoMeasurement,
160}
161
162#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
164pub enum OptionalChangeForecastBasis {
165 #[serde(rename = "possible")]
166 Possible,
167 #[serde(rename = "notPossible")]
168 NotPossible,
169}
170
171#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
173pub enum MarketLocationProperty {
174 #[serde(rename = "customerFacility")]
175 CustomerFacility,
176 #[serde(rename = "nonActice")]
178 NonActive,
179 #[serde(rename = "standard")]
180 Standard,
181}
182
183#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
185pub enum ProportionType {
186 #[serde(rename = "bilateralAgreement")]
187 BilateralAgreement,
188 #[serde(rename = "percent")]
189 Percent,
190}
191
192#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
194#[serde(rename_all = "camelCase")]
195pub struct IdentificationParameter {
196 pub identification_date_time: String,
198 pub energy_direction: EnergyDirection,
199 #[serde(skip_serializing_if = "Option::is_none")]
201 pub identification_parameter_id: Option<IdentificationParameterId>,
202 pub identification_parameter_address: IdentificationParameterAddress,
204}
205
206#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
208#[serde(rename_all = "camelCase")]
209pub struct IdentificationParameterId {
210 #[serde(skip_serializing_if = "Option::is_none")]
211 pub malo_id: Option<MaloId>,
212 #[serde(skip_serializing_if = "Option::is_none")]
213 pub tranchen_ids: Option<Vec<String>>,
214 #[serde(skip_serializing_if = "Option::is_none")]
215 pub melo_ids: Option<Vec<MeloId>>,
216 #[serde(skip_serializing_if = "Option::is_none")]
217 pub meter_numbers: Option<Vec<String>>,
218 #[serde(skip_serializing_if = "Option::is_none")]
219 pub customer_number: Option<String>,
220}
221
222#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
224#[serde(rename_all = "camelCase")]
225pub struct IdentificationParameterAddress {
226 #[serde(skip_serializing_if = "Option::is_none")]
227 pub name: Option<PersonName>,
228 #[serde(skip_serializing_if = "Option::is_none")]
229 pub address: Option<PostalAddress>,
230}
231
232#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
234#[serde(rename_all = "camelCase")]
235pub struct PersonName {
236 #[serde(skip_serializing_if = "Option::is_none")]
237 pub surnames: Option<String>,
238 #[serde(skip_serializing_if = "Option::is_none")]
239 pub firstnames: Option<String>,
240 #[serde(skip_serializing_if = "Option::is_none")]
241 pub title: Option<String>,
242 #[serde(skip_serializing_if = "Option::is_none")]
243 pub company: Option<String>,
244}
245
246#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
248#[serde(rename_all = "camelCase")]
249pub struct PostalAddress {
250 #[serde(skip_serializing_if = "Option::is_none")]
251 pub country_code: Option<String>,
252 #[serde(skip_serializing_if = "Option::is_none")]
253 pub zip_code: Option<String>,
254 #[serde(skip_serializing_if = "Option::is_none")]
255 pub city: Option<String>,
256 #[serde(skip_serializing_if = "Option::is_none")]
257 pub street: Option<String>,
258 #[serde(skip_serializing_if = "Option::is_none")]
259 pub house_number: Option<i32>,
260 #[serde(skip_serializing_if = "Option::is_none")]
261 pub house_number_addition: Option<String>,
262}
263
264#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
269#[serde(rename_all = "camelCase")]
270pub struct MaloIdentResultPositive {
271 pub data_market_location: DataMarketLocation,
272 #[serde(skip_serializing_if = "Option::is_none")]
273 pub data_tranches: Option<Vec<DataTranche>>,
274 #[serde(skip_serializing_if = "Option::is_none")]
275 pub data_meter_locations: Option<Vec<DataMeterLocation>>,
276 #[serde(skip_serializing_if = "Option::is_none")]
277 pub data_technical_resources: Option<Vec<DataTechnicalResource>>,
278 #[serde(skip_serializing_if = "Option::is_none")]
279 pub data_controllable_resources: Option<Vec<DataControllableResource>>,
280 #[serde(skip_serializing_if = "Option::is_none")]
281 pub data_network_locations: Option<Vec<DataNetworkLocation>>,
282}
283
284#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
286#[serde(rename_all = "camelCase")]
287pub struct MaloIdentResultNegative {
288 pub decision_tree: String,
290 pub response_code: String,
292 #[serde(skip_serializing_if = "Option::is_none")]
293 pub reason: Option<String>,
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub network_operator: Option<MarketPartnerId>,
297}
298
299#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
301#[serde(rename_all = "camelCase")]
302pub struct DataMarketLocation {
303 pub malo_id: MaloId,
304 pub energy_direction: EnergyDirection,
305 pub measurement_technology_classification: MeasurementTechnologyClassification,
306 pub optional_change_forecast_basis: OptionalChangeForecastBasis,
307 pub data_market_location_properties: Vec<MarketLocationProperties>,
308 pub data_market_location_network_operators: Vec<TimeSlicedMarketPartner>,
309 pub data_market_location_transmission_system_operators: Vec<TimeSlicedMarketPartner>,
310 #[serde(skip_serializing_if = "Option::is_none")]
311 pub data_market_location_measuring_point_operators: Option<Vec<TimeSlicedMarketPartner>>,
312 #[serde(skip_serializing_if = "Option::is_none")]
313 pub data_market_location_suppliers: Option<Vec<TimeSlicedMarketPartner>>,
314 #[serde(skip_serializing_if = "Option::is_none")]
315 pub data_market_location_name: Option<PersonName>,
316 #[serde(skip_serializing_if = "Option::is_none")]
317 pub data_market_location_address: Option<PostalAddress>,
318}
319
320#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
322#[serde(rename_all = "camelCase")]
323pub struct TimeSlicedMarketPartner {
324 pub market_partner_id: MarketPartnerId,
325 pub execution_time_from: String,
326 #[serde(skip_serializing_if = "Option::is_none")]
327 pub execution_time_until: Option<String>,
328}
329
330#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
332#[serde(rename_all = "camelCase")]
333pub struct MarketLocationProperties {
334 pub market_location_property: MarketLocationProperty,
335 pub execution_time_from: String,
336 #[serde(skip_serializing_if = "Option::is_none")]
337 pub execution_time_until: Option<String>,
338}
339
340#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
342#[serde(rename_all = "camelCase")]
343pub struct DataMeterLocation {
344 pub melo_id: MeloId,
345 pub meter_number: String,
346 pub data_meter_location_measuring_point_operators: Vec<TimeSlicedMarketPartner>,
347}
348
349#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
351#[serde(rename_all = "camelCase")]
352pub struct DataTechnicalResource {
353 pub tr_id: TrId,
354}
355
356#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
358#[serde(rename_all = "camelCase")]
359pub struct DataControllableResource {
360 pub sr_id: SrId,
361 #[serde(skip_serializing_if = "Option::is_none")]
362 pub data_controllable_resource_measuring_point_operators: Option<Vec<SrMarketPartner>>,
363}
364
365#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
367#[serde(rename_all = "camelCase")]
368pub struct SrMarketPartner {
369 pub market_partner_id: MarketPartnerId,
370 pub execution_time_from: String,
371 #[serde(skip_serializing_if = "Option::is_none")]
372 pub execution_time_until: Option<String>,
373 pub market_partner_type_sr: String,
374}
375
376#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
378#[serde(rename_all = "camelCase")]
379pub struct DataNetworkLocation {
380 pub nelo_id: NeloId,
381 pub data_network_location_measuring_point_operators: Vec<TimeSlicedMarketPartner>,
382}
383
384#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
386#[serde(rename_all = "camelCase")]
387pub struct DataTranche {
388 pub tranchen_id: String,
389 pub proportion: ProportionType,
390 #[serde(skip_serializing_if = "Option::is_none")]
391 pub percent: Option<f64>,
392 pub data_tranche_suppliers: Vec<TimeSlicedMarketPartner>,
393}
394
395#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
401#[serde(rename_all = "camelCase")]
402pub enum WimDeviceCategory {
403 #[serde(rename = "iMSys")]
405 IMSys,
406 #[serde(rename = "mME")]
408 Mme,
409 #[serde(rename = "mME+KME")]
411 MmeKme,
412}
413
414#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
416#[serde(rename_all = "camelCase")]
417pub enum WimRejectionReason {
418 #[serde(rename = "meloUnknown")]
420 MeloUnknown,
421 #[serde(rename = "notResponsible")]
423 NotResponsible,
424 #[serde(rename = "deviceCategoryNotSupported")]
426 DeviceCategoryNotSupported,
427 #[serde(rename = "rolloutPreconditionNotMet")]
429 RolloutPreconditionNotMet,
430 #[serde(rename = "capacityExhausted")]
432 CapacityExhausted,
433 #[serde(rename = "other")]
435 Other,
436}
437
438#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
442#[serde(rename_all = "camelCase")]
443pub struct WimAnmeldungRequest {
444 pub melo_id: String,
446 pub netzbetreiber_id: i64,
448 pub process_date: String,
450 pub device_category: WimDeviceCategory,
452 #[serde(skip_serializing_if = "Option::is_none")]
454 pub notes: Option<String>,
455}
456
457#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
461#[serde(rename_all = "camelCase")]
462pub struct WimBestaetigung {
463 pub reference_id: Uuid,
465 pub confirmed_process_date: String,
467 #[serde(skip_serializing_if = "Option::is_none")]
469 pub device_id: Option<String>,
470}
471
472#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
476#[serde(rename_all = "camelCase")]
477pub struct WimAblehnung {
478 pub reference_id: Uuid,
480 pub reason: WimRejectionReason,
482 #[serde(skip_serializing_if = "Option::is_none")]
484 pub reason_text: Option<String>,
485}