enebularを使いラズパイ赤外線リモコンをSiriからMQTTで起動する

去年のアドベントカレンダーに続き、２年目の参加となりました。お誘いいただき光栄至極に存じます。2018の記事はこちら→「[enebularで社畜感あふれるAlexaスキルを作った話](https://qiita.com/sitopp/items/c6b3e177a409a3be0791)」

本日は、[enebular developer Meetup 11/28](https://enebular.connpass.com/event/152742/) でLTをさせていただいた「[外出先から尻で暖房をつける](https://docs.google.com/presentation/d/1OQm0UZID2lUKRBGNkWQJtA6aX35O-3q-sigUmQvB46Q/edit?usp=sharing)」の詳細説明をします。


（iOS 5での登場以来、日本人にとっては誤解しか招かなかった名前ですが、堂々と尻と書く人もまぁ見ない..）


# やりたい事

[おうちハック Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ouch-hack) 6日目に書いた記事、
「[Alexa Gadgets toolkitから自作スマートリモコンで家電操作](https://qiita.com/sitopp/items/f1db7ad639ca02f78c99)」で作った、ラズパイ格安赤外線リモコンを、Amazon Echoから室内Bluetoothで呼ぶだけでなく、外出先からSiriで呼び出してみようと思って作りました。
最近寒いので家に着く前に部屋の暖房をつけたいのですけれど、歩きスマホは危ないので、Hey Siriが妥協点です。
Siriショートカットは音声以外にiPhoneからタップしても起動するので、電車の中で暖房をつけたいときはタップすれば良いのです。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/11b41c89-1edb-2ca7-2055-fa6ee88f00c4.png)

なんでNature RemoやSwitch Botなどの市販のWifiスマートリモコンを使わず、こんな地味なものをDIYで作ったかというと、自分のライフログを自分で守りたいなーと思ったからです。
そこらへんのポエムは、いずれnoteとかにかこうと思います。


# 材料

部品、デバイス

- Raspberry Pi3
- 部品一式  [（こちらを参考に→格安スマートリモコンの作り方）](https://qiita.com/takjg/items/e6b8af53421be54b62c9)
- iPhone X (iOS13）

※Siriショートカットを使うには、iOS12以降が必要。


作業環境、クラウド

- Mac Book Air 11' (OS : High Sierra)
- VS Code
- enebular
- AWS IoT
- Heroku


# 手順


## 1. Raspberry Piで赤外線リモコンを作る

[こちらを参考に作成します。](https://qiita.com/sitopp/items/f1db7ad639ca02f78c99#1-raspberry-pi%E3%81%A7%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8B)



## 2. enebularでフロー作成

### siri_remocon_raspberrypi

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/45fecc61-3bdd-9a08-6fa2-edd4a1a0664e.png)

- [インポートURLはこちら。](https://enebular.com/discover/flow/e593a085-215c-44e0-a1ac-4057d1e7bbee)

- 紫色のところがMQTTのブロックなので、必ずMQTTのトピックスを自分専用のものに書き替えてください。
命名例）
request用の任意のtopic -> "hokuto/kenshiro/aircon/response"
response用の任意のtopic -> "hokuto/kenshiro/aircon/response"

- ローカルにおいたshのパスが独自の場合は、「AIR_ON」「AIR_OFF」両ブロックの**コマンド**を書き換えてください。

- AWS IoTのIAM発行、enebularと接続
enebular公式の解説サイトより、「[AWS IoTのConnection作成](https://docs.enebular.com/ja/deploy/deployflow/awsiot/MakeAWSIoTConnection.html)」を参考に。
例）Connection名：raspi3

- デプロイ
「export to other services」＞ 上で設定したAWSIoT用のConnectionを指定

ボタン1発でデプロイできるとか、神ですか！神に違いない。。(^o^)
 
### siri_remocon_weburl

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/530c49cc-298b-3d3f-8732-cb2d2cb98d44.png)

- [インポートURLはこちら。](https://enebular.com/discover/flow/193ec081-beee-4541-96ec-f2778cb7f527)

- 紫色のところがMQTTのブロックで、「request用の任意のtopic」の部分を"siri_remocon_raspberrypi"のMQTTブロックで宣言したものと同じトピックに置き換えてください。

- Herokuにログイン後、アプリを作成して、API Tokenを発行します。
例）アプリ名：siri-remocon 


- enebularからHerokuへのデプロイの設定をします。
enebular公式の解説サイトより、[Heroku へのデプロイ](https://docs.enebular.com/ja/deploy/deployflow/Heroku/)を参考に。
例） Connection名：heroku



## 3.Siriショートカットの作成

[公式の説明](https://support.apple.com/ja-jp/guide/shortcuts/apd84c576f8c/3.2/ios/13.2)もあるのですが、いまいちわからないので補足します。

- iPhoneに入っている「ショートカット」アプリを使います。
これ↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/4b4f3a86-4320-4c7c-821e-752ea6926577.png" width=100>

- マイショートカット＞右上の「＋」＞アクションを追加＞「Web」＞「URL」＞
と進むと、以下の編集画面が開くので、うっすら表示されてる「apple.com」の上を10回くらいタップすると編集できるようになるので、herokuにデプロイしたアプリのURLを記入する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/868fbdf5-e8f4-12ed-df62-e25bbabdb706.png" width=200>

- herokuにデプロイしたアプリのURLは、アプリ名との組み合わせで、以下のようになります。
例）アプリ名が「siri-remocon」の場合
「暖房をつけて」の場合：https://siri-remocon.herokuapp.com/on
「暖房を消して」の場合：https://siri-remocon.herokuapp.com/off
末尾の「/on」は、"siri_remocon_weburl"で指定した「[get]/on」と対応しています。

- 完成したところ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/02651029-65d1-b713-1236-10c9ce39c21b.png" width=200>

## 4. 動作確認

iPhoneに向かって、「Hey Siri、暖房つけて」と言い、暖房がつけばOKです。

参考動画：
1 https://www.youtube.com/watch?v=qWHrP2xVhiM
2 https://www.youtube.com/watch?v=J7ZFCvwmLLI


### トラブルシュート、MQTTを疑う
自分の場合、MQTTがうまく受け渡せなかったので、デバッグ用の簡易フローをenebularで作ってテストしました。

siri-remocon-mqtt-debug
インポートURL：https://enebular.com/discover/flow/1d02aa53-978b-402a-bf70-0d3171bcf41b

- 「request用の任意のtopic」の部分は自分の宣言したものに置き換えてください。
- デプロイはしなくてもこのままenebular上で動きます。
- 保存は、Command+Sをしたところ、いずこかに保存されました。（enebularのサーバーだと思われ）
  
- 使い方：

緑色の「msg.payload」と書かれたデバッグブロックの右のぴろぴろをクリックして引っ張り出しておき、右ペインのデバッグタブを開いておく。
「ON」ブロックの左のピロピロをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173392/b1be9949-911e-ae2b-e659-0d36ed26da12.png)

左側の3つがMQTTブローカーへのトピック送信、右側の2つはトピックを取得しにいきデバッグ表示するものです。

灰色の「ON」ブロックを押したらデバッグログのpayloadに「ON」が表示されたらOKです。
そもそもログが出ない時は、、、

- 左岸と右岸でトピックが一致してない
- mqttブローカーのサーバーが間違ってる
- ポートが違う

などの原因が考えられます。
自分の場合は、mqttブローカーのサーバーを「iot.eclipse.org」と記入していたため、接続できませんでした。調べたら今年の2月ごろ？に「mqtt.eclipse.org」に移転しちゃってたんですね。
参考：https://github.com/thomasnordquist/MQTT-Explorer/issues/74
今回公開しているフローのインポートURLは、全部新しいサーバー名に書き直してありますが、これも永久ではないと思いますので、動かなかったら適宜おググりくださいませ。。(^o^)



# 感想


今回は趣味のDIYでしたが、ハッカソンで時間が限られている時や、突然IoTのプロトタイプ開発を命じられた時、enebularが使えると、非常な武器になると思いました。

また、Raspberry PiにNode-redのコードをデプロイする際、enebularからAWS IoT Coreを経由させると、enebularのエディタ画面からボタン一発でデプロイできるところが超絶便利でした。
センサーを使うものは作っては壊しの試行錯誤が多いので、デプロイが楽なのはいいですね。。(*^^*)

以上です！
みなさま、来年も良いお年を！(^o^)