ELBil Dashboard — Et personlig Tesla-dashbord bygget på AWS

En komplett dashboard-løsning for 2017 Tesla Model X 100D, bygget med Tesla Fleet Telemetry, AWS Lightsail, RDS Postgres og en single-file PWA. Kostnad for AWS infrastruktur: <$20/mnd.

Ambisjon Lage en løsning for optimal ladearkitektur, prediksjon av vedlikeholdsbehov og analyse av batterihelse og kostnader, samt en måling på miljøvennlig kjørestil. Alt bygget rundt Tesla Fleet API uten OBD-tilkobling av tredjeparts utstyr eller tredjeparts tjenester for sensitive data.
📅 Mai 2026 🚗 Tesla Model X 100D (2017) ☁️ AWS eu-north-1 💰 ~$20/mnd

Bakgrunn

Etter 9 år og snart 180 000 km med vår 2017 Tesla Model X 100D var jeg rett og slett nysgjerrig: hvor mye batterikapasitet er det egentlig igjen, og hvordan kan jeg predikere vedlikeholdsbehov før noe overrasker meg på en mørk vei? Dette ledet til et bredere spørsmål — hva eksponerer Tesla faktisk av data og funksjoner via API-ene sine, både for privat bruk og kommersielle formål?

Resultatet av kartleggingen: Tesla Fleet API + Fleet Telemetry gir overraskende rik tilgang til alt vi trenger — SoC, BMS-projisert rekkevidde, cellebalanse-aggregater, HV-isolasjon, lade-data, GPS, og hendelses-varsler. Basert på dette bygde vi et dashbord som leverer:

Konklusjonen for "The Black Adder" etter målingene: ~92 % batterihelse (projisert ~418 km av nybilens 455 km Typical-rekkevidde) og tid for å bytte 12V-batteri (58 mnd siden bytte, godt over forventet 36). Ellers solide data som grunnlag for mange flere mil — pakka, harness, og celle-balanse er innenfor hva som forventes på dette årsmodelleten.

Dashbordet er bygget for å kjøre i Tesla in-car browser (1200×640 viewport) men har responsiv design for iPhone og PC.

Det vi har bygget

Live-tab — Sanntids kjøre-data

Når bilen er i Drive, viser Live-tab tur-energi, kjørestil-score, pakke-temperatur og fortløpende statistikk. WebSocket-feed fra backend pusher fersk data hvert sekund. Når du nærmer deg fotoboks, kommer en rolig pling-tone og banner med avstand.

Skjermbilde av Live-tab — viser tur-energi, kjørestil-score 100/100, pakke-temperatur, distanse, snittfart, varighet og 60-min effekt-graf
Live-tab i Park-modus — gear-pille (PARK), kjørestil-score, pakke-temp, og effekt/høyde-graf for siste 60 min. Tallene oppdateres når bilen våkner og begynner å kjøre.

Backend

Fastify + Node 22 på AWS Lightsail nano-instans håndterer:

Datamodell — 3-lags telemetri

Lag 1 — telemetry_raw (alle datapunkter, 30d retention)
   ↓
Lag 2 — derived metrics (1 Hz: distanse, energi, hard-events)
   ↓
Lag 3 — trips, charge_sessions (per-tur/sesjon-aggregater, persistent)

Batteri-analyse

Batteri-tab samler all helse-relevant data: SoC + projisert rekkevidde, SoH-trend, pakke-temperatur over 24t, cellebalanse, og lade-effektivitet for AC vs DC. SoH beregnes fra IdealBatteryRange (det "Typical"-tallet bilen viser) — ikke EPA-papirtallet som er statisk.

Skjermbilde av Batteri-tab oversikt — viser SoC 80%, SoH 91.8%, pakke-temp 15°C, phantom drain, celle-balanse 6 mV og lade-effektivitet AC 88% / DC 95%
Batteri-tab toppdel — SoH 91.8 % beregnet fra Typical-rekkevidde (~418 km av nybil 455 km). Pakke-temp-heatmap viser termisk profil siste 24 timer. Lade-effektivitet skiller mellom AC hjemme (88 %, typisk for onboard charger) og DC supercharge (95 %).

Smart-lading og kostnadsanalyse

Lading er der den største løpende utgiften i et el-billiv ligger. Vi henter time-for-time spotpris fra Nord Pool (via hvask.no JSON-API, gratis), kombinerer med brukerens egen pris-modell (Norgespris-toggle, nettleie-satser dag/natt), og finner billigste ladevindu før et ønsket "klar innen"-tidspunkt. Smart-lading-kommandoer går via Tesla Vehicle Command Proxy med signert payload — og vi sjekker bilens nåværende ChargeState og SoC før hver kommando for å unngå unødige API-kall.

