Skip to content

Commit c17fb39

Browse files
author
Thomas Salm
committed
Merge branch 'develop'
2 parents 9ed1649 + 559ec3b commit c17fb39

4 files changed

Lines changed: 59 additions & 31 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "saic_ismart_client"
7-
version = "1.2.3"
7+
version = "1.2.4"
88
authors = [
99
{ name = "Thomas Salm", email="saic-python-client@devtom.de"},
1010
]

src/saic_ismart_client/common_model.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,20 +127,29 @@ def get_data(self) -> dict:
127127
return data
128128

129129
def init_from_dict(self, data: dict):
130-
self.uid = data.get(FIELD_UID)
131-
self.token = data.get(FIELD_TOKEN)
130+
if FIELD_UID in data:
131+
self.uid = data.get(FIELD_UID)
132+
if FIELD_TOKEN in data:
133+
self.token = data.get(FIELD_TOKEN)
132134
self.application_id = data.get(FIELD_APPLICATION_ID)
133-
self.vin = data.get(FIELD_VIN)
135+
if FIELD_VIN in data:
136+
self.vin = data.get(FIELD_VIN)
134137
self.event_creation_time = data.get(FIELD_EVENT_CREATION_TIME)
135-
self.event_id = data.get(FIELD_EVENT_ID)
138+
if FIELD_EVENT_ID in data:
139+
self.event_id = data.get(FIELD_EVENT_ID)
136140
self.message_id = data.get(FIELD_MESSAGE_ID)
137-
self.ack_required = data.get(FIELD_ACK_REQUIRED)
141+
if FIELD_ACK_REQUIRED in data:
142+
self.ack_required = data.get(FIELD_ACK_REQUIRED)
138143
self.application_data_length = data.get(FIELD_APPLICATION_DATA_LENGTH)
139-
self.application_data_encoding = data.get(FIELD_APPLICATION_DATA_ENCODING)
144+
if FIELD_APPLICATION_DATA_ENCODING in data:
145+
self.application_data_encoding = data.get(FIELD_APPLICATION_DATA_ENCODING)
140146
self.application_data_protocol_version = data.get(FIELD_APPLICATION_DATA_PROTOCOL_VERSION)
141-
self.test_flag = data.get(FIELD_TEST_FLAG)
142-
self.result = data.get(FIELD_RESULT)
143-
self.error_message = data.get(FIELD_ERROR_MESSAGE)
147+
if FIELD_TEST_FLAG in data:
148+
self.test_flag = data.get(FIELD_TEST_FLAG)
149+
if FIELD_RESULT in data:
150+
self.result = data.get(FIELD_RESULT)
151+
if FIELD_ERROR_MESSAGE in data:
152+
self.error_message = data.get(FIELD_ERROR_MESSAGE)
144153

145154

146155
class MessageBodyV1(AbstractMessageBody):

src/saic_ismart_client/saic_api.py

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def get_vehicle_status_with_retry(self, vin_info: VinInfo) -> MessageV2:
182182

183183
def lock_vehicle(self, vin_info: VinInfo) -> MessageV2:
184184
rvc_params = []
185-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x01', rvc_params)
185+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x01', rvc_params, False)
186186

187187
def unlock_vehicle(self, vin_info: VinInfo) -> MessageV2:
188188
rvc_params = []
@@ -211,7 +211,7 @@ def unlock_vehicle(self, vin_info: VinInfo) -> MessageV2:
211211
param5.param_value = b'\x00'
212212
rvc_params.append(param5)
213213

214-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x02', rvc_params)
214+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x02', rvc_params, False)
215215

216216
def start_rear_window_heat(self, vin_info: VinInfo) -> MessageV2:
217217
rvc_params = []
@@ -225,7 +225,7 @@ def start_rear_window_heat(self, vin_info: VinInfo) -> MessageV2:
225225
param2.param_value = b'\x00'
226226
rvc_params.append(param2)
227227

228-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x20', rvc_params)
228+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x20', rvc_params, False)
229229

230230
def stop_rear_window_heat(self, vin_info: VinInfo) -> MessageV2:
231231
rvc_params = []
@@ -239,7 +239,7 @@ def stop_rear_window_heat(self, vin_info: VinInfo) -> MessageV2:
239239
param2.param_value = b'\x00'
240240
rvc_params.append(param2)
241241

242-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x20', rvc_params)
242+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x20', rvc_params, False)
243243

244244
def start_ac(self, vin_info: VinInfo) -> MessageV2:
245245
rcv_params = []
@@ -258,7 +258,7 @@ def start_ac(self, vin_info: VinInfo) -> MessageV2:
258258
param3.param_value = b'\x00'
259259
rcv_params.append(param3)
260260

261-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params)
261+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params, True)
262262

263263
def stop_ac(self, vin_info: VinInfo) -> MessageV2:
264264
rcv_params = []
@@ -277,7 +277,7 @@ def stop_ac(self, vin_info: VinInfo) -> MessageV2:
277277
param3.param_value = b'\x00'
278278
rcv_params.append(param3)
279279

280-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params)
280+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params, True)
281281

282282
def start_ac_blowing(self, vin_info: VinInfo) -> MessageV2:
283283
rcv_params = []
@@ -301,7 +301,7 @@ def start_ac_blowing(self, vin_info: VinInfo) -> MessageV2:
301301
param4.param_value = b'\x00'
302302
rcv_params.append(param4)
303303

304-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params)
304+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params, True)
305305

306306
def stop_ac_blowing(self, vin_info: VinInfo) -> MessageV2:
307307
rcv_params = []
@@ -325,7 +325,7 @@ def stop_ac_blowing(self, vin_info: VinInfo) -> MessageV2:
325325
param4.param_value = b'\x00'
326326
rcv_params.append(param4)
327327

