とうとうAlexaが家電をコントロール。Raspberry PiでBroadlink RM mini 3がちゃんと使えた。

とうとうAlexaが家電をコントロール。Raspberry PiでBroadlink RM mini 3がちゃんと使えた。

理想が一つ1つ実現できたので、忘れないうちにアウトプットしておきます。

Echo Plusを使ってリビングのフロアライトをOFF/ON出来るようになりました!

元ネタとその手順を詳細に掲載されているもう1つのサイトが大変参考になりました。

参考にした、というよりほぼそのままやったダケなんですが、2例とも仮想Alexaでの構築事例。
実機のEcho Plusではどのように動くのか、そのあたりも書いていきます。

openHAB2

openHAB2はラズパイを始めとする各プラットフォームで動作するIoTゲートウェイ。Webサーバを持ちスマホでアクセス可能、元々定義した関連付けにのっとり入力に対応したサービスを出力します。

今回のpython-Broadlinkを試す前は、このopenHAB2でRM mini3を利用できないか試行錯誤していました。

しかし解ったのは

  • サービス(Binding)追加が難解でほぼCLI手設定
  • Hue,Xiaomiなどのデバイスはやっぱりホームハブが必要
  • RM mini3がうまく認識できない(個人のスキルとして)

という事。

基本的な部分だけは動いているため、今回このRaspberry Pi + openHAB2のLinux環境に後付でpython-Broadlinkをセットアップしていきます。OpenHAB2に興味のない人は元記事を読まれたほうが必要なコマンドは分かりやすいでしょう。

RM mini3のセットアップ

まずは黒豆ことRM mini3をネットワークにつなぎました。

Gearbest Broadlink RM mini3 Universal WIFI
Broadlink RM mini3 Universal WIFI [GearBest]

通電後LEDが「青く速い点滅」になります。
この状態でe-Controlを起動すると、接続するSSIDを聞かれるので自宅の2.4GHz帯の無線APの情報を入力します。

BroadLink e-Control 2.7.6(無料)App
カテゴリ: 仕事効率化, ライフスタイル
販売元: BroadLink Co., Ltd – Broadlink Co.,Ltd(サイズ: 79.1 MB)
全てのバージョンの評価: (99件の評価)

LEDが消え、DHCPでIPアドレスが付与されていたら設定完了。

うまく行かなければ早い青点滅状態からリセットボタンを5秒長押し。「ゆっくり点滅」になったらSSID”Broadlink…”といったアクセスポイントが出現するのでiPhoneにて接続。再度e-Controlにて無線APの情報を入れればの接続が完了。

例の「この装置は正規品じゃない」が出ても気にしなくてかまいません。純正アプリなんて無線LANを設定するためだけの存在です。

Python-boradlink

純正のサービスには見放されても、Pythonで書かれたRM mini3コントロールツールが公開されています。それがPython-broadlink

githubからもって来てインストール開始。

cd /home/openhabian
git clone https://github.com/mjg59/python-broadlink.git
sudo pip install broadlink

しかしpipが悪いのか

  File "/usr/lib/python2.7/dist-packages/pip/download.py", line 25, in <module>
    from requests.compat import IncompleteRead
ImportError: cannot import name IncompleteRead

みたいなエラーを吐く。結局

sudo easy_install -U pip

とやってpipを再インストールしたら上手く”pip install broadlink”が進みました。

2018/01/02追記——————————-
古いRaspbianで実行したらPython.hのエラーで中断。

  src/_fastmath.c:31:20: fatal error: Python.h: No such file or directory
#include "Python.h"
         ^
compilation terminated.
error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1

この場合はpyhon2.7-devを追加したらOkでした。

sudo apt-get install python2.7-dev

————————————————-

次にLANに接続したRM mini3を探します。

cd python-broadlink/cli
./broadlink_discovery

コマンド結果の下から2行目、以下の行を”ROOM.device”というファイルに保存。
この後のファイル含め、学習データはこの./python-broadlink/cliディレクトリに蓄積していく形になります。

0x2712 192.168.1.xxx 8699xxxxxxxxx

このファイルでRM mini3を紐付け、次のコマンドで実際のリモコンからコードを学習させます。

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

1行メッセージが出て待機状態になったらRM mini3に向けてリモコンを押下。RM mini3側に白いLEDがついたらすぐ離す。これで学習は完了です。
試しに長押ししたデータを見てみたらその分サイズが増え、余計なデータが入ってしまいました。長く押す必要はありません。

以下はサンプル。

