From 50824a97fd153a2bb778689f41a8af629bc7df84 Mon Sep 17 00:00:00 2001 From: andig Date: Thu, 4 Jun 2026 08:25:41 +0200 Subject: [PATCH] DriveSomethingGreater: fix hybrid range --- vehicle/vw/eudataact/eudataact_test.go | 54 ++------------------------ vehicle/vw/eudataact/provider.go | 2 +- vehicle/vw/eudataact/types.go | 19 ++++----- 3 files changed, 15 insertions(+), 60 deletions(-) diff --git a/vehicle/vw/eudataact/eudataact_test.go b/vehicle/vw/eudataact/eudataact_test.go index ffb5e9499..86963a8a8 100644 --- a/vehicle/vw/eudataact/eudataact_test.go +++ b/vehicle/vw/eudataact/eudataact_test.go @@ -40,52 +40,6 @@ func testProvider(data map[string]point) *Provider { } } -func TestParseDataset(t *testing.T) { - doc := datasetFile{ - VIN: "WVWZZZ123", - Data: []dataPoint{ - {DataFieldName: FieldSoc, Value: "73", TimestampUtc: "2026-05-31T07:00:00Z"}, - {DataFieldName: FieldSoc, Value: "80", TimestampUtc: "2026-05-31T08:00:00Z"}, // newest timestamp wins - {DataFieldName: FieldOdometer, Value: "12345", TimestampUtc: "2026-05-31T08:00:00Z"}, - {DataFieldName: FieldRange, Value: "210", TimestampUtc: "2026-05-31T08:00:00Z"}, - {DataFieldName: FieldChargingState, Value: "charging", TimestampUtc: "2026-05-31T08:00:00Z"}, - {DataFieldName: FieldPlugState, Value: "connected", TimestampUtc: "2026-05-31T08:00:00Z"}, - {DataFieldName: FieldTargetSoc, Value: "90", TimestampUtc: "2026-05-31T08:00:00Z"}, - {DataFieldName: "", Value: "ignored"}, // empty field name skipped - }, - } - - vin, data, err := parseDataset(zipJSON(t, doc)) - require.NoError(t, err) - - assert.Equal(t, "WVWZZZ123", vin, "dataset vin must be returned for filtering") - assert.Equal(t, "80", data[FieldSoc].Value, "newest timestamp must win") - assert.Equal(t, "12345", data[FieldOdometer].Value) - assert.Equal(t, "210", data[FieldRange].Value) - - p := testProvider(data) - - soc, err := p.Soc() - require.NoError(t, err) - assert.Equal(t, 80.0, soc) - - rng, err := p.Range() - require.NoError(t, err) - assert.Equal(t, int64(210), rng) - - odo, err := p.Odometer() - require.NoError(t, err) - assert.Equal(t, 12345.0, odo) - - status, err := p.Status() - require.NoError(t, err) - assert.Equal(t, api.StatusC, status) - - limit, err := p.GetLimitSoc() - require.NoError(t, err) - assert.Equal(t, int64(90), limit) -} - func TestStatusPlugStates(t *testing.T) { tc := []struct { plug, charge string @@ -162,16 +116,16 @@ func TestMerge(t *testing.T) { FieldOdometer: {Value: "100", Timestamp: t1}, } src := map[string]point{ - FieldSoc: {Value: "80", Timestamp: t1}, // newer -> wins - FieldOdometer: {Value: "90", Timestamp: t0}, // older -> ignored - FieldRange: {Value: "200", Timestamp: t1}, // new field -> added + FieldSoc: {Value: "80", Timestamp: t1}, // newer -> wins + FieldOdometer: {Value: "90", Timestamp: t0}, // older -> ignored + FieldRangeSecondary: {Value: "200", Timestamp: t1}, // new field -> added } merge(dst, src) assert.Equal(t, "80", dst[FieldSoc].Value, "newer datapoint wins") assert.Equal(t, "100", dst[FieldOdometer].Value, "older datapoint ignored") - assert.Equal(t, "200", dst[FieldRange].Value, "new field added") + assert.Equal(t, "200", dst[FieldRangeSecondary].Value, "new field added") } // TestResetDelay verifies the cache reset is scheduled for when the portal is diff --git a/vehicle/vw/eudataact/provider.go b/vehicle/vw/eudataact/provider.go index 6c3cdae95..2adbe26c6 100644 --- a/vehicle/vw/eudataact/provider.go +++ b/vehicle/vw/eudataact/provider.go @@ -98,7 +98,7 @@ func (v *Provider) Range() (int64, error) { return 0, err } - if p := lookup(data, FieldRange, FieldRangePrimary); p != nil { + if p := lookup(data, FieldRangeSecondary, FieldRangePrimary, FieldRangeCombined); p != nil { f, err := strconv.ParseFloat(p.Value, 64) return int64(f), err } diff --git a/vehicle/vw/eudataact/types.go b/vehicle/vw/eudataact/types.go index 07227777e..767f01524 100644 --- a/vehicle/vw/eudataact/types.go +++ b/vehicle/vw/eudataact/types.go @@ -101,15 +101,16 @@ type datasetFile struct { // data field names as delivered in the dataset (see lib/euDataActDictionary.json) const ( - FieldSoc = "state_of_charge" - FieldHvSoc = "hv_soc" - FieldRange = "cruising_range_combined" - FieldRangePrimary = "cruising_range_primary_engine" - FieldOdometer = "mileage" - FieldChargingState = "charging_state" - FieldPlugState = "plug_state" - FieldTargetSoc = "settings.target_soc" - FieldRemainingTime = "remaining_charging_time" + FieldSoc = "state_of_charge" + FieldHvSoc = "hv_soc" + FieldRangeCombined = "cruising_range_combined" + FieldRangePrimary = "cruising_range_primary_engine" + FieldRangeSecondary = "cruising_range_secondary_engine" + FieldOdometer = "mileage" + FieldChargingState = "charging_state" + FieldPlugState = "plug_state" + FieldTargetSoc = "settings.target_soc" + FieldRemainingTime = "remaining_charging_time" ) // contentDatasets returns the datasets that actually carry content, with their