TeslaMate 是一款适用于您的特斯拉且功能强大的自托管数据记录器。
- 用 Elixir 语言编写
- 数据存储在 Postgres 数据库中
- 使用 Grafana 进行可视化和数据分析
- 车辆数据发布到本地 MQTT Broker
强烈推荐使用云服务器部署,稳定的同时能够通过 SSH 升级 TeslaMate 和备份、迁移数据。推荐使用京东云(点击购买),618 爆款云主机低至 50元/年,便宜、好用、稳定。
2024.07.12 同步 teslamate 镜像至 1.30.1
2024.07.18 更新 NAS 位于家庭网络无法通过 ACME 获取 SSL 证书解决方案(见文末)
https://docs.teslamate.com.cn
懒得折腾的小伙伴建议直接购买 dhuar 大佬的成品硬件
淘宝店铺:Tesmirror特斯拉投屏神器
https://item.taobao.com/item.htm?id=726272780484
1. 主要特点:
1.1 仪表板
1.1.1 驾驶详情
1.1.2 充电统计
1.1.3 驾驶统计
1.1.4 驾驶记录
1.1.5 能耗
1.1.6 车辆状态
1.1.7 充电详情
1.1.8 电池充电与使用记录
1.1.9 电池静置耗电(Vampire Drain)情况
1.1.10 预估 100% 续航里程续航变化(电池退化)
1.1.11 概览
1.1.12 OTA 更新记录
1.1.13 终生驾驶地图
1.1.14 车辆“足迹”
1.1.15 电池健康
1.2 常规
- 高精度驱动数据记录
- 车辆静置时没有额外的耗电:车辆会尽快休眠
- 自动地址查找
- 轻松集成到家庭助理中(通过MQTT)
- 轻松集成到 Node-Red 和 Telegram 中(通过 MQTT)
- 用于创建自定义位置的地理围栏功能
- 每个 Tesla 帐户支持多辆车
- 收费成本跟踪
- 从 TeslaFi 和 tesla-apiscraper 导入
本次教程基于 Red Hat Enterprise Linux 系统,需要 Docker 环境支持,你也可以选择 1Panel、BTPanel 等面板快速部署,关于上述几项系统及环境安装配置请参阅:
2. TeslaMate 部署(高级/推荐)
本节使用 Traefik、Let's Encrypt 和 HTTP Basic Auth 进行
如果您希望在互联网上公开 TeslaMate,强烈建议您保护 Web 界面并仅允许使用密码访问 Grafana。本指南提供了与基本安装不同的docker-compose.yml,具体表现在以下几个方面:
- TeslaMate 和 Grafana 这两个可公开访问的服务都位于终止 HTTPS 流量的反向代理 (Traefik) 后面
- TeslaMate 服务受 HTTP 基本身份验证保护
- 自定义配置保存在单独的文件中
.env
- Traefik 会自动获取 Let's Encrypt 证书
- Grafana 配置为需要登录
请注意,这只是如何在更高级的场景中使用 TeslaMate 的一个示例。根据您的用例,您可能需要进行一些调整,主要是对 traefik 配置进行调整。有关详细信息,请参阅 traefik 文档。
2.1 要求
- 例如,一个公共 FQDN(在下面的示例中替换您的域名)
teslamate.giscloud.com
2.2 准备
创建以下三个文件:
2.2.1 docker-compose.yml
services:
teslamate:
image: ccr.ccs.tencentyun.com/xlab/teslamate:latest
restart: always
depends_on:
- database
environment:
- ENCRYPTION_KEY=${TM_ENCRYPTION_KEY}
- DATABASE_USER=${TM_DB_USER}
- DATABASE_PASS=${TM_DB_PASS}
- DATABASE_NAME=${TM_DB_NAME}
- DATABASE_HOST=database
- MQTT_HOST=mosquitto
- VIRTUAL_HOST=${FQDN_TM}
- CHECK_ORIGIN=true
- TZ=${TM_TZ}
volumes:
- ./import:/opt/app/import
labels:
traefik.enable: "true"
traefik.port: "4000"
traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
traefik.http.middlewares.teslamate-auth.basicauth.realm: "teslamate"
traefik.http.middlewares.teslamate-auth.basicauth.usersfile: "/auth/.htpasswd"
traefik.http.routers.teslamate-insecure.rule: "Host(`${FQDN_TM}`)"
traefik.http.routers.teslamate-insecure.middlewares: "redirect"
traefik.http.routers.teslamate-ws.rule: "Host(`${FQDN_TM}`) && Path(`/live/websocket`)"
traefik.http.routers.teslamate-ws.entrypoints: "websecure"
traefik.http.routers.teslamate-ws.tls: ""
traefik.http.routers.teslamate.rule: "Host(`${FQDN_TM}`)"
traefik.http.routers.teslamate.middlewares: "teslamate-auth"
traefik.http.routers.teslamate.entrypoints: "websecure"
traefik.http.routers.teslamate.tls.certresolver: "tmhttpchallenge"
cap_drop:
- ALL
database:
image: ccr.ccs.tencentyun.com/xlab/postgres:15.4
restart: always
environment:
- POSTGRES_USER=${TM_DB_USER}
- POSTGRES_PASSWORD=${TM_DB_PASS}
- POSTGRES_DB=${TM_DB_NAME}
volumes:
- teslamate-db:/var/lib/postgresql/data
grafana:
image: ccr.ccs.tencentyun.com/xlab/grafana:latest
restart: always
environment:
- DATABASE_USER=${TM_DB_USER}
- DATABASE_PASS=${TM_DB_PASS}
- DATABASE_NAME=${TM_DB_NAME}
- DATABASE_HOST=database
- GRAFANA_PASSWD=${GRAFANA_PW}
- GF_SECURITY_ADMIN_USER=${GRAFANA_USER}
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PW}
- GF_AUTH_ANONYMOUS_ENABLED=false
- GF_SERVER_DOMAIN=${FQDN_TM}
- GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s/grafana
- GF_SERVER_SERVE_FROM_SUB_PATH=true
volumes:
- teslamate-grafana-data:/var/lib/grafana
labels:
traefik.enable: "true"
traefik.port: "3000"
traefik.http.middlewares.redirect.redirectscheme.scheme: "https"
traefik.http.routers.grafana-insecure.rule: "Host(`${FQDN_TM}`)"
traefik.http.routers.grafana-insecure.middlewares: "redirect"
traefik.http.routers.grafana.rule: "Host(`${FQDN_TM}`) && (Path(`/grafana`) || PathPrefix(`/grafana/`))"
traefik.http.routers.grafana.entrypoints: "websecure"
traefik.http.routers.grafana.tls.certresolver: "tmhttpchallenge"
mosquitto:
image: ccr.ccs.tencentyun.com/xlab/eclipse-mosquitto:2
restart: always
command: mosquitto -c /mosquitto-no-auth.conf
ports:
- "127.0.0.1:1883:1883"
volumes:
- mosquitto-conf:/mosquitto/config
- mosquitto-data:/mosquitto/data
proxy:
image: ccr.ccs.tencentyun.com/xlab/traefik:v2.7
restart: always
command:
- "--global.sendAnonymousUsage=false"
- "--providers.docker"
- "--providers.docker.exposedByDefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.tmhttpchallenge.acme.httpchallenge=true"
- "--certificatesresolvers.tmhttpchallenge.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.tmhttpchallenge.acme.email=${LETSENCRYPT_EMAIL}"
- "--certificatesresolvers.tmhttpchallenge.acme.storage=/etc/acme/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- ./.htpasswd:/auth/.htpasswd
- ./acme/:/etc/acme/
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
teslamate-db:
teslamate-grafana-data:
mosquitto-conf:
mosquitto-data:
如果你希望使用
teslamate:
image: ccr.ccs.tencentyun.com/xlab/teslamate:latest
grafana:
image: ccr.ccs.tencentyun.com/dhuar/grafana:latest
替换为:
teslamate:
image: ccr.ccs.tencentyun.com/dhuar/teslamate:latest
grafana:
image: ccr.ccs.tencentyun.com/dhuar/grafana:v1.29.1
2.2.2 .env
TM_ENCRYPTION_KEY= #用于加密 Tesla API 令牌的安全密钥
TM_DB_USER=teslamate #数据库用户名
TM_DB_PASS= #数据库密码
TM_DB_NAME=teslamate #数据库名称
GRAFANA_USER=admin #Grafana 用户名
GRAFANA_PW=admin #Grafana 密码
FQDN_TM=teslamate.giscloud.com #解析域名
TM_TZ=Asia/Shanghai
[email protected]
2.2.3 .htpasswd
此文件包含用于访问 TeslaMate (Basic-auth) 的用户和密码。请注意,这不是您的 tesla.com 密码。如果您没有安装 Apache 工具,您可以在 Web 上生成它(例如 http://www.htaccesstools.com/htpasswd-generator/),请使用 BCrypt
加密模式。
teslamate:$2y$10$qmET5CsDh0kgIDYN04TmgOUOeNnDWmIa4FwunHCDsRpiL8vRRYvPW
2.3 部署
将以上 3 个文件上传到想要部署的目录,如 /home/docker/teslamate
,使用以下命令启动部署。
docker compose up -d
2.4 使用
- 打开 Web 界面
https://teslamate.giscloud.com
- 使用您的 Tesla 帐户登录(如何获取 tesla api token:见本文4.1)
- 在“设置”页中,更新“URL”字段。将“Web 应用”设置为
https://teslamate.giscloud.com
,将“仪表板”设置为https://teslamate.giscloud.com/grafana
如果您在登录 Grafana 时遇到困难,例如您无法使用简单设置中的凭据或存储在 .env 文件中的值登录,请使用以下命令重置管理员密码:
docker compose exec grafana grafana-cli admin reset-admin-password
3. TeslaMate 部署(简单)
本节档提供了在任何运行 Docker 的系统上安装 TeslaMate 的必要步骤。
仅当您在家庭网络上运行 TeslaMate 时,才建议使用此设置,否则您的 Tesla API 令牌可能会面临风险。如果您打算将 TeslaMate 直接暴露在互联网上,请参阅本节。
3.1 要求
- Docker(如果您不熟悉 Docker,请参阅安装 Docker 和 Docker Compose)
- 一台始终在线的机器,以便 TeslaMate 可以持续获取数据
- 计算机上至少有 1 GB 的 RAM 才能成功安装
- 外部互联网接入,可以链接到 tesla.com
3.2 准备
创建一个包含以下内容的文件:docker-compose.yml
services:
teslamate:
image: teslamate/teslamate:latest
restart: always
environment:
- ENCRYPTION_KEY=secretkey #replace with a secure key to encrypt your Tesla API tokens
- DATABASE_USER=teslamate
- DATABASE_PASS=password #insert your secure database password!
- DATABASE_NAME=teslamate
- DATABASE_HOST=database
- MQTT_HOST=mosquitto
ports:
- 4000:4000
volumes:
- ./import:/opt/app/import
cap_drop:
- all
database:
image: postgres:15
restart: always
environment:
- POSTGRES_USER=teslamate
- POSTGRES_PASSWORD=password #insert your secure database password!
- POSTGRES_DB=teslamate
volumes:
- teslamate-db:/var/lib/postgresql/data
grafana:
image: teslamate/grafana:latest
restart: always
environment:
- DATABASE_USER=teslamate
- DATABASE_PASS=password #insert your secure database password!
- DATABASE_NAME=teslamate
- DATABASE_HOST=database
ports:
- 3000:3000
volumes:
- teslamate-grafana-data:/var/lib/grafana
mosquitto:
image: eclipse-mosquitto:2
restart: always
command: mosquitto -c /mosquitto-no-auth.conf
# ports:
# - 1883:1883
volumes:
- mosquitto-conf:/mosquitto/config
- mosquitto-data:/mosquitto/data
volumes:
teslamate-db:
teslamate-grafana-data:
mosquitto-conf:
mosquitto-data:
- 选择将用于加密您的 Tesla API 令牌的安全加密密钥(插入为 )。
ENCRYPTION_KEY
- 选择您的安全数据库密码,并在每次出现 和 时插入该密码
DATABASE_PASS
POSTGRES_PASSWORD
- 使用 .若要在后台运行容器,请添加以下标志:
docker compose up
-d
3.3 部署
将以上 3 个文件上传到想要部署的目录,如 /home/docker/teslamate
,使用以下命令启动部署。
docker compose up -d
3.4 使用
- 在浏览器访问: http://ip:4000 (将ip替换成你的服务器ip),默认用户
admin
(初始密码admin
) . - 设置您的 Tesla API tokens (见本文4.1)
- 特斯拉数据面板可以访问 http://ip:3000 (将ip替换成你的服务器ip)
4 已知的问题
- 如何获取 tesla api token(特斯拉访问令牌)
以下几个开源应用程序可用于获取您特斯拉帐号的访问令牌,你可以用电脑或手机浏览这个网页,安装App,然后登录获取令牌- 注意事项
需要注意的是,Refresh Token对应的中文是刷新令牌,ios版的顺序和网页是相反的。注意别输入错误
输入错误后,有可能卡住导致之后一直提示无效令牌,这时需要重启下服务或重启服务器。 - 下载地址
Auth app for Tesla (iOS, macOS)
Tesla Auth (Android)
Tesla Auth (macOS, Linux, Windows)
- 注意事项
- 电池健康度无数据
- 首次使用需将电量充至 90%
- 为什么 Grafana 中没有显示消耗值?
- Tesla API 不会返回行程的消耗值。为了仍然能够显示值,TeslaMate 根据记录的(充电)数据估算消耗量,至少需要两次充电才能显示第一个估计值,充电时间必须超过 10 分钟且充电状态 (SoC) 低于 95%。未来的每个充电会话将略微提高估计的准确性,该估计将追溯应用于所有数据。
5 家庭网络无法通过 ACME 获取 SSL 证书解决方案
修改以下代码:
- 最新
- 最热
只看作者