Asopitech With · スマート照明
Philips Hue Bridge 照明とシーン with Alopex DB
Philips Hueは、アプリや音声で家の照明を操作し、シーンで明るさと色をまとめて切り替えるスマート照明です。これをAlopex DBで作り直すと…?
更新: 2026/10/13
どんなサービスか
Philips HueのBridgeは、Hueの照明と防犯のシステムの中心です。照明、カメラ、センサーをつなぎ、ZigbeeとBluetoothで機器とやりとりします。Alexa、Google Home、Apple Home、IFTTTなどとも連携します。今回作り直すのは、ブリッジが持つ照明とシーンの部分です。
データの置き場所
- Alopex DBのSQLテーブル:照明、部屋、シーン、センサーをSQLテーブルに持ちます。シーンは、照明ごとの明るさと色の行です。
- SQL:部屋の照明をまとめて切り替える処理は、部屋とシーンを結合するSQLで書きます。
- KV:照明の今の状態は、照明のIDをキーにしたKVで素早く読み書きします。
照明に命令を送るのは、ブリッジのソフトウェアです。
配置の形
Alopex DBを、ブリッジのソフトウェアに組み込みます。照明とシーンのデータは家の中のブリッジにあるので、インターネットが切れても照明は動きます。
Alopex DBが合う理由
スマート照明のデータは、照明、部屋、シーンの関係です。Alopex DBは、その関係をSQLテーブルで持ち、ブリッジに組み込んだまま問い合わせます。家がたくさん集まるクラウドの側では、同じエンジンをサーバー、クラスタとして動かせます。
コードで見る
照明・部屋・シーンをテーブルに持ち、部屋にシーンを当てる処理を、部屋とシーンを結合するSQLで書きます。中心だけを取り出したコードです。
import alopex
db = alopex.Database.open("hue.alopex")
# 照明・部屋・シーン(照明ごとの明るさと色)を持つ
db.execute_sql("CREATE TABLE IF NOT EXISTS lights (id INTEGER PRIMARY KEY, room TEXT, name TEXT)")
db.execute_sql("CREATE TABLE IF NOT EXISTS scenes (id INTEGER PRIMARY KEY, name TEXT)")
db.execute_sql("""
CREATE TABLE IF NOT EXISTS scene_lights (
scene_id INTEGER,
light_id INTEGER,
brightness INTEGER,
color TEXT
)
""")
for lid, room, name in [(1, "居間", "天井"), (2, "居間", "スタンド"), (3, "寝室", "枕元")]:
db.execute_sql("INSERT INTO lights (id, room, name) VALUES (?, ?, ?)", [lid, room, name])
db.execute_sql("INSERT INTO scenes (id, name) VALUES (?, ?)", [1, "映画"])
for light_id, brightness, color in [(1, 10, "warm"), (2, 30, "warm")]:
db.execute_sql("INSERT INTO scene_lights (scene_id, light_id, brightness, color) VALUES (?, ?, ?, ?)", [1, light_id, brightness, color])
# 「居間」に「映画」シーンを当てる=部屋の照明ごとの設定をSQLで引く
rows = db.execute_sql("""
SELECT l.name, sl.brightness, sl.color
FROM scene_lights AS sl
JOIN lights AS l ON l.id = sl.light_id
WHERE sl.scene_id = ? AND l.room = ?
ORDER BY l.id
""", [1, "居間"])
for row in rows:
print(row["name"], row["brightness"], row["color"])部屋とシーンを結合すれば、まとめて切り替える設定が一度に引けます。この結果を、ブリッジが照明への命令に変えます。
照明とシーンの関係をSQLで扱えるAlopex DBを、ハブのソフトウェアに組み込んでみよう。