DriveSomethingGreater: fix hybrid range

This commit is contained in:
andig 2026-06-04 08:25:41 +02:00
parent c0d501ce9e
commit 50824a97fd
3 changed files with 15 additions and 60 deletions

View file

@ -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

View file

@ -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
}

View file

@ -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