s2-python 0.4.1__py3-none-any.whl → 0.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. {s2_python-0.4.1.dist-info → s2_python-0.6.0.dist-info}/METADATA +17 -12
  2. s2_python-0.6.0.dist-info/RECORD +89 -0
  3. {s2_python-0.4.1.dist-info → s2_python-0.6.0.dist-info}/WHEEL +1 -1
  4. s2_python-0.6.0.dist-info/licenses/LICENSE +201 -0
  5. s2python/common/__init__.py +32 -0
  6. s2python/common/duration.py +3 -1
  7. s2python/common/handshake.py +2 -2
  8. s2python/common/handshake_response.py +2 -2
  9. s2python/common/instruction_status_update.py +3 -3
  10. s2python/common/number_range.py +5 -2
  11. s2python/common/power_forecast.py +3 -3
  12. s2python/common/power_forecast_element.py +28 -6
  13. s2python/common/power_forecast_value.py +1 -1
  14. s2python/common/power_measurement.py +27 -5
  15. s2python/common/power_range.py +4 -2
  16. s2python/common/power_value.py +1 -1
  17. s2python/common/reception_status.py +2 -2
  18. s2python/common/resource_manager_details.py +6 -6
  19. s2python/common/revoke_object.py +3 -3
  20. s2python/common/role.py +1 -1
  21. s2python/common/select_control_type.py +2 -2
  22. s2python/common/session_request.py +2 -2
  23. s2python/common/timer.py +3 -3
  24. s2python/common/transition.py +8 -8
  25. s2python/ddbc/__init__.py +21 -0
  26. s2python/ddbc/ddbc_actuator_description.py +30 -0
  27. s2python/ddbc/ddbc_actuator_status.py +22 -0
  28. s2python/ddbc/ddbc_average_demand_rate_forecast.py +28 -0
  29. s2python/ddbc/ddbc_average_demand_rate_forecast_element.py +21 -0
  30. s2python/ddbc/ddbc_instruction.py +19 -0
  31. s2python/ddbc/ddbc_operation_mode.py +26 -0
  32. s2python/ddbc/ddbc_system_description.py +29 -0
  33. s2python/ddbc/ddbc_timer_status.py +18 -0
  34. s2python/frbc/__init__.py +19 -3
  35. s2python/frbc/frbc_actuator_description.py +15 -9
  36. s2python/frbc/frbc_actuator_status.py +5 -5
  37. s2python/frbc/frbc_fill_level_target_profile.py +3 -3
  38. s2python/frbc/frbc_fill_level_target_profile_element.py +7 -6
  39. s2python/frbc/frbc_instruction.py +5 -5
  40. s2python/frbc/frbc_leakage_behaviour.py +3 -3
  41. s2python/frbc/frbc_leakage_behaviour_element.py +9 -6
  42. s2python/frbc/frbc_operation_mode.py +13 -6
  43. s2python/frbc/frbc_operation_mode_element.py +5 -5
  44. s2python/frbc/frbc_storage_description.py +2 -2
  45. s2python/frbc/frbc_storage_status.py +2 -2
  46. s2python/frbc/frbc_system_description.py +4 -4
  47. s2python/frbc/frbc_timer_status.py +4 -4
  48. s2python/frbc/frbc_usage_forecast.py +3 -3
  49. s2python/frbc/frbc_usage_forecast_element.py +2 -2
  50. s2python/generated/gen_s2.py +508 -543
  51. s2python/message.py +101 -6
  52. s2python/ombc/__init__.py +5 -0
  53. s2python/ombc/ombc_instruction.py +19 -0
  54. s2python/ombc/ombc_operation_mode.py +25 -0
  55. s2python/ombc/ombc_status.py +17 -0
  56. s2python/ombc/ombc_system_description.py +25 -0
  57. s2python/ombc/ombc_timer_status.py +17 -0
  58. s2python/pebc/__init__.py +21 -0
  59. s2python/pebc/pebc_allowed_limit_range.py +42 -0
  60. s2python/pebc/pebc_energy_constraint.py +25 -0
  61. s2python/pebc/pebc_instruction.py +27 -0
  62. s2python/pebc/pebc_power_constraints.py +77 -0
  63. s2python/pebc/pebc_power_envelope.py +23 -0
  64. s2python/pebc/pebc_power_envelope_element.py +16 -0
  65. s2python/ppbc/__init__.py +15 -6
  66. s2python/ppbc/ppbc_end_interruption_instruction.py +6 -8
  67. s2python/ppbc/ppbc_power_profile_definition.py +4 -6
  68. s2python/ppbc/ppbc_power_profile_status.py +2 -4
  69. s2python/ppbc/ppbc_power_sequence.py +6 -6
  70. s2python/ppbc/ppbc_power_sequence_container.py +5 -7
  71. s2python/ppbc/ppbc_power_sequence_container_status.py +7 -9
  72. s2python/ppbc/ppbc_power_sequence_element.py +3 -5
  73. s2python/ppbc/ppbc_schedule_instruction.py +6 -8
  74. s2python/ppbc/ppbc_start_interruption_instruction.py +6 -8
  75. s2python/s2_connection.py +93 -32
  76. s2python/s2_control_type.py +36 -0
  77. s2python/s2_parser.py +4 -0
  78. s2python/s2_validation_error.py +3 -1
  79. s2python/validate_values_mixin.py +29 -14
  80. s2_python-0.4.1.dist-info/RECORD +0 -66
  81. {s2_python-0.4.1.dist-info → s2_python-0.6.0.dist-info}/entry_points.txt +0 -0
  82. {s2_python-0.4.1.dist-info → s2_python-0.6.0.dist-info}/top_level.txt +0 -0
@@ -20,805 +20,782 @@ from typing_extensions import Literal
20
20
 
21
21
 
22
22
  class Duration(RootModel[conint(ge=0)]):
23
- root: conint(ge=0) = Field(..., description='Duration in milliseconds')
23
+ root: conint(ge=0) = Field( # pyright: ignore[reportInvalidTypeForm]
24
+ ..., description="Duration in milliseconds"
25
+ )
24
26
 
25
27
 
26
- class ID(RootModel[constr(pattern=r'[a-zA-Z0-9\-_:]{2,64}')]):
27
- root: constr(pattern=r'[a-zA-Z0-9\-_:]{2,64}') = Field(..., description='UUID')
28
+ class ID(RootModel[constr(pattern=r"[a-zA-Z0-9\-_:]{2,64}")]):
29
+ root: constr(pattern=r"[a-zA-Z0-9\-_:]{2,64}") = ( # pyright: ignore[reportInvalidTypeForm]
30
+ Field(..., description="UUID")
31
+ )
28
32
 
29
33
 
30
34
  class Currency(Enum):
31
- AED = 'AED'
32
- ANG = 'ANG'
33
- AUD = 'AUD'
34
- CHE = 'CHE'
35
- CHF = 'CHF'
36
- CHW = 'CHW'
37
- EUR = 'EUR'
38
- GBP = 'GBP'
39
- LBP = 'LBP'
40
- LKR = 'LKR'
41
- LRD = 'LRD'
42
- LSL = 'LSL'
43
- LYD = 'LYD'
44
- MAD = 'MAD'
45
- MDL = 'MDL'
46
- MGA = 'MGA'
47
- MKD = 'MKD'
48
- MMK = 'MMK'
49
- MNT = 'MNT'
50
- MOP = 'MOP'
51
- MRO = 'MRO'
52
- MUR = 'MUR'
53
- MVR = 'MVR'
54
- MWK = 'MWK'
55
- MXN = 'MXN'
56
- MXV = 'MXV'
57
- MYR = 'MYR'
58
- MZN = 'MZN'
59
- NAD = 'NAD'
60
- NGN = 'NGN'
61
- NIO = 'NIO'
62
- NOK = 'NOK'
63
- NPR = 'NPR'
64
- NZD = 'NZD'
65
- OMR = 'OMR'
66
- PAB = 'PAB'
67
- PEN = 'PEN'
68
- PGK = 'PGK'
69
- PHP = 'PHP'
70
- PKR = 'PKR'
71
- PLN = 'PLN'
72
- PYG = 'PYG'
73
- QAR = 'QAR'
74
- RON = 'RON'
75
- RSD = 'RSD'
76
- RUB = 'RUB'
77
- RWF = 'RWF'
78
- SAR = 'SAR'
79
- SBD = 'SBD'
80
- SCR = 'SCR'
81
- SDG = 'SDG'
82
- SEK = 'SEK'
83
- SGD = 'SGD'
84
- SHP = 'SHP'
85
- SLL = 'SLL'
86
- SOS = 'SOS'
87
- SRD = 'SRD'
88
- SSP = 'SSP'
89
- STD = 'STD'
90
- SYP = 'SYP'
91
- SZL = 'SZL'
92
- THB = 'THB'
93
- TJS = 'TJS'
94
- TMT = 'TMT'
95
- TND = 'TND'
96
- TOP = 'TOP'
97
- TRY = 'TRY'
98
- TTD = 'TTD'
99
- TWD = 'TWD'
100
- TZS = 'TZS'
101
- UAH = 'UAH'
102
- UGX = 'UGX'
103
- USD = 'USD'
104
- USN = 'USN'
105
- UYI = 'UYI'
106
- UYU = 'UYU'
107
- UZS = 'UZS'
108
- VEF = 'VEF'
109
- VND = 'VND'
110
- VUV = 'VUV'
111
- WST = 'WST'
112
- XAG = 'XAG'
113
- XAU = 'XAU'
114
- XBA = 'XBA'
115
- XBB = 'XBB'
116
- XBC = 'XBC'
117
- XBD = 'XBD'
118
- XCD = 'XCD'
119
- XOF = 'XOF'
120
- XPD = 'XPD'
121
- XPF = 'XPF'
122
- XPT = 'XPT'
123
- XSU = 'XSU'
124
- XTS = 'XTS'
125
- XUA = 'XUA'
126
- XXX = 'XXX'
127
- YER = 'YER'
128
- ZAR = 'ZAR'
129
- ZMW = 'ZMW'
130
- ZWL = 'ZWL'
35
+ AED = "AED"
36
+ ANG = "ANG"
37
+ AUD = "AUD"
38
+ CHE = "CHE"
39
+ CHF = "CHF"
40
+ CHW = "CHW"
41
+ EUR = "EUR"
42
+ GBP = "GBP"
43
+ LBP = "LBP"
44
+ LKR = "LKR"
45
+ LRD = "LRD"
46
+ LSL = "LSL"
47
+ LYD = "LYD"
48
+ MAD = "MAD"
49
+ MDL = "MDL"
50
+ MGA = "MGA"
51
+ MKD = "MKD"
52
+ MMK = "MMK"
53
+ MNT = "MNT"
54
+ MOP = "MOP"
55
+ MRO = "MRO"
56
+ MUR = "MUR"
57
+ MVR = "MVR"
58
+ MWK = "MWK"
59
+ MXN = "MXN"
60
+ MXV = "MXV"
61
+ MYR = "MYR"
62
+ MZN = "MZN"
63
+ NAD = "NAD"
64
+ NGN = "NGN"
65
+ NIO = "NIO"
66
+ NOK = "NOK"
67
+ NPR = "NPR"
68
+ NZD = "NZD"
69
+ OMR = "OMR"
70
+ PAB = "PAB"
71
+ PEN = "PEN"
72
+ PGK = "PGK"
73
+ PHP = "PHP"
74
+ PKR = "PKR"
75
+ PLN = "PLN"
76
+ PYG = "PYG"
77
+ QAR = "QAR"
78
+ RON = "RON"
79
+ RSD = "RSD"
80
+ RUB = "RUB"
81
+ RWF = "RWF"
82
+ SAR = "SAR"
83
+ SBD = "SBD"
84
+ SCR = "SCR"
85
+ SDG = "SDG"
86
+ SEK = "SEK"
87
+ SGD = "SGD"
88
+ SHP = "SHP"
89
+ SLL = "SLL"
90
+ SOS = "SOS"
91
+ SRD = "SRD"
92
+ SSP = "SSP"
93
+ STD = "STD"
94
+ SYP = "SYP"
95
+ SZL = "SZL"
96
+ THB = "THB"
97
+ TJS = "TJS"
98
+ TMT = "TMT"
99
+ TND = "TND"
100
+ TOP = "TOP"
101
+ TRY = "TRY"
102
+ TTD = "TTD"
103
+ TWD = "TWD"
104
+ TZS = "TZS"
105
+ UAH = "UAH"
106
+ UGX = "UGX"
107
+ USD = "USD"
108
+ USN = "USN"
109
+ UYI = "UYI"
110
+ UYU = "UYU"
111
+ UZS = "UZS"
112
+ VEF = "VEF"
113
+ VND = "VND"
114
+ VUV = "VUV"
115
+ WST = "WST"
116
+ XAG = "XAG"
117
+ XAU = "XAU"
118
+ XBA = "XBA"
119
+ XBB = "XBB"
120
+ XBC = "XBC"
121
+ XBD = "XBD"
122
+ XCD = "XCD"
123
+ XOF = "XOF"
124
+ XPD = "XPD"
125
+ XPF = "XPF"
126
+ XPT = "XPT"
127
+ XSU = "XSU"
128
+ XTS = "XTS"
129
+ XUA = "XUA"
130
+ XXX = "XXX"
131
+ YER = "YER"
132
+ ZAR = "ZAR"
133
+ ZMW = "ZMW"
134
+ ZWL = "ZWL"
131
135
 
132
136
 
133
137
  class SessionRequestType(Enum):
134
- RECONNECT = 'RECONNECT'
135
- TERMINATE = 'TERMINATE'
138
+ RECONNECT = "RECONNECT"
139
+ TERMINATE = "TERMINATE"
136
140
 
137
141
 
138
142
  class RevokableObjects(Enum):
139
- PEBC_PowerConstraints = 'PEBC.PowerConstraints'
140
- PEBC_EnergyConstraint = 'PEBC.EnergyConstraint'
141
- PEBC_Instruction = 'PEBC.Instruction'
142
- PPBC_PowerProfileDefinition = 'PPBC.PowerProfileDefinition'
143
- PPBC_ScheduleInstruction = 'PPBC.ScheduleInstruction'
144
- PPBC_StartInterruptionInstruction = 'PPBC.StartInterruptionInstruction'
145
- PPBC_EndInterruptionInstruction = 'PPBC.EndInterruptionInstruction'
146
- OMBC_SystemDescription = 'OMBC.SystemDescription'
147
- OMBC_Instruction = 'OMBC.Instruction'
148
- FRBC_SystemDescription = 'FRBC.SystemDescription'
149
- FRBC_Instruction = 'FRBC.Instruction'
150
- DDBC_SystemDescription = 'DDBC.SystemDescription'
151
- DDBC_Instruction = 'DDBC.Instruction'
143
+ PEBC_PowerConstraints = "PEBC.PowerConstraints"
144
+ PEBC_EnergyConstraint = "PEBC.EnergyConstraint"
145
+ PEBC_Instruction = "PEBC.Instruction"
146
+ PPBC_PowerProfileDefinition = "PPBC.PowerProfileDefinition"
147
+ PPBC_ScheduleInstruction = "PPBC.ScheduleInstruction"
148
+ PPBC_StartInterruptionInstruction = "PPBC.StartInterruptionInstruction"
149
+ PPBC_EndInterruptionInstruction = "PPBC.EndInterruptionInstruction"
150
+ OMBC_SystemDescription = "OMBC.SystemDescription"
151
+ OMBC_Instruction = "OMBC.Instruction"
152
+ FRBC_SystemDescription = "FRBC.SystemDescription"
153
+ FRBC_Instruction = "FRBC.Instruction"
154
+ DDBC_SystemDescription = "DDBC.SystemDescription"
155
+ DDBC_Instruction = "DDBC.Instruction"
152
156
 
