1
1
""" Module containing classes that model the several OCPP messages types. It
2
2
also contain some helper functions for packing and unpacking messages. """
3
+ from __future__ import annotations
4
+
3
5
import decimal
4
6
import json
5
7
import os
6
8
from dataclasses import asdict , is_dataclass
7
- from typing import Callable , Dict
9
+ from typing import Callable , Dict , Union
8
10
9
11
from jsonschema import Draft4Validator
10
12
from jsonschema import _validators as SchemaValidators
@@ -75,7 +77,9 @@ def unpack(msg):
75
77
try :
76
78
msg = json .loads (msg )
77
79
except json .JSONDecodeError :
78
- raise FormatViolationError (details = {"cause" : "Message is not valid JSON" })
80
+ raise FormatViolationError (
81
+ details = {"cause" : "Message is not valid JSON" , "ocpp_message" : msg }
82
+ )
79
83
80
84
if not isinstance (msg , list ):
81
85
raise ProtocolError (
@@ -100,7 +104,7 @@ def unpack(msg):
100
104
raise ProtocolError (details = {"cause" : "Message is missing elements." })
101
105
102
106
raise PropertyConstraintViolationError (
103
- details = {f"MessageTypeId '{ msg [0 ]} ' isn't valid" }
107
+ details = {"cause" : f"MessageTypeId '{ msg [0 ]} ' isn't valid" }
104
108
)
105
109
106
110
@@ -160,7 +164,7 @@ def get_validator(
160
164
return _validators [cache_key ]
161
165
162
166
163
- def validate_payload (message , ocpp_version ) :
167
+ def validate_payload (message : Union [ Call , CallResult ], ocpp_version : str ) -> None :
164
168
"""Validate the payload of the message using JSON schemas."""
165
169
if type (message ) not in [Call , CallResult ]:
166
170
raise ValidationError (
@@ -217,18 +221,25 @@ def validate_payload(message, ocpp_version):
217
221
validator .validate (message .payload )
218
222
except SchemaValidationError as e :
219
223
if e .validator == SchemaValidators .type .__name__ :
220
- raise TypeConstraintViolationError (details = {"cause" : e .message })
224
+ raise TypeConstraintViolationError (
225
+ details = {"cause" : e .message , "ocpp_message" : message }
226
+ )
221
227
elif e .validator == SchemaValidators .additionalProperties .__name__ :
222
- raise FormatViolationError (details = {"cause" : e .message })
228
+ raise FormatViolationError (
229
+ details = {"cause" : e .message , "ocpp_message" : message }
230
+ )
223
231
elif e .validator == SchemaValidators .required .__name__ :
224
232
raise ProtocolError (details = {"cause" : e .message })
225
233
elif e .validator == "maxLength" :
226
- raise TypeConstraintViolationError (details = {"cause" : e .message }) from e
234
+ raise TypeConstraintViolationError (
235
+ details = {"cause" : e .message , "ocpp_message" : message }
236
+ ) from e
227
237
else :
228
238
raise FormatViolationError (
229
239
details = {
230
240
"cause" : f"Payload '{ message .payload } for action "
231
- f"'{ message .action } ' is not valid: { e } "
241
+ f"'{ message .action } ' is not valid: { e } " ,
242
+ "ocpp_message" : message ,
232
243
}
233
244
)
234
245
@@ -317,7 +328,7 @@ def __repr__(self):
317
328
class CallResult :
318
329
"""
319
330
A CallResult is a message indicating that a Call has been handled
320
- succesfully .
331
+ successfully .
321
332
322
333
From the specification:
323
334
0 commit comments