From 0940f0250686ed91d25d33caa052edd8988a4450 Mon Sep 17 00:00:00 2001 From: Thomas Salm Date: Sat, 8 Nov 2025 21:41:15 +0100 Subject: [PATCH 1/4] Fix VehicleStatus timestamp drift for invalid placeholder values --- .../vehicle/vehicle_status_resp.py | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/status_publisher/vehicle/vehicle_status_resp.py b/src/status_publisher/vehicle/vehicle_status_resp.py index 15b7929..f5dc280 100644 --- a/src/status_publisher/vehicle/vehicle_status_resp.py +++ b/src/status_publisher/vehicle/vehicle_status_resp.py @@ -2,6 +2,7 @@ from dataclasses import dataclass import datetime +import logging from typing import TYPE_CHECKING, Final, override from saic_ismart_client_ng.api.vehicle import VehicleStatusResp @@ -25,6 +26,8 @@ from publisher.core import Publisher from vehicle_info import VehicleInfo +_logger = logging.getLogger(__name__) + @dataclass(kw_only=True, frozen=True) class VehicleStatusRespProcessingResult: @@ -54,15 +57,23 @@ def __init__( def publish( self, vehicle_status: VehicleStatusResp ) -> VehicleStatusRespProcessingResult: - vehicle_status_time = datetime.datetime.fromtimestamp( - vehicle_status.statusTime or 0, tz=datetime.UTC - ) - now_time = datetime.datetime.now(tz=datetime.UTC) - vehicle_status_drift = abs(now_time - vehicle_status_time) + if vehicle_status.statusTime in (0, 2147483647): + _logger.debug("Skipping vehicle status drift check because of invalid timestamp value: %s", vehicle_status.statusTime) + else: + vehicle_status_time = datetime.datetime.fromtimestamp( + vehicle_status.statusTime, tz=datetime.UTC + ) + now_time = datetime.datetime.now(tz=datetime.UTC) + vehicle_status_drift = abs(now_time - vehicle_status_time) + _logger.debug("Vehicle status timestamp: %s, current UTC time: %s, drift: %s", + vehicle_status_time, + now_time, + vehicle_status_drift + ) - if vehicle_status_drift > datetime.timedelta(minutes=15): - msg = f"Vehicle status time drifted more than 15 minutes from current time: {vehicle_status_drift}. Server reported {vehicle_status_time}" - raise MqttGatewayException(msg) + if vehicle_status_drift > datetime.timedelta(minutes=15): + msg = f"Vehicle status time drifted more than 15 minutes from current time: {vehicle_status_drift}. Server reported {vehicle_status_time}" + raise MqttGatewayException(msg) basic_vehicle_status = vehicle_status.basicVehicleStatus if basic_vehicle_status: From a7ebb749cc5fe2b8aacd668e7d523848e6d51205 Mon Sep 17 00:00:00 2001 From: Thomas Salm Date: Sat, 8 Nov 2025 21:49:39 +0100 Subject: [PATCH 2/4] float value as first argument for fromtimestamp --- src/status_publisher/vehicle/vehicle_status_resp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/status_publisher/vehicle/vehicle_status_resp.py b/src/status_publisher/vehicle/vehicle_status_resp.py index f5dc280..1948ec1 100644 --- a/src/status_publisher/vehicle/vehicle_status_resp.py +++ b/src/status_publisher/vehicle/vehicle_status_resp.py @@ -61,7 +61,7 @@ def publish( _logger.debug("Skipping vehicle status drift check because of invalid timestamp value: %s", vehicle_status.statusTime) else: vehicle_status_time = datetime.datetime.fromtimestamp( - vehicle_status.statusTime, tz=datetime.UTC + float(vehicle_status.statusTime), tz=datetime.UTC ) now_time = datetime.datetime.now(tz=datetime.UTC) vehicle_status_drift = abs(now_time - vehicle_status_time) From 2828f43ad236400444f03fdfadf1fceac8e8d30c Mon Sep 17 00:00:00 2001 From: Thomas Salm Date: Sat, 8 Nov 2025 21:58:18 +0100 Subject: [PATCH 3/4] Added None to the invalid timestamp check --- src/status_publisher/vehicle/vehicle_status_resp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/status_publisher/vehicle/vehicle_status_resp.py b/src/status_publisher/vehicle/vehicle_status_resp.py index 1948ec1..dcf552f 100644 --- a/src/status_publisher/vehicle/vehicle_status_resp.py +++ b/src/status_publisher/vehicle/vehicle_status_resp.py @@ -57,7 +57,7 @@ def __init__( def publish( self, vehicle_status: VehicleStatusResp ) -> VehicleStatusRespProcessingResult: - if vehicle_status.statusTime in (0, 2147483647): + if vehicle_status.statusTime in (None, 0, 2147483647): _logger.debug("Skipping vehicle status drift check because of invalid timestamp value: %s", vehicle_status.statusTime) else: vehicle_status_time = datetime.datetime.fromtimestamp( From 08f5b6588ebe90d026d61f0ea7049ce905ca020f Mon Sep 17 00:00:00 2001 From: Thomas Salm Date: Sat, 8 Nov 2025 22:06:14 +0100 Subject: [PATCH 4/4] Fix mypy error by checking None --- .../vehicle/vehicle_status_resp.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/status_publisher/vehicle/vehicle_status_resp.py b/src/status_publisher/vehicle/vehicle_status_resp.py index dcf552f..c00fa6f 100644 --- a/src/status_publisher/vehicle/vehicle_status_resp.py +++ b/src/status_publisher/vehicle/vehicle_status_resp.py @@ -57,18 +57,25 @@ def __init__( def publish( self, vehicle_status: VehicleStatusResp ) -> VehicleStatusRespProcessingResult: - if vehicle_status.statusTime in (None, 0, 2147483647): - _logger.debug("Skipping vehicle status drift check because of invalid timestamp value: %s", vehicle_status.statusTime) + if vehicle_status.statusTime is None or vehicle_status.statusTime in ( + 0, + 2147483647, + ): + _logger.debug( + "Skipping vehicle status drift check because of invalid timestamp value: %s", + vehicle_status.statusTime, + ) else: vehicle_status_time = datetime.datetime.fromtimestamp( - float(vehicle_status.statusTime), tz=datetime.UTC + vehicle_status.statusTime, tz=datetime.UTC ) now_time = datetime.datetime.now(tz=datetime.UTC) vehicle_status_drift = abs(now_time - vehicle_status_time) - _logger.debug("Vehicle status timestamp: %s, current UTC time: %s, drift: %s", + _logger.debug( + "Vehicle status timestamp: %s, current UTC time: %s, drift: %s", vehicle_status_time, now_time, - vehicle_status_drift + vehicle_status_drift, ) if vehicle_status_drift > datetime.timedelta(minutes=15):