NFCタグにスマホをかざして家電を操作できるようにしてみた

#はじめに
ここ最近、リモートで働くようになって家にいる時間が長くなってきました。少しでも面倒なことはなくしていきたいということで、NFCタグにスマホをかざすだけで家電を操作できるようにしました。ちょっと宣伝になってしまうのですが、少し前に[nature_remo_api](https://rubygems.org/gems/nature_remo_api)というgemを作ったので、そちらを使っていこうと思います。

#用意するもの
- iPhone
- NFCタグ（自分は[こちらのNFCタグ](https://www.amazon.co.jp/gp/product/B088HD9JQS/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)を購入しました。ただ、ちょっと反応が悪い気がする・・）
- Raspberry Pi
- Nature Remo

#全体の流れ
ざっくりですが、最終的な全体の構成は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/2833e700-f822-d27d-b4bf-45790a7f502b.png)

#事前準備
後々使用するため、先に以下の2点を済ませておくとスムーズに進められると思います。

- [Nature Remo公式のアプリ](https://apps.apple.com/jp/app/nature-remo/id1193531669)で家電やNFCタグに設定したい操作を登録
- Nature RemoのAPIを使用するため、[こちら](https://developer.nature.global/)からアクセストークンを取得

#Raspberry Piのセットアップ
まずはRaspberry Piのセットアップからです。

##Raspberry Pi に SSH できるようにする
このあとオートメーションの中で Raspberry Pi に SSH して Ruby のコードを実行するため、まずはRaspberry Piに SSH できるようにします。

###Raspberry PiのIPアドレスを取得する

```bash
arp -a | grep raspberry-pi-home.lan
```

###Raspberry PiにSSHする

取得したIPアドレスを指定してSSHします。

```bash
ssh pi@<上記で取得したIPアドレスを入れる>
```

実行するとパスワードを求められると思うので、入力します。
Raspberry PiにSSHした画面がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/91607292-126d-1e6a-8339-1d181f9540ea.png)

#Raspberry Piで nature_remo_api を使えるようにする
まずは作業用のディレクトリを作成 & 作成したディレクトリに移動します。
ここでは`ios_automation`というディレクトリ名にしておきます。

```bash
mkdir ios_automation
cd ios_automation
```

##Rubyのセットアップ
次にRubyのセットアップをしていきます。
既にRuby 3.0.0が動く環境になっている場合は[nature_remo_apiをインストールする](https://qiita.com/k_2929/items/c8988acb33ea393a0b35#nature_remo_api%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)に進んでください。

###rbenvをインストール

```bash
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

###.bashrcにrbenvの設定を追加

```bash:.bashrc
PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

###.bashrcを読み込む

```bash
source ~/.bashrc
```

###ruby-buildをインストール

```bash
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

###rbenv経由でRubyをインストール & 設定
このあと、Rubyのコードを書く際、`Ruby 3.0がインストールされていることを前提`として進めていくので、バージョンを合わせておくとスムーズに進められると思います。

####リストに表示されていることを確認。

```bash
rbenv install --list-all | grep 3.0.0
```

<details><summary>リストに表示されなかった場合</summary><div>
rbenvとruby-buildを更新します。

rbenvを更新

```bash
cd ~/.rbenv
git pull
```

ruby-buildを更新

```bash
cd ~/.rbenv/plugins/ruby-build
git pull
```

---

</div>
</details>


####Ruby 3.0.0をインストール

```bash
rbenv install 3.0.0
```

####現在いるディレクトリのRubyのバージョンを指定

```bash
rbenv local 3.0.0
```

##nature_remo_apiをインストールする

```bash
gem install nature_remo_api
```

##Nature Remoのアクセストークンを環境変数に設定する

[こちら](https://developer.nature.global/)で取得したアクセストークンを環境変数に設定します。

```bash:bashrc
# Nature RemoのAPIKEY
export NATURE_REMO_ACCESS_TOKEN='<取得したアクセストークン>'
```

上記を設定したあと、反映させるために`source ~/.bashrc`を実行しておきます。

##操作したい家電の赤外線を取得

nature_remo_apiのセットアップが終わったので、ここからはコンソール上で操作したい家電の赤外線を取得していきます。

まずは`irb`を実行してRubyのREPLを立ち上げてください。
細かいコードの説明は省きますが、まずは以下のコードでAPIを叩けるようにします。

```irb
require('nature_remo_api')

NatureRemoApi::Client.configure{|config| config.access_token = ENV['NATURE_REMO_ACCESS_TOKEN']}
client = NatureRemoApi::Client.new
```

次に登録してある家電を取得します。
取得できたハッシュのキーが家電のIDになります。

```irb
client.appliances.to_h{[_1.id, _1.nickname]}
```

操作したい家電が見つかれば、`appliance_id`に入れておきましょう。

```irb
appliance_id = <家電のID>
```


次に対象の家電で登録している操作（赤外線）を取得します。
取得できたハッシュのキーが家電に対する操作のIDになります。

```irb
client.signals(appliance_id: appliance_id).to_h{[_1.id, _1.name]}
```

NFCタグに登録したい操作が見つかれば、`signal_id`に入れておきます。

```irb
signal_id = <家電に対する操作のID>
```


次にNature Remo経由で実際に家電を操作してみます。

```irb
client.send_signal(signal_id: signal_id)
```

上手くいけば登録しておいた家電に対する操作が実行されるはずです。
操作のID（上記で`signal_id`として扱っていたもの）は、このあと使用するためメモしておいてください。

ここからは家電を操作するための簡易的なスクリプトを作成していきます。
（ファイル名は適宜変えてください）

```ruby:hoge.rb
require('nature_remo_api')

NatureRemoApi::Client.configure{|config| config.access_token = ENV['NATURE_REMO_ACCESS_TOKEN']}
client = NatureRemoApi::Client.new

client.send_signal(signal_id: '<先ほど取得した操作のID>')
```

念のため、スクリプトを実行してみましょう。

```bash
ruby ~/ios_automation/hoge.rb
```

登録しておいた操作が実行されれば、Raspberry Pi側の準備は完了です。
上記のコマンドは後ほど使用するためメモしておいてください。

#オートメーションを作成する
次に「ショートカット」にあるオートメーションを作成し、先ほど作成したRubyのスクリプトを実行できるようにしていきます。

オートメーション作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/a3bc2667-6b2d-61ed-bac7-5cb91f8f53e4.png" width=50%>

「個人用オートメーションを作成」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/768ad104-e297-739c-6bf8-2e32781daa14.png" width=50%>

「NFC」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/891391fc-7cd3-d703-7a62-e7e756c7e8cf.png" width=50%>

「NFCタグ スキャン」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/20017040-d290-1bbd-d8cf-947c68989b84.png" width=50%>

この画面が表示されたら、NFCタグにスマホをかざします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/7654e548-e7c2-3024-aaf5-97b4767589b2.png" width=50%>

読み取りに成功すると、このような画面が表示されるので、任意の名前を設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/ddc142ad-c4a7-7a03-cd5c-05819d971fc8.png" width=50%>

名前を設定したら「次へ」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/dd1a7264-7b45-312d-bb8d-2ab3cd603c9b.png" width=50%>

「アクションを追加」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/aeb3ec62-4c49-f157-a50e-482ab4f8eb1f.png" width=50%>

検索窓に「ssh」と入力し、「SSH経由でスクリプトを実行」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/3596c73c-f044-6913-bdd6-f56ae48e7859.png" width=50%>

赤枠の部分を埋めていきます。入力の欄には動作確認で使用したコマンドを入力したあと、「次へ」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/3ed175af-d605-c6df-21c6-7aae46af838a.png" width=50%>

「完了」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201112/e815e5d1-2c56-cbe6-ff1e-6717ebbc5d53.png" width=50%>

以上で設定は終わりです。
試しにNFCタグにスマホをかざしてみましょう。
家電の操作を実行できれば成功です！

#終わりに
今回はNFCタグを使って、家電を簡単に操作できるようにしました。今回使用したNFCタグはちょっと反応が悪いなーと感じたので、おすすめのNFCタグがあれば教えていただけると嬉しいです！今後もどんどん改善しながら楽していこうと思います・・！