はじめに
以前こちらの記事を参考に格安スマートリモコンを自作しましたが、使用しているうちに以下のことを感じるようになってきました。
(念の為書いておきますが、参考元の記事をディスるわけではありません。素晴らしい記事です。)
- 動作(アプレット)が3つ以上の場合、IFTTTの無償枠に収まらない。
- 動作が3つ以内なら大丈夫。
- Slackをメッセージ数を食い潰してしまう。
- 一人だけの個人Slackなら問題にならないかも。
- 障害があると切り分けがしづらい。
- IFTTT側か、Slack側なのか切り分けが難しい。
- IFTTTの登録ワードとGoogle Assistantのショートカットが被ると誤動作する。
- 例えば「おはよう」というワードで登録した場合、Google Assistantで用意されている「おはよう」のルーティングが開始されてしまう。
- そのとき、電気がついているかどうか分からない。
対象読者
-
格安スマートリモコンの作り方を読んで、
ラズパイで回路を制御
まで作成済みの方 - MQTTの基本的な用語を理解している方 (e.g. Publisher, Subscriber, Broker, Topic ...)
- 簡単なPythonを読める方
全体の構成
※家の外からHomekitを使うには、HomepodもしくはAppleTV、ハブに設定したiPadが必要です。
用意するもの
- 自作した格安スマートリモコン
- この記事中では **自作リモコン(IR-Remo)**と表記します。
- Homebirdge
- この記事中では **HBホスト(HB-Host)**と表記します。
- Linuxが動くマシン(Raspberry Piでも可)
- 今回の記事では転がっていた野良Raspberry Pi4にUbuntuを焼いています。
Homebridgeを構築する
HBホストで操作
今回はUbuntu上にHomebirdgeを構築するので、Install Homebridge on Debian or Ubuntu Linuxを読みながらインストールを進めます。
※RaspberryPiで構築する場合は、Homebridge構築済みのRaspbianイメージがHomebridge公式で配布されているので、そちらを使うのが一番楽かもしれません。
# setup repo
(HB-Host) $ curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
# install Node.js
(HB-Host) $ sudo apt-get install -y nodejs gcc g++ make python net-tools
# test node is working
(HB-Host) $ node -v
# Install Homebridge and Homebridge UI
(HB-Host) $ sudo npm install -g --unsafe-perm homebridge homebridge-config-ui-x
(HB-Host) $ sudo hb-service install --user homebridge
インストールが終わったらhttp://<インストールしたRaspberryPiのIP>:8581
にアクセスすると、下の画面が表示されます。
MQTTで赤外線を操作する
今回はリビングの照明と寝室の照明を操作することを目標にします。
それぞれのTopicは以下のとおりとします。(ON/OFFの制御情報が流れてくるMQTTのスレッド的なもの)
- Living/Light
- Bedroom/Light
赤外線を学習させる
自作リモコンで操作
元記事を参考に赤外線を学習させます。
ここで重要なのは一番最後の引数です。今回のシステムでは各機器のTopic/{On|Off}
にしています。(後からPythonで赤外線を発信するときに重要になってきます。)
(IR-Remo) $ python3 irrp.py -r -g18 -f codes --no-confirm --post 130 Livingroom/Light/On
MQTTを受信して、赤外線を発信するプログラム
自作リモコンで実行
今回導入するMQTTプラグインでは、例えばリビングの照明をONにする場合、Topicにtrue
という文字列が流れてきます。逆にOFFにする場合、false
という文字列が流れてきます。
なので受信したMQTTのTopic Livingroom/Light
の payload がtrue
なら、Livingroom/Light/On
の赤外線を発信するPython(命名:lightman)を作成します。
今回作成したプログラムはGithubに置いてありますが、ここでは簡単にプログラムの説明をします。
import paho.mqtt.client as mqtt # MQTTのライブラリをインポート
import irrp_play # 赤外線送信のインポート
topic_list = [("Livingroom/Light", 0), ("Bedroom/Light", 0)]
今回はリビングと寝室のTopicを受信するので、topic_list
リストに格納しています。
他のTopicに対応させたいときはここを編集してください。
# メッセージが届いたときの処理
def on_message(client, userdata, msg):
# msg.topicにトピック名が,msg.payloadに届いたデータ本体が入っている
print("Received message '" + str(msg.payload) + "' on topic '" + msg.topic + "' with QoS " + str(msg.qos))
payload = msg.payload.decode('utf-8')
if payload == 'true':
irrp_play.send(msg.topic + "/On")
else:
irrp_play.send(msg.topic + "/Off")
payload
の中身に応じて、赤外線発信関数irrp_play.send()
を呼び出しています。
MQTTブローカーの準備
HBホストで実行
MQTTを送受信する場合、送信側と受信側だけでは通信が成り立たず、仲介役であるBrokerが必須になります。
公式ページを見ながらMosquittoをインストールします。
# レポジトリ追加
(HB-Host) $ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
# パッケージ更新
(HB-Host) $ sudo apt-get update
# Broker(mosqitto)と動作確認とデバック用にクライアント(mosquitto-clients)をインストール
(HB-Host) $ sudo apt-get install -y mosquitto mosquitto-clients
動作確認
ここまでできたらHBホストからMQTTをPublishして、正しく赤外線が制御されるか確認してみましょう。
# MQTT Brokerを起動
(HB-Host) $ sudo systemctl start mosquitto
# 受信側のPythonを起動しておく。
(IR-Remo) $ python3 main.py
# リビングの照明をONにする制御情報をPublishする
(HB-Host) $ mosquitto_pub -d -t Living/Light -m "true"
# これで電気がつけばOK!
# リビングの照明をOFFにする制御情報をPublishする
(HB-Host) $ mosquitto_pub -d -t Living/Light -m "false"
# これで電気が消えればOK!
自動起動&デーモン化する
MQTT Brokerを自動起動させる
HBホストが起動した時にMosquittoを自動で起動させるようにします。
# サービス開始
(HB-Host) $ sudo systemctl start mosquitto
# 自動起動ON
(HB-Host) $ sudo systemctl enable mosquitto
赤外線送信Pythonをデーモン化する
今回作成したlightmanをデーモン化させて、ラズパイ起動時に自動起動させるようにします。
下のserviceファイルを作成してください。
[Unit]
Description=Light bulb control by MQTT
[Service]
ExecStart=/usr/bin/python3 /home/pi/lightman/main.py
Restart=always
User=pi
Group=pi
[Install]
WantedBy=multi-user.target
systemdファイルの書き方などは以下の記事を参考にしてください。
Systemd入門(1) - Unitの概念を理解する
Systemd入門(4) - serviceタイプUnitの設定ファイル
serviceファイルを作成したら、自動起動をさせるようにします。
# サービス再読み込み
(IR-Remo) $ sudo systemctl daemon-reload
# サービス起動
(IR-Remo) $ sudo systemctl start lightman
# 自動起動ON
(IR-Remo) $ sudo systemctl enable lightman
Homebridgeから赤外線を操作する
MQTTプラグインのインストール
Homebridgeのメニューからプラグイン
を選択して、上の検索バーに Mqttthing
と入力してください。
Homebridge Mqttththig
が表示されたらインストールを選択してください。
※下図は既にインストール済みのため、アンインストール
と表示されています。
MQTTプラグインの設定
インストールしたら、設定
からADD ACCESSORY
を選択して以下のように入力してください。
Set On
に指定したTopicにtrue/false
が流れてきます。
動作確認
Homebirdgeのアクセサリ
を選択すると先程設定した照明が追加されているので、クリックして照明がON/OFFできるか確認しましょう。
Homekitから操作する
Homebridgeの状態
を選択すると表示されるQRコードをiPhoneやiPadで読み込ませるだけです。
これでiPhoneやiPadのホーム
アプリで操作できるようになりました。
Google Assistantから操作する
AndroidやGoogle Homeから操作するためにはHomebridge Google Smart Home
というプラグインが必要になります。
詳しいインストール方法や設定方法は公式Githubを見てください。
簡単にインストール方法と接続設定だけ書いておきます。
- 下図に従ってプラグインをインストールして、GoogleアカウントもしくはGithubアカウントを紐付けます。
- スマートフォンの
Google Home
アプリの左上+
を選択します。 -
デバイスのセットアップ
からGoogleと連携する
を選択します。 -
Homebridge
を探して、1.で紐付けたアカウントでログインします。
おわりに
IFTTTが有料化したからどうしようかなー。と悩んでいたら今回のシステムを完成しました。
今回は照明のON/OFFだけでしたが、HomebirdgeやGoogle homeプラグインは照明の明るさや色の変更、他の家電にも対応しているので、いろんなものに応用できます。
Homebirdge対応のスマートロックも作ったので、そのうち記事を書きたいと思います。
またGoogle Homeに対応したおかげで、Google Homeアプリから操作できるだけでなく、
GPSによる在宅、外出モードやAndroid11以降の電源ボタン長押し時の家電操作もできるようになりました。
今回の記事はPythonのプログラムから、Homebirdgeの設定まで結構広範囲になってしまったので、記事が読みづらくなってしまったかもしれません。すみません。。。