:~/python-broadlink/cli$ cat FLOOR_LIGHT.on
26006e0055581b1c1c1c1c3e1b3e1c3e1c3e1c1b1c1c1c0006f555581b1c1c1c1c3d1c3e1c3e1c3e1c1b1c1c1c0006f155571c1c1c1c1b3e1c3e1c3e1b3e1c1c1c1c1b0006f155581c1c1b1c1c3e1c3e1b3e1c3e1c1c1c1b1c0006f055581c1b1c1c1c3e1b3e1c3e1c3e1c1b1c1c1c000d0500000000000000000000

これをリモコンのボタンの数だけファイルネームを変えながら繰り返します。

データが出来たら実際にコマンドで送信テストしてみます。
この送信はコマンドが長ったらしいのでシェルスクリプトにするといいようです。

#!/bin/sh
cd /home/openhasbian/python-broadlink/cli
./broadlink_cli --device @ROOM.device --send @$1

名前をroom.shとしました。実行権もつけておきます。

sudo chmod u+x room.sh
./room.sh FLOOR_LIGHT.on

無事動きました。
あの「正規品じゃない呼ばわり」されたRM mini3が動くなんて嬉しい。

○ink○apa○ザマァwww

Node-RED

人の褌で相撲を取ったところで、今度は赤外線リモコンをAlexaと結びつけます。

その土台になるのが「Node-RED」。

Alexaのスマートホームグループにあって気になっていたらこういうツールだったのか!という感じです。
IFTTTとはまた違った、「事象Aを受けたら事象Bを出力する」サービスみたい。

Node-REDはNode.jsで動くのでまずそちらを導入。

sudo apt-get install node.js

Node-REDはNode-RED日本ユーザ会 : Running on Raspberry Piに従って手動インストールしました。

cd /tmp
sudo apt-get install build-essential python-rpi.gpio
bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

一般ユーザーで実行。
ルートでやると「root要らないけどホントにそのままやる??」って聞かれます。

Are you really sure you want to do this ? [y/N] ? y

Would you like to install the Pi-specific nodes ? [y/N] ?
Running Node-RED update for user openhabian at /home/openhabian

This can take 20-30 minutes on a Pi 1 - please wait.

Stop Node-RED ?
Remove old version of Node-RED ?
Remove old version of node.js -
Update node.js LTS ? Node v7.10.1 Npm 4.2.0
Clean npm cache ?
Install Node-RED core ? 0.17.5
Move global nodes to local -
Install extra Pi nodes -
Npm rebuild existing nodes ?
Add menu shortcut ?
Update systemd script ?
sudo: ignoring time stamp from the future
[sudo] password for openhabian:
Update update script ?/nodered-install.log

All done.
You can now start Node-RED with the command node-red-start
or using the icon under Menu / Programming / Node-RED
Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880

Started Mon Dec 25 17:18:01 JST 2017 - Finished Mon Dec 25 17:21:47 JST 2017

例みたいにチェックマークじゃなくて「?」なのが気になるけど一応動きました。
これは”update-nodejs-and-nodered”と同一なのでもう一度やる必要はありません。

この方法でインストールしたNode-REDは元サイトのような”Node-red-start”ではなく、”node-red-pi”で起動します。

$ node-red-pi
25 Dec 17:31:08 - [info]

Welcome to Node-RED
===================

25 Dec 17:31:08 - [info] Node-RED version: v0.17.5
25 Dec 17:31:08 - [info] Node.js version: v7.10.1
25 Dec 17:31:08 - [info] Linux 4.9.35-v7+ arm LE
25 Dec 17:31:10 - [info] Loading palette nodes
25 Dec 17:31:18 - [info] Settings file : /home/openhabian/.node-red/settings.js
25 Dec 17:31:18 - [info] User directory : /home/openhabian/.node-red
25 Dec 17:31:18 - [info] Flows file : /home/openhabian/.node-red/flows_openHABianPi.json
25 Dec 17:31:18 - [info] Creating new flow file
25 Dec 17:31:18 - [info] Server now running at http://127.0.0.1:1880/
25 Dec 17:31:18 - [info] Starting flows
25 Dec 17:31:18 - [info] Started flows

途中にかかれたhttp://127…..をラズパイのIPアドレスに読み替え、http://192.168.1.xxx:1880/にChromeでアクセス(FireFoxが公認らしいです)。うまく動けばノードエディタが開きます。

このnore-red-piをラズパイの起動に合わせて自動実行するには以下の通り。

Node-RED日本ユーザ会 : Running on Raspberry Pi


sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/nodered.service -O /lib/systemd/system/nodered.service
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop
sudo chmod +x /usr/bin/node-red-st*
sudo systemctl daemon-reload

