From dd97e9ddbf1ab21237b97d74d2a826073c5fae4a Mon Sep 17 00:00:00 2001 From: G-Two <7310260+G-Two@users.noreply.github.com> Date: Sun, 3 Mar 2024 17:12:33 -0500 Subject: [PATCH] Bump subarulink to 0.7.11 - API native values are now US customary - Use latest MySubaru API g2v29 --- custom_components/subaru/manifest.json | 4 +- custom_components/subaru/sensor.py | 71 ++++++---- requirements.test.txt | 2 +- setup.cfg | 2 +- tests/api_responses.py | 136 +++++++++++-------- tests/fixtures/diagnostics_config_entry.json | 28 ++-- tests/fixtures/diagnostics_device.json | 28 ++-- 7 files changed, 143 insertions(+), 128 deletions(-) diff --git a/custom_components/subaru/manifest.json b/custom_components/subaru/manifest.json index 4b360fa..17cb1ae 100644 --- a/custom_components/subaru/manifest.json +++ b/custom_components/subaru/manifest.json @@ -6,6 +6,6 @@ "documentation": "https://github.com/G-Two/homeassistant-subaru", "iot_class": "cloud_polling", "issue_tracker": "https://github.com/G-Two/homeassistant-subaru/issues", - "requirements": ["subarulink==0.7.9"], - "version": "0.7.12" + "requirements": ["subarulink==0.7.11"], + "version": "0.7.13" } diff --git a/custom_components/subaru/sensor.py b/custom_components/subaru/sensor.py index 465e045..01e273f 100644 --- a/custom_components/subaru/sensor.py +++ b/custom_components/subaru/sensor.py @@ -22,12 +22,12 @@ CoordinatorEntity, DataUpdateCoordinator, ) -from homeassistant.util.unit_conversion import DistanceConverter, VolumeConverter -from homeassistant.util.unit_system import ( - LENGTH_UNITS, - PRESSURE_UNITS, - US_CUSTOMARY_SYSTEM, +from homeassistant.util.unit_conversion import ( + DistanceConverter, + PressureConverter, + VolumeConverter, ) +from homeassistant.util.unit_system import LENGTH_UNITS, METRIC_SYSTEM, PRESSURE_UNITS from .const import ( API_GEN_2, @@ -59,7 +59,7 @@ translation_key="odometer", device_class=SensorDeviceClass.DISTANCE, icon="mdi:road-variant", - native_unit_of_measurement=UnitOfLength.KILOMETERS, + native_unit_of_measurement=UnitOfLength.MILES, state_class=SensorStateClass.TOTAL_INCREASING, ), ] @@ -70,7 +70,7 @@ key=sc.AVG_FUEL_CONSUMPTION, translation_key="average_fuel_consumption", icon="mdi:leaf", - native_unit_of_measurement=FUEL_CONSUMPTION_LITERS_PER_HUNDRED_KILOMETERS, + native_unit_of_measurement=FUEL_CONSUMPTION_MILES_PER_GALLON, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( @@ -78,35 +78,35 @@ translation_key="range", device_class=SensorDeviceClass.DISTANCE, icon="mdi:gas-station", - native_unit_of_measurement=UnitOfLength.KILOMETERS, + native_unit_of_measurement=UnitOfLength.MILES, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( key=sc.TIRE_PRESSURE_FL, translation_key="tire_pressure_front_left", device_class=SensorDeviceClass.PRESSURE, - native_unit_of_measurement=UnitOfPressure.HPA, + native_unit_of_measurement=UnitOfPressure.PSI, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( key=sc.TIRE_PRESSURE_FR, translation_key="tire_pressure_front_right", device_class=SensorDeviceClass.PRESSURE, - native_unit_of_measurement=UnitOfPressure.HPA, + native_unit_of_measurement=UnitOfPressure.PSI, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( key=sc.TIRE_PRESSURE_RL, translation_key="tire_pressure_rear_left", device_class=SensorDeviceClass.PRESSURE, - native_unit_of_measurement=UnitOfPressure.HPA, + native_unit_of_measurement=UnitOfPressure.PSI, state_class=SensorStateClass.MEASUREMENT, ), SensorEntityDescription( key=sc.TIRE_PRESSURE_RR, translation_key="tire_pressure_rear_right", device_class=SensorDeviceClass.PRESSURE, - native_unit_of_measurement=UnitOfPressure.HPA, + native_unit_of_measurement=UnitOfPressure.PSI, state_class=SensorStateClass.MEASUREMENT, ), ] @@ -220,13 +220,12 @@ def native_value(self) -> None | int | float: if current_value is None: return None - if unit in LENGTH_UNITS: + if unit in LENGTH_UNITS and unit_system == METRIC_SYSTEM: return round(unit_system.length(current_value, cast(str, unit)), 1) - if unit in PRESSURE_UNITS and unit_system == US_CUSTOMARY_SYSTEM: + if unit in PRESSURE_UNITS and unit_system == METRIC_SYSTEM: return round( - unit_system.pressure(current_value, cast(str, unit)), - 1, + PressureConverter.convert(current_value, unit, UnitOfPressure.KPA), 0 ) if ( @@ -235,7 +234,7 @@ def native_value(self) -> None | int | float: FUEL_CONSUMPTION_LITERS_PER_HUNDRED_KILOMETERS, FUEL_CONSUMPTION_MILES_PER_GALLON, ] - and unit_system == US_CUSTOMARY_SYSTEM + and unit_system == METRIC_SYSTEM ): return round((100.0 * L_PER_GAL) / (KM_PER_MI * current_value), 1) @@ -247,18 +246,19 @@ def native_unit_of_measurement(self) -> str | None: unit = self.entity_description.native_unit_of_measurement if unit in LENGTH_UNITS: - return self.hass.config.units.length_unit + if self.hass.config.units == METRIC_SYSTEM: + return self.hass.config.units.length_unit if unit in PRESSURE_UNITS: - if self.hass.config.units == US_CUSTOMARY_SYSTEM: - return self.hass.config.units.pressure_unit + if self.hass.config.units == METRIC_SYSTEM: + return UnitOfPressure.KPA if unit in [ FUEL_CONSUMPTION_LITERS_PER_HUNDRED_KILOMETERS, FUEL_CONSUMPTION_MILES_PER_GALLON, ]: - if self.hass.config.units == US_CUSTOMARY_SYSTEM: - return FUEL_CONSUMPTION_MILES_PER_GALLON + if self.hass.config.units == METRIC_SYSTEM: + return FUEL_CONSUMPTION_LITERS_PER_HUNDRED_KILOMETERS return unit @@ -266,6 +266,7 @@ def native_unit_of_measurement(self) -> str | None: def extra_state_attributes(self) -> dict[str, Any] | None: """Return entity specific state attributes.""" extra_attributes = None + unit_system = self.hass.config.units # Provide recommended tire pressure if self.device_class == SensorDeviceClass.PRESSURE: @@ -276,17 +277,27 @@ def extra_state_attributes(self) -> dict[str, Any] | None: sc.TIRE_PRESSURE_FL, sc.TIRE_PRESSURE_FR, ]: - extra_attributes = { - "Recommended pressure": info.get( - sc.HEALTH_RECOMMENDED_TIRE_PRESSURE_FRONT + value = info.get(sc.HEALTH_RECOMMENDED_TIRE_PRESSURE_FRONT) + if unit_system == METRIC_SYSTEM: + value = round( + PressureConverter.convert( + value, UnitOfPressure.PSI, UnitOfPressure.KPA + ), + 0, ) - } + + extra_attributes = {"Recommended pressure": value} else: - extra_attributes = { - "Recommended pressure": info.get( - sc.HEALTH_RECOMMENDED_TIRE_PRESSURE_REAR + value = info.get(sc.HEALTH_RECOMMENDED_TIRE_PRESSURE_REAR) + if unit_system == METRIC_SYSTEM: + value = round( + PressureConverter.convert( + value, UnitOfPressure.PSI, UnitOfPressure.KPA + ), + 0, ) - } + + extra_attributes = {"Recommended pressure": value} return extra_attributes diff --git a/requirements.test.txt b/requirements.test.txt index 5182dea..f4de755 100644 --- a/requirements.test.txt +++ b/requirements.test.txt @@ -2,4 +2,4 @@ pylint pytest pytest-cov pytest-homeassistant-custom-component -subarulink==0.7.9 +subarulink==0.7.11 diff --git a/setup.cfg b/setup.cfg index d4d232f..b29b1df 100644 --- a/setup.cfg +++ b/setup.cfg @@ -43,7 +43,7 @@ forced_separate = tests combine_as_imports = true [mypy] -python_version = 3.9 +python_version = 3.11 ignore_errors = true follow_imports = silent ignore_missing_imports = true diff --git a/tests/api_responses.py b/tests/api_responses.py index fd4a3cb..4f36a4c 100644 --- a/tests/api_responses.py +++ b/tests/api_responses.py @@ -1,6 +1,6 @@ """Sample API response data for tests.""" -from datetime import datetime, timezone +import datetime from custom_components.subaru.const import ( API_GEN_1, @@ -70,8 +70,6 @@ }, } -MOCK_DATETIME = datetime.fromtimestamp(1595560000, timezone.utc) - VEHICLE_STATUS_EV = { VEHICLE_CLIMATE_SELECTED_PRESET: None, VEHICLE_CLIMATE: [ @@ -162,8 +160,8 @@ }, ], VEHICLE_STATUS: { - "AVG_FUEL_CONSUMPTION": 2.3, - "DISTANCE_TO_EMPTY_FUEL": 707, + "AVG_FUEL_CONSUMPTION": 51.1, + "DISTANCE_TO_EMPTY_FUEL": 170, "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", "DOOR_BOOT_POSITION": "CLOSED", "DOOR_ENGINE_HOOD_POSITION": "CLOSED", @@ -178,25 +176,23 @@ "EV_IS_PLUGGED_IN": "UNLOCKED_CONNECTED", "EV_STATE_OF_CHARGE_MODE": "EV_MODE", "EV_STATE_OF_CHARGE_PERCENT": 20, - "EV_TIME_TO_FULLY_CHARGED_UTC": MOCK_DATETIME, + "EV_TIME_TO_FULLY_CHARGED_UTC": datetime.datetime( + 2024, 1, 2, 17, 20, 15, tzinfo=datetime.timezone.utc + ), + "LAST_UPDATED_DATE": "2024-01-02T12:20:15.000+0000", + "LATITUDE": 40.0, + "LOCATION_VALID": True, + "LONGITUDE": -100.0, "ODOMETER": 1234, - "POSITION_HEADING_DEGREE": 150, - "POSITION_SPEED_KMPH": "0", - "POSITION_TIMESTAMP": 1595560000.0, - "TIMESTAMP": 1595560000.0, + "TIMESTAMP": datetime.datetime( + 2024, 1, 2, 12, 20, 15, tzinfo=datetime.timezone.utc + ), "TRANSMISSION_MODE": "UNKNOWN", "TYRE_PRESSURE_FRONT_LEFT": 0, - "TYRE_PRESSURE_FRONT_RIGHT": 2550, - "TYRE_PRESSURE_REAR_LEFT": 2450, + "TYRE_PRESSURE_FRONT_RIGHT": 31.9, + "TYRE_PRESSURE_REAR_LEFT": 32.6, "TYRE_PRESSURE_REAR_RIGHT": None, - "TYRE_STATUS_FRONT_LEFT": "UNKNOWN", - "TYRE_STATUS_FRONT_RIGHT": "UNKNOWN", - "TYRE_STATUS_REAR_LEFT": "UNKNOWN", - "TYRE_STATUS_REAR_RIGHT": "UNKNOWN", "VEHICLE_STATE_TYPE": "IGNITION_OFF", - "HEADING": 170, - "LATITUDE": 40.0, - "LONGITUDE": -100.0, }, VEHICLE_HEALTH: { "FEATURES": { @@ -229,24 +225,37 @@ VEHICLE_STATUS_G3 = { VEHICLE_STATUS: { - "AVG_FUEL_CONSUMPTION": 2.3, - "DISTANCE_TO_EMPTY_FUEL": 707, + "AVG_FUEL_CONSUMPTION": 51.1, + "DISTANCE_TO_EMPTY_FUEL": 170, + "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", "DOOR_BOOT_POSITION": "CLOSED", "DOOR_ENGINE_HOOD_POSITION": "CLOSED", "DOOR_FRONT_LEFT_POSITION": "CLOSED", "DOOR_FRONT_RIGHT_POSITION": "CLOSED", "DOOR_REAR_LEFT_POSITION": "CLOSED", "DOOR_REAR_RIGHT_POSITION": "CLOSED", + "EV_CHARGER_STATE_TYPE": "CHARGING", + "EV_CHARGE_SETTING_AMPERE_TYPE": "MAXIMUM", + "EV_CHARGE_VOLT_TYPE": "CHARGE_LEVEL_1", + "EV_DISTANCE_TO_EMPTY": 1, + "EV_IS_PLUGGED_IN": "UNLOCKED_CONNECTED", + "EV_STATE_OF_CHARGE_MODE": "EV_MODE", + "EV_STATE_OF_CHARGE_PERCENT": 20, + "EV_TIME_TO_FULLY_CHARGED_UTC": datetime.datetime( + 2024, 1, 2, 17, 20, 15, tzinfo=datetime.timezone.utc + ), + "LAST_UPDATED_DATE": "2024-01-02T12:20:15.000+0000", + "LATITUDE": 40.0, + "LOCATION_VALID": True, + "LONGITUDE": -100.0, "ODOMETER": 1234, - "POSITION_HEADING_DEGREE": 150, - "POSITION_SPEED_KMPH": "0", - "POSITION_TIMESTAMP": 1595560000.0, - "REMAINING_FUEL_PERCENT": 77, - "TIMESTAMP": 1595560000.0, + "TIMESTAMP": datetime.datetime( + 2024, 1, 2, 12, 20, 15, tzinfo=datetime.timezone.utc + ), "TRANSMISSION_MODE": "UNKNOWN", "TYRE_PRESSURE_FRONT_LEFT": 0, - "TYRE_PRESSURE_FRONT_RIGHT": 2550, - "TYRE_PRESSURE_REAR_LEFT": 2450, + "TYRE_PRESSURE_FRONT_RIGHT": 31.9, + "TYRE_PRESSURE_REAR_LEFT": 32.6, "TYRE_PRESSURE_REAR_RIGHT": None, "VEHICLE_STATE_TYPE": "IGNITION_OFF", "WINDOW_BACK_STATUS": "OPEN", @@ -255,15 +264,19 @@ "WINDOW_REAR_LEFT_STATUS": "OPEN", "WINDOW_REAR_RIGHT_STATUS": "OPEN", "WINDOW_SUNROOF_STATUS": "OPEN", - "HEADING": 170, - "LATITUDE": 40.0, - "LONGITUDE": -100.0, - } + }, } EXPECTED_STATE_EV_IMPERIAL = { - "AVG_FUEL_CONSUMPTION": "102.3", - "DISTANCE_TO_EMPTY_FUEL": "439.3", + "AVG_FUEL_CONSUMPTION": "51.1", + "DISTANCE_TO_EMPTY_FUEL": "170", + "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", + "DOOR_BOOT_POSITION": "CLOSED", + "DOOR_ENGINE_HOOD_POSITION": "CLOSED", + "DOOR_FRONT_LEFT_POSITION": "CLOSED", + "DOOR_FRONT_RIGHT_POSITION": "CLOSED", + "DOOR_REAR_LEFT_POSITION": "CLOSED", + "DOOR_REAR_RIGHT_POSITION": "CLOSED", "EV_CHARGER_STATE_TYPE": "CHARGING", "EV_CHARGE_SETTING_AMPERE_TYPE": "MAXIMUM", "EV_CHARGE_VOLT_TYPE": "CHARGE_LEVEL_1", @@ -271,26 +284,31 @@ "EV_IS_PLUGGED_IN": "UNLOCKED_CONNECTED", "EV_STATE_OF_CHARGE_MODE": "EV_MODE", "EV_STATE_OF_CHARGE_PERCENT": "20", - "EV_TIME_TO_FULLY_CHARGED_UTC": "2020-07-24T03:06:40+00:00", - "ODOMETER": "766.8", - "POSITION_HEADING_DEGREE": "150", - "POSITION_SPEED_KMPH": "0", - "POSITION_TIMESTAMP": 1595560000.0, - "TIMESTAMP": 1595560000.0, + "EV_TIME_TO_FULLY_CHARGED_UTC": "2024-01-02T17:20:15+00:00", + "LAST_UPDATED_DATE": "2024-01-02T12:20:15+00:00", + "LATITUDE": 40.0, + "LOCATION_VALID": True, + "LONGITUDE": -100.0, + "ODOMETER": "1234", + "TIMESTAMP": "2024-01-02T12:20:15+00:00", "TRANSMISSION_MODE": "UNKNOWN", - "TYRE_PRESSURE_FRONT_LEFT": "0.0", - "TYRE_PRESSURE_FRONT_RIGHT": "37.0", - "TYRE_PRESSURE_REAR_LEFT": "35.5", + "TYRE_PRESSURE_FRONT_LEFT": "0", + "TYRE_PRESSURE_FRONT_RIGHT": "31.9", + "TYRE_PRESSURE_REAR_LEFT": "32.6", "TYRE_PRESSURE_REAR_RIGHT": "unknown", "VEHICLE_STATE_TYPE": "IGNITION_OFF", - "HEADING": 170, - "LATITUDE": 40.0, - "LONGITUDE": -100.0, } EXPECTED_STATE_EV_METRIC = { - "AVG_FUEL_CONSUMPTION": "2.3", - "DISTANCE_TO_EMPTY_FUEL": "707", + "AVG_FUEL_CONSUMPTION": "4.6", + "DISTANCE_TO_EMPTY_FUEL": "273.6", + "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", + "DOOR_BOOT_POSITION": "CLOSED", + "DOOR_ENGINE_HOOD_POSITION": "CLOSED", + "DOOR_FRONT_LEFT_POSITION": "CLOSED", + "DOOR_FRONT_RIGHT_POSITION": "CLOSED", + "DOOR_REAR_LEFT_POSITION": "CLOSED", + "DOOR_REAR_RIGHT_POSITION": "CLOSED", "EV_CHARGER_STATE_TYPE": "CHARGING", "EV_CHARGE_SETTING_AMPERE_TYPE": "MAXIMUM", "EV_CHARGE_VOLT_TYPE": "CHARGE_LEVEL_1", @@ -298,21 +316,19 @@ "EV_IS_PLUGGED_IN": "UNLOCKED_CONNECTED", "EV_STATE_OF_CHARGE_MODE": "EV_MODE", "EV_STATE_OF_CHARGE_PERCENT": "20", - "EV_TIME_TO_FULLY_CHARGED_UTC": "2020-07-24T03:06:40+00:00", - "ODOMETER": "1234", - "POSITION_HEADING_DEGREE": "150", - "POSITION_SPEED_KMPH": "0", - "POSITION_TIMESTAMP": 1595560000.0, - "TIMESTAMP": 1595560000.0, + "EV_TIME_TO_FULLY_CHARGED_UTC": "2024-01-02T17:20:15+00:00", + "LAST_UPDATED_DATE": "2024-01-02T12:20:15+00:00", + "LATITUDE": 40.0, + "LOCATION_VALID": True, + "LONGITUDE": -100.0, + "ODOMETER": "1985.9", + "TIMESTAMP": "2024-01-02T12:20:15+00:00", "TRANSMISSION_MODE": "UNKNOWN", - "TYRE_PRESSURE_FRONT_LEFT": "0", - "TYRE_PRESSURE_FRONT_RIGHT": "2550", - "TYRE_PRESSURE_REAR_LEFT": "2450", + "TYRE_PRESSURE_FRONT_LEFT": "0.0", + "TYRE_PRESSURE_FRONT_RIGHT": "220.0", + "TYRE_PRESSURE_REAR_LEFT": "225.0", "TYRE_PRESSURE_REAR_RIGHT": "unknown", "VEHICLE_STATE_TYPE": "IGNITION_OFF", - "HEADING": 170, - "LATITUDE": 40.0, - "LONGITUDE": -100.0, } EXPECTED_STATE_EV_UNAVAILABLE = { diff --git a/tests/fixtures/diagnostics_config_entry.json b/tests/fixtures/diagnostics_config_entry.json index f6cac83..4239e57 100644 --- a/tests/fixtures/diagnostics_config_entry.json +++ b/tests/fixtures/diagnostics_config_entry.json @@ -101,8 +101,8 @@ } ], "vehicle_status": { - "AVG_FUEL_CONSUMPTION": 2.3, - "DISTANCE_TO_EMPTY_FUEL": 707, + "AVG_FUEL_CONSUMPTION": 51.1, + "DISTANCE_TO_EMPTY_FUEL": 170, "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", "DOOR_BOOT_POSITION": "CLOSED", "DOOR_ENGINE_HOOD_POSITION": "CLOSED", @@ -117,25 +117,19 @@ "EV_IS_PLUGGED_IN": "UNLOCKED_CONNECTED", "EV_STATE_OF_CHARGE_MODE": "EV_MODE", "EV_STATE_OF_CHARGE_PERCENT": 20, - "EV_TIME_TO_FULLY_CHARGED_UTC": "2020-07-24 03:06:40+00:00", + "EV_TIME_TO_FULLY_CHARGED_UTC": "2024-01-02 17:20:15+00:00", + "LAST_UPDATED_DATE": "2024-01-02T12:20:15.000+0000", + "LATITUDE": "**REDACTED**", + "LOCATION_VALID": true, + "LONGITUDE": "**REDACTED**", "ODOMETER": "**REDACTED**", - "POSITION_HEADING_DEGREE": 150, - "POSITION_SPEED_KMPH": "0", - "POSITION_TIMESTAMP": 1595560000.0, - "TIMESTAMP": 1595560000.0, + "TIMESTAMP": "2024-01-02 12:20:15+00:00", "TRANSMISSION_MODE": "UNKNOWN", "TYRE_PRESSURE_FRONT_LEFT": 0, - "TYRE_PRESSURE_FRONT_RIGHT": 2550, - "TYRE_PRESSURE_REAR_LEFT": 2450, + "TYRE_PRESSURE_FRONT_RIGHT": 31.9, + "TYRE_PRESSURE_REAR_LEFT": 32.6, "TYRE_PRESSURE_REAR_RIGHT": null, - "TYRE_STATUS_FRONT_LEFT": "UNKNOWN", - "TYRE_STATUS_FRONT_RIGHT": "UNKNOWN", - "TYRE_STATUS_REAR_LEFT": "UNKNOWN", - "TYRE_STATUS_REAR_RIGHT": "UNKNOWN", - "VEHICLE_STATE_TYPE": "IGNITION_OFF", - "HEADING": 170, - "LATITUDE": "**REDACTED**", - "LONGITUDE": "**REDACTED**" + "VEHICLE_STATE_TYPE": "IGNITION_OFF" }, "vehicle_health": { "FEATURES": { diff --git a/tests/fixtures/diagnostics_device.json b/tests/fixtures/diagnostics_device.json index b0081a6..71c1eb4 100644 --- a/tests/fixtures/diagnostics_device.json +++ b/tests/fixtures/diagnostics_device.json @@ -100,8 +100,8 @@ } ], "vehicle_status": { - "AVG_FUEL_CONSUMPTION": 2.3, - "DISTANCE_TO_EMPTY_FUEL": 707, + "AVG_FUEL_CONSUMPTION": 51.1, + "DISTANCE_TO_EMPTY_FUEL": 170, "DOOR_BOOT_LOCK_STATUS": "UNKNOWN", "DOOR_BOOT_POSITION": "CLOSED", "DOOR_ENGINE_HOOD_POSITION": "CLOSED", @@ -116,25 +116,19 @@ "EV_IS_PLUGGED_IN": "UNLOCKED_CONNECTED", "EV_STATE_OF_CHARGE_MODE": "EV_MODE", "EV_STATE_OF_CHARGE_PERCENT": 20, - "EV_TIME_TO_FULLY_CHARGED_UTC": "2020-07-24 03:06:40+00:00", + "EV_TIME_TO_FULLY_CHARGED_UTC": "2024-01-02 17:20:15+00:00", + "LAST_UPDATED_DATE": "2024-01-02T12:20:15.000+0000", + "LATITUDE": "**REDACTED**", + "LOCATION_VALID": true, + "LONGITUDE": "**REDACTED**", "ODOMETER": "**REDACTED**", - "POSITION_HEADING_DEGREE": 150, - "POSITION_SPEED_KMPH": "0", - "POSITION_TIMESTAMP": 1595560000.0, - "TIMESTAMP": 1595560000.0, + "TIMESTAMP": "2024-01-02 12:20:15+00:00", "TRANSMISSION_MODE": "UNKNOWN", "TYRE_PRESSURE_FRONT_LEFT": 0, - "TYRE_PRESSURE_FRONT_RIGHT": 2550, - "TYRE_PRESSURE_REAR_LEFT": 2450, + "TYRE_PRESSURE_FRONT_RIGHT": 31.9, + "TYRE_PRESSURE_REAR_LEFT": 32.6, "TYRE_PRESSURE_REAR_RIGHT": null, - "TYRE_STATUS_FRONT_LEFT": "UNKNOWN", - "TYRE_STATUS_FRONT_RIGHT": "UNKNOWN", - "TYRE_STATUS_REAR_LEFT": "UNKNOWN", - "TYRE_STATUS_REAR_RIGHT": "UNKNOWN", - "VEHICLE_STATE_TYPE": "IGNITION_OFF", - "HEADING": 170, - "LATITUDE": "**REDACTED**", - "LONGITUDE": "**REDACTED**" + "VEHICLE_STATE_TYPE": "IGNITION_OFF" }, "vehicle_health": { "FEATURES": {