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),
39 ControllableResource(SrId),
41}
42
43impl std::fmt::Display for NeloId {
44 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45 f.write_str(&self.0)
46 }
47}
48impl std::fmt::Display for SrId {
49 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
50 f.write_str(&self.0)
51 }
52}
53impl std::fmt::Display for LocationId {
54 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
55 match self {
56 LocationId::NetworkLocation(id) => id.fmt(f),
57 LocationId::ControllableResource(id) => id.fmt(f),
58 }
59 }
60}
61
62#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
66pub struct MaximumPowerValue(pub String);
67
68#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
70#[serde(rename_all = "camelCase")]
71pub struct CommandControl {
72 pub maximum_power_value: MaximumPowerValue,
74 pub execution_time_from: String,
76 #[serde(skip_serializing_if = "Option::is_none")]
78 pub execution_time_until: Option<String>,
79}
80
81#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
83#[serde(rename_all = "camelCase")]
84pub struct CommandRegular {
85 pub execution_time_from: String,
87}
88
89#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
91pub enum ReasonNegative {
92 #[serde(rename = "communicationFailure")]
94 CommunicationFailure,
95 #[serde(rename = "overload")]
97 Overload,
98 #[serde(rename = "unable")]
100 Unable,
101}
102
103#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
105pub enum StateNegative {
106 #[serde(rename = "failed")]
108 Failed,
109}
110
111#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
113pub enum StatePositive {
114 #[serde(rename = "succeeded")]
116 Succeeded,
117}
118
119#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
121pub enum PreliminaryStatePositive {
122 #[serde(rename = "possible")]
124 Possible,
125}
126
127#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
129pub enum StateUnknown {
130 #[serde(rename = "unknown")]
132 Unknown,
133}
134
135#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
139pub struct MaloId(pub String);
140
141#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
143pub struct MeloId(pub String);
144
145#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
147pub struct TrId(pub String);
148
149#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
151pub enum EnergyDirection {
152 #[serde(rename = "consumption")]
154 Consumption,
155 #[serde(rename = "production")]
157 Production,
158}
159
160#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
162pub enum MeasurementTechnologyClassification {
163 #[serde(rename = "intelligentMeasuringSystem")]
165 IntelligentMeasuringSystem,
166 #[serde(rename = "conventionalMeasuringSystem")]
168 ConventionalMeasuringSystem,
169 #[serde(rename = "noMeasurement")]
171 NoMeasurement,
172}
173
174#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
176pub enum OptionalChangeForecastBasis {
177 #[serde(rename = "possible")]
179 Possible,
180 #[serde(rename = "notPossible")]
182 NotPossible,
183}
184
185#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
187pub enum MarketLocationProperty {
188 #[serde(rename = "customerFacility")]
190 CustomerFacility,
191 #[serde(rename = "nonActice")]
193 NonActive,
194 #[serde(rename = "standard")]
196 Standard,
197}
198
199#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
201pub enum ProportionType {
202 #[serde(rename = "bilateralAgreement")]
204 BilateralAgreement,
205 #[serde(rename = "percent")]
207 Percent,
208}
209
210#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
212#[serde(rename_all = "camelCase")]
213pub struct IdentificationParameter {
214 pub identification_date_time: String,
216 pub energy_direction: EnergyDirection,
218 #[serde(skip_serializing_if = "Option::is_none")]
220 pub identification_parameter_id: Option<IdentificationParameterId>,
221 pub identification_parameter_address: IdentificationParameterAddress,
223}
224
225#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
227#[serde(rename_all = "camelCase")]
228pub struct IdentificationParameterId {
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub malo_id: Option<MaloId>,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub tranchen_ids: Option<Vec<String>>,
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub melo_ids: Option<Vec<MeloId>>,
238 #[serde(skip_serializing_if = "Option::is_none")]
240 pub meter_numbers: Option<Vec<String>>,
241 #[serde(skip_serializing_if = "Option::is_none")]
243 pub customer_number: Option<String>,
244}
245
246#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
248#[serde(rename_all = "camelCase")]
249pub struct IdentificationParameterAddress {
250 #[serde(skip_serializing_if = "Option::is_none")]
252 pub name: Option<PersonName>,
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub address: Option<PostalAddress>,
256}
257
258#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
260#[serde(rename_all = "camelCase")]
261pub struct PersonName {
262 #[serde(skip_serializing_if = "Option::is_none")]
264 pub surnames: Option<String>,
265 #[serde(skip_serializing_if = "Option::is_none")]
267 pub firstnames: Option<String>,
268 #[serde(skip_serializing_if = "Option::is_none")]
270 pub title: Option<String>,
271 #[serde(skip_serializing_if = "Option::is_none")]
273 pub company: Option<String>,
274}
275
276#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
278#[serde(rename_all = "camelCase")]
279pub struct PostalAddress {
280 #[serde(skip_serializing_if = "Option::is_none")]
282 pub country_code: Option<String>,
283 #[serde(skip_serializing_if = "Option::is_none")]
285 pub zip_code: Option<String>,
286 #[serde(skip_serializing_if = "Option::is_none")]
288 pub city: Option<String>,
289 #[serde(skip_serializing_if = "Option::is_none")]
291 pub street: Option<String>,
292 #[serde(skip_serializing_if = "Option::is_none")]
294 pub house_number: Option<i32>,
295 #[serde(skip_serializing_if = "Option::is_none")]
297 pub house_number_addition: Option<String>,
298}
299
300#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
305#[serde(rename_all = "camelCase")]
306pub struct MaloIdentResultPositive {
307 pub data_market_location: DataMarketLocation,
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub data_tranches: Option<Vec<DataTranche>>,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub data_meter_locations: Option<Vec<DataMeterLocation>>,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub data_technical_resources: Option<Vec<DataTechnicalResource>>,
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub data_controllable_resources: Option<Vec<DataControllableResource>>,
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub data_network_locations: Option<Vec<DataNetworkLocation>>,
324}
325
326#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
328#[serde(rename_all = "camelCase")]
329pub struct MaloIdentResultNegative {
330 pub decision_tree: String,
332 pub response_code: String,
334 #[serde(skip_serializing_if = "Option::is_none")]
336 pub reason: Option<String>,
337 #[serde(skip_serializing_if = "Option::is_none")]
339 pub network_operator: Option<MarketPartnerId>,
340}
341
342#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
344#[serde(rename_all = "camelCase")]
345pub struct DataMarketLocation {
346 pub malo_id: MaloId,
348 pub energy_direction: EnergyDirection,
350 pub measurement_technology_classification: MeasurementTechnologyClassification,
352 pub optional_change_forecast_basis: OptionalChangeForecastBasis,
354 pub data_market_location_properties: Vec<MarketLocationProperties>,
356 pub data_market_location_network_operators: Vec<TimeSlicedMarketPartner>,
358 pub data_market_location_transmission_system_operators: Vec<TimeSlicedMarketPartner>,
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub data_market_location_measuring_point_operators: Option<Vec<TimeSlicedMarketPartner>>,
363 #[serde(skip_serializing_if = "Option::is_none")]
365 pub data_market_location_suppliers: Option<Vec<TimeSlicedMarketPartner>>,
366 #[serde(skip_serializing_if = "Option::is_none")]
368 pub data_market_location_name: Option<PersonName>,
369 #[serde(skip_serializing_if = "Option::is_none")]
371 pub data_market_location_address: Option<PostalAddress>,
372}
373
374#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
376#[serde(rename_all = "camelCase")]
377pub struct TimeSlicedMarketPartner {
378 pub market_partner_id: MarketPartnerId,
380 pub execution_time_from: String,
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub execution_time_until: Option<String>,
385}
386
387#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
389#[serde(rename_all = "camelCase")]
390pub struct MarketLocationProperties {
391 pub market_location_property: MarketLocationProperty,
393 pub execution_time_from: String,
395 #[serde(skip_serializing_if = "Option::is_none")]
397 pub execution_time_until: Option<String>,
398}
399
400#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
402#[serde(rename_all = "camelCase")]
403pub struct DataMeterLocation {
404 pub melo_id: MeloId,
406 pub meter_number: String,
408 pub data_meter_location_measuring_point_operators: Vec<TimeSlicedMarketPartner>,
410}
411
412#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
414#[serde(rename_all = "camelCase")]
415pub struct DataTechnicalResource {
416 pub tr_id: TrId,
418}
419
420#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
422#[serde(rename_all = "camelCase")]
423pub struct DataControllableResource {
424 pub sr_id: SrId,
426 #[serde(skip_serializing_if = "Option::is_none")]
428 pub data_controllable_resource_measuring_point_operators: Option<Vec<SrMarketPartner>>,
429}
430
431#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
433#[serde(rename_all = "camelCase")]
434pub struct SrMarketPartner {
435 pub market_partner_id: MarketPartnerId,
437 pub execution_time_from: String,
439 #[serde(skip_serializing_if = "Option::is_none")]
441 pub execution_time_until: Option<String>,
442 pub market_partner_type_sr: String,
444}
445
446#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
448#[serde(rename_all = "camelCase")]
449pub struct DataNetworkLocation {
450 pub nelo_id: NeloId,
452 pub data_network_location_measuring_point_operators: Vec<TimeSlicedMarketPartner>,
454}
455
456#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
458#[serde(rename_all = "camelCase")]
459pub struct DataTranche {
460 pub tranchen_id: String,
462 pub proportion: ProportionType,
464 #[serde(skip_serializing_if = "Option::is_none")]
466 pub percent: Option<f64>,
467 pub data_tranche_suppliers: Vec<TimeSlicedMarketPartner>,
469}
470
471#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
477#[serde(rename_all = "camelCase")]
478pub enum WimDeviceCategory {
479 #[serde(rename = "iMSys")]
481 IMSys,
482 #[serde(rename = "mME")]
484 Mme,
485 #[serde(rename = "mME+KME")]
487 MmeKme,
488}
489
490#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
492#[serde(rename_all = "camelCase")]
493pub enum WimRejectionReason {
494 #[serde(rename = "meloUnknown")]
496 MeloUnknown,
497 #[serde(rename = "notResponsible")]
499 NotResponsible,
500 #[serde(rename = "deviceCategoryNotSupported")]
502 DeviceCategoryNotSupported,
503 #[serde(rename = "rolloutPreconditionNotMet")]
505 RolloutPreconditionNotMet,
506 #[serde(rename = "capacityExhausted")]
508 CapacityExhausted,
509 #[serde(rename = "other")]
511 Other,
512}
513
514#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
518#[serde(rename_all = "camelCase")]
519pub struct WimAnmeldungRequest {
520 pub melo_id: String,
522 pub netzbetreiber_id: i64,
524 pub process_date: String,
526 pub device_category: WimDeviceCategory,
528 #[serde(skip_serializing_if = "Option::is_none")]
530 pub notes: Option<String>,
531}
532
533#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
537#[serde(rename_all = "camelCase")]
538pub struct WimBestaetigung {
539 pub reference_id: Uuid,
541 pub confirmed_process_date: String,
543 #[serde(skip_serializing_if = "Option::is_none")]
545 pub device_id: Option<String>,
546}
547
548#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
552#[serde(rename_all = "camelCase")]
553pub struct WimAblehnung {
554 pub reference_id: Uuid,
556 pub reason: WimRejectionReason,
558 #[serde(skip_serializing_if = "Option::is_none")]
560 pub reason_text: Option<String>,
561}