Amazon AlexaのNode-Red連携でハマりまくったので備忘録

方法

  • node-red-contrib-alexa-home を使う。 sudo npm install node-red-contrib-alexa-home でもよいし、Node-Redのパレット管理からインストールしてもよい。
  • 現在Echo Dotはデバイスの検出に80番ポートを要求するのでNode-Redはroot権限で起動する(またはポートリダイレクトで80番を60000番等にリダイレクト)。
  • ただしnode-red本体は80番で起動させない(Alexa Controllerと衝突して刺さる)。たとえばデフォルトのポート1880で実行する。このとき環境変数を設定して起動する: sudo ALEXA_PORT=80 node-red start
  • Node-Red内で、node-red-contrib-alexa-homeのノード"Alexa Controller"をフローに配置し、これをダブルクリックして内容を開き、そのポート(デフォルト60000番)を80番に書き換える。
  • ノード"Alexa Home"を配置し、ダブルクリックして名前をつける。
  • デプロイしてからAlexaにデバイスの検出をさせる(「アレクサ、デバイスを探して」)と、自分が付けた名前の機器が検出できる。
  • このノードはMQTTなりWebインターフェイスなりと情報をやり取りできるので、自作IoT機器と相互に通信でき、すなわちその機器のAlexaインターフェイスとなる。

ググると見つかるその他のノード

"Node-Red Alexa 連携"などで検索するといろいろ見つかる。

これはAlexaスキルでNode-Redを検索すると出てくるスキル連携型のノードで、イギリスのどこかのサーバにユーザー名とパスワードを登録し、デバイスを作成するという手順が必要だ。Node-Redに出てくるノードに、同じユーザー名とパスワードを書き込み、更新するとデバイスを選択できるようになる(登録したものが出てくる)。これをAlexaにdiscoverさせることで使用できる。

これは最初に作られたらしいNode-Red Alexa連携ノード。ローカルで完結する。Echoの世代交代(およびファームウエアアップデート)により動かなくなっている。

2種類だけ挙げたが他にもある。ただし自分は最初に書いたnode-red-contrib-alexa-homeを使う方法と、上記のnode-red-contrib-alexa-home-skill(スキル連携型のノード)しか動作させられなかった。ちなみにこの動いた2つ、名前はそっくりだが、モノはまったく違う。

経緯とか: スマートホームの不自由さ

スマートホーム的なことをしたいと思って最近いろいろ買い込んでる。自分で設置した12VのLEDストリップ照明をスマートスイッチで自動化したのを皮切りに、Alexaで制御できるスイッチやリモコンを設置しまくっている。

もともと20年ほど前にX10を知り、そのシンプルでオープンで実用的な構成に感心したこともあり(電灯線で通信し、対応機器が安く大量に販売され、シリアル通信でパソコンとやり取りできるアダプタ等も既に販売されていた)、その後の日本のスマートホームブームにおいて、住宅屋がそれぞれ独自に作るプロプライエタリな製品しか出ない状況を苦々しく、というかほとんど不思議な気分で眺めていた。ところがここ数年は、AlexaやGoogle Homeに対応した比較的安価な製品が様々な製造者により提供される状況になって、そろそろ自分でもやりたくなってきた。

いろいろ買ってみてわかったのは、これらの多くがESP8266等の安価なWiFiチップを自前で持っていること。家庭内軽量ワイヤレスネットワークに特化したはずだったZigBeeのようなプロトコルは少数派(スマート電球では使われているが)で、大多数はいきなりWiFiで繋ぐ。WiFiチップが十分安価になったということだろうが、諸行無常感もある。

それでちょっと問題になるのが、PIRモーションセンサーや赤外線センサ、磁石に反応するリードスイッチ等の軽量センサー類だ。これらは独立した機器として使うには単純すぎるのだ。

こうしたセンサは、数をたくさん設置するほど便利だ。たとえばPIRセンサを設置するにしても、場所と方向と死角を考慮して3つほど設置してやると、そのとき反応している人物(オレ)が何のためにそこにいるのかが、ある程度推測できる。たとえばリビングで反応したときに、そこで仕事をしたいのか、夜中にトイレに起きて横切るだけなのかによって点灯すべき照明の質/量は異なる。トイレに起きてまた寝る予定なのに昼間のように煌々と明かりを点けられては余計なお世話を通り越してQoLに問題が出る。こうした場合はサブの照明を軽く点灯するだけにする、といった具合の、押し付けがましくない自動制御にはセンサの数と種類が必要だ。

ところがたとえばPIRセンサであるが、WiFi/Alexa対応のやつは安くても2000円くらいする。こんな貴重品では需要だけを考えて湯水のように使うのはぜんぜんムリで、まとめて買うことすら憚られる。お金も帯域も持っていくなら、せめて多機能であってほしい。

こんなときに活躍するのは軽量なマイコンチップだ。

ATMega328どころか88でいい。マイコンにセンサを多数ぶら下げて、近くのマシンに配線を伸ばせば…今度はケーブルが問題になる。