328-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params)
328+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params, True)
329329

330330
def start_front_defrost(self, vin_info: VinInfo) -> MessageV2:
331331
rcv_params = []
@@ -349,7 +349,7 @@ def start_front_defrost(self, vin_info: VinInfo) -> MessageV2:
349349
param4.param_value = b'\x00'
350350
rcv_params.append(param4)
351351

352-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params)
352+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params, True)
353353

354354
def stop_front_defrost(self, vin_info: VinInfo) -> MessageV2:
355355
rcv_params = []
@@ -373,19 +373,37 @@ def stop_front_defrost(self, vin_info: VinInfo) -> MessageV2:
373373
param4.param_value = b'\x00'
374374
rcv_params.append(param4)
375375

376-
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params)
376+
return self.send_vehicle_ctrl_cmd_with_retry(vin_info, b'\x06', rcv_params, True)
377377

378-
def send_vehicle_ctrl_cmd_with_retry(self, vin_info: VinInfo, rvc_req_type: bytes, rvc_params: list) -> MessageV2:
378+
def send_vehicle_ctrl_cmd_with_retry(self, vin_info: VinInfo, rvc_req_type: bytes, rvc_params: list,
379+
has_app_data: bool) -> MessageV2:
379380
vehicle_control_cmd_rsp_msg = self.send_vehicle_control_command(vin_info, rvc_req_type, rvc_params)
380-
while vehicle_control_cmd_rsp_msg.application_data is None:
381-
if vehicle_control_cmd_rsp_msg.body.error_message is not None:
382-
self.handle_error(vehicle_control_cmd_rsp_msg.body)
383-
else:
384-
logging.debug('API request returned no application data and no error message.')
385-
time.sleep(float(AVG_SMS_DELIVERY_TIME))
386381

387-
vehicle_control_cmd_rsp_msg = self.send_vehicle_control_command(vin_info, rvc_req_type, rvc_params,
388-
vehicle_control_cmd_rsp_msg.body.event_id)
382+
if has_app_data:
383+
while vehicle_control_cmd_rsp_msg.application_data is None:
384+
if vehicle_control_cmd_rsp_msg.body.error_message is not None:
385+
self.handle_error(vehicle_control_cmd_rsp_msg.body)
386+
else:
387+
logging.debug('API request returned no application data and no error message.')
388+
time.sleep(float(AVG_SMS_DELIVERY_TIME))
389+
390+
event_id = vehicle_control_cmd_rsp_msg.body.event_id
391+
vehicle_control_cmd_rsp_msg = self.send_vehicle_control_command(vin_info, rvc_req_type, rvc_params,
392+
event_id)
393+
else:
394+
retry = 1
395+
while(
396+
vehicle_control_cmd_rsp_msg.body.error_message is not None
397+
and retry <= 3
398+
):
399+
self.handle_error(vehicle_control_cmd_rsp_msg.body)
400+
event_id = vehicle_control_cmd_rsp_msg.body.event_id
401+
vehicle_control_cmd_rsp_msg = self.send_vehicle_control_command(vin_info, rvc_req_type, rvc_params,
402+
event_id)
403+
retry += 1
404+
if vehicle_control_cmd_rsp_msg.body.error_message is not None:
405+
raise SaicApiException(vehicle_control_cmd_rsp_msg.body.error_message.decode(),
406+
vehicle_control_cmd_rsp_msg.body.result)
389407
return vehicle_control_cmd_rsp_msg
390408

391409
def get_message_list_with_retry(self) -> list:

tests/test_saic_api.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ def mock_chrg_mgmt_data_rsp(message_v3_0_coder: MessageCoderV30, uid: str, token
195195
return message_v3_0_coder.encode_request(chrg_mgmt_data_rsp_msg)
196196

197197

198-
def mock_start_ac_rsp_msg(message_coder_v2_1, UID, TOKEN, vin_info):
198+
def mock_start_ac_rsp_msg(message_coder_v2_1: MessageCoderV21, uid: str, token: str, vin_info: VinInfo):
199199
start_ac_rsp = OtaRvcStatus25857()
200200
start_ac_rsp.rvcReqType = b'\x06'
201201
start_ac_rsp.rvcReqSts = b'\x01'
@@ -245,6 +245,7 @@ def mock_start_ac_rsp_msg(message_coder_v2_1, UID, TOKEN, vin_info):
245245
start_ac_rsp.basicVehicleStatus.extended_data2 = 0 # is charging
246246
start_ac_rsp.basicVehicleStatus.fuel_range_elec = 32000
247247
start_ac_rsp_msg = MessageV2(MessageBodyV2(), start_ac_rsp)
248+
message_coder_v2_1.initialize_message(uid, token, vin_info.vin, '510', 25857, 1, start_ac_rsp_msg)
248249
return message_coder_v2_1.encode_request(start_ac_rsp_msg)
249250

250251

@@ -309,6 +310,6 @@ def test_start_ac(self, mocked_post):
309310
vin_info = create_vin_info(VIN)
310311
mock_response(mocked_post, mock_start_ac_rsp_msg(self.message_coder_v2_1, UID, TOKEN, vin_info))
311312

312-
start_ac_rsp_msg = self.saic_api.start_ac()
313+
start_ac_rsp_msg = self.saic_api.start_ac(vin_info)
313314
app_data = cast(OtaRvcStatus25857, start_ac_rsp_msg.application_data)
314315
self.assertEqual(app_data.rvcReqType, b'\x06')

0 commit comments

Comments
 (0)