LoupeDeck でスマート家電を操作する
Twitter で はっしゅTeacher さんから LoupeDeck で Nature Remo の使い方について質問をいただきました。
※ 解決された旨の返信もいただきました。ご連絡ありがとうございました!
そこで、以下の記事で紹介している Nature Remo のローカル API の取り扱い方法について詳しくご説明したいと思います。
家電操作に必要な機器
「アレクサ、電気を消して。」とか、「オッケーGoogle、エアコンつけて。」などの呪文でスマート家電を操作するには「アレクサ対応家電」か、そうではない赤外線リモコンで操作するタイプの家電だと、NatureRemo や Switchbot といった赤外線が送信できるスマートリモコンを使って操作します。
「アレクサ対応家電」は操作する家電自体が WiFi に繋がって、インターネット経由で操作を受け付けるので、ネイティブに操作ができます。
赤外線リモコンの場合、リモコンが送信している赤外線と同じデータを送りつける形なので、基本的にリモコン操作以上のことはできません。
この記事でご紹介するのは、アレクサ対応家電ではない、赤外線リモコンで操作するタイプの家電と、Nature Remo の組み合わせで操作する方法です。
クラウド経由とローカル API
Nature Remo はローカル API 操作に対応しています。
「アレクサ、電気を消して。」の場合は、クラウド経由で呼ばれるのでタイムラグがありますが、ローカル API の場合は直接スマートリモコンに送信したい赤外線の情報を送るのでレスポンスが早いのが特徴です。
curl コマンドについて
cURL (カール) と読みます。
{}
↑ の記号が由来だそうです。この記号、日本では中かっこ、中かっこ閉じですが、Curly brackets と呼ぶそうです。
普段、GUI 経由でブラウザから Web サイトにアクセスしていますが、curl を使うと、CUI 経由でリクエストを送り、レスポンスを受け取ることができます。
試しに Google にアクセスしてみます。ターミナルを開き、
以下コマンドを投入します。
curl https://google.co.jp
すると、www.google.co.jp に移動したよ。とレスポンスがあります。
Nature Remo に cURL する
上記手順を踏まえ、Nature Remo にリクエストを送信してみます。コマンドは以下の通りです。XXXXXX の部分には、ホスト名を入力する必要があります。
curl http://Remo-XXXXXX.local/messages -H "X-Requested-With: local"
ホスト名の調べ方は Nature Remo Local API の Swagger に記載されているのですが、前提知識がないと理解しづらいところかと思います。
一つずつ解説していきます。
Nature Remo のホスト名
ターミナルに以下コマンドを投入します。
% dns-sd -B _remo._tcp
すると、以下のようなレスポンスが返りますので、Instance Name というカラムを見つけてください。(我が家は Nature Remo 3 と Nature Remo 2 があるので、二つ表示されています。)
Browsing for _remo._tcp
DATE: ---Tue 23 May 2023---
7:53:01.634 ...STARTING...
Timestamp A/R Flags if Domain Service Type Instance Name
7:53:01.635 Add 2 17 local. _remo._tcp. Remo-XXXXXX
7:53:01.889 Add 2 17 local. _remo._tcp. Remo-YYYYYY
Nature Remo に cURL する
ホスト名が分かったので、cURL してみてください。Nature Remo アプリケーションなどは使わず、Nature Remo に向けて赤外線を飛ばします。
青く光ったら OK です。受信した赤外線データが本体に残ります。
以下コマンドを投入します。
curl http://Remo-XXXXXX.local/messages -H "X-Requested-With: local"
本体に直前の赤外線データが保存されていたら、以下のようなレスポンスが返ります。めっちゃ長いです。このレスポンスを送信すると、Nature Remo から赤外線が送信されて、家電を操作できます。
% curl http://Remo-XXXXXX.local/messages -H "X-Requested-With: local"
{"format":"us","freq":37,"data":[3430,1800,385...486]}
%
GET と POST
これまで操作してきた、cURL は全部 GET メソッドでした。GET はざっくり書くとリクエストを取得するための機能で、データを送りつけるには POST を使います。
以下のコマンドを使います。コマンドは非常に長いので、VSCode などのエディタを利用されることをお勧めします。Word などを使うと、ダブルコーテーションが変換されたりするのでハマります。
% curl -XPOST http://XXX.XXX.XXX.XXX/messages -H \"X-Requested-With: local\" -d {\"format\":\"us\",\"freq\":3 ...
いかがでしたか?テレビは消えましたでしょうか?あるいは、電気はつきましたか?追加で、処理を早くするためにホスト名ではなく、プライベート IP アドレスでリクエストを送る方法をご紹介します。
Nature Remo のプライベート IP アドレス
プライベート IP アドレスの調べ方は、公式ヘルプセンターに紹介されていますしす。
% dns-sd -G v4 Remo-XXXXXX.local
以下、レスポンスがありますので、Address のカラムを探してください。プライベート IP アドレスが見つかります。
% dns-sd -G v4 Remo-XXXXXX.local
DATE: ---Tue 23 May 2023---
8:14:26.676 ...STARTING...
Timestamp A/R Flags IF Hostname Address TTL
8:14:26.804 Add 2 17 Remo-XXXXXX.local. XXX.XXX.XXX.XXX 120
^C
%
プライベート IP アドレスで POST 送信すると、名前解決にかかる時間が短縮されて早いです。
% curl -XPOST http://XXX.XXX.XXX.XXX/messages -H \"X-Requested-With: local\" -d {\"format\":\"us\",\"freq\":3 ...
AppleScript のコーディング
LoupeDesk は、Shell スクリプトが実装できないため、Apple Script で送信しています。僕は、以下の画像のとおり一つのフォルダーに AppleScript ファイルをまとめて保存しています。
以下は、シーリングファンを消すスクリプトです。
テキストでも貼っておきます。
set HOST_REMO to "XXX.XXX.XXX.XXX"
set REMO_SIGNAL to "'{\"format\":\"us\",\"freq\":38,\"data\":[757,906,...495,545]}'"
do shell script "curl -XPOST http://" & HOST_REMO & "/messages -H \"X-Requested-With: local\" -d " & REMO_SIGNAL
LoupeDeck の実装方法
長くなりましたが、最後に LoupeDeck の実装方法をご紹介します。
カスタム -> AppleScript を選択します。
任意の表示名をつけます。
上記の手順で作成した AppleScript を指定します。
[保存] ボタンをクリックして保存します。
ボタンに割り当てます。
うまく設定できましたでしょうか。
ここが分かりづらいといった箇所があれば、ご指摘ください。