ラズパイで熱帯夜を乗り切ろう！

#エアコン操作を自動化して室温を一定に

上限温度に達すればオン
下限ならオフ
これをひたすら繰り返します笑

###対象
ターミナル接続でLinuxを触ったことのある人向け。

###用意するもの
ラズパイzero: 電源まで付いたスターターキットがオススメ。
[リモコンアドバンス](http://btoshop.jp/2015/08/12/4562469770550/)：パワフルで操作簡単なリモコンモジュール。
BME280：温度湿度気圧センサー。要ハンダ付け。
ブレッドボードケーブル（メス－メス）２０ｃｍぐらい。
USBケーブル：リモコンアドバンス(miniB) - ラズパイzero(microB)

###ラズパイのセットアップに必要なもの
電源
microSD
[おすすめキーボード・マウス（あったほうが楽）](https://www.amazon.co.jp/LOGICOOL-%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-MK240n-%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%9C-MK240nBC/dp/B01L9W87RK/)
HDMIケーブル

###ラズパイzeroの注意点
ラズパイzeroは小ささや消費電力の点で魅力的なのですが反面USBやHDMIの規格が小さくなってます。
黄丸にはブレッドボードケーブルでBME280をつなぎます。
赤の左からミニHDMI、USB-microB、USB-microB
赤真ん中にリモコンアドバンス、赤右に電源をつなぎます。
![IMG_0246.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455147/ca40846a-3e13-43b6-1487-3d06141b0df5.jpeg)

###ラズパイzeroをセットアップして下さい。
OSインストール
パスワードの変更
wifi設定
SSH Enable
I2C Enable
起動時にCUIで立ち上げる設定
できればipアドレスの固定化

までできれば大丈夫です。
先人の偉い方々の記事がたくさんありますので参考にして下さい。
この後はリモートで作業しましょう。

ここではPiユーザーで設定しますが任意のユーザーを作成したほうがいいと思います。
センサーやリモコンアドバンスの接続時は念の為電源を切っておいてください。

###BME280とラズパイzero
ピンがハンダ付けされてない場合はハンダ付けしてください。
![IMG_0247(Edited).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455147/b81b5e91-4094-5b48-0a28-6e83b7bbecd4.jpeg)
BME280.VCC -> ラズパイ.1ピン
BME280.GND -> ラズパイ.6ピン
BME280.SCL -> ラズパイ.5ピン
BME280.SDA -> ラズパイ.3ピン
BME280.SDO -> ラズパイ.9ピン

SCLとSDAがI2C通信をするピン。
![RaspPiZero.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455147/18e62487-befe-a84f-27c5-0f934e675cc1.png)
こんな感じでブレッドボードケーブルで指して繋げばOK。
![IMG_0248(Edited).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455147/cbb748b0-46a3-59f5-523b-ba8c821d3f39.jpeg)

###BME280の設定
hawk777さんの記事が参考になります。ありがとうございます。
[ラズパイ+BME280でIoT環境センサー構築(その1)](https://qiita.com/hawk777/items/2b910a81df480268e07e)
4．サンプルコードの実行はこちらと読み替えて下さい。

```
sudo apt install -y python-smbus

cd /home/pi/ダウンロード
wget https://github.com/SWITCHSCIENCE/BME280/archive/master.zip
unzip master.zip
sudo pip install smbus2

python BME280-master/Python27/bme280_sample.py
```

無事スイッチサイエンスさんのサンプルが動いたら次へ行きましょう。

###リモコンアドバンスの設定
参考にさせていただきました。ありがとうございます。
[エアコンを外出先から遠隔操作(by MQTT)](https://qiita.com/Kaz-su/items/93ec120b4bb90de7da2b)
6. 赤外線リモコン信号送信まででOKです。

###作業フォルダ
/home/pi/aircon
以下の作業は先程作成したairconフォルダ内でやります。

###リモコン信号の記憶

```
#受信開始
$ bto_advanced_USBIR_cmd -r
#受信終了
$ bto_advanced_USBIR_cmd -s
#ファイル書き出し
$ bto_advanced_USBIR_cmd -g | tee aircon_XX.txt
```

22度設定でon -> aircon_22.txt
25度設定でon -> aircon_25.txt
オフ -> aircon_off.txt
上を参考に３種類のリモコン信号をファイル化してください。
書き出しのところでエラーがでたときはもう一度試すと成功することがあります。

###BME280のライブラリをダウンロード
[Raspberry PiとBME280モジュールで自動で温度・湿度・気圧を測定してグラフ化する](https://karaage.hatenadiary.jp/entry/2016/05/11/073000)
からあげさんの記事を参考に改変させていただきました。

```
git clone https://github.com/fell-procir2/bme280.git
cp ./bme280/bme280_sensor.py ./
```

###フラグファイルの作成
off.aircon
というファイル名で空ファイルを作成して下さい。

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

import time, datetime
import bme280_sensor
import sys
import os

#温度設定
upper = 27.8
under = 26.4
on_files = ['aircon_25.txt']
strong_files = ['aircon_22.txt']
off_files = ['aircon_off.txt']

def ir_cmd(code_files):
        for code_file in code_files:
            _cmd = "bto_advanced_USBIR_cmd -d `cat " + code_file + "`"
            while not 0 == os.system(_cmd):
                    time.sleep(1)
            print(_cmd + ' -> ' + str('done'))
            time.sleep(1)

#湿度による微調整
def clearance(hu):
        clr = 0
        if 60 <= hu:
                clr = -0.5
        elif 58 <= hu and hu < 60:
                clr = -0.3
        elif 50 <= hu and hu < 58:
                clr = 0
        elif hu < 50:
                clr = 0.2
        return clr

#初期設定 -> エアコン状態off -> フラグoff
ir_cmd(off_files)
if os.path.isfile('on.aircon'):
        os.rename('on.aircon', 'off.aircon')
before_temp = 35

while True:
        (temp, humi, press) = bme280_sensor.get_value()

        temp_is_over = upper + clearance(humi) < temp and os.path.isfile('off.aircon')
        temp_is_under = temp < under + clearance(humi) and os.path.isfile('on.aircon')
        #冷房中に温度があがったか？
        temp_is_back = before_temp < temp and os.path.isfile('on.aircon')

        #冷えにくくなったらstrong_file送信
        if temp_is_back:
                ir_cmd(strong_files)

        if temp_is_over:
                ir_cmd(on_files)
                os.rename('off.aircon', 'on.aircon')

        if temp_is_under:
                ir_cmd(off_files)
                os.rename('on.aircon', 'off.aircon')

        now = datetime.datetime.fromtimestamp(time.time())

        log = now.strftime("%H:%M") + ": Temp: " + str(round(temp, 2)) + "C Humi: " + str(round(humi, 2)) + "% Press: " + str(round(press, 2)) + "hPa: "
        print(log)
        before_temp = temp
        time.sleep(60)
```
###テスト起動
全てのファイルが作業フォルダ上にあることを確認して下さい。
auto_pirot.py
off.aircon
aircon_22.txt
aircon_25.txt
aircon_off.txt
bme280_sensor.py

```
python auto_pirot.py
```

１分おきに気温・湿度・気圧が表示されauto_pirot.pyの設定温度になるとリモコン信号が照射されます。
ctrl-cで中断できます。

リモコン設定温度等、色々調整してみて下さい。
湿度によっても微調整するようにしています。

###自動起動
aircon_auto_pirot.sh を作成して作業フォルダに保存します。

```
vi aircon_auto_pirot.sh
```

```
#!/bin/sh
cd /home/pi/aircon/
python auto_pirot.py
```
rc.localを編集。

```
sudo vi /etc/rc.local
```

```
・・・
sh /home/pi/aircon/aircon_auto_pirot.sh
exit 0
```
これで再起動すると自動起動でエアコン操作が始まります。
プロセスが動いているかは下記コマンドで確認できます。

```
pgrep -l python 
```

###ケースに入れてみました
センサーが外でブラブラしてるのはラズパイの温度の影響を受けないためです笑
このぐらいの半透明でもこのリモコンはよく効きますね。

とりあえず２日ほどつけっぱなしでいますが特に不具合もなく動いています。
![IMG_0244.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455147/d6ba9bf9-a607-a729-d665-caefd7e4a4d2.jpeg)