肉汁爆弾

いろいろメモっていきます

Nature Remoでシーケンス処理ができるようにして、google homeと連携した。


IoTデバイスたちはとても優秀

Nature Remo 使ってますか。めちゃくちゃ便利ですよ。僕の中で2018年買ってよかった家電で堂々の一位です。
ちなみにウチにあるIoTなデバイス
google home
google home audio
・ Nature Remo
・ fire tv stick
chrome cast
という感じです。Alexaちゃんも持ってたけれど、やっぱり2台は要らないということで実家送りです。
この辺の使い倒しっぷりについてもそのうち書きたいところですね。

Nature Remoって何?

赤外線をしゃべるデバイスです。
センサーがいくつもついているのでルールを決めて、トリガーすることもできます。最近は複数の赤外線の命令を同時に発行する「シーン再生」という機能もリリースされました。

Nature Remo の死角

ただ、シーケンス処理がサポートされていないのです。
テレビって電源を入れてからチャンネル変更を受け付けるまでラグがあるじゃないですか。
あのラグをいい感じにsleepして、順番に命令を実行してほしい...
僕は夜いろんなテレビを見てからテレビを消して寝るんですけど、朝起きたら日テレ入れておいてほしいんですよね。スッキリが見たいので。

Nature Remo の APIを駆使して実現する

ということで作りました。作ったというか、色んな人が作ってくれたものを組み合わせたというのが正しいかもしれません。。今回は google home に話しかけたら Nature Remo がシーケンス処理を行ってくれるところまでです。
ざっくりと流れだけお話すると、google homeがiftttと連携し、webhookでアウトプット(httpのリクエスト)してくれます。あとはこれを自分のサーバー上でエンドポイントとして受け取り、自分の持っているNature Remoに対して命令を送るだけです。
ちなみにifttt->自分のサーバー間での認証とかは全く行っていないので、URLがバレると自宅の家電がハックされる可能性があるので注意しましょうね。
まあ、多分シーケンシャルな処理は将来的に本家が対応してくれると思うので、それまでの短い寿命だと思いますが、お付き合いください!

Nature Remoに登録されている命令を取得するまで

このレポジトリを使います。
github.com

how to useに書きましたが、まずはaccess tokenを取得しましょう。ここです

f:id:sugaret:20190315004233p:plain
左下ですね

generate access tokenから取得したものを確保しておいてください。ページを離れるともう見れないようです。いくらでも新しく作れますけど。

goがインストールされてるマシンにcloneして、main.goのYOURTOKENの部分をさっきのtokenでreplaceしましょう。

f:id:sugaret:20190315003355p:plain
このへん
あとは

go get .
go run main.go

とかすればきっと動くはず。config.yamlが同じdirに出力されるはずです。これがあなたのNature Remoに登録されているsignal群ですね。

f:id:sugaret:20190315004326p:plain
こんなノリ

Nature Remoにいい感じに命令を飛ばす

さて、signal群のidがわかったらそれらを組み合わせた命令を作りましょう。ちなみに最終的にgoogle homeからhttpのGETリクエストが飛んで、それを受けてnature remoに命令を送るので、自分の持っているサーバー上でやってくださいね。持ってない人はlocalで雰囲気だけでも味わってみてください。
このレポジトリをcloneしてきて、main.goと同じdirectoryにさっき出力されたconfig.yamlをおいてください。
github.com

とりあえずレポジトリ内ではtestHandlerという処理が "/test"にアクセスされたときに実行されるようになっています。
エンドポイントの名前を変えたり増やしたり、処理内容をいじったりした遊んでください。
朝起きたときにスッキリ!がみたい場合は

{
	remoclient.SendSignal(commandhash["電気点灯"])
	remoclient.SendSignal(commandhash["テレビ電源"])
	sleepInterval()
	remoclient.SendSignal(commandhash["日テレ"])
}

みたいな、そんなノリです。intervalは適当に3秒にしてますが、各自の都合に合わせて適当に変更してください。
port番号もお好みに合わせて変えてください、firewallの設定漏れでアクセスできないとか注意しましょうね。

リクエストを受けて命令を実行してみる

満足行くまでいじったら

go get .
go run main .

です。あとはブラウザから適当にアクセスして、イケることを確認しましょう。

google home -> ifttt -> webhook につなぐ

iftttは神サービスです。いろんなトリガーからいろんなアクションを実行してくれます。google homeを使っていろいろやってる人はご存知だと思いますが。詳しい設定を書くと非常に長くなるので、細かいのは調べてください..
トリガーは google assistantですね。適当にフレーズを決めて設定します。
アクションはweb hookを選びましょう。GETでbodyは適当でよいです。よく考えたらこの辺の内容で認証すればURLがバレても実行しないとかいろいろできますね。書いてて気づいた。

google home に話しかけて試す。

ok google, おはよう!で電気がついてテレビが付いて、一呼吸おいて日テレに変わったらOKですね。これで毎朝ちゃんと加藤浩次が映ります。

残っていること

エアコンのsignal周りに対応してないです。iftttが1トリガーから複数actionもできるので、webhookを叩きつつnature remo自身も実行する.. 的なことをすれば実現できます。普通にやろうとすると駄目です。解説するには非常に長くなるので省略します。ググってください。

謝辞

papixさんが作ってくださったrepositoryが 非常に役立ちました!今回の修正もpull-requestを送っておいたので、そのうちmergeされるかもしれません。このレポジトリ自体、非常にシンプルで読みやすく書かれていて、golangはなんて書きやすくて読みやすいんだと素晴らしさを感じる日々です。
https://github.com/papix/go-nature-remo

おわりに

golang 1年生なのでこれからもがんばります。今年のISUCONではgolangが普通に使えるようになるんだ...