From 73f569bb1ae3975b0e15ee19436d2afb20c2693f Mon Sep 17 00:00:00 2001 From: SeaSpotter Date: Thu, 13 Aug 2026 22:35:02 +0200 Subject: [PATCH] Improve odometer update logic in libeuda.py Refactor odometer handling to preserve last known value if no new reading is available. --- packages/modules/vehicles/vweuda/libeuda.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/modules/vehicles/vweuda/libeuda.py b/packages/modules/vehicles/vweuda/libeuda.py index 49b0aa36e7..a2da096921 100755 --- a/packages/modules/vehicles/vweuda/libeuda.py +++ b/packages/modules/vehicles/vweuda/libeuda.py @@ -813,10 +813,23 @@ def update_result_from_payload(self, payload: dict, source: str) -> dict: if result['soc'] is None: _LOGGER.info("thread result skipped, no soc found") _valid = False - if _valid and result['odometer'] is not None: - if vin in euda.result and result['odometer'] < euda.result[vin]['odometer']: - _LOGGER.info("odometer less than earlier - keep earlier value") - result['odometer'] = euda.result[vin]['odometer'] + if _valid: + cached_odometer = euda.result[vin].get('odometer') + if result['odometer'] is None: + # newer payload carries no odometer reading - keep the + # last known value instead of dropping the whole update + result['odometer'] = cached_odometer + elif cached_odometer is not None: + try: + if float(result['odometer']) < float(cached_odometer): + _LOGGER.info("odometer less than earlier - keep earlier value") + result['odometer'] = cached_odometer + except (TypeError, ValueError): + _LOGGER.warning( + f"could not compare odometer values " + f"(new={result['odometer']!r}, cached={cached_odometer!r}); " + "keeping new value" + ) euda.result[vin] = result _LOGGER.info("thread result is valid") else: