スマートホームスキルとNode-redとpython-broadlinkを使ってrm mini3を音声操作するメモ

# スマートホームスキルとNode-redとpython-broadlinkを使ってrm mini3を操作するようにするメモ

参考：[Amazon Echoで「○○をつけて」と言って家電を操作する \- Qiita](https://qiita.com/machu/items/122c8403b35748bd5f4c)

ほとんどここの内容。rm mini3 + debian(strech)バージョン。日本語打つのが嫌なのでめっちゃ参照する。

## 前置き

Alexaでスマートホームを実現する方法は主に以下の方法ある。

- カスタムスキル
- IFTTT連携
- スマートホームスキル

上から順に自由度が高いが、スマートホームスキル以外は依頼時に呼び出し名が必要で使い勝手が悪い。

e.g.「アレクサ、"リモコンを起動して"テレビをつけて」、「アレクサ、テレビをつけて"をトリガー"」

スマートホームスキルは現状の対応操作（ON,OFF,調光,調色)しかできないが、自然な依頼が可能である。

e.g. 「アレクサ、テレビつけて」、「アレクサ、照明を明るくして」

カスタムスキルであれスマートホームスキルであれ、スキル開発が（それなりに）面倒くさいので一番シンプルにやるならIFTTT連携が良い感じだった。

そんなある日、イギリスのおじさんがスマートホームスキルの面倒な部分を実装して必要なところだけをサービスとして提供してくれている事を知った。今回それを使って、自然な依頼でrm mini3を音声操作できるようにする。イギリスのおじさんに大いに感謝する。（paypalでビール代を送ってあげよう）

使うもの

- ハードウエア
	- alexa
		- スマートスピーカ
	- rm mini3
		- wifi ir リモコン
	- debian(strech)
		- お家にある常時起動かつnode-red,pythonが動けば何でも良い
	- (ルータ)