そんなわけで、そろそろ面倒くさくなってきたので、AliexpressでESP32-WROVERの生モジュール(技適付き)を20個ほどと、開発用ブレイクアウトボードを2枚買ってきた。総額8000円くらいだった。

ESP32はWiFiチップだが強力な演算能力を併せ持ち、開発元のEspressifがArduino環境で使えるようにブートローダオープンソースで提供している。平たく言えば、このチップはWiFi(とBLE)つきのArduino互換機になるのだ。省電力機能も充実してるので、好きな場所に設置してセンサを繋ぐことで、気軽にセンサーネットワークが構築できる。

ところがところが。これをスマートスイッチやAlexaに接続しようとしたところ、単純な方法は存在しないことがわかった。

スマートスイッチ類はSmart Lifeという中国Tuya社のアプリを通じて制御するようになっている。ペアリングモードにするとスマホアプリと接続し、アプリに教えてもらった家庭のWiFiネットワークに繋ぎ替わり、さらにクラウドのサーバに登録することでいつでも制御可能な状態になる。そしてAlexaやGoogle HomeがSmart Lifeにこの登録情報を教えてもらうことでスマホアプリ無しの連携が出来るようになる。ぜんぶ閉じた世界だ。

IoT関係ではMQTTというオープンなメッセージプロトコルが存在しており盛んに使われていると聞いていたのだか、Smart LifeもAlexaもGoogle Homeも誰も彼も、MQTTなんか喋ってくれないのである。

不自由な環境では人は自由になるために何らかの行動をするものだ。一番簡単なのは製品を買うことだが、そんな不自然な市場に参加したくない。

というわけでいろいろハマりまくったものの、Node-Redで連携できて、とても良い気分です。

Alexaと喋るその他の方法

マイコンでAlexaと連携する方法は実は他にもある。自分が見つけているのは

  • Sinric Pro
  • TuyAPI
  • Tasmota / ESPHome

である。見つけたら追記する。

Sinric Pro

Arduino関連のサイトでAlexa連携について検索すると、最初に見つかるのがSinric Proだ。

使い方は簡単。Sinricのアカウントを作り、Githbからサンプルコードをダウンロード。Arduino IDEで開いて、WiFi情報(使う場所の)、デバイスID、キー(アカウントページで取れる)を書き換えて、Arduinoとして書き込むだけだ。

これにより機器がSinricのサーバと通信し、SinricのサーバがAlexaと通信する。たとえば機器のPIR検出をサーバ経由で自分のAlexaに通知できる。

これの良いところは、比較的柔軟にデバイスを構成できること。上記のNode-Redのcontribコードは基本的に電球としてしか動作しないが、こちらはAlexaが対応するさまざまな機器として動作するハードウエアを作ることができる。

悪いところは、通信がいったん外に出ていくことと、機器の数に制限があり、4台以上は有料(1台3ドル/年)。

通信がローカルで完結せず、いったん外に出ていくのは結構嫌。無駄な感じがするのは措くとしても、ネットが繋がっていないと動作しない。

そして使ってみたところ、通知がいまいち信用できない。サーバが反応しないことがちょくちょくあり、PIRセンサの検出時に光らせているLEDが点灯してるのに照明が消えたりする。なので「連続N分検出していない状態が続いたら消灯」のように運用でカバーする必要がある。

3台の制限の中でも3ビット使えば8種類の情報が、いや、照度を%単位で設定できるスマート電球として使えば1003=100万の状態がプロットできるのでは、などと夢を広げてましたが、Node-Redがつながったし、もういいかな〜という感じ。

TuyAPI

こちらはTuyaのスマート機器に化けることでAlexaとやりとりするというもの。汎用性も高いしAlexaの仕様変更等で使えなくならないのは良いな…と思うんだけど、Tuyaに開発者登録してデバイスを作るところがうまくいかず。

Tasmota / ESPHome

これらはArduinoではなく、ESP8266/ESP32で使用できるファームウェアで、独自のプログラミング環境(ブロック的な簡単なもの)をサポートしている。まだ使って見てないのでわからないが、TasmotaはBelkin WeMoやHue Bridgeをエミュレートすることで、ESPHomeはHome Assistantを介すことで、やりとりができるらしい。

ハブもあるらしい

Arduinoに限らず、こうした形でスマートホームをやる場合、普通はハブになるソフトを使うものらしい。OpenHAB/Home Assistant/Mozilla WebThings Gatewayなどいろいろある。

スマートホームハブ徹底比較(Node-red、Home Assistant、OpenHAB、Mozilla WebThings Gatewayhttps://dream-soft.mydns.jp/blog/developper/smarthome/2020/08/1966/ 』という記事では、Node-Redはむしろ一番面倒で避けたそうなソリューションとして描かれている。

オレは最初にNode-Redに行き着いてしまったのであれだけど、連携が簡単になったりするなら使ってみたいところ。