Skip to content

Commit 9c59ade

Browse files
authored
Merge pull request #7 from Syax89/claude/code-review-testing-o31VM
Release v1.4.9: Use ECU odometer as primary, reduce trip lookback to …
2 parents 4023d5c + f0013da commit 9c59ade

File tree

15 files changed

+27
-21
lines changed

15 files changed

+27
-21
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
All notable changes to this project are documented in this file.
44

5+
## [1.4.9] - 2026-03-14
6+
7+
### Changed
8+
- **Odometer Source**: Switched primary odometer to `DiagnosticOdometerId` (ECU-reported, lightweight, updated at ignition on/off). The previous `DiagnosticOdometerAdjustmentId` (hybrid ECM+GPS, expensive API call, can drift over time) is now a diagnostic fallback sensor.
9+
- **Trip Lookback**: Reduced trip history fetch window from 90 to 30 days. All trip stats (daily/weekly/monthly) only use the last 30 days, so the extra 60 days of data was unnecessary API overhead.
10+
- **Sensor Renamed**: `odometer_raw` sensor renamed to `odometer_adjustment` to accurately reflect its data source (Geotab's hybrid adjustment value, not raw ECU data).
11+
512
## [1.4.8] - 2026-03-14
613

714
### Fixed

custom_components/geotab/api.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def _blocking_fetch_all(self, include_trips: bool = True) -> tuple[list, list, l
145145

146146
# Trips (only when include_trips=True)
147147
if include_trips:
148-
from_date = (datetime.now(timezone.utc) - timedelta(days=90)).isoformat()
148+
from_date = (datetime.now(timezone.utc) - timedelta(days=30)).isoformat()
149149
for device in devices:
150150
device_id = device["id"]
151151
calls.append(
@@ -315,11 +315,10 @@ async def async_get_full_device_data(
315315
data.update(diag_data)
316316

317317
# Robust fallback for odometer
318+
# Priority: OdometerId (ECU, lightweight) → AdjustmentId (hybrid) → TotalDistance (GPS)
318319
if not data.get("odometer"):
319320
if diag_data.get("odometer_adjustment"):
320321
data["odometer"] = diag_data["odometer_adjustment"]
321-
elif diag_data.get("odometer_raw"):
322-
data["odometer"] = diag_data["odometer_raw"]
323322
elif diag_data.get("total_distance"):
324323
data["odometer"] = diag_data["total_distance"]
325324

custom_components/geotab/const.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
# Define the diagnostics we want to fetch, grouped by category
2727
DIAGNOSTICS_TO_FETCH = {
2828
# Driving & odometer
29-
"odometer": "DiagnosticOdometerAdjustmentId",
30-
"odometer_raw": "DiagnosticOdometerId",
29+
"odometer": "DiagnosticOdometerId",
30+
"odometer_adjustment": "DiagnosticOdometerAdjustmentId",
3131
"total_distance": "DiagnosticTotalDistanceId",
3232
"ignition": "DiagnosticIgnitionId",
3333
# Energy & fuel

custom_components/geotab/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
"iot_class": "cloud_polling",
88
"issue_tracker": "https://github.com/Syax89/geotab-hacs-integration/issues",
99
"requirements": ["mygeotab>=0.9.1,<1.0.0"],
10-
"version": "1.4.8"
10+
"version": "1.4.9"
1111
}
1212

custom_components/geotab/sensor.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,16 @@ class GeotabSensorEntityDescription(SensorEntityDescription):
6060
),
6161
),
6262
GeotabSensorEntityDescription(
63-
key="odometer_raw",
64-
translation_key="odometer_raw",
63+
key="odometer_adjustment",
64+
translation_key="odometer_adjustment",
6565
icon="mdi:counter",
6666
native_unit_of_measurement=UnitOfLength.KILOMETERS,
6767
device_class=SensorDeviceClass.DISTANCE,
6868
state_class=SensorStateClass.TOTAL_INCREASING,
6969
entity_category=EntityCategory.DIAGNOSTIC,
7070
suggested_display_precision=1,
7171
value_fn=lambda data: (
72-
data.get("odometer_raw", 0) / 1000 if data.get("odometer_raw") is not None else None
72+
data.get("odometer_adjustment", 0) / 1000 if data.get("odometer_adjustment") is not None else None
7373
),
7474
entity_registry_enabled_default=False,
7575
),

custom_components/geotab/strings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"entity": {
2626
"sensor": {
2727
"odometer": { "name": "Odometer" },
28-
"odometer_raw": { "name": "Odometer (Raw)" },
28+
"odometer_adjustment": { "name": "Odometer (Adjustment)" },
2929
"total_distance": { "name": "Odometer (Total Distance)" },
3030
"fuel_level": { "name": "Fuel Level" },
3131
"fuel_level_raw": { "name": "Fuel Level (Raw)" },

custom_components/geotab/translations/de.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"entity": {
2626
"sensor": {
2727
"odometer": { "name": "Kilometerzähler" },
28-
"odometer_raw": { "name": "Kilometerzähler (Rohdaten)" },
28+
"odometer_adjustment": { "name": "Kilometerzähler (Anpassung)" },
2929
"total_distance": { "name": "Kilometerzähler (Gesamtstrecke)" },
3030
"fuel_level": { "name": "Kraftstoffstand" },
3131
"fuel_level_raw": { "name": "Kraftstoffstand (Rohdaten)" },

custom_components/geotab/translations/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"entity": {
2626
"sensor": {
2727
"odometer": { "name": "Odometer" },
28-
"odometer_raw": { "name": "Odometer (Raw ECU Data)" },
28+
"odometer_adjustment": { "name": "Odometer (Adjustment)" },
2929
"total_distance": { "name": "Odometer (Total Distance)" },
3030
"fuel_level": { "name": "Fuel Level" },
3131
"fuel_level_raw": { "name": "Fuel Level (Raw Data)" },

custom_components/geotab/translations/es.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"entity": {
2626
"sensor": {
2727
"odometer": { "name": "Odómetro" },
28-
"odometer_raw": { "name": "Odómetro (Datos brutos)" },
28+
"odometer_adjustment": { "name": "Odómetro (Ajuste)" },
2929
"total_distance": { "name": "Odómetro (Distancia total)" },
3030
"fuel_level": { "name": "Nivel de combustible" },
3131
"fuel_level_raw": { "name": "Nivel de combustible (Datos brutos)" },

custom_components/geotab/translations/fr.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"entity": {
2626
"sensor": {
2727
"odometer": { "name": "Odomètre" },
28-
"odometer_raw": { "name": "Odomètre (Données brutes)" },
28+
"odometer_adjustment": { "name": "Odomètre (Ajustement)" },
2929
"total_distance": { "name": "Odomètre (Distance totale)" },
3030
"fuel_level": { "name": "Niveau de carburant" },
3131
"fuel_level_raw": { "name": "Niveau de carburant (Données brutes)" },

0 commit comments

Comments
 (0)