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.
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:
- Reell batterihelse-trend basert på Typical-rekkevidden bilen viser
- Cellebalanse + 96-brick-visualisering
- HV-isolasjons-monitor med diskriminerings-algoritme for harness-svikt vs. cellesvikt
- 12V-batteri-prediksjon med alder + Tesla service-alerts + wake-rate som proxy
- Smart-lading med spotpris fra Nord Pool + Norgespris-toggle
- Tur-historikk med eco/safety-score
- Fotoboks-varsel via egen GPS-bundle (443 ATK-bokser i Norge)
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.
Backend
Fastify + Node 22 på AWS Lightsail nano-instans håndterer:
- TLS via Let's Encrypt på origin (auto-renewal med certbot)
- HMAC-signerte session-cookies (HttpOnly, Secure, SameSite=Lax)
- Scrypt-hashed PIN-auth (5/min rate-limit, 10-fail IP-lockout 1 t)
- Tesla Fleet Telemetry-mottak (protobuf via WSS, port 4443)
- Tesla Vehicle Command HTTP Proxy lokalt (kommando-signering med EC P-256 virtual key)
- Smart-lading cron med Nord Pool spotpris-data
- Live trip-deteksjon med 10-min park-grace (rygging i parkeringshus = én tur, ikke to)
- Live charge-session-deteksjon med automatisk kostnadsberegning
- GPS-fence rundt Norge for kostnadsberegning (utenlands → null)
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.
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.
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.
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:
- HV-isolasjon (Battery Harness) —
IsolationResistancefra BMS hver 30. min. Rapportert vedlikeholds-mønster blant 2017 X 100D-eiere (korrosjon/fukt-inntrenging i HV-kabel). Pluss diskriminerings-algoritme som skiller harness-svikt fra cellesvikt basert på fluktuasjon (FI), monotont fall (MD), temp-korrelasjon (TCS) og SoC-bånd-støy (VNI). - 12V-batteri — AGM-blybatteri med 24-36 mnd typisk levetid. Helse-score basert på alder + Tesla service-alerts + wake-rate-trend. Manuell input av siste bytt-dato gir presis vurdering.
- Cellebalanse — alle 96 brick-grupper visualisert. Kun min/max måles av Tesla Fleet API, men outliers spores over tid for å fange begynnende celle-degradering før det blir akutt.
AWS-tjenester brukt
| Tjeneste | Bruk |
|---|---|
| Lightsail | Compute — nano-instans (Ubuntu 24.04, $5/mnd) |
| RDS Postgres 16 | Database — db.t4g.micro single-AZ, 20 GB gp3 ($14/mnd) |
| CloudFront | Edge-distribusjon med ACM-cert, HSTS, custom ResponseHeadersPolicy. Egen Function for URL-rewrite |
| S3 | Statisk frontend-host (HTML-fil bak CloudFront) |
| Route 53 | DNS-zone + A-record til Lightsail static IP |
| ACM | TLS-cert for hovedsdomene (CloudFront viewer) |
| Secrets Manager | Tesla OAuth client_secret |
| SSM Parameter Store SecureString | origin-secret, cookie-secret, pin-hash |
| VPC peering | Lightsail ↔ default VPC for RDS-tilgang |
| CloudWatch Logs | Audit-trail for panic-shutdown-events |
| AWS Budgets | Alert ved 200 NOK/mnd kost-overskridelse (tag-filter prosjekt=Tesla) |
| CloudFront Functions | URL-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.
architecture.drawio i samme mappe for redigering i diagrams.net.Programmeringsspråk og teknologier
| Språk | Bruk | Filtype |
|---|---|---|
| HTML5 | Single-file PWA (tesla-dash.html, ~180 KB rå før minify), blogg-sider | .html |
| CSS3 | Innebygd 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 |
| Bash | Deploy-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:
- TLS edge — ACM-cert via CloudFront, HSTS 1 år
- TLS origin — Let's Encrypt på Lightsail
- CloudFront → backend —
X-Origin-Secretheader validert i Fastify preHandler - PIN-auth — 8-sifret ( eller var det 12? :-) ) scrypt-hashed, rate-limited
- Session — HMAC-signert opake cookies (ikke JWT — overkill for single-user)
- DB — i privat VPC, encrypted at rest, kun tilgang fra Lightsail-CIDR
- Tesla OAuth-tokens — lagret på instans i mode-600 fil, kun lesbar for tjeneste-brukeren
- Tesla virtual key — EC P-256 for command-signering
- 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 | $/mnd | Andel |
|---|---|---|
| RDS db.t4g.micro + 20 GB | $13.80 | 69 % |
| Lightsail nano | $5.00 | 25 % |
| Secrets Manager (2 stk) | $0.80 | 4 % |
| Route 53 zone | $0.50 | 2 % |
| Tesla Fleet API | $0 | (7 % av 5M-tier brukt) |
| CloudFront, S3, SSM, ACM | ~$0 | innen 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 MinDelta på PackVoltage/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.
| Komponent | Service Mode | Vår løsning (Fleet API) |
|---|---|---|
| Brick-spenninger | Per-celle, alle 96 brick-grupper i sanntid | Kun min/max + indeks |
| Modul-temperaturer | Per-modul, alle 16 moduler | Kun pakke-min/max |
| Isolasjons-motstand | Sanntid MΩ | Sanntid MΩ |
| HV-pakke V/I | Høy-frekvent fra BMS | 1 Hz subscribed |
| 12V-batteri | Direkte V + state-of-health | Ikke eksponert via Fleet API for 2017 X |
| Charge cycles | Direkte tall fra BMS | Beregnet fra ladesesjoner |
| BMS firmware-versjon | Vises | Ikke direkte |
| BMS interne feilkoder | Alle koder | Kun gjennom alerts-feed |
| Heater/cooling pumpe-status | Per-modul real-time | Kun BatteryHeaterOn (bool) |
Konklusjon på "hva": Service Mode har MER detaljerte data per snapshot. Vi har MINDRE detaljer i øyeblikket.
Hva Service Mode IKKE har
| Kapabilitet | Service Mode | Vå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
- For dyp øyeblikks-diagnose (f.eks. "har celle #47 lav V akkurat nå?") → bruk Service Mode
- For "hvordan har batteriet utviklet seg siste 6 mnd?" → bruk vår
- For "skal jeg bestille service nå?" → kombinasjon: vår trend gir signal, Service Mode bekrefter
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:
- ✅ Optimal ladearkitektur — smart-lading med Nord Pool-priser, Norgespris-aware, nettleie-modell, GPS-fence for utenlands
- ✅ Prediksjon av vedlikehold — 12V-batteri-helse-score, HV-harness-monitor, cellebalanse-trend
- ✅ Batterihelse + kostnadsanalyse — SoH fra Typical-rekkevidde, kostnad per ladesesjon, 30-dgrs snitt kr/kWh
- ✅ Miljøvennlig kjørestil-måling — eco-score (Wh/km vs EPA-baseline), safety-score (hard-accel/brems-events), regen-ratio
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