🚔

Teslaで走行情報の可視化やってみた

2022/07/18に公開約5,200字

こんな感じの画面になりました

Teslaの走行情報をGrafanaで可視化してみた

こんにちは。 テスラオーナーのUNILORNです。
2019年製の Model3に乗ってます。 アメリカ、カリフォルニア州にあるフリーモント工場で作られた車体で、2020年9月に納車したのです2021年1月頃から上海製になったらしく、恐らく日本で納車されてるModel3でフリーモント製は最後のほうになっているっぽいです。

本題はいります。

Teslaでは非公開情報ではあるのですがAPIがあって、海外の有志の方がテスラモバイルアプリをリバースエンジニアリングしてAPI情報を抜き取っているようです。

OAuth2, Open ID Connectに対応しており、認証認可も結構安心ですね。

Teslamate

https://github.com/adriankumpf/teslamate

自前でAPIを叩いてごにょごにょしたかったところはありましたが、めっちゃくちゃいいアプリをOSSで開発されていました。
別のクラウドサービスに投げるような感じではなく、手元のDocker Containerで動作させDBもローカルにおけるような構成なのでこちらを利用してみようと思います。

https://docs.teslamate.org/docs/installation/docker

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 TokenAccess 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用アプリ(他のサーバにデータを蓄積する系のアプリ)にログイン情報を引き渡すよりは遙かに安全なので、やばさを感じるまでは運用して行こうかと思います。

GitHubで編集を提案

Discussion

ログインするとコメントできます