asopi tech
asopi techIndie Developer

Asopitech With · 車両の管理アプリ

Teslaアプリ with Alopex DB & Alopex Skulk

Teslaアプリは、離れた場所から車の充電や空調を確かめて操作できる、Tesla車の管理アプリです。これをAlopex DBとAlopex Skulkを使って再現すると…?

更新: 2026/10/12

どんなサービスか

Teslaのアプリでは、離れた場所から車の充電の状況を確かめ、空調を入れ、車の場所を見られます。充電の予定も、アプリから設定します。扱うデータは、充電と走行の時系列、室温、車の場所、充電の記録です。

データの置き場所

  • Skulkの時系列:電池の残量、充電の電力、室温、速度を、車のタグを付けてSkulkに追記します。時間ごとの推移は、時間で区切る集計で出します。
  • Alopex DBのテーブル:車、利用者、充電の記録、充電の予定をテーブルに持ちます。

車のセンサーから値を読んで書き込むのは、車のソフトウェアです。

配置の形

Skulkを車のソフトウェアに組み込み、電波が切れても記録を続けます。クラウドでは、たくさんの車の記録をAlopex DBのクラスタで受け、アプリには充電の記録と推移を返します。

Alopex DBとAlopex Skulkが合う理由

車のデータは、車の中で生まれ、クラウドで集まります。Skulkは車の中の時系列を、Alopex DBは車と充電の記録を受け持ち、車の台数が増えればAlopex DBのクラスタに広げます。

コードで見る

車と充電の記録はAlopex DBが持ちます(走行・充電の時系列はSkulk)。充電履歴と合計を出す中心だけを取り出したコードです。

import alopex

# 車と充電の記録は Alopex DB(走行・充電の時系列は Skulk)
db = alopex.Database.open("tesla.alopex")

db.execute_sql("CREATE TABLE IF NOT EXISTS vehicles (id INTEGER PRIMARY KEY, name TEXT)")
db.execute_sql("""
    CREATE TABLE IF NOT EXISTS charges (
        vehicle_id INTEGER,
        started DATE,
        kwh INTEGER
    )
""")

db.execute_sql("INSERT INTO vehicles (id, name) VALUES (?, ?)", [1, "Model Y"])
for started, kwh in [("2026-10-18", 32), ("2026-10-20", 28), ("2026-10-21", 15)]:
    db.execute_sql("INSERT INTO charges (vehicle_id, started, kwh) VALUES (?, ?, ?)", [1, started, kwh])

# 充電の記録を新しい順に並べ、合計の電力量を出す
print("-- 充電履歴")
for row in db.execute_sql("SELECT started, kwh FROM charges WHERE vehicle_id = ? ORDER BY started DESC", [1]):
    print("  ", row["started"], f'{row["kwh"]}kWh')
total = db.execute_sql("SELECT SUM(kwh) AS total FROM charges WHERE vehicle_id = ?", [1])[0]["total"]
print("合計:", total, "kWh")

充電の記録はSQLで並べ替え・集計できます。電池残量・速度・室温の時系列は、Skulkが車のタグ付きで取り込み、クラウドのクラスタが受けます。

動くもののデータには、機器に組み込むAlopex Skulkと、クラウドで記録を受けるAlopex DBの組み合わせをおすすめします。

関連リンク