📝

テスラの走行データで遊ぶためにTeslaMateのDBに接続してみた

2023/12/25に公開

前置き

去年テスラネタでアドベントカレンダーの最終日書かせてもらって、なんと今年も最終日書くことになりました。
※気付いたときにもう最終日と月初くらいしか空いてなくて、書くネタ決まってなかったし2年連続ノリで最終日とりました。
今年も弊社のアドベントカレンダーは珠玉のネタのオンパレードで、みなさんには是非読んで欲しいです
https://adventar.org/calendars/8724
二年連続ということで、多少繋がりを持たせて置こうと思うので、今年もテスラの話をします。

前回からのあらすじ

去年の記事
https://zenn.dev/sieben_l/articles/6c95980dd64341
の中で
「TeslaMateでためたデータを使ってインタラクティブ性のある遊び作れるよ」って話してたんだけど
ちょっと内容が雑過ぎたかなって、今年はそこちょっとだけ深掘って書いてみようかなと思います

TeslaMeteとは?

去年の記事より抜粋

https://docs.teslamate.org/docs/installation/docker/
走行データなどを記録するLoggerで、ローカルもしくはクラウドサーバーで起動して置けば、加速減速やエネルギーの消費など細かいデータまで全部見れるものです。

Localで動いてるTeaslaMate

やりたいこと

TeslaMateがLoggerとして車の走行データをためてくれるので、そのデータを使っていろいろするため、Elixir+Phoenixで自作のサーバーをTeslaMateのDBに接続させたいです。

TeslaMate側の設定

TeslaMateのdocker-compose.ymlはこんな感じ

#DB以外の部分は省略
database:
    image: postgres:15
    restart: always
    environment:
      - POSTGRES_USER=teslamate
      - POSTGRES_PASSWORD=
      - POSTGRES_DB=teslamate
    volumes:
      - teslamate-db:/var/lib/postgresql/data

とりあえずローカルで自作サーバーを動かすために、localhostからこのDBにアクセスしたいので
portの設定を追加します

database:
    image: postgres:15
    restart: always
    environment:
      - POSTGRES_USER=teslamate
      - POSTGRES_PASSWORD=
      - POSTGRES_DB=teslamate
    ports:
      - XXXX:5432
    volumes:
      - teslamate-db:/var/lib/postgresql/data

portsのフォーマットはlocalhostのport:dockerContainer内のport
Containerのportはデフォルト5432で、localHostのportは自作サーバーのDBと被らないようにしましょう

変えてから

docker compose up -d

して試してにターミナルから接続してみる

psql -h 127.0.0.1 -p XXXX -U teslamate teslamate
Password for user teslamate:
psql (14.6 (Homebrew), server 14.10 (Debian 14.10-1.pgdg120+1))
Type "help" for help.

teslamate=#

無事接続できるようになりました

自作サーバー側の設定

自作サーバーを作る

Elixir+Phoenixでとりあえず適当に新しいプロジェクトを作ります

mix phx.new tesla_go

teslamateのDBからデータ読み込んで、こっちでいろいろ遊び作りたいので
自作サーバー側でもDBを持っておきたい

mix ecto.create

TeslamateのDBへ接続

ここまで来ると、自作サーバーのlib/プロジェクト名/の下にはrepo.exファイルができて、
config/dev.exsファイル内で先程作ったDBの設定が書かれています
基本サーバーを立ち上げると、こちらのDBに繋がるようになってます

ここでさらにTeslamateのDBにも繋がるようにしたいので、どうすればいいのかっていうと、素直にRepoを増やします。

lib/プロジェクト名/の下にtesla_mate_repo.exファイル作ります

tesla_mate_repo.ex
defmodule TeslaGo.TeslaMateRepo do
  use Ecto.Repo,
    otp_app: :tesla_go,
    adapter: Ecto.Adapters.Postgres
end

config/dev.exsファイル内でTeslaMateRepoの設定を追加する

dev.exs
config :tesla_go, TeslaGo.TeslaMateRepo,
   username: "teslamate",
   password: "*********",
   hostname: "localhost",
   database: "teslamate",
   port: XXXX, #先程設定したport
   stacktrace: true,
   show_sensitive_data_on_connection_error: true,
   pool_size: 10

起動時の設定を追加

application.ex
def start(_type, _args) do
    children = [
      # Start the Ecto repository
      TeslaGo.Repo,
      TeslaGo.TeslaMateRepo,
      #省略
    ]

これで、TeslaMate側のDBへのアクセスが可能になりました

あとは必要に応じてスキーマを定義してデータを取り出すだけです

car.ex
defmodule TeslaGo.Data.Car do
  use Ecto.Schema

  schema "cars" do
    field :name, :string
    field :efficiency, :float
    field :model, :string
    field :trim_badging, :string
    field :marketing_name, :string
    field :exterior_color, :string
    field :wheel_type, :string
    field :spoiler_type, :string

    field :eid, :integer
    field :vid, :integer
    field :vin, :string
    timestamps()
  end
end

data.ex
defmodule TeslaGo.Data do
  alias __MODULE__.{Car}
  alias  TeslaGo.TeslaMateRepo
  def list_cars do
    TeslaMateRepo.all(Car)
  end
end


車の情報にアクセスできるようになりました

あと書き

TeslaMateは車の情報だけではなく、走行データ、充電状況などいろんなデータを記録しています、位置情報や走行速度などの情報を使い色々楽しいことができると思います。


幸い(?)なことに、テスラの運転中でも、ブラウザを開きっぱにできるので、実際これを利用して本来サポートしていないCarPlayを無理やり動かしたりするデバイスもあります
同じ要領で走りながらできるなにかも作れそうな気がしますね!

また余裕ができたらいろいろいじってみたいと思います

今年もこんな駄文でアドベントカレンダーをしめるのは恐縮ですが、皆さんメリークリスマース&良いお年を!

最後に、アカツキゲームスでは一緒に働くエンジニアを募集しています。
カジュアル面談からでもぜひ!
https://games.aktsk.jp/recruit/

Discussion