153
157
 
154
158
  class EnergyManagementRole(Enum):
155
- CEM = 'CEM'
156
- RM = 'RM'
159
+ CEM = "CEM"
160
+ RM = "RM"
157
161
 
158
162
 
159
163
  class ReceptionStatusValues(Enum):
160
- INVALID_DATA = 'INVALID_DATA'
161
- INVALID_MESSAGE = 'INVALID_MESSAGE'
162
- INVALID_CONTENT = 'INVALID_CONTENT'
163
- TEMPORARY_ERROR = 'TEMPORARY_ERROR'
164
- PERMANENT_ERROR = 'PERMANENT_ERROR'
165
- OK = 'OK'
164
+ INVALID_DATA = "INVALID_DATA"
165
+ INVALID_MESSAGE = "INVALID_MESSAGE"
166
+ INVALID_CONTENT = "INVALID_CONTENT"
167
+ TEMPORARY_ERROR = "TEMPORARY_ERROR"
168
+ PERMANENT_ERROR = "PERMANENT_ERROR"
169
+ OK = "OK"
166
170
 
167
171
 
168
172
  class NumberRange(BaseModel):
169
173
  model_config = ConfigDict(
170
- extra='forbid',
171
- )
172
- start_of_range: float = Field(
173
- ..., description='Number that defines the start of the range'
174
- )
175
- end_of_range: float = Field(
176
- ..., description='Number that defines the end of the range'
174
+ extra="forbid",
177
175
  )
176
+ start_of_range: float = Field(..., description="Number that defines the start of the range")
177
+ end_of_range: float = Field(..., description="Number that defines the end of the range")
178
178
 
179
179
 
180
180
  class Transition(BaseModel):
181
181
  model_config = ConfigDict(
182
- extra='forbid',
182
+ extra="forbid",
183
+ populate_by_name=True
183
184
  )
184
185
  id: ID = Field(
185
186
  ...,
186
- description='ID of the Transition. Must be unique in the scope of the OMBC.SystemDescription, FRBC.ActuatorDescription or DDBC.ActuatorDescription in which it is used.',
187
+ description="ID of the Transition. Must be unique in the scope of the OMBC.SystemDescription, FRBC.ActuatorDescription or DDBC.ActuatorDescription in which it is used.",
187
188
  )
188
189
  from_: ID = Field(
189
190
  ...,
190
- alias='from',
191
- description='ID of the OperationMode (exact type differs per ControlType) that should be switched from.',
191
+ alias="from",
192
+ description="ID of the OperationMode (exact type differs per ControlType) that should be switched from.",
192
193
  )
193
194
  to: ID = Field(
194
195
  ...,
195
- description='ID of the OperationMode (exact type differs per ControlType) that will be switched to.',
196
+ description="ID of the OperationMode (exact type differs per ControlType) that will be switched to.",
196
197
  )
197
198
  start_timers: List[ID] = Field(
198
199
  ...,
199
- description='List of IDs of Timers that will be (re)started when this transition is initiated',
200
+ description="List of IDs of Timers that will be (re)started when this transition is initiated",
200
201
  max_length=1000,
201
202
  min_length=0,
202
203
  )
203
204
  blocking_timers: List[ID] = Field(
204
205
  ...,
205
- description='List of IDs of Timers that block this Transition from initiating while at least one of these Timers is not yet finished',
206
+ description="List of IDs of Timers that block this Transition from initiating while at least one of these Timers is not yet finished",
206
207
  max_length=1000,
207
208
  min_length=0,
208
209
  )
209
210
  transition_costs: Optional[float] = Field(
210
211
  None,
211
- description='Absolute costs for going through this Transition in the currency as described in the ResourceManagerDetails.',
212
+ description="Absolute costs for going through this Transition in the currency as described in the ResourceManagerDetails.",
212
213
  )
213
214
  transition_duration: Optional[Duration] = Field(
214
215
  None,
215
- description='Indicates the time between the initiation of this Transition, and the time at which the device behaves according to the Operation Mode which is defined in the ‘to’ data element. When no value is provided it is assumed the transition duration is negligible.',
216
+ description="Indicates the time between the initiation of this Transition, and the time at which the device behaves according to the Operation Mode which is defined in the ‘to’ data element. When no value is provided it is assumed the transition duration is negligible.",
216
217
  )
217
218
  abnormal_condition_only: bool = Field(
218
219
  ...,
219
- description='Indicates if this Transition may only be used during an abnormal condition (see Clause )',
220
+ description="Indicates if this Transition may only be used during an abnormal condition (see Clause )",
220
221
  )
221
222
 
222
223
 
223
224
  class Timer(BaseModel):
224
225
  model_config = ConfigDict(
225
- extra='forbid',
226
+ extra="forbid",
226
227
  )
227
228
  id: ID = Field(
228
229
  ...,
229
- description='ID of the Timer. Must be unique in the scope of the OMBC.SystemDescription, FRBC.ActuatorDescription or DDBC.ActuatorDescription in which it is used.',
230
+ description="ID of the Timer. Must be unique in the scope of the OMBC.SystemDescription, FRBC.ActuatorDescription or DDBC.ActuatorDescription in which it is used.",
230
231
  )
231
232
  diagnostic_label: Optional[str] = Field(
232
233
  None,
233
- description='Human readable name/description of the Timer. This element is only intended for diagnostic purposes and not for HMI applications.',
234
+ description="Human readable name/description of the Timer. This element is only intended for diagnostic purposes and not for HMI applications.",
234
235
  )
235
236
  duration: Duration = Field(
236
237
  ...,
237
- description='The time it takes for the Timer to finish after it has been started',
238
+ description="The time it takes for the Timer to finish after it has been started",
238
239
  )
239
240
 
240
241
 
241
242
  class PEBCPowerEnvelopeElement(BaseModel):
242
243
  model_config = ConfigDict(
243
- extra='forbid',
244
+ extra="forbid",
244
245
  )
245
- duration: Duration = Field(..., description='The duration of the element')
246
+ duration: Duration = Field(..., description="The duration of the element")
246
247
  upper_limit: float = Field(
247
248
  ...,
248
- description='Upper power limit according to the commodity_quantity of the containing PEBC.PowerEnvelope. The lower_limit must be smaller or equal to the upper_limit. The Resource Manager is requested to keep the power values for the given commodity quantity equal to or below the upper_limit. The upper_limit shall be in accordance with the constraints provided by the Resource Manager through any PEBC.AllowedLimitRange with limit_type UPPER_LIMIT.',
249
+ description="Upper power limit according to the commodity_quantity of the containing PEBC.PowerEnvelope. The lower_limit must be smaller or equal to the upper_limit. The Resource Manager is requested to keep the power values for the given commodity quantity equal to or below the upper_limit. The upper_limit shall be in accordance with the constraints provided by the Resource Manager through any PEBC.AllowedLimitRange with limit_type UPPER_LIMIT.",
249
250
  )
250
251
  lower_limit: float = Field(
251
252
  ...,
252
- description='Lower power limit according to the commodity_quantity of the containing PEBC.PowerEnvelope. The lower_limit must be smaller or equal to the upper_limit. The Resource Manager is requested to keep the power values for the given commodity quantity equal to or above the lower_limit. The lower_limit shall be in accordance with the constraints provided by the Resource Manager through any PEBC.AllowedLimitRange with limit_type LOWER_LIMIT.',
253
+ description="Lower power limit according to the commodity_quantity of the containing PEBC.PowerEnvelope. The lower_limit must be smaller or equal to the upper_limit. The Resource Manager is requested to keep the power values for the given commodity quantity equal to or above the lower_limit. The lower_limit shall be in accordance with the constraints provided by the Resource Manager through any PEBC.AllowedLimitRange with limit_type LOWER_LIMIT.",
253
254
  )
254
255
 
255
256
 
256
257
  class FRBCStorageDescription(BaseModel):
257
258
  model_config = ConfigDict(
258
- extra='forbid',
259
+ extra="forbid",
259
260
  )
260
261
  diagnostic_label: Optional[str] = Field(
261
262
  None,
262
- description='Human readable name/description of the storage (e.g. hot water buffer or battery). This element is only intended for diagnostic purposes and not for HMI applications.',
263
+ description="Human readable name/description of the storage (e.g. hot water buffer or battery). This element is only intended for diagnostic purposes and not for HMI applications.",
263
264
  )
264
265
  fill_level_label: Optional[str] = Field(
265
266
  None,
266
- description='Human readable description of the (physical) units associated with the fill_level (e.g. degrees Celsius or percentage state of charge). This element is only intended for diagnostic purposes and not for HMI applications.',
267
+ description="Human readable description of the (physical) units associated with the fill_level (e.g. degrees Celsius or percentage state of charge). This element is only intended for diagnostic purposes and not for HMI applications.",
267
268
  )
268
269
  provides_leakage_behaviour: bool = Field(
269
270
  ...,
270
- description='Indicates whether the Storage could provide details of power leakage behaviour through the FRBC.LeakageBehaviour.',
271
+ description="Indicates whether the Storage could provide details of power leakage behaviour through the FRBC.LeakageBehaviour.",
271
272
  )
272
273
  provides_fill_level_target_profile: bool = Field(
273
274
  ...,
274
- description='Indicates whether the Storage could provide a target profile for the fill level through the FRBC.FillLevelTargetProfile.',
275
+ description="Indicates whether the Storage could provide a target profile for the fill level through the FRBC.FillLevelTargetProfile.",
275
276
  )
276
277
  provides_usage_forecast: bool = Field(
277
278
  ...,
278
- description='Indicates whether the Storage could provide a UsageForecast through the FRBC.UsageForecast.',
279
+ description="Indicates whether the Storage could provide a UsageForecast through the FRBC.UsageForecast.",
279
280
  )
280
281
  fill_level_range: NumberRange = Field(
281
282
  ...,
282
- description='The range in which the fill_level should remain. It is expected of the CEM to keep the fill_level within this range. When the fill_level is not within this range, the Resource Manager can ignore instructions from the CEM (except during abnormal conditions). ',
283
+ description="The range in which the fill_level should remain. It is expected of the CEM to keep the fill_level within this range. When the fill_level is not within this range, the Resource Manager can ignore instructions from the CEM (except during abnormal conditions). ",
283
284
  )
284
285
 
285
286
 
286
287
  class FRBCLeakageBehaviourElement(BaseModel):
287
288
  model_config = ConfigDict(
288
- extra='forbid',
289
+ extra="forbid",
289
290
  )
290
291
  fill_level_range: NumberRange = Field(
291
292
  ...,
292
- description='The fill level range for which this FRBC.LeakageBehaviourElement applies. The start of the range must be less than the end of the range.',
293
+ description="The fill level range for which this FRBC.LeakageBehaviourElement applies. The start of the range must be less than the end of the range.",
293
294
  )
294
295
  leakage_rate: float = Field(
295
296
  ...,
296
- description='Indicates how fast the momentary fill level will decrease per second due to leakage within the given range of the fill level. A positive value indicates that the fill level decreases over time due to leakage.',
297
+ description="Indicates how fast the momentary fill level will decrease per second due to leakage within the given range of the fill level. A positive value indicates that the fill level decreases over time due to leakage.",
297
298
  )
298
299
 
299
300
 
300
301
  class FRBCUsageForecastElement(BaseModel):
301
302
  model_config = ConfigDict(
302
- extra='forbid',
303
+ extra="forbid",
303
304
  )
304
305
  duration: Duration = Field(
305
- ..., description='Indicator for how long the given usage_rate is valid.'
306
+ ..., description="Indicator for how long the given usage_rate is valid."
306
307
  )
307
308
  usage_rate_upper_limit: Optional[float] = Field(
308
309
  None,
309
- description='The upper limit of the range with a 100 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.',
310
+ description="The upper limit of the range with a 100 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.",
310
311
  )
311
312
  usage_rate_upper_95PPR: Optional[float] = Field(
312
313
  None,
313
- description='The upper limit of the range with a 95 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.',
314
+ description="The upper limit of the range with a 95 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.",
314
315
  )
315
316
  usage_rate_upper_68PPR: Optional[float] = Field(
316
317
  None,
317
- description='The upper limit of the range with a 68 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.',
318
+ description="The upper limit of the range with a 68 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.",
318
319
  )
319
320
  usage_rate_expected: float = Field(
320
321
  ...,
321
- description='The most likely value for the usage rate; the expected increase or decrease of the fill_level per second. A positive value indicates that the fill level will decrease due to usage.',
322
+ description="The most likely value for the usage rate; the expected increase or decrease of the fill_level per second. A positive value indicates that the fill level will decrease due to usage.",
322
323
  )
323
324
  usage_rate_lower_68PPR: Optional[float] = Field(
324
325
  None,
325
- description='The lower limit of the range with a 68 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.',
326
+ description="The lower limit of the range with a 68 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.",
326
327
  )
327
328
  usage_rate_lower_95PPR: Optional[float] = Field(
328
329
  None,
329
- description='The lower limit of the range with a 95 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.',
330
+ description="The lower limit of the range with a 95 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.",
330
331
  )
331
332
  usage_rate_lower_limit: Optional[float] = Field(
332
333
  None,
333
- description='The lower limit of the range with a 100 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.',
334
+ description="The lower limit of the range with a 100 % probability that the usage rate is within that range. A positive value indicates that the fill level will decrease due to usage.",
334
335
  )
335
336
 
336
337
 
337
338
  class FRBCFillLevelTargetProfileElement(BaseModel):
338
339
  model_config = ConfigDict(
339
- extra='forbid',
340
+ extra="forbid",
340
341
  )
341
- duration: Duration = Field(..., description='The duration of the element.')
342
+ duration: Duration = Field(..., description="The duration of the element.")
342
343
  fill_level_range: NumberRange = Field(
343
344
  ...,
344
- description='The target range in which the fill_level must be for the time period during which the element is active. The start of the range must be smaller or equal to the end of the range. The CEM must take best-effort actions to proactively achieve this target.',
345
+ description="The target range in which the fill_level must be for the time period during which the element is active. The start of the range must be smaller or equal to the end of the range. The CEM must take best-effort actions to proactively achieve this target.",
345
346
  )
346
347
 
347
348
 
348
349
  class DDBCAverageDemandRateForecastElement(BaseModel):
349
350
  model_config = ConfigDict(
350
- extra='forbid',
351
+ extra="forbid",
351
352
  )
352
- duration: Duration = Field(..., description='Duration of the element')
353
+ duration: Duration = Field(..., description="Duration of the element")
353
354
  demand_rate_upper_limit: Optional[float] = Field(
354
355
  None,
355
- description='The upper limit of the range with a 100 % probability that the demand rate is within that range',
356
+ description="The upper limit of the range with a 100 % probability that the demand rate is within that range",
356
357
  )
