絶対に起きられるようライトとエアコンとスピーカーをラズパイで制御した話

# はじめに

こんにちは。エンジニアの卵のなりかけです。

冬ってなんでこんなに朝起きれなくなるんでしょうか？
毎回６時半にスマホのアラームをセットしていますが、無意識のうちに止めてしまうらしく、起きるのは９時ごろがデフォになってきました。

このままだと会社に遅刻して朝会をすっぽかす可能性があるので、起こしてくれるシステムを頑張って作ることにしました（努力の方向が違う...）。


## 理想

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/e2f753ff-c51a-fe9b-0747-646a4ac048d8.png)

適度に**暖かい**部屋の中、まるで**朝日を浴びているかのような灯り**の下で、**お気に入りの音楽**と共に（朝７時くらいに）目覚めたい。

## 理想を実現する

### 必要なもの

- エアコン（部屋についてた）
- リモコンで操作可能なシーリングライト（今回のために買った：[コイズミ　BH180802K](https://www.yamada-denkiweb.com/1498098012)、6000円ちょい）
- リモコンで操作可能なCDプレイヤー（実家の物置から引っ張り出してきた）
- CD（水泳ガチ勢だった頃に買った[水夢~Go for VICTORY~](https://tower.jp/item/2431980/水夢~Go-for-VICTORY~)）
- **赤外線リモコン（後述）**

### 赤外線リモコンを作る

こちらの記事が超丁寧に解説してくださっているので、これを読んで作りました。
今回は試作なので、半田付け不要なブレッドボードを使っています。

https://qiita.com/takjg/items/e6b8af53421be54b62c9

できたもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/42497e88-6a45-c364-2300-e5c2c9abc7a1.png)

### 必要な信号を自作した赤外線リモコンに登録する

うちのリモコンはこんな感じです。
![リモコン.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/9db76bdb-a1fb-202c-0200-7770af02033c.png)

まずはこれらのリモコンの信号を格納するフォルダを作成し、信号を送受信するプログラムをダウンロードします。

```shell
# 信号を格納するフォルダを作る
$ mkdir /home/[USER_NAME]/RoomLightControl

# 作成したフォルダに移動
$ cd /home/[USER_NAME]/RoomLightControl

# IR Record and Playbackをダウンロード（IR Record and Playback？？って方は上で紹介した「格安スマートリモコンの作り方」を参照）
$ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py

```

#### ライト

どんな光なら目覚めやすいのか調べてみたところ、

- フィリップス社が出している[ウェイクアップライト](https://www.philips.co.jp/c-e/hs/smartsleep/wake-up-light-portfolio.html)の説明

>太陽光をヒントに開発された光を30分かけ徐々に明るくすることで、朝日で目覚めたかのような、自然な目覚めをサポートします。

- 日経ビジネスの記事：[意外？ ブルーライトを浴びれば目覚めスッキリ](https://business.nikkei.com/atcl/skillup/15/111700008/022300019/)

> 特に、冬場は寒いうえに日の出も遅いから、なおのこと朝がつらい。やっとのことで布団から抜け出ても、なかなか覚醒モードに切り替わらないという人も多いだろう。
そんな人にぜひ活用してほしいのが、覚醒効果が非常に高い青色光（ブルーライト）を含む朝の太陽光だ。

とありました。


なので、「朝日のようなオレンジの暗い光 -> 青色の明るい光」に徐々に変化させるのがよさそうです。

ライトのシーン登録機能（登録したパターンを2つまで呼び出せる）を使って、最低限の明るさの橙色光を登録したシーン１を呼び出し、そこから徐々に明るさと青みを上げることで実現させます。

こちらに必要な信号は
- シーン１呼び出し
- 青みアップ
- 明るさアップ
になるので、
自作したリモコンを使ってそれぞれを記録していきます。

```shell
# シーン１呼び出し信号を記録
$ python3 irrp.py -r -g18 -f my_room_light scene1 --no-confirm --post 130

# 青みアップ信号を記録
$ python3 irrp.py -r -g18 -f my_room_light blue_up --no-confirm --post 130

# 明るさアップ信号を記録
$ python3 irrp.py -r -g18 -f my_room_light light_up --no-confirm --post 130
```

#### エアコン

いつも使っているエコ自動の-2度（エコ自動のままだとちょっと暑い）、ついでにタイマーも設定するためには以下の信号が必要になります。
- エコ自動起動（電源Onも兼ねてる）
- 温度ダウン
- タイマーセット

```shell
# エコ自動信号を記録
$ python3 irrp.py -r -g18 -f my_room_airConditioner eco_auto --no-confirm --post 130

# 温度ダウン信号を記録
$ python3 irrp.py -r -g18 -f my_room_airConditioner temp_down --no-confirm --post 130

# タイマーセットを記録
$ python3 irrp.py -r -g18 -f my_room_airConditioner timer_on --no-confirm --post 130
```

#### CDプレイヤー

プレイヤーを起動してお気に入りの曲番に移動し、再生しつつちょっとづつ音量を上げる、を実現するには以下の信号が必要になります（なおCDは最初からセットされているものとします）。
- 電源On
- ４番（お気に入りの曲番）を再生
- 音量アップ

```shell
# 電源On信号を記録
$ python3 irrp.py -r -g18 -f my_room_audioSystem power --no-confirm --post 130

# ４番再生信号を記録
$ python3 irrp.py -r -g18 -f my_room_audioSystem paly_4 --no-confirm --post 130

# 音量アップ信号を記録
$ python3 irrp.py -r -g18 -f my_room_audioSystem volume_up --no-confirm --post 130
```

### シェルスクリプトを作る

各家電には
- ライトの「青みアップ」は19回実行すると青み最大
- エアコンのタイマー信号は連続して送ると送信回数x30minのタイマーが設定される
- CDプレーヤーは音量12が起きるのにちょうど良く、起動時は音量8になっている
のような特性があるので、これらを考慮して各信号を呼び出すシェルスクリプトを作成します。

起きる1時間ほど前につけるエアコンと、起きる直前に操作したいライトとスピーカーでシェルスクリプトを分けます。

エアコン操作用

```shell:startAirConditioner.sh
#!/bin/sh

# 記録した信号を格納しているフォルダに移動
cd /home/[USER_NAME]/RoomLightControl

# エコ自動モードで起動
python3 irrp.py -p -g17 -f my_room_airConditioner eco_auto

# ちょっと待つ
sleep 30

# 2時間できれるようタイマーセット（0.5時間刻みで延長される）
for _ in `seq 4`;
    do  sleep 1; python3 irrp.py -p -g17 -f my_room_airConditioner timer_on;
done

# ちょっと待つ
sleep 30

# 設定温度を-2℃にする（0.5℃刻み）
for _ in `seq 4`;
    do  sleep 1; python3 irrp.py -p -g17 -f my_room_airConditioner temp_down;
done
```

ライト＆スピーカー操作用

```shell:wakeMeUp.sh
#!/bin/sh

# 記録した信号を格納しているフォルダに移動
cd /home/[USER_NAME]/RoomLightControl

# シーン１を呼び出し
python3 irrp.py -p -g17 -f my_room_light scene1

# 30秒ごとに青みアップを6回実行
for _ in `seq 6`;
    do  sleep 30; python3 irrp.py -p -g17 -f my_room_light blue_up;
done

# 明るさアップと青みアップを30秒ごとに各9回実行
for _ in `seq 9`;
    do sleep 30; python3 irrp.py -p -g17 -f my_room_light light_up; sleep 30; python3 irrp.py -p -g17 -f my_room_light blue_up;
done

# ちょっと待機
sleep 10

# CDプレーヤー電源On
python3 irrp.py -p -g17 -f my_room_audioSystem power

# 起動完了まで待機
sleep 30

# 4番再生
python3 irrp.py -p -g17 -f my_room_audioSystem paly_4

# 明るさアップ、音量アップ、青みアップを20秒ごとに各4回実行
for _ in `seq 4`;
    do  sleep 20; python3 irrp.py -p -g17 -f my_room_light light_up; sleep 20; python3 irrp.py -p -g17 -f my_room_audioSystem volume_up; sleep 20; python3 irrp.py -p -g17 -f my_room_light blue_up;
done
```

### 定期実行を設定する

cronを使って定期実行を設定します。

```sh:command
# cronをスタート
$ sudo service cron start

# cronのスケジュールを編集
$ crontab -e

# crontabの最終行に以下を追記

# 毎週月~金の5時00分からstartAirConditioner.shを実行 + 実行時のログをstartAirConditioner.shに出力
00 05 * * 1-5 /home/[USER_NAME]/RoomLightControl/startAirConditioner.sh > /home/[USER_NAME]/RoomLightControl/startAirConditioner.log 2>&1
# 毎週月~金の6時05分からwakeMeUp.shを実行 + 実行時のログをwakeMeUp.shに出力
05 06 * * 1-5 /home/[USER_NAME]/RoomLightControl/wakeMeUp.sh > /home/[USER_NAME]/RoomLightControl/wakeMeUp.sh 2>&1
```

### 忘れちゃいけない最後の一手間

これで味がぐっと締まります...!（嘘です。ごめんなさい）

ただrootユーザー以外でcronの設定すると実行権限周りで詰まるので、その設定をおこないます。
（rootユーザーで今回の設定を行っていた人は不要です。たぶん...）

#### 忘れるとどうなるか

```shell
/bin/sh: 1: /home/[USER_NAME]/RoomLightControl/wakeMeUp.sh: Permission denied
```

こんな感じでエラーになり、実行できません。

「これで明日から起きれるぜ！」と寝て、朝起きて時計をみた時の絶望感といったら....

#### やらないといけないこと

wakeMeUp.shとstartAirConditioner.shに対し、rootユーザー以外の実行権限を与えます。

```shell
$ chmod 755 startAirConditioner.sh
$ chmod 755 wakeMeUp.sh
```

以上のコマンドで
「所有者」に対して「読み取り」「書き込み」「実行」を、
「所有グループ」と「その他」に対して「読み取り」「実行」を付与しています。

参考：[Linuxの権限確認と変更(chmod)（超初心者向け）](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)

念の為`ls -all`コマンドで付与ができているか確認します。

```shell
$ ls -all

...
-rw-r--r--  1 XXX YYY nnn 12月  5 17:20 irrp.py
-rw-r--r--  1 XXX YYY nnn  5547 12月 19 21:05 my_room_airConditioner
-rw-r--r--  1 XXX YYY nnn  5715 12月 19 22:42 my_room_audioSystem
-rw-r--r--  1 XXX YYY nnn  1921 12月 19 20:57 my_room_light
-rwxr-xr-x  1 XXX YYY nnn   608 12月 20 21:36 startAirConditioner.sh
-rwxr-xr-x  1 XXX YYY nnn   892 12月 20 21:35 wakeMeUp.sh
```

startAirConditioner.shとwakeMeUp.shの権限が`-rwxr-xr-x`になっていればOKです。

## お休みの前に

それでは、
明日スッキリ目覚められることを祈って...

おやすみなさ~い

![sleep_animal_cat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304608/20e5d74f-01dd-a263-1bbf-5b7bf3a190c3.png)


## 夢でみた

- スクリプト実行時に部屋の明るさを取得して、一定以上の明るさであれば実行をキャンセルする機能（稀に朝４時くらいから作業していることがあるため）
- 寝ているか（＝ベッドに乗っているか）を判定して自動でスヌーズする機能
- カーテン自動開け機能の追加（ロールカーテンだと巻き取りに必要なトルクが大きく作るの大変そう。レールカーテンに付け替えるべきか...）

正夢にできるよう頑張ります。