Warning
This release crashes in a startup loop on installations with MQTT enabled and no MQTT_NAMESPACE set. Please use v4.1.1 instead.
We've fixed small bugs that had been around for years, implemented several feature requests, integrated the latest version of Grafana, and completely overhauled numerous areas within TeslaMate. As we fixed the phase detection during AC charges, existing charging processes are recomputed once during the upgrade migration: previously empty or zero charge_energy_used values (short or mixed AC sessions) gain values.
The first start after the upgrade can take a few minutes longer on databases with years of history and slow hardware; charge costs are deliberately not changed retroactively (#5592).
And Home Assistant MQTT auto discovery landed (opt-in).
Note for manual Home Assistant configurations: The documented manual mqtt_sensors.yaml now uses state_class: total_increasing for the charge_energy_added sensor (#5543). If you re-sync your manual YAML, Home Assistant will treat the per-charge resets as meter cycles, which changes the long-term statistics behavior (e.g. in the Energy dashboard).
To make your TeslaMate experience even better, we have made 112 improvements.
Enjoy!
New features
- feat: add service mode to webview and reduce log when car is Unlocked at service mode (#5289 - @NirKli)
- feat(mqtt): add service_mode (#5289 - @NirKli)
- feat: add Sun roof and individual window status via MQTT (#5393 - @nebhale)
- feat: show and color the software update icon through the update lifecycle (#5487 - @NirKli)
- feat(mqtt): add download_perc and install_perc for pending sw install (#5487 - @NirKli)
- feat: link the software update icon to the notateslaapp release notes (#5490 - @NirKli)
- feat: add fullscreen mode to vehicle summary map (#5495 - @hakong)
- feat(web): expose VIN in car summary ( #5556 - @Helvio88, @magrathean-uk)
- feat(mqtt): add opt-in Home Assistant MQTT discovery (#5543 - @brianmay, @JakobLichterfeld)
Improvements and bug fixes
- fix(webview): show charging finish time in browser local time (#5436 - @Ashok28)
- fix(vehicle): use streaming-aware interval when a drive starts (#5417 - @evanclan)
- fix(mqtt): retry failed value publications (#5429 - @ciyahu)
- fix: redact Tesla API tokens from logs (#5475 - @magrathean-uk)
- fix(vehicle): back off for 15 minutes on Fleet API
EXCEEDED_LIMITresponses instead of retrying every 10-30s (#5476 - @hossamnagy) - refactor: send TOKEN as Bearer header via FleetAuth middleware (#5470 - @jlestel)
- fix: honor DATABASE_USER/DATABASE_PASS with DATABASE_SOCKET_DIR (#5503 - @mvanhorn)
- fix(import): accept fractional TeslaFi battery levels (#5513 - @magrathean-uk)
- fix(cars): enforce non-null VINs (#5512 - @magrathean-uk)
- fix(mqtt): return publish errors without crashing (#5514 - @magrathean-uk)
- fix(geofences): increase cost precision (#5508 - @magrathean-uk)
- fix: reconnect stream when a drive resumes after mid-drive offline phase to avoid missing elevation (#5535 - @JakobLichterfeld)
- refactor(nix,postgres): provision database declaratively, connect via socket (#5337 - @JakobLichterfeld)
- fix(nix,maintenance): read RELEASE_COOKIE without sourcing the env file (#5337 - @JakobLichterfeld)
- fix(nix,postgres): set role password safely for any value (#5337 - @JakobLichterfeld)
- fix(nix): drop schemas in the configured database during restore (#5337 - @JakobLichterfeld)
- fix(nix,grafana): disable the periodic plugin update check (#5337 - @JakobLichterfeld)
- feat(import): continue past malformed rows and resume completed TeslaFi files- (#5552 - @magrathean-uk)
- fix(vehicle): update geofence while driving with streaming API (#5515 - @magrathean-uk)
- fix(vehicle): identify base Model 3 from model year 2022 as RWD instead of SR+ (#5551 - @magrathean-uk)
- fix(mqtt): avoid blocking startup on retained cleanup (#5549 - @magrathean-uk)
- feat: use Grafana 13.1.1 (#5559 - @swiffer)
- fix(performance): use existing indexes for last-inserted / latest complete position lookups (#5438 - @swiffer)
- fix(geocoder): resolve state for Australian territories (#3868 - mattew124)
- refactor(vehicles): make the geofence name lookup in the charging log total (#5599 - @JakobLichterfeld)
- feat: use Grafana 13.1.3 (#5587 - @swiffer)
- fix(charging): fall back to charger_power when phase detection fails (#5592 - @JakobLichterfeld)
- fix(charges): enforce positive charger phases at the database (#5592 - @JakobLichterfeld)
- fix(charging): recalculate charge_energy_used for existing processes (#5592 - @JakobLichterfeld)
Build, CI, internal
- build(nix): update mixFodDeps hash in nix builds (954e8739 - @JakobLichterfeld)
- build(deps): bump launch-editor from 2.13.2 to 2.14.1 in /website (#5426)
- build(deps): update flake.lock (#5427)
- build(deps): bump webpack-dev-server from 5.2.4 to 5.2.5 in /website (#5445)
- chore: add .codegraph to .gitignore (#5440 - @JakobLichterfeld)
- ci: speed up check_linting by running treefmt in a lean app (#5440 - @JakobLichterfeld)
- sec(deps): add ws override to version 8.21.0 in /website (#5446 - @JakobLichterfeld)
- build(deps-dev): bump esbuild from 0.28.0 to 0.28.1 in /assets (#5444)
- sec(deps): add joi override to version 17.13.4 in /website (#5448 - @JakobLichterfeld)
- build(deps): update flake.lock (#5449)
- build(deps): bump the actions-deps group across 3 directories with 9 updates (#5469)
- build(deps): bump ex_cldr_plugs from 1.3.4 to 1.4.0 (#5465)
- build(deps): bump react and react-dom from 19.2.6 to 19.2.7 in /website (#5466)
- build(deps): bump @geoman-io/leaflet-geoman-free from 2.19.3 to 2.20.0 in /assets (#5464)
- build(deps-dev): bump sass from 1.100.0 to 1.101.0 in /assets (#5462)
- build(deps): bump plug_cowboy from 2.8.1 to 2.9.0 (#5463)
- build(deps): bump floki from 0.38.3 to 0.38.4 (#5461)
- test: harden async waits (#5456 - @magrathean-uk)
- build(deps): update flake.lock (#5477)
- ci: sign published images with SLSA provenance + SBOM attestations (#5380 - @oivindoh)
- fix(ci): add artifact-metadata permission for workflows as it is essential for generating attestations (#5484 - @JakobLichterfeld)
- build(deps): update flake.lock (#5498)
- test: reuse API snapshots across paired fetches (#5510 - @magrathean-uk)
- build(deps): bump tesla from 1.14.1 to 1.20.0, migrate to Tesla.client/2 and update mix nix hash (#5468 - @JakobLichterfeld)
- build(deps): bump websocket-driver from 0.7.4 to 0.7.5 in /website (#5516)
- build(deps): update flake.lock (#5522)
- build(deps): bump svgo from 3.3.3 to 3.3.4 in /website (#5536)
- build(deps): bump shell-quote from 1.8.4 to 1.10.0 in /website (#5537)
- build(deps): bump webpack-dev-server from 5.2.5 to 5.2.6 in /website (#5538)
- build(deps): bump body-parser from 1.20.5 to 1.20.6 in /website (#5539)
- build(deps): bump fast-uri from 3.1.2 to 3.1.4 in /website (#5540)
- build(deps): bump immutable from 5.1.5 to 5.1.9 in /assets (#5541)
- ci(treefmt): stop treefmt.toml from drifting out of sync with the flake (#5545 - @JakobLichterfeld)
- style(nix): format Nix code with nixfmt instead of the archived nixpkgs-fmt (#5545 - @JakobLichterfeld)
- build(deps): update flake.lock (#5544)
- build(deps): bump phoenix_live_view from 0.20.17 to 1.2.8 and migrate accordingly (#5580 - @JakobLichterfeld)
- build(deps): bump all @Docusaurus from 3.10.1 to 3.10.2 in /website (#5571)
- build(deps): bump react and react-dom from 19.2.7 to 19.2.8 in /website (#5574)
- build(deps): bump postcss from 8.5.15 to 8.5.25 in /website (#5582)
- build(deps): bump the actions-deps group across 4 directories with 11 updates (#5576)
- test(grafana): guard latest-position dashboard queries against missing partial-index predicate (#5581 - @magrathean-uk)
- build: use Elixir 1.20.2 OTP 29 (#5579 - @swiffer)
- ci: derive Elixir cache keys from the toolchain and MIX_ENV (#5595 - @JakobLichterfeld)
- fix(test): override meck to 1.2 for OTP 29 compatibility (#5598 - @swiffer)
- build(nix): reduce the manually pinned hashes to one and automate it (#5593 - @JakobLichterfeld)
- ci: let Dependabot pull requests refresh the Nix hashes (#5593 - @JakobLichterfeld)
- ci: verify Nix hashes on all dependency pull requests (#5593 - @JakobLichterfeld)
- ci: let maintainers run CI on pull requests touching .github (#5593 - @JakobLichterfeld)
- build(deps): bump postgrex from 0.22.2 to 0.22.3 (#5570)
- build(deps): bump js-yaml from 4.2.0 to 4.3.1 in /website (#5597)
- build(deps): bump brace-expansion from 1.1.14 to 1.1.18 in /website (#5596)
- build(deps): bump fast-uri from 3.1.4 to 3.1.5 in /website (#5589)
- build(deps): bump phoenix from 1.7.24 to 1.8.9 and migrate accordingly (#5572 - @JakobLichterfeld)
- build(deps): update flake.lock (#5560)
- build(deps-dev): bump sass from 1.101.0 to 1.102.0 in /assets (#5566)
- build(deps): bump leaflet-control-geocoder from 3.3.1 to 4.0.0 in /assets (#5565)
Dashboards
- feat(grafana): make data health summary actionable (#5526 - @magrathean-uk)
- fix(grafana): drop the Releases panel from the home dashboard to end the CORS proxy dependency (#5548 - @JakobLichterfeld)
- fix(dashboards): filter latest-value position panels on complete rows so they use the partial index (#5438 - @swiffer)
- fix(grafana): Battery Health latest SOC/kWh panels pick the newest UNION row and use
usable_battery_levelon charges (#5438 - @swiffer) - fix(grafana): use local calendar for Statistics period end boundaries (#5562 - @wjsall)
- fix(charge-details): keep power panel in sync with the energy integration (#5592 - @JakobLichterfeld)
Translations
- i18n: add Hungarian translation (#5480 - @magrathean-uk)
- i18n: improve Traditional Chinese translations (#5527 - @occultsound)
Documentation
- docs: update security policy to emphasize network-level protection (27172cba - @JakobLichterfeld)
- docs: fix typo in DATABASE_SSL_SNI description (#5346 - @dashitongzhi)
- docs: update upgrading instructions to emphasize backup before updating more clearly (#5453 - @JakobLichterfeld)
- docs(mqtt): add service mode topic to MQTT integration documentation (#5472 - @JakobLichterfeld)
- docs: update star history chart links to new format in README (#5482 - @JakobLichterfeld)
- docs: update star history links in README with to include the now needed sealed token (#5489 - @JakobLichterfeld)
- docs: link directly to restore section in upgrading PostgreSQL guide (#5501 - @JakobLichterfeld)
- docs: split the backup and restore guides into two separate guides and highlight that you should transfer your backup of the host (#5502 - @JakobLichterfeld)
- docs: point Tesla Auth users to fixed releases (#5509 - @magrathean-uk)
- docs: add TeslaMate Dash to the projects page (#5494 - @gmaslowski)