357
358
  demand_rate_upper_95PPR: Optional[float] = Field(
358
359
  None,
359
- description='The upper limit of the range with a 95 % probability that the demand rate is within that range',
360
+ description="The upper limit of the range with a 95 % probability that the demand rate is within that range",
360
361
  )
361
362
  demand_rate_upper_68PPR: Optional[float] = Field(
362
363
  None,
363
- description='The upper limit of the range with a 68 % probability that the demand rate is within that range',
364
+ description="The upper limit of the range with a 68 % probability that the demand rate is within that range",
364
365
  )
365
366
  demand_rate_expected: float = Field(
366
367
  ...,
367
- description='The most likely value for the demand rate; the expected increase or decrease of the fill_level per second',
368
+ description="The most likely value for the demand rate; the expected increase or decrease of the fill_level per second",
368
369
  )
369
370
  demand_rate_lower_68PPR: Optional[float] = Field(
370
371
  None,
371
- description='The lower limit of the range with a 68 % probability that the demand rate is within that range',
372
+ description="The lower limit of the range with a 68 % probability that the demand rate is within that range",
372
373
  )
373
374
  demand_rate_lower_95PPR: Optional[float] = Field(
374
375
  None,
375
- description='The lower limit of the range with a 95 % probability that the demand rate is within that range',
376
+ description="The lower limit of the range with a 95 % probability that the demand rate is within that range",
376
377
  )
377
378
  demand_rate_lower_limit: Optional[float] = Field(
378
379
  None,
379
- description='The lower limit of the range with a 100 % probability that the demand rate is within that range',
380
+ description="The lower limit of the range with a 100 % probability that the demand rate is within that range",
380
381
  )
381
382
 
382
383
 
383
384
  class RoleType(Enum):
384
- ENERGY_PRODUCER = 'ENERGY_PRODUCER'
385
- ENERGY_CONSUMER = 'ENERGY_CONSUMER'
386
- ENERGY_STORAGE = 'ENERGY_STORAGE'
385
+ ENERGY_PRODUCER = "ENERGY_PRODUCER"
386
+ ENERGY_CONSUMER = "ENERGY_CONSUMER"
387
+ ENERGY_STORAGE = "ENERGY_STORAGE"
387
388
 
388
389
 
389
390
  class Commodity(Enum):
390
- GAS = 'GAS'
391
- HEAT = 'HEAT'
392
- ELECTRICITY = 'ELECTRICITY'
393
- OIL = 'OIL'
391
+ GAS = "GAS"
392
+ HEAT = "HEAT"
393
+ ELECTRICITY = "ELECTRICITY"
394
+ OIL = "OIL"
394
395
 
395
396
 
396
397
  class CommodityQuantity(Enum):
397
- ELECTRIC_POWER_L1 = 'ELECTRIC.POWER.L1'
398
- ELECTRIC_POWER_L2 = 'ELECTRIC.POWER.L2'
399
- ELECTRIC_POWER_L3 = 'ELECTRIC.POWER.L3'
400
- ELECTRIC_POWER_3_PHASE_SYMMETRIC = 'ELECTRIC.POWER.3_PHASE_SYMMETRIC'
401
- NATURAL_GAS_FLOW_RATE = 'NATURAL_GAS.FLOW_RATE'
402
- HYDROGEN_FLOW_RATE = 'HYDROGEN.FLOW_RATE'
403
- HEAT_TEMPERATURE = 'HEAT.TEMPERATURE'
404
- HEAT_FLOW_RATE = 'HEAT.FLOW_RATE'
405
- HEAT_THERMAL_POWER = 'HEAT.THERMAL_POWER'
406
- OIL_FLOW_RATE = 'OIL.FLOW_RATE'
398
+ ELECTRIC_POWER_L1 = "ELECTRIC.POWER.L1"
399
+ ELECTRIC_POWER_L2 = "ELECTRIC.POWER.L2"
400
+ ELECTRIC_POWER_L3 = "ELECTRIC.POWER.L3"
401
+ ELECTRIC_POWER_3_PHASE_SYMMETRIC = "ELECTRIC.POWER.3_PHASE_SYMMETRIC"
402
+ NATURAL_GAS_FLOW_RATE = "NATURAL_GAS.FLOW_RATE"
403
+ HYDROGEN_FLOW_RATE = "HYDROGEN.FLOW_RATE"
404
+ HEAT_TEMPERATURE = "HEAT.TEMPERATURE"
405
+ HEAT_FLOW_RATE = "HEAT.FLOW_RATE"
406
+ HEAT_THERMAL_POWER = "HEAT.THERMAL_POWER"
407
+ OIL_FLOW_RATE = "OIL.FLOW_RATE"
407
408
 
408
409
 
409
410
  class InstructionStatus(Enum):
410
- NEW = 'NEW'
411
- ACCEPTED = 'ACCEPTED'
412
- REJECTED = 'REJECTED'
413
- REVOKED = 'REVOKED'
414
- STARTED = 'STARTED'
415
- SUCCEEDED = 'SUCCEEDED'
416
- ABORTED = 'ABORTED'
411
+ NEW = "NEW"
412
+ ACCEPTED = "ACCEPTED"
413
+ REJECTED = "REJECTED"
414
+ REVOKED = "REVOKED"
415
+ STARTED = "STARTED"
416
+ SUCCEEDED = "SUCCEEDED"
417
+ ABORTED = "ABORTED"
417
418
 
418
419
 
419
420
  class ControlType(Enum):
420
- POWER_ENVELOPE_BASED_CONTROL = 'POWER_ENVELOPE_BASED_CONTROL'
421
- POWER_PROFILE_BASED_CONTROL = 'POWER_PROFILE_BASED_CONTROL'
422
- OPERATION_MODE_BASED_CONTROL = 'OPERATION_MODE_BASED_CONTROL'
423
- FILL_RATE_BASED_CONTROL = 'FILL_RATE_BASED_CONTROL'
424
- DEMAND_DRIVEN_BASED_CONTROL = 'DEMAND_DRIVEN_BASED_CONTROL'
425
- NOT_CONTROLABLE = 'NOT_CONTROLABLE'
426
- NO_SELECTION = 'NO_SELECTION'
421
+ POWER_ENVELOPE_BASED_CONTROL = "POWER_ENVELOPE_BASED_CONTROL"
422
+ POWER_PROFILE_BASED_CONTROL = "POWER_PROFILE_BASED_CONTROL"
423
+ OPERATION_MODE_BASED_CONTROL = "OPERATION_MODE_BASED_CONTROL"
424
+ FILL_RATE_BASED_CONTROL = "FILL_RATE_BASED_CONTROL"
425
+ DEMAND_DRIVEN_BASED_CONTROL = "DEMAND_DRIVEN_BASED_CONTROL"
426
+ NOT_CONTROLABLE = "NOT_CONTROLABLE"
427
+ NO_SELECTION = "NO_SELECTION"
427
428
 
428
429
 
429
430
  class PEBCPowerEnvelopeLimitType(Enum):
430
- UPPER_LIMIT = 'UPPER_LIMIT'
431
- LOWER_LIMIT = 'LOWER_LIMIT'
431
+ UPPER_LIMIT = "UPPER_LIMIT"
432
+ LOWER_LIMIT = "LOWER_LIMIT"
432
433
 
433
434
 
434
435
  class PEBCPowerEnvelopeConsequenceType(Enum):
435
- VANISH = 'VANISH'
436
- DEFER = 'DEFER'
436
+ VANISH = "VANISH"
437
+ DEFER = "DEFER"
437
438
 
438
439
 
439
440
  class PPBCPowerSequenceStatus(Enum):
440
- NOT_SCHEDULED = 'NOT_SCHEDULED'
441
- SCHEDULED = 'SCHEDULED'
442
- EXECUTING = 'EXECUTING'
443
- INTERRUPTED = 'INTERRUPTED'
444
- FINISHED = 'FINISHED'
445
- ABORTED = 'ABORTED'
441
+ NOT_SCHEDULED = "NOT_SCHEDULED"
442
+ SCHEDULED = "SCHEDULED"
443
+ EXECUTING = "EXECUTING"
444
+ INTERRUPTED = "INTERRUPTED"
445
+ FINISHED = "FINISHED"
446
+ ABORTED = "ABORTED"
446
447
 
447
448
 
448
449
  class OMBCTimerStatus(BaseModel):
449
450
  model_config = ConfigDict(
450
- extra='forbid',
451
+ extra="forbid",
451
452
  )
452
- message_type: Literal['OMBC.TimerStatus'] = 'OMBC.TimerStatus'
453
+ message_type: Literal["OMBC.TimerStatus"] = "OMBC.TimerStatus"
453
454
  message_id: ID
454
- timer_id: ID = Field(..., description='The ID of the timer this message refers to')
455
+ timer_id: ID = Field(..., description="The ID of the timer this message refers to")
455
456
  finished_at: AwareDatetime = Field(
456
457
  ...,
457
- description='Indicates when the Timer will be finished. If the DateTimeStamp is in the future, the timer is not yet finished. If the DateTimeStamp is in the past, the timer is finished. If the timer was never started, the value can be an arbitrary DateTimeStamp in the past.',
458
+ description="Indicates when the Timer will be finished. If the DateTimeStamp is in the future, the timer is not yet finished. If the DateTimeStamp is in the past, the timer is finished. If the timer was never started, the value can be an arbitrary DateTimeStamp in the past.",
458
459
  )
459
460
 
460
461
 
461
462
  class FRBCTimerStatus(BaseModel):
462
463
  model_config = ConfigDict(
463
- extra='forbid',
464
+ extra="forbid",
464
465
  )
465
- message_type: Literal['FRBC.TimerStatus'] = 'FRBC.TimerStatus'
466
+ message_type: Literal["FRBC.TimerStatus"] = "FRBC.TimerStatus"
466
467
  message_id: ID
467
- timer_id: ID = Field(..., description='The ID of the timer this message refers to')
468
- actuator_id: ID = Field(
469
- ..., description='The ID of the actuator the timer belongs to'
470
- )
468
+ timer_id: ID = Field(..., description="The ID of the timer this message refers to")
469
+ actuator_id: ID = Field(..., description="The ID of the actuator the timer belongs to")
471
470
  finished_at: AwareDatetime = Field(
472
471
  ...,
473
- description='Indicates when the Timer will be finished. If the DateTimeStamp is in the future, the timer is not yet finished. If the DateTimeStamp is in the past, the timer is finished. If the timer was never started, the value can be an arbitrary DateTimeStamp in the past.',
472
+ description="Indicates when the Timer will be finished. If the DateTimeStamp is in the future, the timer is not yet finished. If the DateTimeStamp is in the past, the timer is finished. If the timer was never started, the value can be an arbitrary DateTimeStamp in the past.",
474
473
  )
475
474
 
476
475
 
477
476
  class DDBCTimerStatus(BaseModel):
478
477
  model_config = ConfigDict(
479
- extra='forbid',
478
+ extra="forbid",
480
479
  )
481
- message_type: Literal['DDBC.TimerStatus'] = 'DDBC.TimerStatus'
480
+ message_type: Literal["DDBC.TimerStatus"] = "DDBC.TimerStatus"
482
481
  message_id: ID
483
- timer_id: ID = Field(..., description='The ID of the timer this message refers to')
484
- actuator_id: ID = Field(
485
- ..., description='The ID of the actuator the timer belongs to'
486
- )
482
+ timer_id: ID = Field(..., description="The ID of the timer this message refers to")
483
+ actuator_id: ID = Field(..., description="The ID of the actuator the timer belongs to")
487
484
  finished_at: AwareDatetime = Field(
488
485
  ...,
489
- description='Indicates when the Timer will be finished. If the DateTimeStamp is in the future, the timer is not yet finished. If the DateTimeStamp is in the past, the timer is finished. If the timer was never started, the value can be an arbitrary DateTimeStamp in the past.',
486
+ description="Indicates when the Timer will be finished. If the DateTimeStamp is in the future, the timer is not yet finished. If the DateTimeStamp is in the past, the timer is finished. If the timer was never started, the value can be an arbitrary DateTimeStamp in the past.",
490
487
  )
491
488
 
492
489
 
493
490
  class SelectControlType(BaseModel):
494
491
  model_config = ConfigDict(
495
- extra='forbid',
492
+ extra="forbid",
496
493
  )
497
- message_type: Literal['SelectControlType'] = 'SelectControlType'
494
+ message_type: Literal["SelectControlType"] = "SelectControlType"
498
495
  message_id: ID
499
496
  control_type: ControlType = Field(
500
497
  ...,
501
- description='The ControlType to activate. Must be one of the available ControlTypes as defined in the ResourceManagerDetails',
498
+ description="The ControlType to activate. Must be one of the available ControlTypes as defined in the ResourceManagerDetails",
502
499
  )
503
500
 
504
501
 
505
502
  class SessionRequest(BaseModel):
506
503
  model_config = ConfigDict(
507
- extra='forbid',
504
+ extra="forbid",
508
505
  )
509
- message_type: Literal['SessionRequest'] = 'SessionRequest'
506
+ message_type: Literal["SessionRequest"] = "SessionRequest"
510
507
  message_id: ID
511
- request: SessionRequestType = Field(..., description='The type of request')
508
+ request: SessionRequestType = Field(..., description="The type of request")
512
509
  diagnostic_label: Optional[str] = Field(
513
510
  None,
514
- description='Optional field for a human readible descirption for debugging purposes',
511
+ description="Optional field for a human readible descirption for debugging purposes",
515
512
  )
516
513
 
517
514
 
518
515
  class RevokeObject(BaseModel):
519
516
  model_config = ConfigDict(
520
- extra='forbid',
517
+ extra="forbid",
521
518
  )
522
- message_type: Literal['RevokeObject'] = 'RevokeObject'
519
+ message_type: Literal["RevokeObject"] = "RevokeObject"
523
520
  message_id: ID
524
521
  object_type: RevokableObjects = Field(
525
- ..., description='The type of object that needs to be revoked'
522
+ ..., description="The type of object that needs to be revoked"
526
523
  )
527
- object_id: ID = Field(..., description='The ID of object that needs to be revoked')
524
+ object_id: ID = Field(..., description="The ID of object that needs to be revoked")
528
525
 
529
526
 
530
527
  class Handshake(BaseModel):
531
528
  model_config = ConfigDict(
532
- extra='forbid',
529
+ extra="forbid",
533
530
  )
534
- message_type: Literal['Handshake'] = 'Handshake'
531
+ message_type: Literal["Handshake"] = "Handshake"
535
532
  message_id: ID
536
- role: EnergyManagementRole = Field(
537
- ..., description='The role of the sender of this message'
538
- )
533
+ role: EnergyManagementRole = Field(..., description="The role of the sender of this message")
539
534
  supported_protocol_versions: Optional[List[str]] = Field(
540
535
  None,
541
- description='Protocol versions supported by the sender of this message. This field is mandatory for the RM, but optional for the CEM.',
536
+ description="Protocol versions supported by the sender of this message. This field is mandatory for the RM, but optional for the CEM.",
542
537
  min_length=1,
543
538
  )
544
539
 
