ラズパイに初めて触る人が、Slackから自宅のエアコンを制御する


## はじまり
暑い夏が来る前に、家に着く前にエアコンをつけれる環境が欲しい。
あと、ラズパイ触ってみたい。

そんな時に、[格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)を発見
部品と金額まで書いてある…

ラズパイを用いて、Slackから自宅のエアコンを制御してみよう！！！

## ラズパイでリモコンを作る記事は溢れているのになぜ書いたのか
#### やってみたら、意外と詰まった。
その際、記事を探し回ったので、助けられた内容をまとめておく。
#### 初めてなりの悩み
触り慣れている人からしたら当たり前が詰まっているかもしれないけど、初めて触る人の参考になればと。
#### ShellとPythonがわかれば良いくらいにしたい(今わかるのそれくらい)
今回の目的は**お家の外からエアコンを制御する**です。
ラズパイでSlackbotを飼って([Raspberry PiでSlackbotを飼う](https://qiita.com/undo0530/items/2139a1e8b73b3eee6e00))、赤外線を飛ばすくらいなら、Pythonのみでできました(まだ理解していないがゆえの不都合が考えられるのですが…)。

## 必要なもの
[格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)に従う

## 作成手順

### ラズパイのインストール・設定
あまり余計なものは買いたくないと思い、変換プラグ不要で設定できる方法を探した。
[Raspberry Pi Zero Wをディスプレイやキーボードなしで初期設定、Wi-Fi接続](https://ayame.space/2018/07/setup-raspberry-pi-zero-w-without-display/)がわかりやすく、大変参考になった。

#### ラズパイの起動
電源をさしてから少し待たないと、`ssh`できない。
当たり前のことではあるが、最初戸惑った。

### ラズパイにPython及びPipをインストール
普段使っているのがpyenvだったので、同様の環境の方が楽だと思い、pyenvを導入しました。
[RaspberryPiにpyenvを導入](https://qiita.com/h-sakano/items/cb8df027b81acd78bd77)を参考にすれば、インストールできます(僕は3.6.6をインストールしました)。
pipのインストールはしなくても入ってました。

つまり、

```sh
% sudo apt-get install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev 
% git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```

Shellごとに合わせた設定をして、sourceする。

```sh
% pyenv install 3.6.6
% pyenv global 3.6.6
```

と、pythonもpipも入ります。
ちなみに、今回pipでインストールしたのは

```sh
% pip install Slackbot pigpio
```

#### `pyenv install x.x.x`
すぐは終わらないです。
長そうだったので、朝出かける前にインストールをはじめて半日後帰宅して確認したら、終わってました。

### 赤外線送受信回路作成
[格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)及び[赤外線LEDドライブ回路の決定版 \| 電脳伝説](https://vintagechips.wordpress.com/2013/10/05/%E8%B5%A4%E5%A4%96%E7%B7%9Aled%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E5%9B%9E%E8%B7%AF%E3%81%AE%E6%B1%BA%E5%AE%9A%E7%89%88/)の通りです。

#### 回路におけるLEDの向きについて
これも当たり前かもしれないですが、長い方がアノード、短い方がカソードです。
今回の場合、短い方がGNDと接続するようにしてください。

### ラズパイで回路を制御
[格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)を参考に、pigpioを用いた制御を行います。

#### インストール及び起動設定

```sh
% sudo apt-get update
% sudo apt-get upgrade
% sudo apt-get install pigpio
% sudo systemctl enable pigpiod.service
% sudo systemctl start pigpiod
% pip install pigpio
```

#### GPIOの設定

```sh
% echo 'm 17 w   w 17 0   m 18 r   pud 18 u' > /dev/pigpio
% crontab -e
@reboot until echo 'm 17 w   w 17 0   m 18 r   pud 18 u' > /dev/pigpio; do sleep 1s; done
```

#### pigpioによる送受信プログラム
pigpioの作者自らが作った[IR Record and Playback](http://abyz.me.uk/rpi/pigpio/examples.html#Python_irrp_py)をベースにしました。

[格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)の手法をそのまま踏襲すると、pythonコード内でsubprocessとして`irrp.py`を呼び出すことになります。
そのため、`irrp.py`をclass化して、pythonのコード内で呼び出せるようにしました(多分、subprocessとして呼び出してもうまく行くと思います)。
この際、引数として、オプションで取っていた値を与えるようにしています。

学習と送信に関しては、[格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)に記載がある通りです。

##### `pigpio.error: 'chain is too long'`
我が家のエアコン(ダイキン)の信号は長すぎたようです。
[ラズパイでエアコン対応の赤外線学習リモコンを pigpioライブラリを使って作る方法、Goodbye LIRC (Raspbian Stretchでエアコン対応の赤外線リモコンを動かす、ややこしい LIRCを使わないで IR機器を制御)](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_gpio_pigpio_ir_remote_control/)を参考に、対応しました。
端的に述べると、学習した信号を三つに分割して送信するようにしています。
学習した信号をどこで切るか等はリンク先を参考にしてください。

#### Slackbotの導入
[Raspberry PiでSlackbotを飼う](https://qiita.com/undo0530/items/2139a1e8b73b3eee6e00)を参考にしました。
とりあえず以下のような感じで、RecordとPlayを行うようにしています。
全貌は[こちら](https://github.com/yoshi65/raspibot)で。

```python:SlackBotPlugin.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import pigpio
from slackbot.bot import listen_to, respond_to
from irrp_class import irrp


@listen_to('Record .*')
@respond_to('Record .*')
def record(message, *something):
    pi = pigpio.pi()
    if not pi.connected:
        exit(0)

    name = message.body['text'].replace('Record ', '')

    ir = irrp(pi,
              GPIO=18,
              FILE='pigpio.json',
              ID=name,
              POST=130,
              NO_CONFIRM=True)
    ir.record()

    message.reply(f'Recorded {name}')

    pi.stop()



@listen_to('Play .*')
@respond_to('Play .*')
def play(message, *something):
    略
```

実際、Slackでやってみると、こんな感じです。
![ss 2019-07-24 11.16.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206914/deb2af33-ed86-241d-a045-70016dac4335.png)


## 完成！！！
じゃあ、早速試そうと思い使ってみたものの、
学習はうまくいったけど、送信できない…(`pigpio.error: 'chain is too long'`とエラーが出ました)

そのエラーを上記のように解決した結果、
送信は行われているようだが、エアコンがピクリともしない…

一旦落ち着いて、テレビのOnOffをやらせてみると、あっさりできる…

送信は正常に行われていることがわかったので、エアコンにラズパイを近づけてみると…(30 cmくらいの距離)
クーラーがついた！

とは言え、そんな距離に電源を確保するのも大変…と思い、色々試した結果。
2 mくらいの距離でもうまくいきました。
重要なのは**LEDの向き**でした(当たり前だろって感じだと思いますけど)。

### まとめると
LEDがエアコンにきちんと向いていれば、2 mくらいの距離でもエアコンは信号を受信してくれました(電源は5V/2.4A)。

## 最後に
これで無事夏を乗り切れそうな気がする！(ちょうど今日から地獄のような暑さが到来してますね)

デバイスに触れて作業するのは久々でしたけど、なかなか楽しかったですね。
今度はラズパイ + カメラにチャレンジしようと思います。

以下の問題を抱えている気がするので、今後考えます。
* 連続稼働による影響
* ブレッドボードのままなのでユニバーサル基板に移行してハンダ付け
* ラズパイへの理解が未熟であることに起因する何か

参照した記事を示して、説明は参照先を見てください状態なので、書き直した方が良いのかなぁとも思っています。

## Ref.
1. [格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)
3. [Raspberry PiでSlackbotを飼う](https://qiita.com/undo0530/items/2139a1e8b73b3eee6e00)
2. [Raspberry Pi Zero Wをディスプレイやキーボードなしで初期設定、Wi-Fi接続](https://ayame.space/2018/07/setup-raspberry-pi-zero-w-without-display/)
4. [RaspberryPiにpyenvを導入](https://qiita.com/h-sakano/items/cb8df027b81acd78bd77)
5. [赤外線LEDドライブ回路の決定版 \| 電脳伝説](https://vintagechips.wordpress.com/2013/10/05/%E8%B5%A4%E5%A4%96%E7%B7%9Aled%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E5%9B%9E%E8%B7%AF%E3%81%AE%E6%B1%BA%E5%AE%9A%E7%89%88/)
6. [ラズパイでエアコン対応の赤外線学習リモコンを pigpioライブラリを使って作る方法、Goodbye LIRC (Raspbian Stretchでエアコン対応の赤外線リモコンを動かす、ややこしい LIRCを使わないで IR機器を制御)](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_gpio_pigpio_ir_remote_control/)