Skjermbilde av spotpris-graf på Lading-tab — viser 24-timers Nord Pool-prognose for sone NO1 med fargekoding billig/middels/dyrt, og lade-regler-seksjon under med Smart-lading-toggle, Mål-SoC 80%, Min-SoC 40%, Maks pris 1,15 kr/kWh
Lading-tab toppdel — 24-timers Nord Pool-prognose med stiplet kant rundt timer som er under brukerens makspris-terskel. Drag i Maks pris-slideren oppdaterer markeringene umiddelbart. Den hvitt-rammede stolpen viser nåværende time.

Strømpris-modellen håndterer Norgespris-avtale (50 øre/kWh fast på energi-delen, statlig støtte-ordning fra 2026) og legger på korrekt nettleie per timeslott — dag-rate (06-22 hverdager) eller natt/helg-rate. Hver fullført ladesesjon får sin faktiske kr-kostnad lagret i DB ved at energi distribueres proporsjonalt over tids-slottene sesjonen spenner. Resultatet: presis pris-attribuering per kWh uten manuell input. Kostnadene oppdateres automatisk om brukeren bytter Norgespris av/på eller justerer nettleie-satser.

Skjermbilde av Lading-tab med strømpris-modell — Norgespris-avtale aktiv (50 øre/kWh fast), nettleie dag 0,50 kr/kWh og natt 0,40 kr/kWh, snitt 0,93 kr/kWh siste 30 dager, og siste ladesesjon I går 21:47 Hjem TWC 23.0 kWh til kr 20,70
Strømpris-modell og resultater — Norgespris-toggle ON med automatisk lagring, snitt 0,93 kr/kWh siste 30 dgr (50 øre energi + ~43 øre snitt-nettleie), og enkeltsesjoner med korrekt beregnet kostnad. Tesla Wall Connector hjemme = AC-pris, Tesla Supercharger = "Gratis SC" (lifetime-fri på denne bilen).

For kostnads-attribuering utenfor Norge har vi en GPS-fence rundt fastlands-Norge (lat 57-72°N, lon 4-32°E). Lader bilen utenfor denne, lagres sesjonen normalt med kWh og SoC-delta, men kostnad-feltet blir tomt og merkes "Utenlands" i historikken — vi vil ikke gjette feil pris. Tesla Supercharger-sesjoner følger Tesla sin egen kostnadsrapportering uavhengig av land.

Vedlikeholds-prediksjon

Tre kritiske komponenter overvåkes kontinuerlig:

Skjermbilde av 12V-batteri-helse og Battery Harness — viser 58.8 mnd siden 12V-bytte (helse-score 40/100), HV-isolasjon 1540 MΩ utmerket, og diskriminerings-algoritme med harness-mistanke 25/100
12V-batteri (FØLG MED — 58 mnd siden bytte, over forventet 36) og Battery Harness HV-isolasjons-monitor (UTMERKET — 1540 MΩ). Diskriminerings-algoritmen analyserer 4 indikatorer: fluktuasjon, monotont fall, temp-korrelasjon og SoC-bånd-støy.

AWS-tjenester brukt

TjenesteBruk
LightsailCompute — nano-instans (Ubuntu 24.04, $5/mnd)
RDS Postgres 16Database — db.t4g.micro single-AZ, 20 GB gp3 ($14/mnd)
CloudFrontEdge-distribusjon med ACM-cert, HSTS, custom ResponseHeadersPolicy. Egen Function for URL-rewrite
S3Statisk frontend-host (HTML-fil bak CloudFront)
Route 53DNS-zone + A-record til Lightsail static IP
ACMTLS-cert for hovedsdomene (CloudFront viewer)
Secrets ManagerTesla OAuth client_secret
SSM Parameter Store SecureStringorigin-secret, cookie-secret, pin-hash
VPC peeringLightsail ↔ default VPC for RDS-tilgang
CloudWatch LogsAudit-trail for panic-shutdown-events
AWS BudgetsAlert ved 200 NOK/mnd kost-overskridelse (tag-filter prosjekt=Tesla)
CloudFront FunctionsURL-rewrite + 301-redirect for legacy paths

Arkitektur

Push-basert telemetri fra bilen til vår backend, CloudFront som edge-fasade, RDS via VPC peering, og secrets injisert fra SSM ved oppstart. Bilen pusher protobuf-strøm direkte til vår Fleet Telemetry-endpoint — vi poller aldri Tesla, som sparer kvote og bilbatteri.