545
540
 
546
541
  class HandshakeResponse(BaseModel):
547
542
  model_config = ConfigDict(
548
- extra='forbid',
543
+ extra="forbid",
549
544
  )
550
- message_type: Literal['HandshakeResponse'] = 'HandshakeResponse'
545
+ message_type: Literal["HandshakeResponse"] = "HandshakeResponse"
551
546
  message_id: ID
552
547
  selected_protocol_version: str = Field(
553
- ..., description='The protocol version the CEM selected for this session'
548
+ ..., description="The protocol version the CEM selected for this session"
554
549
  )
555
550
 
556
551
 
557
552
  class ReceptionStatus(BaseModel):
558
553
  model_config = ConfigDict(
559
- extra='forbid',
560
- )
561
- message_type: Literal['ReceptionStatus'] = 'ReceptionStatus'
562
- subject_message_id: ID = Field(
563
- ..., description='The message this ReceptionStatus refers to'
564
- )
565
- status: ReceptionStatusValues = Field(
566
- ..., description='Enumeration of status values'
554
+ extra="forbid",
567
555
  )
556
+ message_type: Literal["ReceptionStatus"] = "ReceptionStatus"
557
+ subject_message_id: ID = Field(..., description="The message this ReceptionStatus refers to")
558
+ status: ReceptionStatusValues = Field(..., description="Enumeration of status values")
568
559
  diagnostic_label: Optional[str] = Field(
569
560
  None,
570
- description='Diagnostic label that can be used to provide additional information for debugging. However, not for HMI purposes.',
561
+ description="Diagnostic label that can be used to provide additional information for debugging. However, not for HMI purposes.",
571
562
  )
572
563
 
573
564
 
574
565
  class InstructionStatusUpdate(BaseModel):
575
566
  model_config = ConfigDict(
576
- extra='forbid',
567
+ extra="forbid",
577
568
  )
578
- message_type: Literal['InstructionStatusUpdate'] = 'InstructionStatusUpdate'
569
+ message_type: Literal["InstructionStatusUpdate"] = "InstructionStatusUpdate"
579
570
  message_id: ID
580
- instruction_id: ID = Field(
581
- ..., description='ID of this instruction (as provided by the CEM) '
582
- )
583
- status_type: InstructionStatus = Field(
584
- ..., description='Present status of this instruction.'
585
- )
571
+ instruction_id: ID = Field(..., description="ID of this instruction (as provided by the CEM) ")
572
+ status_type: InstructionStatus = Field(..., description="Present status of this instruction.")
586
573
  timestamp: AwareDatetime = Field(
587
- ..., description='Timestamp when status_type has changed the last time.'
574
+ ..., description="Timestamp when status_type has changed the last time."
588
575
  )
589
576
 
590
577
 
591
578
  class PEBCEnergyConstraint(BaseModel):
592
579
  model_config = ConfigDict(
593
- extra='forbid',
580
+ extra="forbid",
594
581
  )
595
- message_type: Literal['PEBC.EnergyConstraint'] = 'PEBC.EnergyConstraint'
582
+ message_type: Literal["PEBC.EnergyConstraint"] = "PEBC.EnergyConstraint"
596
583
  message_id: ID
597
584
  id: ID = Field(
598
585
  ...,
599
- description='Identifier of this PEBC.EnergyConstraints. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
586
+ description="Identifier of this PEBC.EnergyConstraints. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
600
587
  )
601
588
  valid_from: AwareDatetime = Field(
602
589
  ...,
603
- description='Moment this PEBC.EnergyConstraints information starts to be valid',
590
+ description="Moment this PEBC.EnergyConstraints information starts to be valid",
604
591
  )
605
592
  valid_until: AwareDatetime = Field(
606
593
  ...,
607
- description='Moment until this PEBC.EnergyConstraints information is valid.',
594
+ description="Moment until this PEBC.EnergyConstraints information is valid.",
608
595
  )
609
596
  upper_average_power: float = Field(
610
597
  ...,
611
- description='Upper average power within the time period given by valid_from and valid_until. If the duration is multiplied with this power value, then the associated upper energy content can be derived. This is the highest amount of energy the resource will consume during that period of time. The Power Envelope created by the CEM must allow at least this much energy consumption (in case the number is positive). Must be greater than or equal to lower_average_power, and can be negative in case of energy production.',
598
+ description="Upper average power within the time period given by valid_from and valid_until. If the duration is multiplied with this power value, then the associated upper energy content can be derived. This is the highest amount of energy the resource will consume during that period of time. The Power Envelope created by the CEM must allow at least this much energy consumption (in case the number is positive). Must be greater than or equal to lower_average_power, and can be negative in case of energy production.",
612
599
  )
613
600
  lower_average_power: float = Field(
614
601
  ...,
615
- description='Lower average power within the time period given by valid_from and valid_until. If the duration is multiplied with this power value, then the associated lower energy content can be derived. This is the lowest amount of energy the resource will consume during that period of time. The Power Envelope created by the CEM must allow at least this much energy production (in case the number is negative). Must be greater than or equal to lower_average_power, and can be negative in case of energy production.',
602
+ description="Lower average power within the time period given by valid_from and valid_until. If the duration is multiplied with this power value, then the associated lower energy content can be derived. This is the lowest amount of energy the resource will consume during that period of time. The Power Envelope created by the CEM must allow at least this much energy production (in case the number is negative). Must be greater than or equal to lower_average_power, and can be negative in case of energy production.",
616
603
  )
617
604
  commodity_quantity: CommodityQuantity = Field(
618
605
  ...,
619
- description='Type of power quantity which applies to upper_average_power and lower_average_power',
606
+ description="Type of power quantity which applies to upper_average_power and lower_average_power",
620
607
  )
621
608
 
622
609
 
623
610
  class PPBCScheduleInstruction(BaseModel):
624
611
  model_config = ConfigDict(
625
- extra='forbid',
612
+ extra="forbid",
626
613
  )
627
- message_type: Literal['PPBC.ScheduleInstruction'] = 'PPBC.ScheduleInstruction'
614
+ message_type: Literal["PPBC.ScheduleInstruction"] = "PPBC.ScheduleInstruction"
628
615
  message_id: ID
629
616
  id: ID = Field(
630
617
  ...,
631
- description='ID of the Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
618
+ description="ID of the Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
632
619
  )
633
620
  power_profile_id: ID = Field(
634
621
  ...,
635
- description='ID of the PPBC.PowerProfileDefinition of which the PPBC.PowerSequence is being selected and scheduled by the CEM.',
622
+ description="ID of the PPBC.PowerProfileDefinition of which the PPBC.PowerSequence is being selected and scheduled by the CEM.",
636
623
  )
637
624
  sequence_container_id: ID = Field(
638
625
  ...,
639
- description='ID of the PPBC.PowerSequnceContainer of which the PPBC.PowerSequence is being selected and scheduled by the CEM.',
626
+ description="ID of the PPBC.PowerSequnceContainer of which the PPBC.PowerSequence is being selected and scheduled by the CEM.",
640
627
  )
641
628
  power_sequence_id: ID = Field(
642
629
  ...,
643
- description='ID of the PPBC.PowerSequence that is being selected and scheduled by the CEM.',
630
+ description="ID of the PPBC.PowerSequence that is being selected and scheduled by the CEM.",
644
631
  )
645
632
  execution_time: AwareDatetime = Field(
646
633
  ...,
647
- description='Indicates the moment the PPBC.PowerSequence shall start. When the specified execution time is in the past, execution must start as soon as possible.',
634
+ description="Indicates the moment the PPBC.PowerSequence shall start. When the specified execution time is in the past, execution must start as soon as possible.",
648
635
  )
649
636
  abnormal_condition: bool = Field(
650
637
  ...,
651
- description='Indicates if this is an instruction during an abnormal condition',
638
+ description="Indicates if this is an instruction during an abnormal condition",
652
639
  )
653
640
 
654
641
 
655
642
  class PPBCStartInterruptionInstruction(BaseModel):
656
643
  model_config = ConfigDict(
657
- extra='forbid',
658
- )
659
- message_type: Literal['PPBC.StartInterruptionInstruction'] = (
660
- 'PPBC.StartInterruptionInstruction'
644
+ extra="forbid",
661
645
  )
646
+ message_type: Literal["PPBC.StartInterruptionInstruction"] = "PPBC.StartInterruptionInstruction"
662
647
  message_id: ID
663
648
  id: ID = Field(
664
649
  ...,
665
- description='ID of the Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
650
+ description="ID of the Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
666
651
  )
667
652
  power_profile_id: ID = Field(
668
653
  ...,
669
- description='ID of the PPBC.PowerProfileDefinition of which the PPBC.PowerSequence is being interrupted by the CEM.',
654
+ description="ID of the PPBC.PowerProfileDefinition of which the PPBC.PowerSequence is being interrupted by the CEM.",
670
655
  )
671
656
  sequence_container_id: ID = Field(
672
657
  ...,
673
- description='ID of the PPBC.PowerSequnceContainer of which the PPBC.PowerSequence is being interrupted by the CEM.',
658
+ description="ID of the PPBC.PowerSequnceContainer of which the PPBC.PowerSequence is being interrupted by the CEM.",
674
659
  )
675
660
  power_sequence_id: ID = Field(
676
- ..., description='ID of the PPBC.PowerSequence that the CEM wants to interrupt.'
661
+ ..., description="ID of the PPBC.PowerSequence that the CEM wants to interrupt."
677
662
  )
678
663
  execution_time: AwareDatetime = Field(
679
664
  ...,
680
- description='Indicates the moment the PPBC.PowerSequence shall be interrupted. When the specified execution time is in the past, execution must start as soon as possible.',
665
+ description="Indicates the moment the PPBC.PowerSequence shall be interrupted. When the specified execution time is in the past, execution must start as soon as possible.",
681
666
  )
682
667
  abnormal_condition: bool = Field(
683
668
  ...,
684
- description='Indicates if this is an instruction during an abnormal condition',
669
+ description="Indicates if this is an instruction during an abnormal condition",
685
670
  )
686
671
 
687
672
 
688
673
  class PPBCEndInterruptionInstruction(BaseModel):
689
674
  model_config = ConfigDict(
690
- extra='forbid',
691
- )
692
- message_type: Literal['PPBC.EndInterruptionInstruction'] = (
693
- 'PPBC.EndInterruptionInstruction'
675
+ extra="forbid",
694
676
  )
677
+ message_type: Literal["PPBC.EndInterruptionInstruction"] = "PPBC.EndInterruptionInstruction"
695
678
  message_id: ID
696
679
  id: ID = Field(
697
680
  ...,
698
- description='ID of the Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
681
+ description="ID of the Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
699
682
  )
700
683
  power_profile_id: ID = Field(
701
684
  ...,
702
- description='ID of the PPBC.PowerProfileDefinition of which the PPBC.PowerSequence interruption is being ended by the CEM.',
685
+ description="ID of the PPBC.PowerProfileDefinition of which the PPBC.PowerSequence interruption is being ended by the CEM.",
703
686
  )
704
687
  sequence_container_id: ID = Field(
705
688
  ...,
706
- description='ID of the PPBC.PowerSequnceContainer of which the PPBC.PowerSequence interruption is being ended by the CEM.',
689
+ description="ID of the PPBC.PowerSequnceContainer of which the PPBC.PowerSequence interruption is being ended by the CEM.",
707
690
  )
708
691
  power_sequence_id: ID = Field(
709
692
  ...,
710
- description='ID of the PPBC.PowerSequence for which the CEM wants to end the interruption.',
693
+ description="ID of the PPBC.PowerSequence for which the CEM wants to end the interruption.",
711
694
  )
712
695
  execution_time: AwareDatetime = Field(
713
696
  ...,
714
- description='Indicates the moment PPBC.PowerSequence interruption shall end. When the specified execution time is in the past, execution must start as soon as possible.',
697
+ description="Indicates the moment PPBC.PowerSequence interruption shall end. When the specified execution time is in the past, execution must start as soon as possible.",
715
698
  )
716
699
  abnormal_condition: bool = Field(
717
700
  ...,
718
- description='Indicates if this is an instruction during an abnormal condition',
701
+ description="Indicates if this is an instruction during an abnormal condition",
719
702
  )
720
703
 
721
704
 
722
705
  class OMBCStatus(BaseModel):
723
706
  model_config = ConfigDict(
724
- extra='forbid',
707
+ extra="forbid",
725
708
  )
726
- message_type: Literal['OMBC.Status'] = 'OMBC.Status'
709
+ message_type: Literal["OMBC.Status"] = "OMBC.Status"
727
710
  message_id: ID
728
- active_operation_mode_id: ID = Field(
729
- ..., description='ID of the active OMBC.OperationMode.'
730
- )
711
+ active_operation_mode_id: ID = Field(..., description="ID of the active OMBC.OperationMode.")
731
712
  operation_mode_factor: float = Field(
732
713
  ...,
733
- description='The number indicates the factor with which the OMBC.OperationMode should be configured. The factor should be greater than or equal than 0 and less or equal to 1.',
714
+ description="The number indicates the factor with which the OMBC.OperationMode should be configured. The factor should be greater than or equal than 0 and less or equal to 1.",
734
715
  )
735
716
  previous_operation_mode_id: Optional[ID] = Field(
736
717
  None,
737
- description='ID of the OMBC.OperationMode that was previously active. This value shall always be provided, unless the active OMBC.OperationMode is the first OMBC.OperationMode the Resource Manager is aware of.',
718
+ description="ID of the OMBC.OperationMode that was previously active. This value shall always be provided, unless the active OMBC.OperationMode is the first OMBC.OperationMode the Resource Manager is aware of.",
738
719
  )
739
720
  transition_timestamp: Optional[AwareDatetime] = Field(
740
721
  None,
741
- description='Time at which the transition from the previous OMBC.OperationMode to the active OMBC.OperationMode was initiated. This value shall always be provided, unless the active OMBC.OperationMode is the first OMBC.OperationMode the Resource Manager is aware of.',
722
+ description="Time at which the transition from the previous OMBC.OperationMode to the active OMBC.OperationMode was initiated. This value shall always be provided, unless the active OMBC.OperationMode is the first OMBC.OperationMode the Resource Manager is aware of.",
742
723
  )
743
724
 
744
725
 
745
726
  class OMBCInstruction(BaseModel):
746
727
  model_config = ConfigDict(
747
- extra='forbid',
728
+ extra="forbid",
748
729
  )
749
- message_type: Literal['OMBC.Instruction'] = 'OMBC.Instruction'
730
+ message_type: Literal["OMBC.Instruction"] = "OMBC.Instruction"
750
731
  message_id: ID
751
732
  id: ID = Field(
752
733
  ...,
753
- description='ID of the instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
734
+ description="ID of the instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
754
735
  )
755
736
  execution_time: AwareDatetime = Field(
756
737
  ...,
757
- description='Indicates the moment the execution of the instruction shall start. When the specified execution time is in the past, execution must start as soon as possible.',
738
+ description="Indicates the moment the execution of the instruction shall start. When the specified execution time is in the past, execution must start as soon as possible.",
758
739
  )
759
740
  operation_mode_id: ID = Field(
760
- ..., description='ID of the OMBC.OperationMode that should be activated'
741
+ ..., description="ID of the OMBC.OperationMode that should be activated"
761
742
  )
