Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@jp7eph

自作格安スマートリモコンとHomebridgeを組み合わせたら幸せになった件

はじめに

以前こちらの記事を参考に格安スマートリモコンを自作しましたが、使用しているうちに以下のことを感じるようになってきました。
(念の為書いておきますが、参考元の記事をディスるわけではありません。素晴らしい記事です。)

動作(アプレット)が3つ以上の場合、IFTTTの無償枠に収まらない。
動作が3つ以内なら大丈夫。
Slackをメッセージ数を食い潰してしまう。
一人だけの個人Slackなら問題にならないかも。
障害があると切り分けがしづらい。
IFTTT側か、Slack側なのか切り分けが難しい。
IFTTTの登録ワードとGoogle Assistantのショートカットが被ると誤動作する。
例えば「おはよう」というワードで登録した場合、Google Assistantで用意されている「おはよう」のルーティングが開始されてしまう。
そのとき、電気がついているかどうか分からない。

対象読者

  • 格安スマートリモコンの作り方を読んで、ラズパイで回路を制御まで作成済みの方
  • MQTTの基本的な用語を理解している方 (e.g. Publisher, Subscriber, Broker, Topic ...)
  • 簡単なPythonを読める方

全体の構成

今回製作した全体構成です。
homebridge構成図.jpg

※家の外から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公式で配布されているので、そちらを使うのが一番楽かもしれません。

HBホストで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にアクセスすると、下の画面が表示されます。
image.png

MQTTで赤外線を操作する

今回はリビングの照明と寝室の照明を操作することを目標にします。
それぞれのTopicは以下のとおりとします。(ON/OFFの制御情報が流れてくるMQTTのスレッド的なもの)

  • Living/Light
  • Bedroom/Light

赤外線を学習させる

自作リモコンで操作
元記事を参考に赤外線を学習させます。
ここで重要なのは一番最後の引数です。今回のシステムでは各機器のTopic/{On|Off}にしています。(後からPythonで赤外線を発信するときに重要になってきます。)

リビングの照明をONにするときの赤外線学習コマンド
(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/Lightpayloadtrueなら、Livingroom/Light/Onの赤外線を発信するPython(命名:lightman)を作成します。

今回作成したプログラムはGithubに置いてありますが、ここでは簡単にプログラムの説明をします。

lightman/main.py
import paho.mqtt.client as mqtt     # MQTTのライブラリをインポート
import irrp_play                    # 赤外線送信のインポート

topic_list = [("Livingroom/Light", 0), ("Bedroom/Light", 0)]

今回はリビングと寝室のTopicを受信するので、topic_listリストに格納しています。
他のTopicに対応させたいときはここを編集してください。

lightman/main.py
# メッセージが届いたときの処理
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ホストで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を自動で起動させるようにします。

Mosquittoの自動起動ON
# サービス開始
(HB-Host) $ sudo systemctl start mosquitto

# 自動起動ON
(HB-Host) $ sudo systemctl enable mosquitto

赤外線送信Pythonをデーモン化する

今回作成したlightmanをデーモン化させて、ラズパイ起動時に自動起動させるようにします。
下のserviceファイルを作成してください。

/etc/systemd/system/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ファイルを作成したら、自動起動をさせるようにします。

lightmanの自動起動
# サービス再読み込み
(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が表示されたらインストールを選択してください。
※下図は既にインストール済みのため、アンインストールと表示されています。
image.png

MQTTプラグインの設定

インストールしたら、設定からADD ACCESSORYを選択して以下のように入力してください。
Set Onに指定したTopicにtrue/falseが流れてきます。
image.png

動作確認

Homebirdgeのアクセサリを選択すると先程設定した照明が追加されているので、クリックして照明がON/OFFできるか確認しましょう。
image.png

Homekitから操作する

Homebridgeの状態を選択すると表示されるQRコードをiPhoneやiPadで読み込ませるだけです。
これでiPhoneやiPadのホームアプリで操作できるようになりました。

Google Assistantから操作する

AndroidやGoogle Homeから操作するためにはHomebridge Google Smart Homeというプラグインが必要になります。
詳しいインストール方法や設定方法は公式Githubを見てください。

簡単にインストール方法と接続設定だけ書いておきます。

  1. 下図に従ってプラグインをインストールして、GoogleアカウントもしくはGithubアカウントを紐付けます。 image.png
  2. スマートフォンのGoogle Homeアプリの左上+を選択します。
  3. デバイスのセットアップからGoogleと連携するを選択します。
  4. Homebridgeを探して、1.で紐付けたアカウントでログインします。

おわりに

IFTTTが有料化したからどうしようかなー。と悩んでいたら今回のシステムを完成しました。
今回は照明のON/OFFだけでしたが、HomebirdgeやGoogle homeプラグインは照明の明るさや色の変更、他の家電にも対応しているので、いろんなものに応用できます。
Homebirdge対応のスマートロックも作ったので、そのうち記事を書きたいと思います。

またGoogle Homeに対応したおかげで、Google Homeアプリから操作できるだけでなく、
GPSによる在宅、外出モードやAndroid11以降の電源ボタン長押し時の家電操作もできるようになりました。

今回の記事はPythonのプログラムから、Homebirdgeの設定まで結構広範囲になってしまったので、記事が読みづらくなってしまったかもしれません。すみません。。。

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
jp7eph
元高専生.今はとある情報通信会社で働いてます.

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?