Skip to main content

Dashboard data map

This document tracks what the dashboards need, what TeslaMate-style EV logging commonly shows, what Rivian appears to expose, and what Riviamigo currently stores.

Sources:

Dashboard inventory

DashboardWidgetsPrimary data sourceCurrent status
Dashboardtotal miles, trips, energy, efficiency, SoC chart, efficiency trendlatest telemetry, trips, chargesTotal miles now uses live odometer; efficiency waits for completed trips.
Batterycurrent SoC, estimated range, phantom drain, capacity health, SoC/range/drain/degradation chartslatest telemetry plus validated parked periods from the idle-drain routePhantom Drain rate is duration-weighted from validated parked periods; current SoC/range use latest vehicle status; capacity falls back to latest usable kWh.
Efficiencyavg Wh/mi, best/worst bands, efficiency by mode, trend, temp bins, average outside temperaturecompleted trips plus route-aware trip weather samplesOutside temperature is a time-weighted vehicle/Open-Meteo summary shared with the trip timeline.
Chargingenergy, cost, sessions, charge mix, daily energy, charging curve trendcharge session detector and charging curve samplesCharging charts use a dedicated daily chart-series endpoint and a session-aware curve-analysis path; daily totals and stacked session composition share the filled charging-bar visual; older curves can fall back to saved Rivian charge points when telemetry history is sparse.
Tripstrip list, route map, synchronized detail charts, speed, elevation, signed net powercompleted trip detector, persisted route previews, adaptive telemetry samples, SoC/capacity telemetryMap requests use one bounded route dataset; detail requests use one columnar sample payload and canvas charts. Drive power uses direct fields when available, otherwise a bounded SoC-derived estimate with provenance and coverage metadata.
Settings Raw Databounded telemetry lanes, searchable normalized records, per-field coverage, selected-record inspection, and owner/manager-only retained inbound eventsbucketed Timescale telemetry for dense views, compatibility raw records for detail, plus short-lived Rivian websocket payload retentionUse lanes for history visualization and the normalized record path for search/detail; original payloads are troubleshooting evidence, not a stable dashboard contract.

Full-density dashboard time-series rule

Dashboard time-series charts and sparklines return every retained normalized telemetry, trip, or charge-session point in the selected range. They must not silently switch to minute/hour/day/week averages or impose a display-point cap. The typed batch and chart routes remain the only delivery seams; raw-event JSON is still a troubleshooting contract, not a dashboard data source. Where older raw history is unavailable, a chart may use the highest-resolution retained aggregate and must retain its source provenance.

Intentional aggregation remains valid when it is the chart's meaning: charging and Phantom Drain bars use local days, while drive-mode and temperature charts use categories/bins. Trip-detail charts retain their 10-second synchronized telemetry contract.

TeslaMate parity targets

Charging chart semantics

  • Energy Charged (charging-weekly-energy) is a daily total-energy bar chart. Each bar is the local calendar date on which the session started and hover shows the day plus total kWh.
  • Daily Charge Sessions (charging-sessions-energy) is a daily stacked bar chart. Each local start-date bar is composed of AC, DC, and Unknown session groups, with legend, grouped hover details including the sum of recorded USD costs per charger type, and optional day selection for the charging table.
  • DC Charging Curve Trend uses only completed, non-home sessions canonically classified as DC. It shows every telemetry-backed session/SoC point, collapsing only duplicate readings from the same session at the same exact SoC. Evidence points fade from accent orange at lower power to green at higher power. The in-chart trend control can show a smooth local observed regression or a local upper-quartile best-observed regression, or hide that line entirely. Direct Rivian kW is preferred; when unavailable, power is derived from observed SoC change and elapsed time. Saved Rivian curve points with interpolated SoC remain visibly marked as estimated history and never affect either summary.
  • Both charts use the shared filled-bar treatment; the stacked chart retains its segmentation because it answers a different question from the daily total chart.

TeslaMate-style dashboards generally cover these data families:

FamilyExample metricsRivian candidate fieldsRiviamigo status
Live batterySoC, rated/estimated range, charge limit, usable capacitybatteryLevel, distanceToEmpty, batteryLimit, batteryCapacityCaptured and surfaced.
Location and motionlatitude, longitude, speed, altitude, heading, odometergnssLocation, gnssSpeed, gnssAltitude, gnssBearing, vehicleMileageCaptured; odometer converted from meters to miles.
Chargingplugged/charging state, charge status, time remaining, sessions, ratechargerState, chargerStatus, timeToEndOfCharge, live charge endpointsBasic status captured; session aggregation needs more real data.
Drive efficiencytrip distance, Wh/mi, drive mode, elevation, cabin/setpoint temperature, estimated exterior temperature, signed net powerdriveMode, telemetry deltas, batteryLevel, batteryCapacity, cabinClimateInteriorTemperature, trip points, trip_weather_samplesExterior samples are estimated because Rivian rejects the subscription field; power is direct only when Rivian supplies it, otherwise averaged between SoC updates with explicit provenance.
Climatecabin temp, driver setpoint, preconditioning, pet mode, defrost, seat heat/ventclimate and seat fields in vehicleStateCabin/driver temp captured; advanced climate fields not yet stored.
Closures and locksdoors, windows, frunk/liftgate/tailgate, side bins, tonneau, locked/unlockedHASS LOCK_STATE_ENTITIES, DOOR_STATE_ENTITIES, CLOSURE_STATE_ENTITIESDoor/frunk/liftgate/tailgate basics stored; side bins, tonneau, and windows are next parity gaps.
Tires and maintenanceTPMS pressure, TPMS status/validity, 12V health, brake/wiper warningstirePressure* values are BAR in HASS, plus tirePressureStatus* and tirePressureStatusValid*Numeric tire pressure converted to PSI on ingest; status stored; validity still a gap.
Softwarecurrent version, available version, install status/progress/readinessotaCurrentVersion*, otaAvailableVersion*, otaStatus, otaInstallProgress, otaInstallReadyCore versions/status stored; week/year/number/progress/readiness are next parity gaps.
Media/imagesconfigured vehicle images, style variantsHASS VehicleImageCoordinator; cel style uses vehicle version 3, photo style uses version 2, resolution="@3x"Every Rivian-provided variant and overlay is mirrored through the existing account session to persistent local storage. UI consumes only first-party normalized side/overhead/front/rear URLs; model-specific packaged artwork renders immediately while missing blobs repair in the background.

The authenticated artwork endpoint uses 200 only for a validated local mirror. Missing metadata, missing files, checksum failures, and active repairs return 202 with x-riviamigo-artwork-state: restoring, causing the browser to keep the packaged R1S/R1T/R2S fallback visible and poll for the completed first-party asset. Startup repairs enrolled vehicles with bounded concurrency so one slow account does not block every other vehicle.

Home Assistant reference map

The HASS integration is the current executable reference for entity parity.

AreaHASS fields / behaviorRiviamigo path
Tire pressuretirePressureFrontLeft, tirePressureFrontRight, tirePressureRearLeft, tirePressureRearRight; HASS declares unit as BAR.Convert BAR -> PSI in apps/api/src/ingestion/parser.rs before storing in timeseries.telemetry.tire_*_psi.
Tire statustirePressureStatusFrontLeft, tirePressureStatusFrontRight, tirePressureStatusRearLeft, tirePressureStatusRearRight; validity fields are tirePressureStatusValid*.Status stored in timeseries.telemetry.tire_*_status; validity fields still need schema/parser coverage.
Charging connectedHASS treats chargerStatus == "chrgr_sts_not_connected" as unplugged and chargerState in ["charging_active", "charging_connecting"] as charging.UI maps chrgr_sts_not_connected to "Not charging" and avoids showing raw unknown.
Drive modeHASS maps everyday -> All-Purpose, distance -> Conserve, off-road variants to display labels.UI uses the same display map before falling back to gear.
LocksAggregate locked state is true only when none of HASS LOCK_STATE_ENTITIES are unlocked.Door lock booleans stored now; add side bin, tonneau, frunk/liftgate/tailgate aggregate parity next.
ClosuresAggregate closure state checks doors plus frunk/liftgate/side bins/tailgate/tonneau for open.Door/frunk/liftgate/tailgate closure booleans stored now; windows/side bins/tonneau next.
SoftwareHASS update entity compares current/available versions and treats 0.0.0 available as current; otaStatus Idle is not a user-facing drive/charging state.UI maps no available version or equal version to "Up to date"; raw OTA fields remain in status/raw data.
ImagesHASS calls getVehicleMobileImages through get_vehicle_images(extension="png", resolution="@3x", vehicle_version="3") for cel and version 2 for photo; image entities use size == "large".Riviamigo now requests both style versions, caches image rows, and normalizes placement/design for UI lookup.

Next acquisition batches

  1. Closures and locks: add side-bin, tonneau, and window fields from HASS LOCK_STATE_ENTITIES / CLOSURE_STATE_ENTITIES.
  2. OTA/software: add week/year/number/git-hash/progress/readiness fields from HASS update entity.
  3. Tire status: add tirePressureStatusValid* fields; numeric pressures are confirmed BAR and should remain stored as converted PSI.
  4. Climate depth: preconditioning, pet mode, defrost, steering wheel heat, and seat heat/vent.
  5. Vehicle imagery: persist vehicle image URLs from getVehicleImages using vehicle version/config metadata; use generic model art until exact assets are known.

Verification loop

For each new field family:

  1. Add only schema-confirmed fields to the websocket or vehicle-state query.
  2. Store raw normalized values in Timescale or a dedicated state table.
  3. Add field coverage to GET /v1/vehicles/:id/raw-data.
  4. Confirm non-null samples and the normalized field inspector in Settings -> Raw Data.
  5. Promote the field into dashboard chips/cards/charts.