762
743
  operation_mode_factor: float = Field(
763
744
  ...,
764
- description='The number indicates the factor with which the OMBC.OperationMode should be configured. The factor should be greater than or equal than 0 and less or equal to 1.',
745
+ description="The number indicates the factor with which the OMBC.OperationMode should be configured. The factor should be greater than or equal than 0 and less or equal to 1.",
765
746
  )
766
747
  abnormal_condition: bool = Field(
767
748
  ...,
768
- description='Indicates if this is an instruction during an abnormal condition',
749
+ description="Indicates if this is an instruction during an abnormal condition",
769
750
  )
770
751
 
771
752
 
772
753
  class FRBCActuatorStatus(BaseModel):
773
754
  model_config = ConfigDict(
774
- extra='forbid',
755
+ extra="forbid",
775
756
  )
776
- message_type: Literal['FRBC.ActuatorStatus'] = 'FRBC.ActuatorStatus'
757
+ message_type: Literal["FRBC.ActuatorStatus"] = "FRBC.ActuatorStatus"
777
758
  message_id: ID
778
- actuator_id: ID = Field(
779
- ..., description='ID of the actuator this messages refers to'
780
- )
759
+ actuator_id: ID = Field(..., description="ID of the actuator this messages refers to")
781
760
  active_operation_mode_id: ID = Field(
782
- ..., description='ID of the FRBC.OperationMode that is presently active.'
761
+ ..., description="ID of the FRBC.OperationMode that is presently active."
783
762
  )
784
763
  operation_mode_factor: float = Field(
785
764
  ...,
786
- description='The number indicates the factor with which the FRBC.OperationMode is configured. The factor should be greater than or equal than 0 and less or equal to 1.',
765
+ description="The number indicates the factor with which the FRBC.OperationMode is configured. The factor should be greater than or equal than 0 and less or equal to 1.",
787
766
  )
788
767
  previous_operation_mode_id: Optional[ID] = Field(
789
768
  None,
790
- description='ID of the FRBC.OperationMode that was active before the present one. This value shall always be provided, unless the active FRBC.OperationMode is the first FRBC.OperationMode the Resource Manager is aware of.',
769
+ description="ID of the FRBC.OperationMode that was active before the present one. This value shall always be provided, unless the active FRBC.OperationMode is the first FRBC.OperationMode the Resource Manager is aware of.",
791
770
  )
792
771
  transition_timestamp: Optional[AwareDatetime] = Field(
793
772
  None,
794
- description='Time at which the transition from the previous FRBC.OperationMode to the active FRBC.OperationMode was initiated. This value shall always be provided, unless the active FRBC.OperationMode is the first FRBC.OperationMode the Resource Manager is aware of.',
773
+ description="Time at which the transition from the previous FRBC.OperationMode to the active FRBC.OperationMode was initiated. This value shall always be provided, unless the active FRBC.OperationMode is the first FRBC.OperationMode the Resource Manager is aware of.",
795
774
  )
796
775
 
797
776
 
798
777
  class FRBCStorageStatus(BaseModel):
799
778
  model_config = ConfigDict(
800
- extra='forbid',
779
+ extra="forbid",
801
780
  )
802
- message_type: Literal['FRBC.StorageStatus'] = 'FRBC.StorageStatus'
781
+ message_type: Literal["FRBC.StorageStatus"] = "FRBC.StorageStatus"
803
782
  message_id: ID
804
- present_fill_level: float = Field(
805
- ..., description='Present fill level of the Storage'
806
- )
783
+ present_fill_level: float = Field(..., description="Present fill level of the Storage")
807
784
 
808
785
 
809
786
  class FRBCLeakageBehaviour(BaseModel):
810
787
  model_config = ConfigDict(
811
- extra='forbid',
788
+ extra="forbid",
812
789
  )
813
- message_type: Literal['FRBC.LeakageBehaviour'] = 'FRBC.LeakageBehaviour'
790
+ message_type: Literal["FRBC.LeakageBehaviour"] = "FRBC.LeakageBehaviour"
814
791
  message_id: ID
815
792
  valid_from: AwareDatetime = Field(
816
793
  ...,
817
- description='Moment this FRBC.LeakageBehaviour starts to be valid. If the FRBC.LeakageBehaviour is immediately valid, the DateTimeStamp should be now or in the past.',
794
+ description="Moment this FRBC.LeakageBehaviour starts to be valid. If the FRBC.LeakageBehaviour is immediately valid, the DateTimeStamp should be now or in the past.",
818
795
  )
819
796
  elements: List[FRBCLeakageBehaviourElement] = Field(
820
797
  ...,
821
- description='List of elements that model the leakage behaviour of the buffer. The fill_level_ranges of the elements must be contiguous.',
798
+ description="List of elements that model the leakage behaviour of the buffer. The fill_level_ranges of the elements must be contiguous.",
822
799
  max_length=288,
823
800
  min_length=1,
824
801
  )
@@ -826,46 +803,44 @@ class FRBCLeakageBehaviour(BaseModel):
826
803
 
827
804
  class FRBCInstruction(BaseModel):
828
805
  model_config = ConfigDict(
829
- extra='forbid',
806
+ extra="forbid",
830
807
  )
831
- message_type: Literal['FRBC.Instruction'] = 'FRBC.Instruction'
808
+ message_type: Literal["FRBC.Instruction"] = "FRBC.Instruction"
832
809
  message_id: ID
833
810
  id: ID = Field(
834
811
  ...,
835
- description='ID of the instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
836
- )
837
- actuator_id: ID = Field(
838
- ..., description='ID of the actuator this instruction belongs to.'
812
+ description="ID of the instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
839
813
  )
814
+ actuator_id: ID = Field(..., description="ID of the actuator this instruction belongs to.")
840
815
  operation_mode: ID = Field(
841
- ..., description='ID of the FRBC.OperationMode that should be activated.'
816
+ ..., description="ID of the FRBC.OperationMode that should be activated."
842
817
  )
843
818
  operation_mode_factor: float = Field(
844
819
  ...,
845
- description='The number indicates the factor with which the FRBC.OperationMode should be configured. The factor should be greater than or equal to 0 and less or equal to 1.',
820
+ description="The number indicates the factor with which the FRBC.OperationMode should be configured. The factor should be greater than or equal to 0 and less or equal to 1.",
846
821
  )
847
822
  execution_time: AwareDatetime = Field(
848
823
  ...,
849
- description='Indicates the moment the execution of the instruction shall start. When the specified execution time is in the past, execution must start as soon as possible.',
824
+ description="Indicates the moment the execution of the instruction shall start. When the specified execution time is in the past, execution must start as soon as possible.",
850
825
  )
851
826
  abnormal_condition: bool = Field(
852
827
  ...,
853
- description='Indicates if this is an instruction during an abnormal condition.',
828
+ description="Indicates if this is an instruction during an abnormal condition.",
854
829
  )
855
830
 
856
831
 
857
832
  class FRBCUsageForecast(BaseModel):
858
833
  model_config = ConfigDict(
859
- extra='forbid',
834
+ extra="forbid",
860
835
  )
861
- message_type: Literal['FRBC.UsageForecast'] = 'FRBC.UsageForecast'
836
+ message_type: Literal["FRBC.UsageForecast"] = "FRBC.UsageForecast"
862
837
  message_id: ID
863
838
  start_time: AwareDatetime = Field(
864
- ..., description='Time at which the FRBC.UsageForecast starts.'
839
+ ..., description="Time at which the FRBC.UsageForecast starts."
865
840
  )
866
841
  elements: List[FRBCUsageForecastElement] = Field(
867
842
  ...,
868
- description='Further elements that model the profile. There shall be at least one element. Elements must be placed in chronological order.',
843
+ description="Further elements that model the profile. There shall be at least one element. Elements must be placed in chronological order.",
869
844
  max_length=288,
870
845
  min_length=1,
871
846
  )
@@ -873,16 +848,16 @@ class FRBCUsageForecast(BaseModel):
873
848
 
874
849
  class FRBCFillLevelTargetProfile(BaseModel):
875
850
  model_config = ConfigDict(
876
- extra='forbid',
851
+ extra="forbid",
877
852
  )
878
- message_type: Literal['FRBC.FillLevelTargetProfile'] = 'FRBC.FillLevelTargetProfile'
853
+ message_type: Literal["FRBC.FillLevelTargetProfile"] = "FRBC.FillLevelTargetProfile"
879
854
  message_id: ID
880
855
  start_time: AwareDatetime = Field(
881
- ..., description='Time at which the FRBC.FillLevelTargetProfile starts.'
856
+ ..., description="Time at which the FRBC.FillLevelTargetProfile starts."
882
857
  )
883
858
  elements: List[FRBCFillLevelTargetProfileElement] = Field(
884
859
  ...,
885
- description='List of different fill levels that have to be targeted within a given duration. There shall be at least one element. Elements must be placed in chronological order.',
860
+ description="List of different fill levels that have to be targeted within a given duration. There shall be at least one element. Elements must be placed in chronological order.",
886
861
  max_length=288,
887
862
  min_length=1,
888
863
  )
@@ -890,71 +865,65 @@ class FRBCFillLevelTargetProfile(BaseModel):
890
865
 
891
866
  class DDBCActuatorStatus(BaseModel):
892
867
  model_config = ConfigDict(
893
- extra='forbid',
868
+ extra="forbid",
894
869
  )
895
- message_type: Literal['DDBC.ActuatorStatus'] = 'DDBC.ActuatorStatus'
870
+ message_type: Literal["DDBC.ActuatorStatus"] = "DDBC.ActuatorStatus"
896
871
  message_id: ID
897
- actuator_id: ID = Field(
898
- ..., description='ID of the actuator this messages refers to'
899
- )
872
+ actuator_id: ID = Field(..., description="ID of the actuator this messages refers to")
900
873
  active_operation_mode_id: ID = Field(
901
874
  ...,
902
- description='The operation mode that is presently active for this actuator.',
875
+ description="The operation mode that is presently active for this actuator.",
903
876
  )
904
877
  operation_mode_factor: float = Field(
905
878
  ...,
906
- description='The number indicates the factor with which the DDBC.OperationMode is configured. The factor should be greater than or equal to 0 and less or equal to 1.',
879
+ description="The number indicates the factor with which the DDBC.OperationMode is configured. The factor should be greater than or equal to 0 and less or equal to 1.",
907
880
  )
908
881
  previous_operation_mode_id: Optional[ID] = Field(
909
882
  None,
910
- description='ID of the DDBC,OperationMode that was active before the present one. This value shall always be provided, unless the active DDBC.OperationMode is the first DDBC.OperationMode the Resource Manager is aware of.',
883
+ description="ID of the DDBC,OperationMode that was active before the present one. This value shall always be provided, unless the active DDBC.OperationMode is the first DDBC.OperationMode the Resource Manager is aware of.",
911
884
  )
912
885
  transition_timestamp: Optional[AwareDatetime] = Field(
913
886
  None,
914
- description='Time at which the transition from the previous DDBC.OperationMode to the active DDBC.OperationMode was initiated. This value shall always be provided, unless the active DDBC.OperationMode is the first DDBC.OperationMode the Resource Manager is aware of.',
887
+ description="Time at which the transition from the previous DDBC.OperationMode to the active DDBC.OperationMode was initiated. This value shall always be provided, unless the active DDBC.OperationMode is the first DDBC.OperationMode the Resource Manager is aware of.",
915
888
  )
916
889
 
917
890
 
918
891
  class DDBCInstruction(BaseModel):
919
892
  model_config = ConfigDict(
920
- extra='forbid',
893
+ extra="forbid",
921
894
  )
922
- message_type: Literal['DDBC.Instruction'] = 'DDBC.Instruction'
895
+ message_type: Literal["DDBC.Instruction"] = "DDBC.Instruction"
923
896
  message_id: ID
924
897
  id: ID = Field(
925
898
  ...,
926
- description='Identifier of this DDBC.Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
899
+ description="Identifier of this DDBC.Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
927
900
  )
928
901
  execution_time: AwareDatetime = Field(
929
902
  ...,
930
- description='Indicates the moment the execution of the instruction shall start. When the specified execution time is in the past, execution must start as soon as possible.',
903
+ description="Indicates the moment the execution of the instruction shall start. When the specified execution time is in the past, execution must start as soon as possible.",
931
904
  )
932
905
  abnormal_condition: bool = Field(
933
906
  ...,
934
- description='Indicates if this is an instruction during an abnormal condition',
935
- )
936
- actuator_id: ID = Field(
937
- ..., description='ID of the actuator this Instruction belongs to.'
907
+ description="Indicates if this is an instruction during an abnormal condition",
938
908
  )
939
- operation_mode_id: ID = Field(..., description='ID of the DDBC.OperationMode')
909
+ actuator_id: ID = Field(..., description="ID of the actuator this Instruction belongs to.")
910
+ operation_mode_id: ID = Field(..., description="ID of the DDBC.OperationMode")
940
911
  operation_mode_factor: float = Field(
941
912
  ...,
942
- description='The number indicates the factor with which the OMBC.OperationMode should be configured. The factor should be greater than or equal to 0 and less or equal to 1.',
913
+ description="The number indicates the factor with which the OMBC.OperationMode should be configured. The factor should be greater than or equal to 0 and less or equal to 1.",
943
914
  )
944
915
 
945
916
 
946
917
  class DDBCAverageDemandRateForecast(BaseModel):
947
918
  model_config = ConfigDict(
948
- extra='forbid',
949
- )
950
- message_type: Literal['DDBC.AverageDemandRateForecast'] = (
951
- 'DDBC.AverageDemandRateForecast'
919
+ extra="forbid",
952
920
  )
921
+ message_type: Literal["DDBC.AverageDemandRateForecast"] = "DDBC.AverageDemandRateForecast"
953
922
  message_id: ID
954
- start_time: AwareDatetime = Field(..., description='Start time of the profile.')
923
+ start_time: AwareDatetime = Field(..., description="Start time of the profile.")
955
924
  elements: List[DDBCAverageDemandRateForecastElement] = Field(
956
925
  ...,
957
- description='Elements of the profile. Elements must be placed in chronological order.',
926
+ description="Elements of the profile. Elements must be placed in chronological order.",
958
927
  max_length=288,
959
928
  min_length=1,
960
929
  )
@@ -962,84 +931,82 @@ class DDBCAverageDemandRateForecast(BaseModel):
962
931
 
963
932
  class PowerValue(BaseModel):
964
933
  model_config = ConfigDict(
965
- extra='forbid',
934
+ extra="forbid",
966
935
  )
967
936
  commodity_quantity: CommodityQuantity = Field(
968
- ..., description='The power quantity the value refers to'
937
+ ..., description="The power quantity the value refers to"
969
938
  )
970
939
  value: float = Field(
971
940
  ...,
972
- description='Power value expressed in the unit associated with the CommodityQuantity',
941
+ description="Power value expressed in the unit associated with the CommodityQuantity",
973
942
  )
974
943
 
975
944
 
976
945
  class PowerForecastValue(BaseModel):
977
946
  model_config = ConfigDict(
978
- extra='forbid',
947
+ extra="forbid",
979
948
  )
