Teslaで走行情報の可視化やってみた
こんな感じの画面になりました
Teslaの走行情報をGrafanaで可視化してみた
こんにちは。 テスラオーナーのUNILORNです。
2019年製の Model3に乗ってます。 アメリカ、カリフォルニア州にあるフリーモント工場で作られた車体で、2020年9月に納車したのです2021年1月頃から上海製になったらしく、恐らく日本で納車されてるModel3でフリーモント製は最後のほうになっているっぽいです。
本題はいります。
Teslaでは非公開情報ではあるのですがAPIがあって、海外の有志の方がテスラモバイルアプリをリバースエンジニアリングしてAPI情報を抜き取っているようです。
OAuth2, Open ID Connectに対応しており、認証認可も結構安心ですね。
Teslamate
自前でAPIを叩いてごにょごにょしたかったところはありましたが、めっちゃくちゃいいアプリをOSSで開発されていました。
別のクラウドサービスに投げるような感じではなく、手元のDocker Containerで動作させDBもローカルにおけるような構成なのでこちらを利用してみようと思います。
docker-compose によるインストール方法が記載されています。
コピペするだけで動くのでめっちゃ簡単ですね。
teslamate - インストール
ドキュメントに書かれてあるymlそのままですが、こちらのファイルを作成します。
コメントアウトされてる部分はパスワードとTokenを入れる場所っぽいですね。
パスワードは任意の文字列に変更します。
version: "3"
services:
teslamate:
image: teslamate/teslamate:latest
restart: always
environment:
- ENCRYPTION_KEY= #insert a secure key to encrypt your Tesla API tokens
- DATABASE_USER=teslamate
- DATABASE_PASS= #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:14
restart: always
environment:
- POSTGRES_USER=teslamate
- POSTGRES_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= #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:
Tokenの取得 - Postman
TeslaのUnofficial API Referenceにて、OAuth2フローの情報を見ながら Postman を利用してTokenを取得します。
Token取得時に表示されるウィンドウに Refresh Token
と Access Token
が表示されるので控えておきます。
Teslamate 起動
docker compose up -d
今回起動している端末は Windows11 + WSL2 (Ubuntu22.04)です。
上手く起動しているか、コンテナログから確認します。
上手く起動してそうですね。
Teslamate ダッシュボード
ローカルに設置している場合は http://localhost:4000 にアプリが立ち上がっています。
初回起動時は先ほど控えたTokenを入力します。入力後しばらくすると所持しているTesla車の情報が表示されます。
Teslamateが起動している間は、TeslaのAPIを利用してデータを蓄積してくれています。
内部としてはStreamingAPIでWebsocket経由でデータのインプットを行っているらしく、スリープ時などは15分に一度の取得など良い感じに処理してくれているようでした。
とれるデータとしてはGradfanaフェーズで見てみます。
Grafana
先ほどのDocker Composeにもありましたが、Grafanaが標準搭載されています。
構成としては、Postgresをコンテナ間通信で呼び出しているような感じでした。
まずデフォルトで搭載されているテンプレート的なのを表示してみます。
ここでは、スピードや消費電力、タイヤの空気圧なども表示されていますね。
結構いろいろなデータが取得出来るようで、これは便利です。
ほかにも、、
充電時の電圧、電流値や、ドライブステータスによるトリップ表示などもテンプレートで存在し、基本的にカスタマイズ無しで何でも表示してくれました。
カスタマイズ
タイヤ空気圧メータを作ってみます。
PostgreSQLへSQL文を投げれば良いだけなので、そんなに難しくありません。
既存のテンプレートを参考に組み立てると良いかと思います。
SELECT
$__time(date),
convert_tire_pressure(tpms_pressure_fl,'$tire_pressure_units') AS tpms_pressure_front_left_$tire_pressure_units,
convert_tire_pressure(tpms_pressure_fr,'$tire_pressure_units') AS tpms_pressure_front_right_$tire_pressure_units,
convert_tire_pressure(tpms_pressure_rl,'$tire_pressure_units') AS tpms_pressure_rear_left_$tire_pressure_units,
convert_tire_pressure(tpms_pressure_rr,'$tire_pressure_units') AS tpms_pressure_rear_right_$tire_pressure_units
FROM
positions
WHERE
car_id = $car_id AND
$__timeFilter(date) AND
tpms_pressure_fl is not null
ORDER BY
date desc
LIMIT 1
この表示方式だと1つのレコードしか必要ないので LIMIT 1
を追加しています。
また、表示順は日付降順(最新情報)が欲しいので ORDER BY date DESC
にしています。基本的にそれだけですね。
右側のパネル設定等は適当に触っていれば良い感じに変化していくのでお好みな表示方法にすれば良いですね。
外出先で表示したい...
流石にこの認証、認可方式で外向けに公開するのは怖いので、自宅に用意しているVPNサーバに表示したい端末が接続しに行って同じネットワーク上で表示出来るようにしておきました。
外部公開する場合はIP制限とかかけておくとなお安心かもしれないですね。
データは基本的にPostgreSQLにたまっていますが、他に悪意のある通信をしているかはまだ見切れていません。ただ、ソースを見る感じではそのような物は無かったように見えます。(悪意があったらそもそもOSS上に置かないので、バックドアとか仕掛けられてる可能性は捨てない方がよさそうです)
Tokenとかを保持しているようなので、扱いは自己責任ですね。。。
さいごに
自前で色々やらないといけないなぁと思っていましたが結構良い感じにやってくれてるOSSがあったので助かりました。
諸々の認証が怖いので外向けには出していません。
Token盗まれるとそれこそTeslaの記事でよく見かける「鍵を盗まれた」状態になるので、注意が必要です。
ただ、かっこいいし 他のTesla用アプリ(他のサーバにデータを蓄積する系のアプリ)にログイン情報を引き渡すよりは遙かに安全なので、やばさを感じるまでは運用して行こうかと思います。
Discussion
TeslamateをTCP5555など外部アクセス可能な状態にしていると脆弱性があるようなので、Latestバージョンを利用しつつポートの外部公開は控えた方が良いと思います。
VPNServerを用いてVPN経由でなければアクセス出来ないようIP制限等かけておくと安心だと思います。