鯨飲馬食

いろいろつまみ食いで勉強したことのメモ書き

Nature Remoで遊んでみた

スマートリモコン Nature Remo を1月末に入手して、使わないまま放置していたのを、少し前から遊びはじめました。

セットアップ

届いたので早速 iPhone アプリを使ってセットアップしようとしたのですが、WiFiルーターを選択したあと、「Remoをタッチ!」の画面から進まない問題が出ました。

nature.global

の通りにやっても進まないので、サポートに問い合わせて何度かやりとりをした結果、WiFi パスワードを16進64桁にしてたのが制限事項に引っかかっているらしいとわかったのですが、パスワード変えると他の端末それぞれの設定をしなおして回らないといけないので面倒だなと思ってしばらく放置していました。

その後腰が重いまま日が過ぎていたのですが、奥さんが新しいタブレットを買ったのでセットアップしてーと言われて、端末増えたら余計に面倒になってくるのでついでにやってしまえと思いパスワード変更したら、Remo の設定も無事に成功するようになりました。

Amazon Echo連携

Echo Dot を持っているので連携させようとスキルを検索すると2つ出てきて、最初スマートホームスキルを有効にしたのですが、

av.watch.impress.co.jp

にあるようにテレビは電源オンオフしかできないとわかり、次にカスタムスキルを使って連携させました。カスタムスキルの方でも最初、電源のオンオフはできるのに、チャンネル変えたりができないので何でかなーと思ったところで

nature.global

を見つけて、「以下の通りボタンを設定していただく必要がございます(名称は、自由に登録していただいて構いません。追加で登録されているものがあっても問題ありません)」のところの画像の通りの「アイコン」でリモコンボタンを登録していたところ、それっぽく動くようになりました。

APIを使って存在しないボタンを登録

家のテレビはSONYのものなのですが、電源をトグルじゃなく切り替えたいなと思いました。手元のリモコンにはトグルの電源ボタンしかないものの、以下の記事を見つけて、0x2e, 0x2f を送信できればいけそうなので試してみようと思いました。

d.hatena.ne.jp

Nature Remo は API での制御が可能とのことなので仕様書を眺めていると、Cloud API のほうの /1/appliances/{appliance}/signals に POST すると登録できそうです。 /1/appliances を GET して得られた id を使って /1/appliances/{appliances}/signals を GET すると登録したボタンは一覧できたのですが、そのエンドポイントに POST する際の message に何を設定すればいいのかでまた少し悩みました。結局、 Local API の /messages を GET すると受信した信号のデータは取れるのがわかったので、それをそのまま登録してみて、うまく動くのを確認しました。次はこのデータをいじってリモコンで出せない信号を出すにはどうするかを考えました。

SONYの赤外線リモコンの信号のフォーマットは 赤外線学習リモコンの信号定義データの合成/ソニーフォーマット編 — 赤外線学習リモコンの信号データ合成 1.1 ドキュメント で解説されていて、 T = 600us の整数倍の配列でデータが表現されていると理解したので、 Local API で取得した電源トグルボタンのデータの配列の各要素を 600 の倍数に丸めてやって、説明通りの形式(実際にはリーダー+データ+トレーラーが何度か繰り返されている)のを確認し、またそれを Cloud API で登録して iPhone のアプリから期待通りに操作できるのを確認しました。あとはそれを 0x2e, 0x2f を表現するデータに書き換えて登録し、トグルじゃなく何度叩いても電源オン、何度叩いても電源オフが実現できました。

信号データを生成する

手でデータを作るのは飽きてきたので、ユーティリティを作りつつ、手元にあるPanasonicのレコーダーのリモコンのデータも生成できるようにしました。 Local APIで信号送信して効くか見ながらやっていたのですが、 Local API の /messages への POST では 1024 バイトを超えるデータを送信すると 400 エラーになっていて、エラー処理してなかったのでしばらくそれを知らずにうまく動かんなーと悩んでました*1。エラー処理は後ほど足しておきます。*2

github.com

感想

バイナリデータから意味を読み解くのは楽しい。

*1:切り分けのため curl で送信したらエラーになってるのに気づいた

*2:curl で 1024 バイトを超えるデータを送信すると Expect: 100-continue が付くけど、それを Remo が処理できずに 400 エラーを返しているようでした。python の requests を使ったときにはそれは踏んでなかったので、うまく動作してなかったのはたまたま別の問題が起きていたのかも