980
949
  value_upper_limit: Optional[float] = Field(
981
950
  None,
982
- description='The upper boundary of the range with 100 % certainty the power value is in it',
951
+ description="The upper boundary of the range with 100 % certainty the power value is in it",
983
952
  )
984
953
  value_upper_95PPR: Optional[float] = Field(
985
954
  None,
986
- description='The upper boundary of the range with 95 % certainty the power value is in it',
955
+ description="The upper boundary of the range with 95 % certainty the power value is in it",
987
956
  )
988
957
  value_upper_68PPR: Optional[float] = Field(
989
958
  None,
990
- description='The upper boundary of the range with 68 % certainty the power value is in it',
959
+ description="The upper boundary of the range with 68 % certainty the power value is in it",
991
960
  )
992
- value_expected: float = Field(..., description='The expected power value.')
961
+ value_expected: float = Field(..., description="The expected power value.")
993
962
  value_lower_68PPR: Optional[float] = Field(
994
963
  None,
995
- description='The lower boundary of the range with 68 % certainty the power value is in it',
964
+ description="The lower boundary of the range with 68 % certainty the power value is in it",
996
965
  )
997
966
  value_lower_95PPR: Optional[float] = Field(
998
967
  None,
999
- description='The lower boundary of the range with 95 % certainty the power value is in it',
968
+ description="The lower boundary of the range with 95 % certainty the power value is in it",
1000
969
  )
1001
970
  value_lower_limit: Optional[float] = Field(
1002
971
  None,
1003
- description='The lower boundary of the range with 100 % certainty the power value is in it',
972
+ description="The lower boundary of the range with 100 % certainty the power value is in it",
1004
973
  )
1005
974
  commodity_quantity: CommodityQuantity = Field(
1006
- ..., description='The power quantity the value refers to'
975
+ ..., description="The power quantity the value refers to"
1007
976
  )
1008
977
 
1009
978
 
1010
979
  class PowerRange(BaseModel):
1011
980
  model_config = ConfigDict(
1012
- extra='forbid',
981
+ extra="forbid",
1013
982
  )
1014
983
  start_of_range: float = Field(
1015
- ..., description='Power value that defines the start of the range.'
1016
- )
1017
- end_of_range: float = Field(
1018
- ..., description='Power value that defines the end of the range.'
984
+ ..., description="Power value that defines the start of the range."
1019
985
  )
986
+ end_of_range: float = Field(..., description="Power value that defines the end of the range.")
1020
987
  commodity_quantity: CommodityQuantity = Field(
1021
- ..., description='The power quantity the values refer to'
988
+ ..., description="The power quantity the values refer to"
1022
989
  )
1023
990
 
1024
991
 
1025
992
  class Role(BaseModel):
1026
993
  model_config = ConfigDict(
1027
- extra='forbid',
994
+ extra="forbid",
1028
995
  )
1029
996
  role: RoleType = Field(
1030
- ..., description='Role type of the Resource Manager for the given commodity'
997
+ ..., description="Role type of the Resource Manager for the given commodity"
1031
998
  )
1032
- commodity: Commodity = Field(..., description='Commodity the role refers to.')
999
+ commodity: Commodity = Field(..., description="Commodity the role refers to.")
1033
1000
 
1034
1001
 
1035
1002
  class PowerForecastElement(BaseModel):
1036
1003
  model_config = ConfigDict(
1037
- extra='forbid',
1004
+ extra="forbid",
1038
1005
  )
1039
- duration: Duration = Field(..., description='Duration of the PowerForecastElement')
1006
+ duration: Duration = Field(..., description="Duration of the PowerForecastElement")
1040
1007
  power_values: List[PowerForecastValue] = Field(
1041
1008
  ...,
1042
- description='The values of power that are expected for the given period of time. There shall be at least one PowerForecastValue, and at most one PowerForecastValue per CommodityQuantity.',
1009
+ description="The values of power that are expected for the given period of time. There shall be at least one PowerForecastValue, and at most one PowerForecastValue per CommodityQuantity.",
1043
1010
  max_length=10,
1044
1011
  min_length=1,
1045
1012
  )
@@ -1047,39 +1014,39 @@ class PowerForecastElement(BaseModel):
1047
1014
 
1048
1015
  class PEBCAllowedLimitRange(BaseModel):
1049
1016
  model_config = ConfigDict(
1050
- extra='forbid',
1017
+ extra="forbid",
1051
1018
  )
1052
1019
  commodity_quantity: CommodityQuantity = Field(
1053
- ..., description='Type of power quantity this PEBC.AllowedLimitRange applies to'
1020
+ ..., description="Type of power quantity this PEBC.AllowedLimitRange applies to"
1054
1021
  )
1055
1022
  limit_type: PEBCPowerEnvelopeLimitType = Field(
1056
1023
  ...,
1057
- description='Indicates if this ranges applies to the upper limit or the lower limit',
1024
+ description="Indicates if this ranges applies to the upper limit or the lower limit",
1058
1025
  )
1059
1026
  range_boundary: NumberRange = Field(
1060
1027
  ...,
1061
- description='Boundaries of the power range of this PEBC.AllowedLimitRange. The CEM is allowed to choose values within this range for the power envelope for the limit as described in limit_type. The start of the range shall be smaller or equal than the end of the range. ',
1028
+ description="Boundaries of the power range of this PEBC.AllowedLimitRange. The CEM is allowed to choose values within this range for the power envelope for the limit as described in limit_type. The start of the range shall be smaller or equal than the end of the range. ",
1062
1029
  )
1063
1030
  abnormal_condition_only: bool = Field(
1064
1031
  ...,
1065
- description='Indicates if this PEBC.AllowedLimitRange may only be used during an abnormal condition',
1032
+ description="Indicates if this PEBC.AllowedLimitRange may only be used during an abnormal condition",
1066
1033
  )
1067
1034
 
1068
1035
 
1069
1036
  class PEBCPowerEnvelope(BaseModel):
1070
1037
  model_config = ConfigDict(
1071
- extra='forbid',
1038
+ extra="forbid",
1072
1039
  )
1073
1040
  id: ID = Field(
1074
1041
  ...,
1075
- description='Identifier of this PEBC.PowerEnvelope. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
1042
+ description="Identifier of this PEBC.PowerEnvelope. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
1076
1043
  )
1077
1044
  commodity_quantity: CommodityQuantity = Field(
1078
- ..., description='Type of power quantity this PEBC.PowerEnvelope applies to'
1045
+ ..., description="Type of power quantity this PEBC.PowerEnvelope applies to"
1079
1046
  )
1080
1047
  power_envelope_elements: List[PEBCPowerEnvelopeElement] = Field(
1081
1048
  ...,
1082
- description='The elements of this PEBC.PowerEnvelope. Shall contain at least one element. Elements must be placed in chronological order.',
1049
+ description="The elements of this PEBC.PowerEnvelope. Shall contain at least one element. Elements must be placed in chronological order.",
1083
1050
  max_length=288,
1084
1051
  min_length=1,
1085
1052
  )
@@ -1087,14 +1054,12 @@ class PEBCPowerEnvelope(BaseModel):
1087
1054
 
1088
1055
  class PPBCPowerSequenceElement(BaseModel):
1089
1056
  model_config = ConfigDict(
1090
- extra='forbid',
1091
- )
1092
- duration: Duration = Field(
1093
- ..., description='Duration of the PPBC.PowerSequenceElement.'
1057
+ extra="forbid",
1094
1058
  )
1059
+ duration: Duration = Field(..., description="Duration of the PPBC.PowerSequenceElement.")
1095
1060
  power_values: List[PowerForecastValue] = Field(
1096
1061
  ...,
1097
- description='The value of power and deviations for the given duration. The array should contain at least one PowerForecastValue and at most one PowerForecastValue per CommodityQuantity.',
1062
+ description="The value of power and deviations for the given duration. The array should contain at least one PowerForecastValue and at most one PowerForecastValue per CommodityQuantity.",
1098
1063
  max_length=10,
1099
1064
  min_length=1,
1100
1065
  )
@@ -1102,163 +1067,163 @@ class PPBCPowerSequenceElement(BaseModel):
1102
1067
 
1103
1068
  class PPBCPowerSequenceContainerStatus(BaseModel):
1104
1069
  model_config = ConfigDict(
1105
- extra='forbid',
1070
+ extra="forbid",
1106
1071
  )
1107
1072
  power_profile_id: ID = Field(
1108
1073
  ...,
1109
- description='ID of the PPBC.PowerProfileDefinition of which the data element ‘sequence_container_id’ refers to. ',
1074
+ description="ID of the PPBC.PowerProfileDefinition of which the data element ‘sequence_container_id’ refers to. ",
1110
1075
  )
1111
1076
  sequence_container_id: ID = Field(
1112
1077
  ...,
1113
- description='ID of the PPBC.PowerSequenceContainer this PPBC.PowerSequenceContainerStatus provides information about.',
1078
+ description="ID of the PPBC.PowerSequenceContainer this PPBC.PowerSequenceContainerStatus provides information about.",
1114
1079
  )
1115
1080
  selected_sequence_id: Optional[ID] = Field(
1116
1081
  None,
1117
- description='ID of selected PPBC.PowerSequence. When no ID is given, no sequence was selected yet.',
1082
+ description="ID of selected PPBC.PowerSequence. When no ID is given, no sequence was selected yet.",
1118
1083
  )
1119
1084
  progress: Optional[Duration] = Field(
1120
1085
  None,
1121
- description='Time that has passed since the selected sequence has started. A value must be provided, unless no sequence has been selected or the selected sequence hasn’t started yet.',
1086
+ description="Time that has passed since the selected sequence has started. A value must be provided, unless no sequence has been selected or the selected sequence hasn’t started yet.",
1122
1087
  )
1123
1088
  status: PPBCPowerSequenceStatus = Field(
1124
- ..., description='Status of the selected PPBC.PowerSequence'
1089
+ ..., description="Status of the selected PPBC.PowerSequence"
1125
1090
  )
1126
1091
 
1127
1092
 
1128
1093
  class OMBCOperationMode(BaseModel):
1129
1094
  model_config = ConfigDict(
1130
- extra='forbid',
1095
+ extra="forbid",
1131
1096
  )
1132
1097
  id: ID = Field(
1133
1098
  ...,
1134
- description='ID of the OBMC.OperationMode. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
1099
+ description="ID of the OBMC.OperationMode. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
1135
1100
  )
1136
1101
  diagnostic_label: Optional[str] = Field(
1137
1102
  None,
1138
- description='Human readable name/description of the OMBC.OperationMode. This element is only intended for diagnostic purposes and not for HMI applications.',
1103
+ description="Human readable name/description of the OMBC.OperationMode. This element is only intended for diagnostic purposes and not for HMI applications.",
1139
1104
  )
1140
1105
  power_ranges: List[PowerRange] = Field(
1141
1106
  ...,
1142
- description='The power produced or consumed by this operation mode. The start of each PowerRange is associated with an operation_mode_factor of 0, the end is associated with an operation_mode_factor of 1. In the array there must be at least one PowerRange, and at most one PowerRange per CommodityQuantity.',
1107
+ description="The power produced or consumed by this operation mode. The start of each PowerRange is associated with an operation_mode_factor of 0, the end is associated with an operation_mode_factor of 1. In the array there must be at least one PowerRange, and at most one PowerRange per CommodityQuantity.",
1143
1108
  max_length=10,
1144
1109
  min_length=1,
1145
1110
  )
1146
1111
  running_costs: Optional[NumberRange] = Field(
1147
1112
  None,
1148
- description='Additional costs per second (e.g. wear, services) associated with this operation mode in the currency defined by the ResourceManagerDetails , excluding the commodity cost. The range is expressing uncertainty and is not linked to the operation_mode_factor.',
1113
+ description="Additional costs per second (e.g. wear, services) associated with this operation mode in the currency defined by the ResourceManagerDetails , excluding the commodity cost. The range is expressing uncertainty and is not linked to the operation_mode_factor.",
1149
1114
  )
1150
1115
  abnormal_condition_only: bool = Field(
1151
1116
  ...,
1152
- description='Indicates if this OMBC.OperationMode may only be used during an abnormal condition.',
1117
+ description="Indicates if this OMBC.OperationMode may only be used during an abnormal condition.",
1153
1118
  )
1154
1119
 
1155
1120
 
1156
1121
  class FRBCOperationModeElement(BaseModel):
1157
1122
  model_config = ConfigDict(
1158
- extra='forbid',
1123
+ extra="forbid",
1159
1124
  )
1160
1125
  fill_level_range: NumberRange = Field(
1161
1126
  ...,
1162
- description='The range of the fill level for which this FRBC.OperationModeElement applies. The start of the NumberRange shall be smaller than the end of the NumberRange.',
1127
+ description="The range of the fill level for which this FRBC.OperationModeElement applies. The start of the NumberRange shall be smaller than the end of the NumberRange.",
1163
1128
  )
1164
1129
  fill_rate: NumberRange = Field(
1165
1130
  ...,
1166
- description='Indicates the change in fill_level per second. The lower_boundary of the NumberRange is associated with an operation_mode_factor of 0, the upper_boundary is associated with an operation_mode_factor of 1. ',
1131
+ description="Indicates the change in fill_level per second. The lower_boundary of the NumberRange is associated with an operation_mode_factor of 0, the upper_boundary is associated with an operation_mode_factor of 1. ",
1167
1132
  )
1168
1133
  power_ranges: List[PowerRange] = Field(
1169
1134
  ...,
1170
- description='The power produced or consumed by this operation mode. The start of each PowerRange is associated with an operation_mode_factor of 0, the end is associated with an operation_mode_factor of 1. In the array there must be at least one PowerRange, and at most one PowerRange per CommodityQuantity.',
1135
+ description="The power produced or consumed by this operation mode. The start of each PowerRange is associated with an operation_mode_factor of 0, the end is associated with an operation_mode_factor of 1. In the array there must be at least one PowerRange, and at most one PowerRange per CommodityQuantity.",
1171
1136
  max_length=10,
1172
1137
  min_length=1,
1173
1138
  )
1174
1139
  running_costs: Optional[NumberRange] = Field(
1175
1140
  None,
1176
- description='Additional costs per second (e.g. wear, services) associated with this operation mode in the currency defined by the ResourceManagerDetails, excluding the commodity cost. The range is expressing uncertainty and is not linked to the operation_mode_factor.',
1141
+ description="Additional costs per second (e.g. wear, services) associated with this operation mode in the currency defined by the ResourceManagerDetails, excluding the commodity cost. The range is expressing uncertainty and is not linked to the operation_mode_factor.",
1177
1142
  )
1178
1143
 
1179
1144
 
1180
1145
  class DDBCOperationMode(BaseModel):
1181
1146
  model_config = ConfigDict(
1182
- extra='forbid',
1147
+ extra="forbid",
1183
1148
  )
1184
1149
  Id: ID = Field(
1185
1150
  ...,
1186
- description='ID of this operation mode. Must be unique in the scope of the DDBC.ActuatorDescription in which it is used.',
1151
+ description="ID of this operation mode. Must be unique in the scope of the DDBC.ActuatorDescription in which it is used.",
1187
1152
  )