- ソフトウェア
	- [Node-RED Alexa Home Skill Bridge](https://alexa-node-red.bm.hardill.me.uk/)
		- イギリスのおじさんが開発したホームスキルとnode-redを繋げる無料Webサービス
		- ビール代は[こちら](https://alexa-node-red.bm.hardill.me.uk/about)からpaypalで。
	- Node-red (on node.js)
		- 機能毎に用意されたノードをGUIでいじるだけでプログラムを作れるサーバ
	- python-broadlink
		- rm mini3をコマンドラインから操作するpythonで書かれたプログラム


それでは始めよう。

> スマートスピーカーが成熟するとこのような工夫は不要になるでしょうが、逆にハックする楽しみを味わえるのは今ならではです。

## 手順.0 
ぐっちゃぐちゃにする用のフォルダを作ろう

	mkdir ~/smarthome-project
	cd smarthome-project

## [手順1. Node-RED Alexa Home Skill Bridgeのセットアップ](https://qiita.com/machu/items/122c8403b35748bd5f4c#%E6%89%8B%E9%A0%861-node-red-alexa-home-skill-bridge%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)
リンク先と全く同じ

## [手順2. スマートホームスキル (Node-RED) とデバイスを追加する](https://qiita.com/machu/items/122c8403b35748bd5f4c#%E6%89%8B%E9%A0%862-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%9B%E3%83%BC%E3%83%A0%E3%82%B9%E3%82%AD%E3%83%AB-node-red-%E3%81%A8%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)

リンク先と全く同じ

## 手順3. Node-redとpython-broadlinkのインストール

### node-redのインストール
Debian(strech)だと普通にaptするとかなり古いしnpm入らないというクソ仕様なので、公式サイト[パッケージマネージャを利用した Node\.js のインストール \| Node\.js](https://nodejs.org/ja/download/package-manager/#debian-and-ubuntu-based-linux-distributions-debian-ubuntu-linux)に従う。


	curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
	sudo apt-get install -y nodejs

	sudo npm install -g --unsafe-perm node-red　

	node-red #起動


最近のraspberry piはこんなことしなくても標準でnode-red入ってるらいしい。

[RaspberryPiでNode\-REDが使えるようになった \- Qiita](https://qiita.com/powmana02/items/bd6c5890159f6696954a)

### python-boradlinkのインストール
	sudo apt install python
	sudo apt install python-pip #pipが入っているならいらない。よく覚えてない

	(setuptoolsがないと言われる場合)
	wget http://peak.telecommunity.com/dist/ez_setup.py
	sudo python ez_setup.py
	(ここまで)

	sudo pip install broadlink

	sudo apt install git
	git clone https://github.com/mjg59/python-broadlink.git

	cd python-broadlink/cli

	# ~/smarthome-project/python-broadlink/cli

	# rm mini3の認識

	./broadlink_discovery
		XxXXXX xxx.xxx.xxx.xxx. xxxxxxx

	# いい感じに認識してそうなら情報を保存

	./broadlink_discovery > ROOM.device

	# 学習(コマンドを叩いてからrm mini3に向けてリモコンを操作)

	./broadlink_cli --device @ROOM.device --learnfile LIGHT.on

	# 送信（学習させた内容が動作することを確認）,@を忘れずに

	./broadlink_cli --device @ROOM.device --send @LIGHT.on

## [手順4. Node-REDで家電操作のフローを作成する](https://qiita.com/machu/items/122c8403b35748bd5f4c#%E6%89%8B%E9%A0%864-node-red%E3%81%A7%E5%AE%B6%E9%9B%BB%E6%93%8D%E4%BD%9C%E3%81%AE%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
execノード以外は同じ

execノードには*.shではなく送信コマンドをフルパスで入れる。むっちゃ長くなるので引数を使うと多少まし。

例

コマンド：/home/(ユーザ名)/smarthome-project/python-broadlink/cli/broadlink_cli

引数：--device @/home/(ユーザ名)/smarthome-project/python-broadlink/cli/ROOM.device --send @/home/(ユーザ名)/smarthome-project/python-broadlink/cli/LIGHT.on
（msg.payloadのチェックを外すこと）


あとはデバイス毎やON,OFFや照度の調整ごとにどんどフローを作っていくだけ！

こんな感じ
![私はこんなかんじになった](https://qiita-image-store.s3.amazonaws.com/0/157074/74bc8a39-81af-a602-1c27-1be8e541b7d0.png)

## 手順5. [シェルスクリプトからNature Remoを使って照明をつける](https://qiita.com/machu/items/122c8403b35748bd5f4c#手順5-シェルスクリプトからnature-remoを使って照明をつける)
コマンドで実施済みのため必要なし。

## 手順6. [テレビやtorneを遠隔から操作できるようにする](https://qiita.com/machu/items/122c8403b35748bd5f4c#手順6-テレビやtorneを遠隔から操作できるようにする)

Braviaやtorneを連携する場合には参考に。

## 手順7. node-redoのservice化
全てうまくいったらnode-redをサービス化しておく。raspberry piの場合でも使えそうだけどやったことはない。

	sudo nano /lib/systemd/system/nodered.service

	(以下の内容で作る、パスの指定だけ見直して。)
	[Unit]
	Description=The NodeRed
	After=syslog.target network.target

	[Service]
	Type=simple
	User=root
	Group=root
	Nice=5
	KillSignal=SIGINT
	ExecStart=/usr/bin/node-red
	Restart=on-failure
	StandardOutput=syslog
	WorkingDirectory=/home/(ユーザ名)/.node-red
	User=root
	Group=root
	[Install]
	WantedBy=multi-user.tar



	sudo systemctl daemon-reload
	sudo systemctl enable nodered.service
	sudo systemctl start nodered.service

---
memo
Debian(strech)の正体はrock64に[Release 0\.6\.32: jenkins\-linux\-build\-rock\-64\-210 · ayufan\-rock64/linux\-build](https://github.com/ayufan-rock64/linux-build/releases/tag/0.6.32)を入れてる。

SynologyでやってもよかったけどNASをいじくり回すの怖い。