脱クラウドスマートリモコンを作ってみた。

# 背景

最近、AWS障害が起きたため、スマートホームを提供するサービスを含め、様々なサービスに影響がありました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">昨晩深夜からのNature Remoのシステム障害ですが、AWS（アマゾンウェブサービス）の障害に起因しており、現時点で一部改善はしておりますが、完全復旧までにはもう少し時間がかかる状況です。<br>ご不便をおかけて大変申し訳ございません。今しばらく復旧をお待ちいただけますと幸いです。</p>&mdash; Nature株式会社 (@NatureRemo_JP) <a href="https://twitter.com/NatureRemo_JP/status/1331720497965350913?ref_src=twsrc%5Etfw">November 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【AWSの異常のお知らせ】アマゾン ウェブ サービス（AWS）の異常によるデバイスの操作失敗で、一部のユーザー様が正常にサービスを使用できないことにご迷惑をおかけしまして誠に申し訳ございません。現在、AWSサポートチームと緊急修復中でございます。</p>&mdash; SwitchBot Japan（スイッチボット） (@SwitchBotJapan) <a href="https://twitter.com/SwitchBotJapan/status/1331617533460312065?ref_src=twsrc%5Etfw">November 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

外出先でも操作可能なようにクラウドに頼るのはいいですが、
サーバ障害が原因で在宅でも操作できない状態には少し疑問がありますね。
万一サービス終了でサーバが止まり、スマートデバイスが文鎮化するのも嫌です。
そこで、特定のクラウドサーバに頼らないスマートホームを作ってみました。

# Tasmota