1188
1153
  diagnostic_label: Optional[str] = Field(
1189
1154
  None,
1190
- description='Human readable name/description of the DDBC.OperationMode. This element is only intended for diagnostic purposes and not for HMI applications.',
1155
+ description="Human readable name/description of the DDBC.OperationMode. This element is only intended for diagnostic purposes and not for HMI applications.",
1191
1156
  )
1192
1157
  power_ranges: List[PowerRange] = Field(
1193
1158
  ...,
1194
- description='The power produced or consumed by this operation mode. The start of each PowerRange is associated with an operation_mode_factor of 0, the end is associated with an operation_mode_factor of 1. In the array there must be at least one PowerRange, and at most one PowerRange per CommodityQuantity.',
1159
+ description="The power produced or consumed by this operation mode. The start of each PowerRange is associated with an operation_mode_factor of 0, the end is associated with an operation_mode_factor of 1. In the array there must be at least one PowerRange, and at most one PowerRange per CommodityQuantity.",
1195
1160
  max_length=10,
1196
1161
  min_length=1,
1197
1162
  )
1198
1163
  supply_range: NumberRange = Field(
1199
1164
  ...,
1200
- description='The supply rate this DDBC.OperationMode can deliver for the CEM to match the demand rate. The start of the NumberRange is associated with an operation_mode_factor of 0, the end is associated with an operation_mode_factor of 1.',
1165
+ description="The supply rate this DDBC.OperationMode can deliver for the CEM to match the demand rate. The start of the NumberRange is associated with an operation_mode_factor of 0, the end is associated with an operation_mode_factor of 1.",
1201
1166
  )
1202
1167
  running_costs: Optional[NumberRange] = Field(
1203
1168
  None,
1204
- description='Additional costs per second (e.g. wear, services) associated with this operation mode in the currency defined by the ResourceManagerDetails, excluding the commodity cost. The range is expressing uncertainty and is not linked to the operation_mode_factor.',
1169
+ description="Additional costs per second (e.g. wear, services) associated with this operation mode in the currency defined by the ResourceManagerDetails, excluding the commodity cost. The range is expressing uncertainty and is not linked to the operation_mode_factor.",
1205
1170
  )
1206
1171
  abnormal_condition_only: bool = Field(
1207
1172
  ...,
1208
- description='Indicates if this DDBC.OperationMode may only be used during an abnormal condition.',
1173
+ description="Indicates if this DDBC.OperationMode may only be used during an abnormal condition.",
1209
1174
  )
1210
1175
 
1211
1176
 
1212
1177
  class ResourceManagerDetails(BaseModel):
1213
1178
  model_config = ConfigDict(
1214
- extra='forbid',
1179
+ extra="forbid",
1215
1180
  )
1216
- message_type: Literal['ResourceManagerDetails'] = 'ResourceManagerDetails'
1181
+ message_type: Literal["ResourceManagerDetails"] = "ResourceManagerDetails"
1217
1182
  message_id: ID
1218
1183
  resource_id: ID = Field(
1219
1184
  ...,
1220
- description='Identifier of the Resource Manager. Must be unique within the scope of the CEM.',
1185
+ description="Identifier of the Resource Manager. Must be unique within the scope of the CEM.",
1221
1186
  )
1222
- name: Optional[str] = Field(None, description='Human readable name given by user')
1187
+ name: Optional[str] = Field(None, description="Human readable name given by user")
1223
1188
  roles: List[Role] = Field(
1224
1189
  ...,
1225
- description='Each Resource Manager provides one or more energy Roles',
1190
+ description="Each Resource Manager provides one or more energy Roles",
1226
1191
  max_length=3,
1227
1192
  min_length=1,
1228
1193
  )
1229
- manufacturer: Optional[str] = Field(None, description='Name of Manufacturer')
1194
+ manufacturer: Optional[str] = Field(None, description="Name of Manufacturer")
1230
1195
  model: Optional[str] = Field(
1231
1196
  None,
1232
- description='Name of the model of the device (provided by the manufacturer)',
1197
+ description="Name of the model of the device (provided by the manufacturer)",
1233
1198
  )
1234
1199
  serial_number: Optional[str] = Field(
1235
- None, description='Serial number of the device (provided by the manufacturer)'
1200
+ None, description="Serial number of the device (provided by the manufacturer)"
1236
1201
  )
1237
1202
  firmware_version: Optional[str] = Field(
1238
1203
  None,
1239
- description='Version identifier of the firmware used in the device (provided by the manufacturer)',
1204
+ description="Version identifier of the firmware used in the device (provided by the manufacturer)",
1240
1205
  )
1241
1206
  instruction_processing_delay: Duration = Field(
1242
1207
  ...,
1243
- description='The average time the combination of Resource Manager and HBES/BACS/SASS or (Smart) device needs to process and execute an instruction',
1208
+ description="The average time the combination of Resource Manager and HBES/BACS/SASS or (Smart) device needs to process and execute an instruction",
1244
1209
  )
1245
1210
  available_control_types: List[ControlType] = Field(
1246
1211
  ...,
1247
- description='The control types supported by this Resource Manager.',
1212
+ description="The control types supported by this Resource Manager.",
1248
1213
  max_length=5,
1249
1214
  min_length=1,
1250
1215
  )
1251
1216
  currency: Optional[Currency] = Field(
1252
1217
  None,
1253
- description='Currency to be used for all information regarding costs. Mandatory if cost information is published.',
1218
+ description="Currency to be used for all information regarding costs. Mandatory if cost information is published.",
1254
1219
  )
1255
1220
  provides_forecast: bool = Field(
1256
1221
  ...,
1257
- description='Indicates whether the ResourceManager is able to provide PowerForecasts',
1222
+ description="Indicates whether the ResourceManager is able to provide PowerForecasts",
1258
1223
  )
1259
1224
  provides_power_measurement_types: List[CommodityQuantity] = Field(
1260
1225
  ...,
1261
- description='Array of all CommodityQuantities that this Resource Manager can provide measurements for. ',
1226
+ description="Array of all CommodityQuantities that this Resource Manager can provide measurements for. ",
1262
1227
  max_length=10,
1263
1228
  min_length=1,
1264
1229
  )
@@ -1266,16 +1231,16 @@ class ResourceManagerDetails(BaseModel):
1266
1231
 
1267
1232
  class PowerMeasurement(BaseModel):
1268
1233
  model_config = ConfigDict(
1269
- extra='forbid',
1234
+ extra="forbid",
1270
1235
  )
1271
- message_type: Literal['PowerMeasurement'] = 'PowerMeasurement'
1236
+ message_type: Literal["PowerMeasurement"] = "PowerMeasurement"
1272
1237
  message_id: ID
1273
1238
  measurement_timestamp: AwareDatetime = Field(
1274
- ..., description='Timestamp when PowerValues were measured.'
1239
+ ..., description="Timestamp when PowerValues were measured."
1275
1240
  )
1276
1241
  values: List[PowerValue] = Field(
1277
1242
  ...,
1278
- description='Array of measured PowerValues. Must contain at least one item and at most one item per ‘commodity_quantity’ (defined inside the PowerValue).',
1243
+ description="Array of measured PowerValues. Must contain at least one item and at most one item per ‘commodity_quantity’ (defined inside the PowerValue).",
1279
1244
  max_length=10,
1280
1245
  min_length=1,
1281
1246
  )
@@ -1283,16 +1248,16 @@ class PowerMeasurement(BaseModel):
1283
1248
 
1284
1249
  class PowerForecast(BaseModel):
1285
1250
  model_config = ConfigDict(
1286
- extra='forbid',
1251
+ extra="forbid",
1287
1252
  )
1288
- message_type: Literal['PowerForecast'] = 'PowerForecast'
1253
+ message_type: Literal["PowerForecast"] = "PowerForecast"
1289
1254
  message_id: ID
1290
1255
  start_time: AwareDatetime = Field(
1291
- ..., description='Start time of time period that is covered by the profile.'
1256
+ ..., description="Start time of time period that is covered by the profile."
1292
1257
  )
1293
1258
  elements: List[PowerForecastElement] = Field(
1294
1259
  ...,
1295
- description='Elements of which this forecast consists. Contains at least one element. Elements must be placed in chronological order.',
1260
+ description="Elements of which this forecast consists. Contains at least one element. Elements must be placed in chronological order.",
1296
1261
  max_length=288,
1297
1262
  min_length=1,
1298
1263
  )
@@ -1300,27 +1265,27 @@ class PowerForecast(BaseModel):
1300
1265
 
1301
1266
  class PEBCPowerConstraints(BaseModel):
1302
1267
  model_config = ConfigDict(
1303
- extra='forbid',
1268
+ extra="forbid",
1304
1269
  )
1305
- message_type: Literal['PEBC.PowerConstraints'] = 'PEBC.PowerConstraints'
1270
+ message_type: Literal["PEBC.PowerConstraints"] = "PEBC.PowerConstraints"
1306
1271
  message_id: ID
1307
1272
  id: ID = Field(
1308
1273
  ...,
1309
- description='Identifier of this PEBC.PowerConstraints. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
1274
+ description="Identifier of this PEBC.PowerConstraints. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
1310
1275
  )
1311
1276
  valid_from: AwareDatetime = Field(
1312
- ..., description='Moment this PEBC.PowerConstraints start to be valid'
1277
+ ..., description="Moment this PEBC.PowerConstraints start to be valid"
1313
1278
  )
1314
1279
  valid_until: Optional[AwareDatetime] = Field(
1315
1280
  None,
1316
- description='Moment until this PEBC.PowerConstraints is valid. If valid_until is not present, there is no determined end time of this PEBC.PowerConstraints.',
1281
+ description="Moment until this PEBC.PowerConstraints is valid. If valid_until is not present, there is no determined end time of this PEBC.PowerConstraints.",
1317
1282
  )
1318
1283
  consequence_type: PEBCPowerEnvelopeConsequenceType = Field(
1319
- ..., description='Type of consequence of limiting power'
1284
+ ..., description="Type of consequence of limiting power"
1320
1285
  )
1321
1286
  allowed_limit_ranges: List[PEBCAllowedLimitRange] = Field(
1322
1287
  ...,
1323
- description='The actual constraints. There shall be at least one PEBC.AllowedLimitRange for the UPPER_LIMIT and at least one AllowedLimitRange for the LOWER_LIMIT. It is allowed to have multiple PEBC.AllowedLimitRange objects with identical CommodityQuantities and LimitTypes.',
1288
+ description="The actual constraints. There shall be at least one PEBC.AllowedLimitRange for the UPPER_LIMIT and at least one AllowedLimitRange for the LOWER_LIMIT. It is allowed to have multiple PEBC.AllowedLimitRange objects with identical CommodityQuantities and LimitTypes.",
1324
1289
  max_length=100,
1325
1290
  min_length=2,
1326
1291
  )
@@ -1328,29 +1293,29 @@ class PEBCPowerConstraints(BaseModel):
1328
1293
 
1329
1294
  class PEBCInstruction(BaseModel):
1330
1295
  model_config = ConfigDict(
1331
- extra='forbid',
1296
+ extra="forbid",
1332
1297
  )
1333
- message_type: Literal['PEBC.Instruction'] = 'PEBC.Instruction'
1298
+ message_type: Literal["PEBC.Instruction"] = "PEBC.Instruction"
1334
1299
  message_id: ID
1335
1300
  id: ID = Field(
1336
1301
  ...,
1337
- description='Identifier of this PEBC.Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
1302
+ description="Identifier of this PEBC.Instruction. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
1338
1303
  )
1339
1304
  execution_time: AwareDatetime = Field(
1340
1305
  ...,
1341
- description='Indicates the moment the execution of the instruction shall start. When the specified execution time is in the past, execution must start as soon as possible.',
1306
+ description="Indicates the moment the execution of the instruction shall start. When the specified execution time is in the past, execution must start as soon as possible.",
1342
1307
  )
1343
1308
  abnormal_condition: bool = Field(
1344
1309
  ...,
1345
- description='Indicates if this is an instruction during an abnormal condition.',
1310
+ description="Indicates if this is an instruction during an abnormal condition.",
1346
1311
  )
1347
1312
  power_constraints_id: ID = Field(
1348
1313
  ...,
1349
- description='Identifier of the PEBC.PowerConstraints this PEBC.Instruction was based on.',
1314
+ description="Identifier of the PEBC.PowerConstraints this PEBC.Instruction was based on.",
1350
1315
  )
1351
1316
  power_envelopes: List[PEBCPowerEnvelope] = Field(
1352
1317
  ...,
1353
- description='The PEBC.PowerEnvelope(s) that should be followed by the Resource Manager. There shall be at least one PEBC.PowerEnvelope, but at most one PEBC.PowerEnvelope for each CommodityQuantity.',
1318
+ description="The PEBC.PowerEnvelope(s) that should be followed by the Resource Manager. There shall be at least one PEBC.PowerEnvelope, but at most one PEBC.PowerEnvelope for each CommodityQuantity.",
1354
1319
  max_length=10,
1355
1320
  min_length=1,
1356
1321
  )
@@ -1358,13 +1323,13 @@ class PEBCInstruction(BaseModel):
1358
1323
 
1359
1324
  class PPBCPowerProfileStatus(BaseModel):
1360
1325
  model_config = ConfigDict(
1361
- extra='forbid',
1326
+ extra="forbid",
1362
1327
  )
1363
- message_type: Literal['PPBC.PowerProfileStatus'] = 'PPBC.PowerProfileStatus'
1328
+ message_type: Literal["PPBC.PowerProfileStatus"] = "PPBC.PowerProfileStatus"
1364
1329
  message_id: ID
1365
1330
  sequence_container_status: List[PPBCPowerSequenceContainerStatus] = Field(
1366
1331
  ...,
1367
- description='Array with status information for all PPBC.PowerSequenceContainers in the PPBC.PowerProfileDefinition.',
1332
+ description="Array with status information for all PPBC.PowerSequenceContainers in the PPBC.PowerProfileDefinition.",
1368
1333
  max_length=1000,
1369
1334
  min_length=1,
1370
1335
  )
@@ -1372,29 +1337,29 @@ class PPBCPowerProfileStatus(BaseModel):
1372
1337
 
1373
1338
  class OMBCSystemDescription(BaseModel):
1374
1339
  model_config = ConfigDict(
1375
- extra='forbid',
1340
+ extra="forbid",
1376
1341
  )
1377
- message_type: Literal['OMBC.SystemDescription'] = 'OMBC.SystemDescription'
1342
+ message_type: Literal["OMBC.SystemDescription"] = "OMBC.SystemDescription"
1378
1343
  message_id: ID
1379
1344
  valid_from: AwareDatetime = Field(
1380
1345
  ...,
1381
- description='Moment this OMBC.SystemDescription starts to be valid. If the system description is immediately valid, the DateTimeStamp should be now or in the past.',
1346
+ description="Moment this OMBC.SystemDescription starts to be valid. If the system description is immediately valid, the DateTimeStamp should be now or in the past.",
1382
1347
  )
1383
1348
  operation_modes: List[OMBCOperationMode] = Field(
1384
1349
  ...,
1385
- description='OMBC.OperationModes available for the CEM in order to coordinate the device behaviour.',
1350
+ description="OMBC.OperationModes available for the CEM in order to coordinate the device behaviour.",
1386
1351
  max_length=100,
1387
1352
  min_length=1,
1388
1353
  )
