Home導入環境はまだブロックされているらしい。(06/18)WWDC2019簡単まとめ。touch(第7世代)」が突然発表。本当に新型出してくるとは。mini(第5世代)」買っちゃった。RJ-3で家電を操作サーバーのNode.jsとngrokのバージョンを上げたら若干ハマった。(05/17)Firefoxでアドオンが利用不可になる不具合。修正パッチリリース済。修正バージョンリリース。v2系がまともに動くようになった。ボタンを押してください。ボタンを押してください。RJ-3で家電を操作サーバーのNode.jsとngrokのバージョンを上げたら若干ハマった。RJ-3」を使って家電を音声操作する為の中継サーバー。Linuxパッケージのアップデートは頻繁に実施していたんですが、実装時以来触ってなかったNode.jsモジュールもアップデートをしてみようかとふと思い立って実施しました。しましたらハマりました。(Node.js自体は悪くないんですが。)というわけで備忘録的なメモです。■続きを読む■アップデート前のnodeとnpmのバージョン。-v6.4.1アップデート可能なバージョンの確認。一気に上げるのも怖いので現状のv8台の最新に留めておく事に。v8.16.0をインストールします。v8.16.0インストールしたv8.16.0を使用するよう指定します。v8.16.0npmをアップデート。npmバージョンが更新された事を確認。-v6.9.0ここでNode.jsのバージョンが変わるとnode配下に配置されたパッケージがいなくなってて一瞬焦りました。useで指定したバージョンのシンボリックリンクになってるとは。いうわけで関係するものをインストールし直します。ホームディレクトリ直下にあるものはもちろんの事ですが影響を受けていないので特に操作等不要です。ngrokついでに、ngrokは最新が落ちてくるわけではないようでUpdateしろって出てたのでこっちもアップデートします。これでバージョンは2.3.28になりました。(ここが最大のハマりポイントになったけど。updateで、これまで通りngrokをバックグラウンド起動したところで前述の通りハマりました。curlコマンドでIFTTTからアクセスする用のURL確認しようとしたところ表示されなくて。うまく動いてないのかと切り分けしてみたけど全く見当付かずで元に戻そうかとも考えたところで、試しにフォアグラウンドで起動してみると特に問題なく動作してる・・・という事は確認の仕方がダメなだけなんだろうなと更に粘って調べてみました。結局のところ、仕様が変わってました。ステータス表示のパスが変更になってます。バージョン上げたせいかなーと。いうわけで、長々と出てきますがこれで出てきます。http://127.0.0.1:4040/api/tunnelscurlコマンドのオプションとsedコマンドで加工するとFQDN(URL部分)だけ抽出できます。's/.*public_url":"https:..([^"]*).*/\1/p'結果的には元に戻ったので良かった良かった。ngrokの仕様変更は鬼門だなぁ。いつの間にかアカウント登録無しでのngrok利用にセッション時間制限が設定されてた。Miniで家電を操作。AssistantをIFTTT連携させて音声操作。RJ-3」を使って声での家電操作。それが数日前から気付いたら反応しないようになり、宅内サーバー側を再起動してサービスを立ち上げ直すと直後はきちんと動作するのに、気付いたらまた無反応に。Firewall)を疑ってログ調べたりポリシーいじってみたりもしたけど結局解消せずで。再起動すれば直るけど、フリー使用の為にngrokで払い出されるURLが毎回ランダムで変わって、そのURLをIFTTT側で書き換えにゃならんので自動的再起動を仕込んだところでどうしようもないし。ERR_NGROK_708まあ、要約するとトンネル(セッション)の期限が切れたのでngrokに登録するか再起動しろって事のようで。Expires」なんて項目が出てる。8時間で強制的に切られるようで。導入した時はなかったはずなので(利用できてたし)、ここ数日で変更されたんだろうか。事象が出始めた直前にメンテナンスで再起動していたのでその時に反映されたのかもしれないけど。ngrokアカウントにサイアンアップして利用を推奨してきてたので登録してみる事に。無料利用に登録の有無で何か違いがあるんだろうかと半信半疑だったけど。登録完了後に認証させる手順が表示されます。手順はngrokをダウンロードして解凍し、直接実行ファイルを指定する内容になっているけど、今回はインストール済みでパスも通っているので若干異なります。コマンド1行だけです。ngrok」にコマンドが記載されているのでそちらから。Authtokenとして記載されています。(Authtoken)実行すると自動的に設定ファイル「ngrok.yml」にauthtokenが書き込まれ、プロセス起動時にこれを利用して認証されるよう。手動で書いてもいいとは思うけど。今回は実行ユーザーのホームディレクトリ配下に隠しディレクトリ「.ngrok2」が作成され、その中にファイルが作成されていました。authtokenが書かれた「ngrok.yml」が用意された後、再度ngrokを一度コンソール上で起動。アカウント登録時に入力したユーザー名が表示される。Expires」が消え、代わりに「Account」情報が表示されるように。これで期限は消えたって事でいいんだろうか。(変わってなければ8時間で分かると思うけど。Onlineが確認できます。Miniで家電を操作。おまけ.AndroidとeRemoteで赤外線信号コード取得。Android/Google.というわけでおまけ編です。RJ-3」で赤外線信号コード取得する方法です。Android端末が必須になります。Bridge」をインストールします。アプリ起動したところ。Stoppedの部分をタップでサーバが起動します。URLが表示されているので控えておきます。右上の「...」からSettingsを開くと、自動起動やポート番号の変更、認証の設定もできます。信号取得時しか使わないものになんてちゃんとした設定項目。Learning」にアクセスします。Devices」を選択します。Device」デバイスが表示されるはずです。Code」を選択します。eRemoteの学習ランプが点くかと思いますので、学習したいリモコンボタンを押して信号を飛ばします。Result」が現れてコード関係が表示されます。Command」中の「"data":"xxxxxxx"」部分のxxxxxxxが赤外線信号コードになります。Code」を押せばまた続けて学習できるので必要なコードを回収していきます。Miniで家電を操作。AssistantをIFTTT連携させて音声操作。Mini連携は同様にできます。使ってみていますが、改めてライトのオンオフだけでも十分便利でもう手放せないかも。他にも天気聞いたり時間を聞いたりとスマホでもできるけどとっさに声だけで欲しい情報が聞けるのはいいですね。Google」の発言が若干面倒なので使えるキーワードはご検討頂きたいですね。Miniで家電を操作。AssistantをIFTTT連携させて音声操作。Miniで家電を操作。パート1」に続いて、パート2です。RJ-3」を使って家電を操作させます。Assistantと連携させます。IFTTT]→[eRemote]のようになります。IFTTT」を導入します。IFTTTをGithubから導入する為、rootユーザーでgitパッケージをインストールします。IFTTT用のディレクトリを作成、移動します。.broadlinkrm-iftttGithubからモジュールをインストールします。git+https://github.com/jor3l/broadlinkrm-ifttt.gitこの時、npmが古いと怒られる場合があります。その場合はnpmのアップデートを実施します。v5.6.0になっていれば問題ありません。-v5.6.0本体があるディレクトリへ移動します。node_modules/BroadLinkServer/一度、正常に起動するか試しておきます。停止するにはCtrl+Cで。runningの行で待ち受けのポートが確認できます。http://localhost:1880この待ち受けポートを変更するには「server.js」を編集します。PORT」行を変更します。次にコマンドを編集します。前回で取得した赤外線信号もここで使用します。[{」移行がコマンドリストになります。サンプルで色々記載されているので不要なものを削除したうえで記載します。1セットは以下の構成になります。複数コマンドを記載していくには",(カンマ)"で続けます。・ここまでできたら準備は完了です。IFTTTバックグラウンド起動Homebridge同様に、foreverでバックグラウンド起動させます。こっちはちょっとやっかいです。モジュール本体があるディレクトリに移動しておく必要があります。start」を打つのみになります。この場合、foreverに「-c」オプションでコマンドとして渡して上げる必要があります。最後に「./」をつけるのがポイントになります。listで起動しているか確認を。続いてngrokを導入します。ngrokは固定IPアドレスやドメインを用意しなくても簡単に外部公開を行えるサーバモジュールです。簡単に公開はできますが、欠点ももちろんあります。ngrok側のサーバと常時セッションを貼って、外部からのリクエストはngrok側のサーバで受けてセッションを受け取る仕組みになります。セキュリティ対策が取りづらくなります。ngrok自体は無償で利用できますが、無償プランだと機能がかなり制限され、特に公開用のURLがランダムになり、ngrok起動の度に変わるのでここは特に面倒かも。有償プランに入れば固定URLも使えるようにはなりますが・・・。無償プラン前提で進めていきます。ngrokのインストール。ngrokインストールできたらngrokを起動します。IFTTTで設定したポート番号を入力します。これで正常に起動できれば画面上にURLが表示されます。xxxx起動時に使用する地域を設定する事も可能です。Pacific)になります。地域を指定すると、URLも変わり、この場合サブドメインに「ap」がつきます。xxxxngrokバックグラウンド起動ngrokもバックグラウンドで起動を行います。こっちは更にやっかいで、なかなかうまくいきませんでした。その理由の1つが、foreverが使えなかった事。foreverはあくまでnodeで起動するものにしか使えず、ngrokはnpmでインストールしているにも関わらず、起動時にはnodeを使用していないのが原因でした。Linuxの標準的な方法(&付ける)でバックグラウンド起動を試みたのですが、なかなかうまくいかず、試行錯誤した結果が以下の方法になります。ポイントはどこでもいいけど適当なファイルにリダイレクトを挟む事でした。細かい理由は分かりませんが・・・まあ、これでバックグラウンドで動いてくれます。&で、バックグラウンドで起動すると払い出されたURLが分からないのですが、curlコマンドでローカルホストに接続して調べる事が可能です。ngrok.ioこれでも文字列が大量に出力されるので、更に手を加えてこれで最終行にURLだけが表示されます。-f1ここまできたらサーバ側の準備は完了です。最後にIFTTTのアプレットを作成します。アカウント作成が必要なのでまずは作成しておきます。Applet」を選択します。Applet」画面が開くので、「+this」の部分を選択します。Assistant」を選択します。Homeで使用しているアカウントでログインします。phrase」を選択します。トリガー作成画面になるので、以下のように設定していきます。Google!」の後、呼びかける命令になります。Homeが正式にサポートしている機器への命令としてデフォルトで登録されていて使えないというか、そっちを実行しようとしてしまうので注意が必要です。(optional)」は上の命令以外に呼びかけ方を必要に応じて入力します。例では漢字で入れた命令を念の為、ひらがなでも入れています。(optional)」は更に他に命令内容があれば入力します。Homeに喋らせたい内容を入力します。何も入れないとデフォルトの「OK、アクションを実行します。「Language」はそのまんま、言語の指定ですので日本語の場合は「Japanese」で。trigger」を選択します。Applet」画面に戻るので、続いて「+that」の部分を選択します。services」に「Web」を入力して「Webhooks」を選択します。request」を選択します。アクション作成画面になるので、以下のように設定していきます。IFTTTで設定したcommand名)」の形式で入力します。httpでもhttpsでもOKです。xxxxxxxxはngrokのURL、.apは起動時に指定していたら入力します。IFTTTで設定したcommand名を入力します。「Method」は「POST」を選択します。(optional)」は「application/json」を選択します。(optional)」は「{"secret":"xxxxxxx"}」を入力します。IFTTTで設定したsecretです。action」を選択します。runs」でアプレット実行時に通知を行うかの指定をします。通知をオンにしていると、スマホにIFTTTアプリを入れている場合等には実行される度にプッシュ通知が届きますが、実行の度に通知がされるので切っておいた方がいいかなと。設定できたら「Finish」を選択します。ここまでの全ての設定は後からでも変えれます。Homeに喋りかけて家電の操作ができるはずです。IFTTT」の「commands.js」への定義の記載と、IFTTTのアプレット作成を行います。ngrokを無償利用の場合は前述の通り、起動の度にURLが変わるので、その都度IFTTTのアプレットのURLを書き換えてやる必要があるのでお忘れなく。Androidしかない環境でも取得する方法とかはおまけとして別途時間ができたら書きます。Mini購入当初の目的は果たせました。2台も買ってしまったのは血迷ったから、ではなく、ベッドから届く範囲と、玄関に設置して就寝時や帰宅時に手が塞がっていても簡単に電気のオン/オフが出来るってもんです。Miniで家電を操作。Miniでスマートスピーカーデビューしたわけですが。)使い道を見出すのにやりたい事としてはやっぱり、声で家電操作したいに行き着いたわけで。いえ、大掛かりなスマートホーム構築まではしたくない。それでも割とお値段は張ります。Google」から操作させようと。Homeには未対応となります。AlexaもLinkJapanがリリースしているコントロールアプリ「eHome」が必要になるのですが、現状では対応しているのが今年に入ってからの出荷ロットにのみ適用できるファームウェアのみ。(古いファームは「e-Control」アプリにしか対応していない。)我が家のはホント出たてでモニター価格で売られてた時に買ったものなのでどの道、正規の方法では使えません。サーバーを用意して、IFTTT連携で操作する環境構築をやっちゃおうと。いう事で試行錯誤していました。ハマって時間がかかっちゃったんですが。ネットでは結構同じような事やってる人多いですが、前提条件が分かってて当然だよね的に書かれていなかったり不親切な記事が多すぎて手探りでやるしかなかったので。最終的にはインターネット側から命令が飛ぶ事もあって、LAN内とは切り離した方が安全かなーとサーバーをDMZに置こうしたのが間違いでした。ファイアウォールで最低限ポート開けとけばいいかとか思ってたけど、どうもマルチキャストで通信してるっぽく、この後の実装した方法ではどうやっても拾えませんでした。NAT入れたり、マルチキャストルート書いてみたり色々やりすぎてよく分からない状態になってしまったので諦めてLAN内に置くことで落ち着いています。前置きが長くなりましたが、はじめていきます。言いつつ、赤外線信号の取得がてら、まずはiOSのHomeKitに対応させてSiriから操作させてみました。Piで実装しているのがほとんどでしたが、VM上にCentOS7でサーバ立てて実装しています。今回導入するモジュール類がNode.js環境で動くものという事でまずはその環境構築です。Node.jsなんて触った事もなかったのでここから四苦八苦でした。Node.jsを単体で導入してもいいんですが、バージョン管理が簡単に出来るnodebrewと言うのを入れてそこからNode.jsを導入します。これは完全に好みです。今後、他に色々したくなった時にあった方がいいかなー程度の考えでうちでは入れました。必要なパッケージ類をインストール。他にmakeが必要です。gcc-c++Node.js動かす用にユーザー作成。既存のユーザーでもOKです。xxxxxxx作ったユーザーにスイッチします。xxxxxxxnodebrewのインストール。正常にインストールされたら以下のようにメッセージが続きます。PATH=$HOME/.nodebrew/current/bin:$PATH========================================メッセージ内にパスをexportするように書かれているので実施します。これでnode系コマンドにパスが通ります。PATH=$HOME/.nodebrew/current/bin:$PATHとは言っても、exportコマンドはログオフすれば消えてしまうのでログイン時にパスが通るように「.bash_profile」にも買いておきます。.bash_profile最後尾に追記。PATH=$HOME/.nodebrew/current/bin:$PATHインストール可能なnodeバージョンの確認。nodeのバージョンはメンテナンスバージョン(3オクテット目)が偶数が安定バージョン、奇数が開発バージョンとなるようです。ls-remotenodeをインストールします。うちではv8の一番新しい安定版にしています。successfully使用するnodeバージョンを指定します。1つしかインストールしてなくてもここは必須です。v8.9.2nodeのバージョン確認。Modules)のバージョン確認。-v5.5.1これでNode.js環境の準備は完了です。Homebridgeの導入iOSのHomeKitとなるサーバモジュールであるHomebridgeを導入します。rootユーザーに戻って必要なパッケージを追加します。CentOS7では以下が必要。avahi-compat-libdns_sd-develインストールできたらnode用ユーザーに再度スイッチし、npmでhomebridgeをインストールします。homebridgeインストールが無事できたら一度homebridgeを起動してみます。これでホームディレクトリに「.homebridge」ディレクトリが作成されるはずです。homebridgeコンソールに色々と表示されたらCtrl+Cで抜けます。続いてeRemote用のモジュールを導入します。homebridge-broadlink-rmインストールできたらeRemoteのMACアドレスを調べます。分かっている場合は不要です。homebridge-broadlink-rmに同梱されているgetDevice.jsを使用します。(aa:aa:aa:aa:aa:aa)homebridge用のコンフィグを作成します。config.jsonコンフィグサンプルです。nameはHomeKit上に表示されるのでお好みで。usernameは先程取得したMACアドレスを。アルファベットは大文字で。portはデフォルトでいいかと。pinはiOSのHomeアプリに登録する時に使うものなのでお好みで3-2-3桁で記載します。accessories内のnameは呼びかける時に使うデバイス名等になります。typeのswitchはオン/オフのみを定義するタイプの指定になります。on/offにはこの後赤外線信号を取得して記載するので、ここでは空でOKです。]}作成できたら改めてhomebridgeを起動します。homebridgeコンソールにQRコードが表示されるのでiPhoneで「ホーム」アプリを起動して読み込み、アクセサリとして登録します。各項目はデフォルトでOKですが、「よく使う項目に含める」はお好みでオフに。ホームタブの「よく使うアクセサリ」欄に載せるかどうかになります。Frequency」は基本的に普段は使わないですし。Frequency」は使い道がそもそも分かってない。)とは言いつつ、赤外線信号を取得する為にその「Learn」を使います。「Learn」をタップしてオンにするとeRemote側のランプが光るので、eRemoteに向かって調べたいリモコンのキーを押します。code:」に続いて数字とアルファベットの組み合わせの長い文字羅列が表示されるのでそれを記録しておきます。""」にその取得したコードを記述します。オン/オフが同一ボタンの場合は両方に同じコードを記述します。記述したらhomebridgeを起動し直せばオン/オフが操作できるようになっているかと思います。○○○(accessories内のname)をオン」とか呼びかけると声でも操作できると思います。注意点は、iOSのHomeKitは対象のデバイスに対して最後に出した命令を覚えていて、同一命令を連続で処理してくれません。オン/オフが同一コードのボタンを操作する場合でも、オンを2回言ってもそもそも命令を飛ばしてくれません。問題になるのは別のリモコンで操作したないようは当たり前ですが知っていないので、HomeKit上のステータスとずれが生じる場合もあり割と面倒です。(あくまでSiriで音声操作する場合で、ホームアプリ上のボタンから操作する場合はそこまで気にする事ではないですが。)まあ、これで一旦は目的は達成です。Homebridgeバックグラウンド起動が、このままだとhomebridgeがフロントで動作していて、コンソールが占拠されています。バックグラウンドで動作させるようにします。バックグラウンド動作にはforeverを使用します。foreverの導入。foreverインストールできたらforeverでhomebridgeを起動します。~/.nodebrew/current/bin/homebridgeこれで起動すればバックグラウンドで動作するので、プロンプトも返ってきます。動作しているかを確認するにはlistオプションで確認します。listインストールできたらforeverでhomebridgeを起動します。ididはlistオプションで表示されるidで、psコマンドで表示されるpidと同一になります。注意点は、foreverで起動した場合は内部の認識が変わるからか、「ホーム」アプリで再登録する必要があります。バックグラウンド起動した事によってQRコードが画面上に出てこないですが、「config.json」に記述したpinを使えば楽に登録しなおせます。後からリモコン学習したい時でもコードがコンソールに表示されなくなるのですが、listオプションで確認した際に使用しているログファイル「.forever/xxxx.log」が記載されているので、そのファイルを確認すれば対象のコンソールログ等が全て記録されています。(QRコードもここで確認する事も可能です。Miniで操作を実装したいと思います。今回の方法はiOS環境でしかコード取得できないので、Androidしかない環境でも取得する方法も書こうかなと。miniがクラウドファンディングに。mini」が登場していました。」がお試し価格で売られてた時に買って以来愛用しているのですごく気になりました。eRemote-3と比べると幅が小さくなって背が高くなってるようです。■続きを読む■まあ、結局今回は見送ったんですが。b/g)のみだったので。サイズ以外変化点も見られないし、できれば5GHz帯だけにしていきたいので乗り換えるメリットはそうないなと。そもそもeRemote-3自体、不満はないし。360度赤外線を飛ばせる設計になってるので部屋内どこにでも届くし、簡易ながら室温も見れるし、外からスマホを使っての操作も問題なくできているし。使うともっと正確に温度とか計れてeRemoteと連動できるらしいです。)スマートリモコンはないと困るってわけではないけど、あるとふとした時に便利ですよ。