脱クラウドスマートリモコンを作るには、[Tasmota](https://tasmota.github.io/docs/) という Arduino ESP8266 デバイス向けのIoTファームウエアを使います。Tasmotaを入れると、Wifi経由でデバイスの操作が可能になります。

# ハードウエアを用意

Tasmota はカスタムファームウエアであるため、デバイスの購入がし辛いです。
そこで、既存のデバイスのファームウエアを上書きするか、パーツを購入して自分で組み立てるかの2択しかないです。

### 既存デバイスのファームウエアを書き換える

一部中国メーカのスマートデバイスは、Tasmota ファームウエアに書き換えることができます。
ポイントは、「Smart Life」または 「TUYA」というアプリで操作するデバイスが対象です。
Amazon または AliExpress で「[スマートリモコン tuya](https://www.amazon.co.jp/s?k=スマートリモコン+tuya)」を検索すればすぐ出るので、探してみてください。

2000円弱で買えるし、見た目はDIYより全然綺麗なので、こちらの方がオススメです。
ただ、TUYAの新しいパッチが適用されていると、デバイスの書き換えができなくなるため注意が必要です。

ちなみに、こちらのスマートリモコンをAliExpressで買いました。
https://www.aliexpress.com/item/32986913713.html
![B1B8C47E-84D5-42F7-88C5-904DD4F8E867.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/4b038c03-fee2-0c67-3eed-33e78cb884f8.png)


Tasmota に書き換えるために [tuya-convert](https://github.com/ct-Open-Source/tuya-convert) を使います。
書き換えるデバイスリストは[こちら](https://templates.blakadder.com)をご参照ください。

### DIY

ESP8266 Node MCU と 赤外線受発信モジュールで実現できます。
パーツの詳細、作り方に関しては Tasmota の[ドキュメンテーション](https://tasmota.github.io/docs/IR-Remote/)を参照してください。

# Tasmota を設定

## Wifi 設定

初めに、デバイスをAPにしてWifiの設定が必要です。
Wifiメニューで「tasmota-XXXX」のネットワークに接続してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/a285fa3e-6f6f-076e-e729-e86c17139dfc.png)

ブラウザは自動で開きますが、そうになっていない場合は http://192.168.4.1 を開けば以下のようなフォームが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/e43bed61-862b-36bd-3b31-7c4f23997740.png)

自分のWifiのSSIDとパスワードを入れます。
少なくても `AP1 SSId` と `AP1 Password` を入力してください。
※ 2.4GHz Wifi にしか接続できないのでご注意。

保存して、デバイスを再起動させます。
Wifiに接続できたらWifiメニューから「tasmota-XXXX」の項目が消えます。

## テンプレートを設定

テンプレートはハードウエアの構成を定義する物です。
設定するには、まずIPアドレスでデバイスにアクセスします。
IPアドレスは、ルーターから調べるか、[Advanced IP Scanner](https://www.advanced-ip-scanner.com/) や [Fing](https://www.fing.com/)などで特定すればいいです。
![Screen Shot 2020-12-09 at 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/a919c6dd-43fa-1e5b-2d0f-9d2d5a211164.png)

「Configuration」＞「Configure Other」で設定をします。
スマートリモコンは、おそらく以下のテンプレートで行けると思います。

```json
{"NAME":"IR Smart Remote","GPIO":[255,255,255,255,56,51,0,0,0,17,8,0,0],"FLAG":0,"BASE":62}
```

保存して、デバイスを再起動させます。

## 赤外線を受信
![6F68198E-7BA4-4ECB-B290-512499EE9410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/efaf14a8-5492-a7a1-019f-58bdfddb0d4e.png)
メインメニューが表示されたら、「Console」を開いて、試しに赤外線を放ちます。
リモコンをスマートリモコンに向けてボタンを押したら、こういうメッセージが出ます。
![Screen Shot 2020-12-09 at 18-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/ac9326c1-7be1-ad08-aecd-e6824f70cdb2.png)

```
00:00:56 MQT: tele/IR_Bridge/RESULT = {"IrReceived":{"Protocol":"NEC","Bits":32,"Data":"0x41B6659A","DataLSB":"0x826DA659","Repeat":0}}
```

これで赤外線の受信ができています。

## 赤外線を発信

コンソール下部の入力欄にコマンドを打ちます。
赤外線を発信するために `IRSend` というコマンドを使います。
先程受信した赤外線を発信するためには、以下のコマンドを入力します。

```
IRSend {"Protocol":"NEC","Bits":32,"Data":"0x41B6659A"}
```

家電が近くにあれば反応します。
これでTasmotaの設定完了です。

# 綺麗なUIを導入

毎回手動で赤外線のコードを入力するのはとても不便なので、
その間に入る [Home Assistant](https://www.home-assistant.io/) というスマートホーム管理アプリを入れます。

## Home Assistantを入れる
入れる[手順](https://www.home-assistant.io/getting-started/)はいくつかあるので、自分に合う方法で入れてください。
自宅サーバはすでにdockerをつかっているため、docker版（[Home Assistant Container](https://www.home-assistant.io/docs/installation/docker/)）を入れました。
Raspberry Piを持っている方は、[Home Assistant OS](https://www.home-assistant.io/getting-started/) が一番簡単だと思います。

## MQTTサーバを入れる
Home Assistant と Tasmota デバイス間で通信するためのメッセージキューシステムです。
Home Assistant OS を使っている場合は[拡張機能](https://github.com/home-assistant/addons/blob/master/mosquitto/DOCS.md)で簡単に入れられます。
Docker [イメージ](https://hub.docker.com/_/eclipse-mosquitto)も用意されています。

Docker Compose を使っている方は、以下のYAMLで Home Assistant と、 Mosquitto という MQTTブローカーを立ち上げます。

```yaml:docker-compose.yml
version: “2”
services:
  mosquitto:
    image: eclipse-mosquitto:1.6
    container_name: mosquitto
    volumes:
      - ~/appdata/mosquitto:/mosquitto
    ports:
      - 1883:1883
    restart: unless-stopped

  homeassistant:
    image: homeassistant/home-assistant:stable
    container_name: homeassistant
    network_mode: host
    env_file: common.env
    volumes:
      - ~/appdata/homeassistant:/config
    ports:
      - 8123:8123
    restart: unless-stopped
```

## Tasmota の MQTT コンフィグを設定

スマートリモコンのメインメニューから「Configuration」> 「Configure MQTT」に遷移し、MQTTブローカーのIPアドレスを __Host__ として設定します。
ブローカーにユーザーとパスワードを定義したらこちらにも入力が必要です。
![PNG image 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/92bedfda-e653-6178-b365-f91e9e29389b.png)


## Home Assistant コンフィグを設定

Home Assistant のYAMLファイルに、例として照明を追加します。

```yaml:configuration.yaml
light:
   - platform: mqtt
     # 自分に分かりやすい名前をつける
     name: Room Light
     # トピックは必ずTasmotaに設定したトピックと一致する
     command_topic: cmnd/IR_Bridge/IRSEND
     # 照明を付ける赤外線コード
     payload_on: '{"Protocol":"NEC","Bits":32,"Data":"0x41B645BA"}'
     # 照明を消す赤外線コード
     payload_off: '{"Protocol":"NEC","Bits":32,"Data":"0x41B67D82"}'
     # デバイスから返事を待たずにUIに反映するかどうか。
     # 赤外線は返事が来ないので基本的 true
     optimistic: true
```

必要に応じ項目を定義して、Home Assistant のダッシュボードをカスタマイズするとこういう感じのUIが実現できます。
![PNG image 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/305be206-652e-26a2-71d5-bc5c3cce70dc.png)

# 出来上がり

Home Assistant は、1700以上のインテグレーションが対応しており、Philips Hue など既存のスマート家電を導入することができます。
全てHome Assistantにまとめると、一つのアプリで全てのスマートデバイスを操作できるようになります。
![PNG image 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/64069fc7-c564-5d33-f44a-7a11b849734c.png)
# おまけ

### HomeKit と連携

HomeKit [インテグレーション](https://www.home-assistant.io/integrations/homekit/)により Home Assistant で定義したデバイスを HomeKit に追加できます。
![9042C1C4-32B1-4593-A582-64256F1E5E8C 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/1a9922d4-4d54-c556-f6ea-a51410b454b2.png)

毎晩ベッドで横になってから「Hey Siri、電気全部消して」という発言をして、幸せを感じています。

最近 HomePod mini も買ったので、外出しても操作可能になり、位置ベースのオートメーションも動かせるようになりました。　

### 既にTasmotaが入っているデバイスが買えるかも？

最近 Tasmota が既に入っているデバイスが売っている通販サイトができました。
現時点スマートリコンはまだないですが、スマートライト、スマートコンセントは持っているようです。

https://ja.athom.tech/products