初期のnodered.serviceはユーザーpiで実行する設定になっています。
OpenHAB2の場合はデフォルトユーザー名がopenhabianなので、パスを含めて修正してからsystemctl daemon-reloadしましょう。

Node-RED Alexa Home Skill Bridge

Node-REDで動くAlexaとの橋渡しNode-RED Alexa Home Skill Bridgeを設定します。

実際の操作は以下参照サイトに詳しく書かれております。

ここで設定したものが、後のAlexaアプリにて検出されます。

ただし、声でAlexaを呼ぶフレーズはAlexaアプリ内で自由に変更可能であり、ここでの名前によって縛られる事はありません。なので分かりやすい英語でもなんでも問題なし。

次にiPhoneのAlexaアプリにてNode-REDスキルを追加します。

Amazon Alexa 2.2.874.0(無料)App
カテゴリ: ミュージック
販売元: AMZN Mobile LLC – AMZN Mobile LLC(サイズ: 150.8 MB)
全てのバージョンの評価: (158件の評価)
+ iPhone/iPadの両方に対応

ここまでやったらスマートホーム>「デバイスの追加」をすることで、Devicesに設定した仮想デバイスが検出されます。

早速検出されたDevice”Living”は日本語テストのため”居間の電気”に変更してみました。

Node-REDにて連携設定

いよいよ大詰め。
ここでの手順も先出のサイトに大変詳しく書かれています。

設定>パレットの管理>Palette>ノードを追加にて”node-red-contrib-alexa-home-skill”を追加。インストール中はコンソールに動作ログが表示され、数分かかります。

終わるとalexaグループに「alexa home」が増えるのでそれを始点にしてノードを繋いでいきます。

”alexa home”ノードを開き、Node-RED Alexa Home Skill Bridgeで作成したユーザー名(Notメアド)、パスワードを入力。すぐにDevice横のリロードボタンを押しても反応しませんが、何度かノードを開いて閉じてしているとふっとDeviceがリストに挙がってきます。

あとはお手本通りSwitchを”is true”,”is false”で2系統作成。最後にexecノードにてLinuxで準備したコマンドを入れます。

こちらはON側のexec。

最後に右上の「デプロイ」を押せば連携が有効になります。

使ってみる

とうとう完成したAlexa→赤外線コントロール。1,000円と格安だった分、しっかり回り道した気がします。

まずはAlexaアプリのスマートホームから、ボタンを押してOFF/ON。
ここでコマンドの呼び出しに問題がある場合はコンソールにログが出ますし、Node-REDの設定の問題であればFLOW画面でもノードの下にステータスがリアルタイムに表示され判断材料となります。

Alexa,居間の電気をつけて。

カチリという音がして部屋に明かりが灯りました。感動!Hue電球と何ら遜色ないスマートさです。スマート家電コントローラ RS-WFIREX3[RATOC]みたいに「家電リモコンで~を~して」とか言わなくていい。

点灯するときは「つけて」でも「点灯して」でもOK。ただ、デバイス名を「Living」にしていた当初、「消灯して」は良くても「けして」と伝えるとスケジュールの処理を始めてしまい、スマートホームの操作になりませんでした。「ダイニング」ではどちらのフレーズも大丈夫だったので、シンプルなフレーズでは一部扱いが異なるようです。
その後呼び名を「居間の電気」にしたらどちらのフレーズでも消灯ができました。

「電源のOFF/ONがインターネット経由でできる」という点でいえば、以下の赤外線リモコンをはさんでしまえばなんでもIoT化できるようになったわけです。

2 thoughts on “0

  1. 突然のコメント失礼します。
    “声でAlexaを呼ぶフレーズはAlexaアプリ内で自由に変更可能”
    とありますが、iphoneアプリ内のデバイス管理以外で何かしら設定が必要だったりするものでしょうか?

    アプリ内でデバイス追加完了→アプリ内からの操作も問題なくできるのですが、声での呼びかけがうまくいかない状況に陥っています。何か心当たりがあればぜひご助言頂けますでしょうか・・・?

    1. ▽CHABBI3さん
      いらっしゃいませ。
      Alexaアプリ内の「スマートホーム」画面内で名前を変えるだけで動いてますね。
      (デバイスをタップ>編集>名前の編集)

      具体的にはNode-RED Alexa Home Skill Bridgeで”Living”と定義し、
      最初Alexaアプリでも”Living”として検出されました。
      あとはAlexaアプリ内で名前を「居間の電気」に変えただけで”居間の電気”に反応するようになっています。

      フレーズは何個か変えてみると変化あるかもしれません。