1389
1354
  transitions: List[Transition] = Field(
1390
1355
  ...,
1391
- description='Possible transitions to switch from one OMBC.OperationMode to another.',
1356
+ description="Possible transitions to switch from one OMBC.OperationMode to another.",
1392
1357
  max_length=1000,
1393
1358
  min_length=0,
1394
1359
  )
1395
1360
  timers: List[Timer] = Field(
1396
1361
  ...,
1397
- description='Timers that control when certain transitions can be made.',
1362
+ description="Timers that control when certain transitions can be made.",
1398
1363
  max_length=1000,
1399
1364
  min_length=0,
1400
1365
  )
@@ -1402,89 +1367,89 @@ class OMBCSystemDescription(BaseModel):
1402
1367
 
1403
1368
  class PPBCPowerSequence(BaseModel):
1404
1369
  model_config = ConfigDict(
1405
- extra='forbid',
1370
+ extra="forbid",
1406
1371
  )
1407
1372
  id: ID = Field(
1408
1373
  ...,
1409
- description='ID of the PPBC.PowerSequence. Must be unique in the scope of the PPBC.PowerSequnceContainer in which it is used.',
1374
+ description="ID of the PPBC.PowerSequence. Must be unique in the scope of the PPBC.PowerSequnceContainer in which it is used.",
1410
1375
  )
1411
1376
  elements: List[PPBCPowerSequenceElement] = Field(
1412
1377
  ...,
1413
- description='List of PPBC.PowerSequenceElements. Shall contain at least one element. Elements must be placed in chronological order.',
1378
+ description="List of PPBC.PowerSequenceElements. Shall contain at least one element. Elements must be placed in chronological order.",
1414
1379
  max_length=288,
1415
1380
  min_length=1,
1416
1381
  )
1417
1382
  is_interruptible: bool = Field(
1418
1383
  ...,
1419
- description='Indicates whether the option of pausing a sequence is available.',
1384
+ description="Indicates whether the option of pausing a sequence is available.",
1420
1385
  )
1421
1386
  max_pause_before: Optional[Duration] = Field(
1422
1387
  None,
1423
- description='The maximum duration for which a device can be paused between the end of the previous running sequence and the start of this one',
1388
+ description="The maximum duration for which a device can be paused between the end of the previous running sequence and the start of this one",
1424
1389
  )
1425
1390
  abnormal_condition_only: bool = Field(
1426
1391
  ...,
1427
- description='Indicates if this PPBC.PowerSequence may only be used during an abnormal condition',
1392
+ description="Indicates if this PPBC.PowerSequence may only be used during an abnormal condition",
1428
1393
  )
1429
1394
 
1430
1395
 
1431
1396
  class FRBCOperationMode(BaseModel):
1432
1397
  model_config = ConfigDict(
1433
- extra='forbid',
1398
+ extra="forbid",
1434
1399
  )
1435
1400
  id: ID = Field(
1436
1401
  ...,
1437
- description='ID of the FRBC.OperationMode. Must be unique in the scope of the FRBC.ActuatorDescription in which it is used.',
1402
+ description="ID of the FRBC.OperationMode. Must be unique in the scope of the FRBC.ActuatorDescription in which it is used.",
1438
1403
  )
1439
1404
  diagnostic_label: Optional[str] = Field(
1440
1405
  None,
1441
- description='Human readable name/description of the FRBC.OperationMode. This element is only intended for diagnostic purposes and not for HMI applications.',
1406
+ description="Human readable name/description of the FRBC.OperationMode. This element is only intended for diagnostic purposes and not for HMI applications.",
1442
1407
  )
1443
1408
  elements: List[FRBCOperationModeElement] = Field(
1444
1409
  ...,
1445
- description='List of FRBC.OperationModeElements, which describe the properties of this FRBC.OperationMode depending on the fill_level. The fill_level_ranges of the items in the Array must be contiguous.',
1410
+ description="List of FRBC.OperationModeElements, which describe the properties of this FRBC.OperationMode depending on the fill_level. The fill_level_ranges of the items in the Array must be contiguous.",
1446
1411
  max_length=100,
1447
1412
  min_length=1,
1448
1413
  )
1449
1414
  abnormal_condition_only: bool = Field(
1450
1415
  ...,
1451
- description='Indicates if this FRBC.OperationMode may only be used during an abnormal condition',
1416
+ description="Indicates if this FRBC.OperationMode may only be used during an abnormal condition",
1452
1417
  )
1453
1418
 
1454
1419
 
1455
1420
  class DDBCActuatorDescription(BaseModel):
1456
1421
  model_config = ConfigDict(
1457
- extra='forbid',
1422
+ extra="forbid",
1458
1423
  )
1459
1424
  id: ID = Field(
1460
1425
  ...,
1461
- description='ID of this DDBC.ActuatorDescription. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
1426
+ description="ID of this DDBC.ActuatorDescription. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
1462
1427
  )
1463
1428
  diagnostic_label: Optional[str] = Field(
1464
1429
  None,
1465
- description='Human readable name/description of the actuator. This element is only intended for diagnostic purposes and not for HMI applications.',
1430
+ description="Human readable name/description of the actuator. This element is only intended for diagnostic purposes and not for HMI applications.",
1466
1431
  )
1467
1432
  supported_commodites: List[Commodity] = Field(
1468
1433
  ...,
1469
- description='Commodities supported by the operation modes of this actuator. There shall be at least one commodity',
1434
+ description="Commodities supported by the operation modes of this actuator. There shall be at least one commodity",
1470
1435
  max_length=4,
1471
1436
  min_length=1,
1472
1437
  )
1473
1438
  operation_modes: List[DDBCOperationMode] = Field(
1474
1439
  ...,
1475
- description='List of all Operation Modes that are available for this actuator. There shall be at least one DDBC.OperationMode.',
1440
+ description="List of all Operation Modes that are available for this actuator. There shall be at least one DDBC.OperationMode.",
1476
1441
  max_length=100,
1477
1442
  min_length=1,
1478
1443
  )
1479
1444
  transitions: List[Transition] = Field(
1480
1445
  ...,
1481
- description='List of Transitions between Operation Modes. Shall contain at least one Transition.',
1446
+ description="List of Transitions between Operation Modes. Shall contain at least one Transition.",
1482
1447
  max_length=1000,
1483
1448
  min_length=0,
1484
1449
  )
1485
1450
  timers: List[Timer] = Field(
1486
1451
  ...,
1487
- description='List of Timers associated with Transitions for this Actuator. Can be empty.',
1452
+ description="List of Timers associated with Transitions for this Actuator. Can be empty.",
1488
1453
  max_length=1000,
1489
1454
  min_length=0,
1490
1455
  )
@@ -1492,40 +1457,40 @@ class DDBCActuatorDescription(BaseModel):
1492
1457
 
1493
1458
  class DDBCSystemDescription(BaseModel):
1494
1459
  model_config = ConfigDict(
1495
- extra='forbid',
1460
+ extra="forbid",
1496
1461
  )
1497
- message_type: Literal['DDBC.SystemDescription'] = 'DDBC.SystemDescription'
1462
+ message_type: Literal["DDBC.SystemDescription"] = "DDBC.SystemDescription"
1498
1463
  message_id: ID
1499
1464
  valid_from: AwareDatetime = Field(
1500
1465
  ...,
1501
- description='Moment this DDBC.SystemDescription starts to be valid. If the system description is immediately valid, the DateTimeStamp should be now or in the past.',
1466
+ description="Moment this DDBC.SystemDescription starts to be valid. If the system description is immediately valid, the DateTimeStamp should be now or in the past.",
1502
1467
  )
1503
1468
  actuators: List[DDBCActuatorDescription] = Field(
1504
1469
  ...,
1505
- description='List of all available actuators in the system. Must contain at least one DDBC.ActuatorAggregated.',
1470
+ description="List of all available actuators in the system. Must contain at least one DDBC.ActuatorAggregated.",
1506
1471
  max_length=10,
1507
1472
  min_length=1,
1508
1473
  )
1509
1474
  present_demand_rate: NumberRange = Field(
1510
- ..., description='Present demand rate that needs to be satisfied by the system'
1475
+ ..., description="Present demand rate that needs to be satisfied by the system"
1511
1476
  )
1512
1477
  provides_average_demand_rate_forecast: bool = Field(
1513
1478
  ...,
1514
- description='Indicates whether the Resource Manager could provide a demand rate forecast through the DDBC.AverageDemandRateForecast.',
1479
+ description="Indicates whether the Resource Manager could provide a demand rate forecast through the DDBC.AverageDemandRateForecast.",
1515
1480
  )
1516
1481
 
1517
1482
 
1518
1483
  class PPBCPowerSequenceContainer(BaseModel):
1519
1484
  model_config = ConfigDict(
1520
- extra='forbid',
1485
+ extra="forbid",
1521
1486
  )
1522
1487
  id: ID = Field(
1523
1488
  ...,
1524
- description='ID of the PPBC.PowerSequenceContainer. Must be unique in the scope of the PPBC.PowerProfileDefinition in which it is used.',
1489
+ description="ID of the PPBC.PowerSequenceContainer. Must be unique in the scope of the PPBC.PowerProfileDefinition in which it is used.",
1525
1490
  )
1526
1491
  power_sequences: List[PPBCPowerSequence] = Field(
1527
1492
  ...,
1528
- description='List of alternative Sequences where one could be chosen by the CEM',
1493
+ description="List of alternative Sequences where one could be chosen by the CEM",
1529
1494
  max_length=288,
1530
1495
  min_length=1,
1531
1496
  )
@@ -1533,37 +1498,37 @@ class PPBCPowerSequenceContainer(BaseModel):
1533
1498
 
1534
1499
  class FRBCActuatorDescription(BaseModel):
1535
1500
  model_config = ConfigDict(
1536
- extra='forbid',
1501
+ extra="forbid",
1537
1502
  )
1538
1503
  id: ID = Field(
1539
1504
  ...,
1540
- description='ID of the Actuator. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
1505
+ description="ID of the Actuator. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
1541
1506
  )
1542
1507
  diagnostic_label: Optional[str] = Field(
1543
1508
  None,
1544
- description='Human readable name/description for the actuator. This element is only intended for diagnostic purposes and not for HMI applications.',
1509
+ description="Human readable name/description for the actuator. This element is only intended for diagnostic purposes and not for HMI applications.",
1545
1510
  )
1546
1511
  supported_commodities: List[Commodity] = Field(
1547
1512
  ...,
1548
- description='List of all supported Commodities.',
1513
+ description="List of all supported Commodities.",
1549
1514
  max_length=4,
1550
1515
  min_length=1,
1551
1516
  )
1552
1517
  operation_modes: List[FRBCOperationMode] = Field(
1553
1518
  ...,
1554
- description='Provided FRBC.OperationModes associated with this actuator',
1519
+ description="Provided FRBC.OperationModes associated with this actuator",
1555
1520
  max_length=100,
1556
1521
  min_length=1,
1557
1522
  )
1558
1523
  transitions: List[Transition] = Field(
1559
1524
  ...,
1560
- description='Possible transitions between FRBC.OperationModes associated with this actuator.',
1525
+ description="Possible transitions between FRBC.OperationModes associated with this actuator.",
1561
1526
  max_length=1000,
1562
1527
  min_length=0,
1563
1528
  )
1564
1529
  timers: List[Timer] = Field(
1565
1530
  ...,
1566
- description='List of Timers associated with this actuator',
1531
+ description="List of Timers associated with this actuator",
1567
1532
  max_length=1000,
1568
1533
  min_length=0,
1569
1534
  )
@@ -1571,25 +1536,25 @@ class FRBCActuatorDescription(BaseModel):
1571
1536
 
1572
1537
  class PPBCPowerProfileDefinition(BaseModel):
1573
1538
  model_config = ConfigDict(
1574
- extra='forbid',
1539
+ extra="forbid",
1575
1540
  )
1576
- message_type: Literal['PPBC.PowerProfileDefinition'] = 'PPBC.PowerProfileDefinition'
1541
+ message_type: Literal["PPBC.PowerProfileDefinition"] = "PPBC.PowerProfileDefinition"
1577
1542
  message_id: ID
1578
1543
  id: ID = Field(
1579
1544
  ...,
1580
- description='ID of the PPBC.PowerProfileDefinition. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.',
1545
+ description="ID of the PPBC.PowerProfileDefinition. Must be unique in the scope of the Resource Manager, for at least the duration of the session between Resource Manager and CEM.",
1581
1546
  )
1582
1547
  start_time: AwareDatetime = Field(
1583
1548
  ...,
1584
- description='Indicates the first possible time the first PPBC.PowerSequence could start',
1549
+ description="Indicates the first possible time the first PPBC.PowerSequence could start",
1585
1550
  )
1586
1551
  end_time: AwareDatetime = Field(
1587
1552
  ...,
1588
- description='Indicates when the last PPBC.PowerSequence shall be finished at the latest',
1553
+ description="Indicates when the last PPBC.PowerSequence shall be finished at the latest",
1589
1554
  )
1590
1555
  power_sequences_containers: List[PPBCPowerSequenceContainer] = Field(
1591
1556
  ...,
1592
- description='The PPBC.PowerSequenceContainers that make up this PPBC.PowerProfileDefinition. There shall be at least one PPBC.PowerSequenceContainer that includes at least one PPBC.PowerSequence. PPBC.PowerSequenceContainers must be placed in chronological order.',
1557
+ description="The PPBC.PowerSequenceContainers that make up this PPBC.PowerProfileDefinition. There shall be at least one PPBC.PowerSequenceContainer that includes at least one PPBC.PowerSequence. PPBC.PowerSequenceContainers must be placed in chronological order.",
1593
1558
  max_length=1000,
1594
1559
  min_length=1,
1595
1560
  )
@@ -1597,15 +1562,15 @@ class PPBCPowerProfileDefinition(BaseModel):
1597
1562
 
1598
1563
  class FRBCSystemDescription(BaseModel):
1599
1564
  model_config = ConfigDict(
1600
- extra='forbid',
1565
+ extra="forbid",
1601
1566
  )
1602
- message_type: Literal['FRBC.SystemDescription'] = 'FRBC.SystemDescription'
1567
+ message_type: Literal["FRBC.SystemDescription"] = "FRBC.SystemDescription"
1603
1568
  message_id: ID
1604
1569
  valid_from: AwareDatetime = Field(
1605
1570
  ...,
1606
- description='Moment this FRBC.SystemDescription starts to be valid. If the system description is immediately valid, the DateTimeStamp should be now or in the past.',
1571
+ description="Moment this FRBC.SystemDescription starts to be valid. If the system description is immediately valid, the DateTimeStamp should be now or in the past.",
1607
1572
  )
1608
1573
  actuators: List[FRBCActuatorDescription] = Field(
1609
- ..., description='Details of all Actuators.', max_length=10, min_length=1
1574
+ ..., description="Details of all Actuators.", max_length=10, min_length=1
1610
1575
  )
1611
- storage: FRBCStorageDescription = Field(..., description='Details of the storage.')
1576
+ storage: FRBCStorageDescription = Field(..., description="Details of the storage.")