エアコンを外出先から遠隔操作(by MQTT)

## 注意

この記事で利用している [sango](https://sango.shiguredo.jp/) はサービスが終了しているので現在は利用できません。
代わりに [AWS IoT](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/aws-iot-how-it-works.html) などを利用する必要があります。

# 目的
できるだけ手抜きで、外出先からエアコンを操作できるようにします。
手抜きな分、赤外線受光素子＋赤外線 LED で自作する場合と比べるとお金はかかります
回線がマンションタイプで外から直接アクセスできないネットワークなので、 [MQTT](https://qiita.com/darai0512/items/37158f56e9a6b4ce83ed) を使用します。

# 用意するもの
1. raspbian がインストールされている Raspberry Pi (私は2を使用しました)
2. [赤外線リモコンアドバンス](http://bit-trade-one.co.jp/product/module/adir01p/)  
ちょっとお値段します。ですが手抜きの要になります。
3. 1 と 2 を接続する USB Mini ケーブル
4. MQTT Publish 用のスマホアプリ  
　↑ Android の [MQTT Dash](https://play.google.com/store/apps/details?id=net.routix.mqttdash&hl=ja)ってアプリ使いました。結構使いやすいです。  
5. [sango](https://sango.shiguredo.jp/)に登録しておく  

赤外線リモコンアドバンス製造元のビット・トレード・ワン様謹製の Windows デスクトップアプリで、
一度動作確認＋使い勝手のチェックをしてみるのがいいかと思います。
http://bit-trade-one.co.jp/product/module/adir01p/

# 手順
## 赤外線リモコンアドバンス操作編
まずは赤外線リモコンアドバンスを、ラズパイから操作できるようにします。

### 1. 手元に clone
適当なディレクトリを作って、赤外線リモコンアドバンスをコマンドラインで操作するためのツールを `git clone` します

```
$ mkdir /home/pi/aircon
$ cd /home/pi/aircon
$ git clone https://github.com/Drunkar/bto_ir_advanced_cmd.git
```

### 2. 必要なツールをインストール
`libusb-1.0.0` をインストールします。ツールをビルドするために必要です。
[追記] `libusb-1.0.0-dev` も必要なようです。
https://qiita.com/Kaz-su/items/93ec120b4bb90de7da2b#comment-2ff5f5b73f0ff8ecea44


```
$ sudo apt-get install libusb-1.0.0
$ sudo apt-get install libusb-1.0-0-dev
```

### 3. make
`make` します。これで赤外線リモコンアドバンスをコマンドラインから使えるようになります。

```
$ cd bto_ir_advanced_cmd
$ make
$ sudo make install
```

### 4. 赤外線リモコン信号のデータ化
ラズパイに赤外線リモコンアドバンスを接続し、エアコンのリモコン信号をファイル化します。
暖房ONの信号や、エアコン停止の信号ファイル等を作っておきましょう。

**[受信開始]**

```
$ bto_advanced_USBIR_cmd -r
```
(赤外線リモコンアドバンスに向け、リモコンのボタンを押す。)

**[受信終了]**

```
$ bto_advanced_USBIR_cmd -s
```

**[ファイルに信号を書き出す]**

```
$ bto_advanced_USBIR_cmd -g | tee data.txt
```

### 5. 送信用スクリプト作成
送信用のスクリプトを作成します。(どなたかのページから拝借したのですが忘れました・・ごめんなさい)

```
$ vi send_ir
```

```python:send_ir
#!/usr/bin/python3
import os
import sys

def send(code):
    os.system('/usr/local/bin/bto_advanced_USBIR_cmd -d ' + code)

if __name__ == '__main__':
    argv = sys.argv
    try:
        filename = argv[1]
        if os.path.isfile(filename) is True:
            f = open(filename, 'r')
            code = f.read()
            send(code)
            sys.exit(0)
        else:
           sys.stderr.write('File not found.\n')
           sys.exit(-1)

    except (OSError, IndexError):
        sys.stderr.write('File not found.\n')
        sys.exit(-1)
```

### 6. 赤外線リモコン信号送信
作成したスクリプトで赤外線リモコン信号送信

```
$ ./send_ir data.txt
```

エアコンが動きましたか？
つまり "`./send_ir data.txt`" を遠隔で実行できれば、外出先からエアコンが操作できるわけです。


## 遠隔制御編
MQTTを使用して、インターネット経由で遠隔操作できるようにします。
(MQTTの説明については割愛・・・)

### 1. 接続情報の確認
sango のコンソールに入って、 MQTT 接続情報を控えておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/b8146cfe-6800-809e-26ef-f914756c2e5b.png)

### 2. 必要なライブラリをインストール
python の mqtt ライブラリをインストールします。

```
$ pip install paho-mqtt
```

### 3. subscribe スクリプト作成
MQTT 接続情報をもとに、 MQTT を subscribe するスクリプトを作成します。
`aircon_heat_on` というメッセージで暖房 ON の信号を、
`aircon_off` というメッセージでエアコン停止の信号を送信するようなサンプルになります。

```
$ vi subscribe.py
```

```python:subscribe.py
# coding:utf-8
import paho.mqtt.client as mqtt
import commands

def on_connect(client, userdata, flags, rc):
        print('Connected with result code '+str(rc))
        client.subscribe("[topic]")

def on_message(client, userdata, msg):
        print(msg.topic + ' ' + str(msg.payload))
        if msg.payload == "aircon_heat_on":
                print "aircon heat ON！"
                print commands.getoutput("./usbir_send ./aircon_heat_on.txt")
        if msg.payload == "aircon_off":
                print "aircon OFF!"
                print commands.getoutput("./usbir_send ./aircon_off.txt")

if __name__ == '__main__':

        username = '[username]'
        password = '[password]'
        host = 'lite.mqtt.shiguredo.jp'
        port = 1883

        client = mqtt.Client()
        client.on_connect = on_connect
        client.on_message = on_message

        client.username_pw_set(username, password=password)
        client.connect(host, port=port, keepalive=60)
        client.loop_forever()
```

### 4. subscribe スクリプトをバックグラウンド実行
`subscribe.py` を走らせておきます
　`$ nohup [hogehoge] &　` で ssh 切れても `hogehoge` がバックグラウンドでずっと動いてくれるそうです。凄いですね。

```
$ nohup python subscribe.py &
```

### 5. エアコン制御命令を送信
MQTT Dash から、 sango に接続し、 [topic] 宛にメッセージを送る
　`"aircon_heat_on"`とか`"aircon_off"`とか

ラズパイのコンソールに 「aircon heat ON!」 や 「aircon OFF!」 の文字が表示され、エアコンが動きましたか？
これで家に帰る前にエアコンON出来ますね。最高かよ。
テレビなど様々なものに応用できると思うので、色々作ってみてください。

#おわりに
- 赤外線リモコンの仕組みに興味を持たれた方は、赤外線受光素子、赤外線 LED 、ブレッドボードを用意して実験してみるといいと思います。
- アドバンスじゃない方の赤外線リモコンは、おそらく送受信用のコマンドラインツールが異なるので注意してください。
- 赤外線コードが長いと、 `$ bto_advanced_USBIR_cmd -d 'cat data.txt'` のやり方では送信できないようです。
　富士通のエアコン制御信号は送れませんでした。
　そのため、赤外線リモコンアドバンス操作編-手順5のスクリプトを使用している節があります。