1use serde::{Deserialize, Serialize};
12use uuid::Uuid;
13
14pub type TransactionId = Uuid;
18pub type InitialTransactionId = Uuid;
20pub type ReferenceId = Uuid;
22pub use rubo4e::identifiers::MarktpartnerId as MarketPartnerId;
27
28pub use rubo4e::identifiers::NeloId;
30
31pub use rubo4e::identifiers::SrId;
33
34#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
36#[serde(untagged)]
37pub enum LocationId {
38 NetworkLocation(NeloId),
40 ControllableResource(SrId),
42}
43
44impl std::fmt::Display for LocationId {
45 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46 match self {
47 LocationId::NetworkLocation(id) => id.fmt(f),
48 LocationId::ControllableResource(id) => id.fmt(f),
49 }
50 }
51}
52
53#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57pub struct MaximumPowerValue(pub String);
58
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
61#[serde(rename_all = "camelCase")]
62pub struct CommandControl {
63 pub maximum_power_value: MaximumPowerValue,
65 pub execution_time_from: String,
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub execution_time_until: Option<String>,
70}
71
72#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct CommandRegular {
76 pub execution_time_from: String,
78}
79
80#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
82pub enum ReasonNegative {
83 #[serde(rename = "communicationFailure")]
85 CommunicationFailure,
86 #[serde(rename = "overload")]
88 Overload,
89 #[serde(rename = "unable")]
91 Unable,
92}
93
94#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
96pub enum StateNegative {
97 #[serde(rename = "failed")]
99 Failed,
100}
101
102#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
104pub enum StatePositive {
105 #[serde(rename = "succeeded")]
107 Succeeded,
108}
109
110#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
112pub enum PreliminaryStatePositive {
113 #[serde(rename = "possible")]
115 Possible,
116}
117
118#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
120pub enum StateUnknown {
121 #[serde(rename = "unknown")]
123 Unknown,
124}
125
126pub use rubo4e::identifiers::MaloId;
135
136pub use rubo4e::identifiers::MeloId;
139
140pub use rubo4e::identifiers::TrId;
142
143#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
145pub enum EnergyDirection {
146 #[serde(rename = "consumption")]
148 Consumption,
149 #[serde(rename = "production")]
151 Production,
152}
153
154#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
156pub enum MeasurementTechnologyClassification {
157 #[serde(rename = "intelligentMeasuringSystem")]
159 IntelligentMeasuringSystem,
160 #[serde(rename = "conventionalMeasuringSystem")]
162 ConventionalMeasuringSystem,
163 #[serde(rename = "noMeasurement")]
165 NoMeasurement,
166}
167
168#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
170pub enum OptionalChangeForecastBasis {
171 #[serde(rename = "possible")]
173 Possible,
174 #[serde(rename = "notPossible")]
176 NotPossible,
177}
178
179#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
181pub enum MarketLocationProperty {
182 #[serde(rename = "customerFacility")]
184 CustomerFacility,
185 #[serde(rename = "nonActice")]
187 NonActive,
188 #[serde(rename = "standard")]
190 Standard,
191}
192
193#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
195pub enum ProportionType {
196 #[serde(rename = "bilateralAgreement")]
198 BilateralAgreement,
199 #[serde(rename = "percent")]
201 Percent,
202}
203
204#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
206#[serde(rename_all = "camelCase")]
207pub struct IdentificationParameter {
208 pub identification_date_time: String,
210 pub energy_direction: EnergyDirection,
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub identification_parameter_id: Option<IdentificationParameterId>,
215 pub identification_parameter_address: IdentificationParameterAddress,
217}
218
219#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
221#[serde(rename_all = "camelCase")]
222pub struct IdentificationParameterId {
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub malo_id: Option<MaloId>,
226 #[serde(skip_serializing_if = "Option::is_none")]
228 pub tranchen_ids: Option<Vec<String>>,
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub melo_ids: Option<Vec<MeloId>>,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub meter_numbers: Option<Vec<String>>,
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub customer_number: Option<String>,
238}
239
240#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
242#[serde(rename_all = "camelCase")]
243pub struct IdentificationParameterAddress {
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub name: Option<PersonName>,
247 #[serde(skip_serializing_if = "Option::is_none")]
249 pub address: Option<PostalAddress>,
250}
251
252#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
254#[serde(rename_all = "camelCase")]
255pub struct PersonName {
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub surnames: Option<String>,
259 #[serde(skip_serializing_if = "Option::is_none")]
261 pub firstnames: Option<String>,
262 #[serde(skip_serializing_if = "Option::is_none")]
264 pub title: Option<String>,
265 #[serde(skip_serializing_if = "Option::is_none")]
267 pub company: Option<String>,
268}
269
270#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
272#[serde(rename_all = "camelCase")]
273pub struct PostalAddress {
274 #[serde(skip_serializing_if = "Option::is_none")]
276 pub country_code: Option<String>,
277 #[serde(skip_serializing_if = "Option::is_none")]
279 pub zip_code: Option<String>,
280 #[serde(skip_serializing_if = "Option::is_none")]
282 pub city: Option<String>,
283 #[serde(skip_serializing_if = "Option::is_none")]
285 pub street: Option<String>,
286 #[serde(skip_serializing_if = "Option::is_none")]
288 pub house_number: Option<i32>,
289 #[serde(skip_serializing_if = "Option::is_none")]
291 pub house_number_addition: Option<String>,
292}
293
294#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
299#[serde(rename_all = "camelCase")]
300pub struct MaloIdentResultPositive {
301 pub data_market_location: DataMarketLocation,
303 #[serde(skip_serializing_if = "Option::is_none")]
305 pub data_tranches: Option<Vec<DataTranche>>,
306 #[serde(skip_serializing_if = "Option::is_none")]
308 pub data_meter_locations: Option<Vec<DataMeterLocation>>,
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub data_technical_resources: Option<Vec<DataTechnicalResource>>,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub data_controllable_resources: Option<Vec<DataControllableResource>>,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub data_network_locations: Option<Vec<DataNetworkLocation>>,
318}
319
320#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
322#[serde(rename_all = "camelCase")]
323pub struct MaloIdentResultNegative {
324 pub decision_tree: String,
326 pub response_code: String,
328 #[serde(skip_serializing_if = "Option::is_none")]
330 pub reason: Option<String>,
331 #[serde(skip_serializing_if = "Option::is_none")]
333 pub network_operator: Option<MarketPartnerId>,
334}
335
336#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
338#[serde(rename_all = "camelCase")]
339pub struct DataMarketLocation {
340 pub malo_id: MaloId,
342 pub energy_direction: EnergyDirection,
344 pub measurement_technology_classification: MeasurementTechnologyClassification,
346 pub optional_change_forecast_basis: OptionalChangeForecastBasis,
348 pub data_market_location_properties: Vec<MarketLocationProperties>,
350 pub data_market_location_network_operators: Vec<TimeSlicedMarketPartner>,
352 pub data_market_location_transmission_system_operators: Vec<TimeSlicedMarketPartner>,
354 #[serde(skip_serializing_if = "Option::is_none")]
356 pub data_market_location_measuring_point_operators: Option<Vec<TimeSlicedMarketPartner>>,
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub data_market_location_suppliers: Option<Vec<TimeSlicedMarketPartner>>,
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub data_market_location_name: Option<PersonName>,
363 #[serde(skip_serializing_if = "Option::is_none")]
365 pub data_market_location_address: Option<PostalAddress>,
366}
367
368#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
370#[serde(rename_all = "camelCase")]
371pub struct TimeSlicedMarketPartner {
372 pub market_partner_id: MarketPartnerId,
374 pub execution_time_from: String,
376 #[serde(skip_serializing_if = "Option::is_none")]
378 pub execution_time_until: Option<String>,
379}
380
381#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
383#[serde(rename_all = "camelCase")]
384pub struct MarketLocationProperties {
385 pub market_location_property: MarketLocationProperty,
387 pub execution_time_from: String,
389 #[serde(skip_serializing_if = "Option::is_none")]
391 pub execution_time_until: Option<String>,
392}
393
394#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
396#[serde(rename_all = "camelCase")]
397pub struct DataMeterLocation {
398 pub melo_id: MeloId,
400 pub meter_number: String,
402 pub data_meter_location_measuring_point_operators: Vec<TimeSlicedMarketPartner>,
404}
405
406#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
408#[serde(rename_all = "camelCase")]
409pub struct DataTechnicalResource {
410 pub tr_id: TrId,
412}
413
414#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
416#[serde(rename_all = "camelCase")]
417pub struct DataControllableResource {
418 pub sr_id: SrId,
420 #[serde(skip_serializing_if = "Option::is_none")]
422 pub data_controllable_resource_measuring_point_operators: Option<Vec<SrMarketPartner>>,
423}
424
425#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
427#[serde(rename_all = "camelCase")]
428pub struct SrMarketPartner {
429 pub market_partner_id: MarketPartnerId,
431 pub execution_time_from: String,
433 #[serde(skip_serializing_if = "Option::is_none")]
435 pub execution_time_until: Option<String>,
436 pub market_partner_type_sr: String,
438}
439
440#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
442#[serde(rename_all = "camelCase")]
443pub struct DataNetworkLocation {
444 pub nelo_id: NeloId,
446 pub data_network_location_measuring_point_operators: Vec<TimeSlicedMarketPartner>,
448}
449
450#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
452#[serde(rename_all = "camelCase")]
453pub struct DataTranche {
454 pub tranchen_id: String,
456 pub proportion: ProportionType,
458 #[serde(skip_serializing_if = "Option::is_none")]
460 pub percent: Option<f64>,
461 pub data_tranche_suppliers: Vec<TimeSlicedMarketPartner>,
463}
464
465#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
471#[serde(rename_all = "camelCase")]
472pub enum WimDeviceCategory {
473 #[serde(rename = "iMSys")]
475 IMSys,
476 #[serde(rename = "mME")]
478 Mme,
479 #[serde(rename = "mME+KME")]
481 MmeKme,
482}
483
484#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
486#[serde(rename_all = "camelCase")]
487pub enum WimRejectionReason {
488 #[serde(rename = "meloUnknown")]
490 MeloUnknown,
491 #[serde(rename = "notResponsible")]
493 NotResponsible,
494 #[serde(rename = "deviceCategoryNotSupported")]
496 DeviceCategoryNotSupported,
497 #[serde(rename = "rolloutPreconditionNotMet")]
499 RolloutPreconditionNotMet,
500 #[serde(rename = "capacityExhausted")]
502 CapacityExhausted,
503 #[serde(rename = "other")]
505 Other,
506}
507
508#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
512#[serde(rename_all = "camelCase")]
513pub struct WimAnmeldungRequest {
514 pub melo_id: String,
516 pub netzbetreiber_id: i64,
518 pub process_date: String,
520 pub device_category: WimDeviceCategory,
522 #[serde(skip_serializing_if = "Option::is_none")]
524 pub notes: Option<String>,
525}
526
527#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
531#[serde(rename_all = "camelCase")]
532pub struct WimBestaetigung {
533 pub reference_id: Uuid,
535 pub confirmed_process_date: String,
537 #[serde(skip_serializing_if = "Option::is_none")]
539 pub device_id: Option<String>,
540}
541
542#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
546#[serde(rename_all = "camelCase")]
547pub struct WimAblehnung {
548 pub reference_id: Uuid,
550 pub reason: WimRejectionReason,
552 #[serde(skip_serializing_if = "Option::is_none")]
554 pub reason_text: Option<String>,
555}