Asopitech With · スマートホームのハブ
SmartThings with Alopex DB & Alopex Skulk
SmartThingsは、照明やセンサー、家電をひとつのアプリでつなぐスマートホームのサービスです。これをAlopex DBとAlopex Skulkで作り直すと…?
更新: 2026/10/12
どんなサービスか
SmartThingsのようなスマートホームのサービスは、照明、センサー、スマートプラグ、カメラ、サーモスタット、家電を、ひとつのアプリでつなぎ、操作し、自動化します。ハブが家の中の機器をつなぎ、人の動きを検知して照明をつけるような自動化を動かします。扱うデータは、機器と部屋の構成、自動化のルール、機器の状態とセンサーの値の時系列です。
データの置き場所
- ハブのAlopex DB:家、部屋、機器、シーン、自動化のルールをテーブルに持ちます。ルールの条件は、JSONの列に入れます。
- ハブのSkulk:温度、電力、人の動きのようなセンサーの値を、機器と部屋のタグを付けてSkulkに追記します。直近の平均の室温は、時間の集計で出ます。
- クラウドのAlopex DBのクラスタ:家ごとの機器の構成と、利用の集計をクラウドに集めます。
自動化のルールを評価して機器を動かすのは、ハブのアプリのコードです。
配置の形
ハブには、Alopex DBとSkulkを組み込みます。インターネットが切れても、家の中の自動化とセンサーの記録は止まりません。クラウドでは、たくさんの家のデータをAlopex DBのクラスタで受けます。ノードの参加と離脱はクラスタ全体で合意し、読み取りはデータを受け持つノードへ振り分けます。ハブとクラウドは、同じSQLで同じ形のデータを扱います。
Alopex DBとAlopex Skulkが合う理由
スマートホームのデータは、家の中で生まれ、家の中ですぐに使われ、クラウドで集められます。Alopex DBとSkulkは、ハブに組み込む小さな形から、クラウドのAlopex DBのクラスタまで、同じデータの形でつなぎます。
コードで見る
家・部屋・機器・自動化はAlopex DBが持ちます(センサーの時系列はSkulk)。部屋ごとの機器を集計する中心だけを取り出したコードです。
import alopex
# 家・部屋・機器・自動化は Alopex DB(センサーの時系列は Skulk)
db = alopex.Database.open("smartthings.alopex")
db.execute_sql("CREATE TABLE IF NOT EXISTS rooms (id INTEGER PRIMARY KEY, name TEXT)")
db.execute_sql("""
CREATE TABLE IF NOT EXISTS devices (
id INTEGER PRIMARY KEY,
room_id INTEGER,
kind TEXT,
state TEXT
)
""")
for rid, name in [(1, "居間"), (2, "玄関")]:
db.execute_sql("INSERT INTO rooms (id, name) VALUES (?, ?)", [rid, name])
for did, room_id, kind, state in [(1, 1, "light", "on"), (2, 1, "sensor", "idle"), (3, 2, "lock", "locked")]:
db.execute_sql("INSERT INTO devices (id, room_id, kind, state) VALUES (?, ?, ?, ?)", [did, room_id, kind, state])
# 部屋ごとの機器の数を集計する
for row in db.execute_sql("""
SELECT r.name, COUNT(d.id) AS devices
FROM rooms AS r
JOIN devices AS d ON d.room_id = r.id
GROUP BY r.id, r.name
ORDER BY devices DESC
"""):
print(row["name"], row["devices"])構成はSQLで集計・絞り込みできます。センサーの値の時系列はSkulkがタグ付きで追記し、ハブとクラウドのクラスタが同じSQLでつながります。
ハブに組み込むAlopex DBとAlopex Skulk、クラウドのAlopex DBのクラスタは、同じSQLでスマートホームをつなげます。ハブ一台分から試してみよう。