Arkitektur-diagram — viser eksterne kilder (bruker, Tesla bilen, Tesla Fleet API, Nord Pool, FotoboksVarsler), AWS Edge (Route 53, ACM, CloudFront, AWS Budgets, CloudWatch), AWS Compute (S3, Lightsail med 4 systemd-tjenester), og persistens (RDS Postgres, Secrets Manager, SSM Parameter Store)
Komplett arkitektur. Røde piler = bil-relatert kommunikasjon, blå = AWS edge, grønn = data/persistens, oransje stiplet = secrets ved oppstart. Komplett drawio-fil tilgjengelig som architecture.drawio i samme mappe for redigering i diagrams.net.

Programmeringsspråk og teknologier

SpråkBrukFiltype
HTML5Single-file PWA (tesla-dash.html, ~180 KB rå før minify), blogg-sider.html
CSS3Innebygd styling med custom properties, grid + flex layout, media queries for iPhone, animasjoner. Ingen ekstern stylesheet.(innebygd i HTML)
JavaScript (Node.js + vanilla browser)Backend (Fastify-server, Tesla Fleet API-integrasjon, smart-lading, trip-detektering), frontend (state-mgmt, render-loop, WebSocket-feed, Service Worker).js
SQL (PostgreSQL)Schema-DDL (RDS-tilpasset), parametriserte queries i backend, idempotente migrations ved oppstart.sql
BashDeploy-pipeline (minify + S3 + CloudFront-invalidering), panic-shutdown / start-scripts (CloudShell), DB-backup-cron.sh
Go (tredjeparts-binærer)Tesla Vehicle Command HTTP Proxy + Tesla Fleet Telemetry server. Forhåndskompilerte binærer fra Tesla — vi konfigurerer og kjører dem som systemd-tjenester på Lightsail. Ingen Go-kode skrevet av oss.(binær)
TypeScript (skisse)En tidlig kost-attribuering-middleware-skisse (middleware.ts) som ikke ble deployet — den endelige implementasjonen er i JavaScript inni Fastify-serveren.ts

I tillegg: Protobuf (Tesla Fleet Telemetry-format, deserialisering håndtert av Tesla sin Go-server), JSON (alle API-respons + spotpriser fra hvask.no), og SVG (graf-rendering for SoH-trend, harness-trend, cell-bars, tur-rute-fallback). Stack-en er bevisst minimalistisk — ingen byggesteg, ingen frameworks, ingen webfonts. Frontend-bundlet er én enkelt HTML-fil med inline CSS og JS.

Sikkerhetsarkitektur

Ende-til-ende-beskyttelse i flere lag:

  1. TLS edge — ACM-cert via CloudFront, HSTS 1 år
  2. TLS origin — Let's Encrypt på Lightsail
  3. CloudFront → backendX-Origin-Secret header validert i Fastify preHandler
  4. PIN-auth — 8-sifret ( eller var det 12? :-) ) scrypt-hashed, rate-limited
  5. Session — HMAC-signert opake cookies (ikke JWT — overkill for single-user)
  6. DB — i privat VPC, encrypted at rest, kun tilgang fra Lightsail-CIDR
  7. Tesla OAuth-tokens — lagret på instans i mode-600 fil, kun lesbar for tjeneste-brukeren
  8. Tesla virtual key — EC P-256 for command-signering
  9. Panic-shutdown — CloudShell-script som kan stoppe instans + rotere secrets fra mobil hvis "tripwires" aktiveres

Kostnadsmodell

Total: ~$20/mnd — flat, ingen variabel komponent som kan løpe løpsk:

Post$/mndAndel
RDS db.t4g.micro + 20 GB$13.8069 %
Lightsail nano$5.0025 %
Secrets Manager (2 stk)$0.804 %
Route 53 zone$0.502 %
Tesla Fleet API$0(7 % av 5M-tier brukt)
CloudFront, S3, SSM, ACM~$0innen free-tier

Tesla Fleet API-volum: ~365 000 datapunkter/mnd ved 2 000 km/mnd kjøring. Vi trimmet konfigurasjonen ned fra 720 dp/min til 150 dp/min ved å droppe LongitudinalAcceleration og LateralAcceleration (deriveres fra VehicleSpeed i stedet) og bumpe MinDeltaPackVoltage/PackCurrent.

AWS Budget-alert satt opp med tag-filter prosjekt=Tesla for tidlig varsling ved 80 % prognostisert + 100 % faktisk forbruk.

Tekniske læringer underveis

1. Tesla rapporterer alle distance-signaler i miles

Selv om bilens GUI viser km, returnerer både Fleet Telemetry og REST API alle range-signaler i miles. Dette ga oss feil SoH (73 % istedenfor 92 %) inntil vi konverterte ved ingest.

2. ChargeState bruker Enable / Precharge, ikke "Charging"

