From 1ae3e863f1d6e83399617daec43c9bd64f239863 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 29 Mar 2026 14:23:00 +0200 Subject: [PATCH 1/4] Add cockpit data retrieval to Renault API --- packages/modules/vehicles/renault/api.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/modules/vehicles/renault/api.py b/packages/modules/vehicles/renault/api.py index 2f23f1e9ea..444da55854 100755 --- a/packages/modules/vehicles/renault/api.py +++ b/packages/modules/vehicles/renault/api.py @@ -81,5 +81,19 @@ def fetch_soc(config: RenaultConfiguration) -> CarState: responsetext = response.read() batt = json.loads(responsetext) + # Step 9 - cockpit data + data = urllib.parse.urlencode(country_data) + data = data.encode('Big5') + reg = urllib.request.Request(KAMEREON_ROOTURL + '/commerce/v1/accounts/' + + kamereonaccountid + '/kamereon/kca/car-adapter/v2/cars/' + + vin + '/cockpit?' + data.decode("utf-8")) + reg.add_header('x-gigya-id_token', gigya_jwttoken) + reg.add_header('apikey', KAMEREON_API_KEY) + response = urllib.request.urlopen(reg) + responsetext = response.read() + cockpit = json.loads(responsetext) + + return CarState(soc=float(batt['data']['attributes']['batteryLevel']), - range=float(batt['data']['attributes']['batteryAutonomy'])) + range=float(batt['data']['attributes']['batteryAutonomy']), + odometer=float(cockpit['data']['attributes']['totalMileage'])) From c950a7738f53642c00d19e6cd9f86fdeabcd28e9 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 29 Mar 2026 14:46:23 +0200 Subject: [PATCH 2/4] Enhance vehicle data retrieval with validation and error handling --- packages/modules/vehicles/renault/api.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/modules/vehicles/renault/api.py b/packages/modules/vehicles/renault/api.py index 444da55854..969b1a946c 100755 --- a/packages/modules/vehicles/renault/api.py +++ b/packages/modules/vehicles/renault/api.py @@ -93,7 +93,19 @@ def fetch_soc(config: RenaultConfiguration) -> CarState: responsetext = response.read() cockpit = json.loads(responsetext) - - return CarState(soc=float(batt['data']['attributes']['batteryLevel']), - range=float(batt['data']['attributes']['batteryAutonomy']), - odometer=float(cockpit['data']['attributes']['totalMileage'])) + # Validate response structure + if 'data' not in cockpit: + log.warning(f"Cockpit endpoint returned unexpected structure: {cockpit}") + raise Exception(f"Vehicle data unavailable. Response: {cockpit}") + + if 'data' not in batt: + log.warning(f"Battery endpoint returned unexpected structure: {batt}") + raise Exception(f"Battery data unavailable. Response: {batt}") + + try: + return CarState(soc=float(batt['data']['attributes']['batteryLevel']), + range=float(batt['data']['attributes']['batteryAutonomy']), + odometer=float(cockpit['data']['attributes']['totalMileage'])) + except (KeyError, TypeError, ValueError) as e: + log.error(f"Failed to parse vehicle data: {e}. Battery: {batt}, Cockpit: {cockpit}") + raise Exception(f"Unable to parse vehicle data: {e}") From 0492ef7351b9380a5084c02b80e2e6c3021d1da1 Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 29 Mar 2026 15:02:48 +0200 Subject: [PATCH 3/4] Refactor vehicle data retrieval by removing validations Removed validation checks for response structure and error handling. --- packages/modules/vehicles/renault/api.py | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/packages/modules/vehicles/renault/api.py b/packages/modules/vehicles/renault/api.py index 969b1a946c..1886373e17 100755 --- a/packages/modules/vehicles/renault/api.py +++ b/packages/modules/vehicles/renault/api.py @@ -81,11 +81,11 @@ def fetch_soc(config: RenaultConfiguration) -> CarState: responsetext = response.read() batt = json.loads(responsetext) - # Step 9 - cockpit data + # Step 9 - cockpit data for odometer/totalMileage data = urllib.parse.urlencode(country_data) data = data.encode('Big5') reg = urllib.request.Request(KAMEREON_ROOTURL + '/commerce/v1/accounts/' + - kamereonaccountid + '/kamereon/kca/car-adapter/v2/cars/' + kamereonaccountid + '/kamereon/kca/car-adapter/v1/cars/' + vin + '/cockpit?' + data.decode("utf-8")) reg.add_header('x-gigya-id_token', gigya_jwttoken) reg.add_header('apikey', KAMEREON_API_KEY) @@ -93,19 +93,7 @@ def fetch_soc(config: RenaultConfiguration) -> CarState: responsetext = response.read() cockpit = json.loads(responsetext) - # Validate response structure - if 'data' not in cockpit: - log.warning(f"Cockpit endpoint returned unexpected structure: {cockpit}") - raise Exception(f"Vehicle data unavailable. Response: {cockpit}") - - if 'data' not in batt: - log.warning(f"Battery endpoint returned unexpected structure: {batt}") - raise Exception(f"Battery data unavailable. Response: {batt}") - - try: - return CarState(soc=float(batt['data']['attributes']['batteryLevel']), - range=float(batt['data']['attributes']['batteryAutonomy']), - odometer=float(cockpit['data']['attributes']['totalMileage'])) - except (KeyError, TypeError, ValueError) as e: - log.error(f"Failed to parse vehicle data: {e}. Battery: {batt}, Cockpit: {cockpit}") - raise Exception(f"Unable to parse vehicle data: {e}") + return CarState(soc=float(batt['data']['attributes']['batteryLevel']), + range=float(batt['data']['attributes']['batteryAutonomy']), + odometer=float(cockpit['data']['attributes']['totalMileage'])) + From 08aeb184ebbfe5f25a8300e9b1f0ea7880f4273f Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Sun, 29 Mar 2026 15:07:43 +0200 Subject: [PATCH 4/4] Flake8 --- packages/modules/vehicles/renault/api.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/modules/vehicles/renault/api.py b/packages/modules/vehicles/renault/api.py index 1886373e17..af6ccdc00c 100755 --- a/packages/modules/vehicles/renault/api.py +++ b/packages/modules/vehicles/renault/api.py @@ -96,4 +96,3 @@ def fetch_soc(config: RenaultConfiguration) -> CarState: return CarState(soc=float(batt['data']['attributes']['batteryLevel']), range=float(batt['data']['attributes']['batteryAutonomy']), odometer=float(cockpit['data']['attributes']['totalMileage'])) -