テスラの走行データで遊ぶためにTeslaMateのDBに接続してみた
前置き
去年テスラネタでアドベントカレンダーの最終日書かせてもらって、なんと今年も最終日書くことになりました。
※気付いたときにもう最終日と月初くらいしか空いてなくて、書くネタ決まってなかったし2年連続ノリで最終日とりました。
今年も弊社のアドベントカレンダーは珠玉のネタのオンパレードで、みなさんには是非読んで欲しいです
二年連続ということで、多少繋がりを持たせて置こうと思うので、今年もテスラの話をします。
前回からのあらすじ
去年の記事
「TeslaMateでためたデータを使ってインタラクティブ性のある遊び作れるよ」って話してたんだけど
ちょっと内容が雑過ぎたかなって、今年はそこちょっとだけ深掘って書いてみようかなと思います
TeslaMeteとは?
去年の記事より抜粋
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
ファイル作ります
defmodule TeslaGo.TeslaMateRepo do
use Ecto.Repo,
otp_app: :tesla_go,
adapter: Ecto.Adapters.Postgres
end
config/dev.exs
ファイル内でTeslaMateRepo
の設定を追加する
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
起動時の設定を追加
def start(_type, _args) do
children = [
# Start the Ecto repository
TeslaGo.Repo,
TeslaGo.TeslaMateRepo,
#省略
]
これで、TeslaMate側のDBへのアクセスが可能になりました
あとは必要に応じてスキーマを定義してデータを取り出すだけです
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
defmodule TeslaGo.Data do
alias __MODULE__.{Car}
alias TeslaGo.TeslaMateRepo
def list_cars do
TeslaMateRepo.all(Car)
end
end
車の情報にアクセスできるようになりました
あと書き
TeslaMateは車の情報だけではなく、走行データ、充電状況などいろんなデータを記録しています、位置情報や走行速度などの情報を使い色々楽しいことができると思います。
幸い(?)なことに、テスラの運転中でも、ブラウザを開きっぱにできるので、実際これを利用して本来サポートしていないCarPlayを無理やり動かしたりするデバイスもあります
同じ要領で走りながらできるなにかも作れそうな気がしますね!
また余裕ができたらいろいろいじってみたいと思います
今年もこんな駄文でアドベントカレンダーをしめるのは恐縮ですが、皆さんメリークリスマース&良いお年を!
最後に、アカツキゲームスでは一緒に働くエンジニアを募集しています。
カジュアル面談からでもぜひ!
Discussion