Tesla 2017 X 100D rapporterer aktiv lading med ChargeState-verdier Enable og Precharge, ikke en streng 'Charging'. Vi mistet ladesesjon-data inntil vi byttet til en negativ-liste-sjekk.

3. Energi-buckets med Tesla's egen sign-konvensjon

Tesla rapporterer positiv PackCurrent for strøm INN i pakka (regen/lading), negativt for strøm UT (drift). Vi hadde det opprinnelig motsatt → 95 % regen-ratio på vanlig kjøring var åpenbar feil. Etter bytte: realistiske ~13 % regen-ratio.

4. fleet_telemetry_config må gå via Vehicle Command HTTP Proxy

Tesla har migrert konfig-endepunktet bak proxy-en (krever signed commands). Direkte mot fleet-api.prd returnerer 400 "must be called through the Vehicle Command HTTP Proxy".

5. Hardkodet 1200×640 layout låser bilen ut

Inntil vi la til responsive media-queries (under 1100 px), så Tesla 1200×640 perfekt ut, men iPhone og PC-browsere fikk en knust layout.

Hvorfor ikke bare bruke Service Mode?

Det første spørsmålet en Tesla-kjenner stiller: "mye av denne batteri-informasjonen er jo allerede tilgjengelig i Tesla Service Mode i bilen — hvorfor bygge et eget dashbord?". Ærlig svar etter sammenligning: Service Mode har bedre snapshot-detalj. Vi har bedre over tid og kontekst.

Hva Service Mode eksponerer

Service Mode aktiveres ved å holde Tesla-logoen + skrive "service" som passord. Brukes av Tesla-teknikere og skarpe eiere.

KomponentService ModeVår løsning (Fleet API)
Brick-spenningerPer-celle, alle 96 brick-grupper i sanntidKun min/max + indeks
Modul-temperaturerPer-modul, alle 16 modulerKun pakke-min/max
Isolasjons-motstandSanntid MΩSanntid MΩ
HV-pakke V/IHøy-frekvent fra BMS1 Hz subscribed
12V-batteriDirekte V + state-of-healthIkke eksponert via Fleet API for 2017 X
Charge cyclesDirekte tall fra BMSBeregnet fra ladesesjoner
BMS firmware-versjonVisesIkke direkte
BMS interne feilkoderAlle koderKun gjennom alerts-feed
Heater/cooling pumpe-statusPer-modul real-timeKun BatteryHeaterOn (bool)

Konklusjon på "hva": Service Mode har MER detaljerte data per snapshot. Vi har MINDRE detaljer i øyeblikket.

Hva Service Mode IKKE har

KapabilitetService ModeVår løsning
Historiske data❌ Kun her-og-nå-snapshot✅ 30+ dager i RDS
Trend-analyse❌ Krever manuell logging✅ Lineær regresjon, slope-detektering
Anomali-deteksjon❌ Du må selv se✅ Auto-flagging av avvik fra snitt
Diskriminerings-algoritme (harness vs. cellesvikt)❌ Ikke beregnet✅ FI + MD + TCS + VNI proxy-modell
Korrelasjon mellom signaler✅ delta_v vs temp-spread, SoC-bånd-støy
Prediktiv scoring✅ 12V-helse fra alder+alerts+wake-rate
Tur-akkumulering med score✅ eco/safety per trip
Lade-kostnadsanalyse✅ Norgespris + nettleie + spotpris-mapping
Smart-lading✅ Tesla scheduled charging-API + Nord Pool
Fjern-tilgang❌ Må stå i bilen✅ Hvilken som helst enhet, hvilket som helst sted
Fotoboks-varsel✅ 443-elements GPS-bundle + pling
Multi-enhet med audit-log❌ Én bilen✅ Trusted-device-allowlist, revoke-flow

Praktisk bruk — kombiner begge

Tesla Fleet API/Telemetry eksponerer kun aggregater (min/max) for å begrense data-volum og beskytte konkurranse-sensitive detaljer. Per-celle-data krever enten Service Mode i bilen, OBD-II-tilkobling med tredjeparts utstyr (ScanMyTesla / TM-Spy), eller Tesla Toolbox 3 (verkstedsverktøy). Vi valgte bevisst vekk OBD-II for å holde arkitekturen ren rundt offisiell Fleet API. Det gir mindre granularitet, men analysen vi legger på toppen — trend-detektering, cross-correlation, predictive scoring, kostnadsintegrasjon — er det Service Mode mangler.

Sluttresultat

Et fullstendig dashbord som leverer på alle de fire ambisjonene:

Browseren trenger ikke være åpen for at data skal samles inn — alt skjer på backend automatisk så lenge bilen er våken og Lightsail er oppe.

Lenke til prosjekt i github: https://github.com/silentforge26/elbil-dash