Raspberry PiとSwitchbotを使って自然に起きられる光目覚ましを作ってみた（python）


# はじめに

スマートホーム化第2弾です！今回は光目覚ましを作ってみたいと思います。

Raspberry Pi zero WHとSwitchBotのテープライトを買ってみました〜！
<img width="400" alt="IMG_4637.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/0a8d5a50-4bc3-4728-3daa-dfcf36b4a537.jpeg">

<img width="400" alt="IMG_4863.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/2d4e5822-a10a-bdb4-111d-2c375e76b72f.jpeg">

私はとても寝起きが悪いので、光を徐々に明るくすることで自然にスッキリ起きられるところを目指します！！

# 必要なもの
- SwitchBotテープライト
- Raspberry Pi
- microSDカード
- microUSBケーブル

# 準備
## テープライトの設置

テープライトの背面にあるシールをはがして、設置したいところに貼り付けます。
5mあるので、必要に応じて切断します。

今回はデスクとベッドにつけてみました！

<img width="400" alt="IMG_4855.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/490d23b8-ce36-6ca7-4e88-f01f646cb471.jpeg">

かっこいい！！！
色のレパートリーが沢山あるので、気分によって変えたりしても楽しそうです。

## Raspberry Piの準備
### Raspberry Pi Imagerのインストール

[公式サイト](https://www.raspberrypi.com/software/)からRaspberry Pi Imagerをダウンロードします。

microSDカードをPCに接続した状態で、アプリを起動します。

<img width="400" alt="スクリーンショット 2022-07-02 19.44.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/f87f600a-556c-0e2f-053f-28722f332ebb.png">

OSは「Raspberry Pi OS(32-bit)」を選択し、右下の設定アイコンをクリックします。

以下の設定で保存します
- SSHを有効（パスワード認証を使う）
- ユーザー名とパスワードを設定
  - ※2022年版のRaspberry Pi OSではユーザー、パスワード設定が必須になったみたいです
- ロケール設定

ストレージはmicroSDカードを選択し、「書き込む」ボタンを押します。

10分くらい経つと書き込みが完了します。

### SSH有効化
設定に使うファイルは[こちら](https://github.com/HoshimuraYuto/raspberry-pi-setup/archive/master.zip)を使用させていただきました。

ダウンロードしたzipファイルを解凍すると、以下のファイルがあります。
<img width="400" alt="スクリーンショット 2022-07-02 22.53.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/081c012a-b1e5-3667-94be-0ce7b4f48abd.png">

wpa_supplicant.confを開き、WifiのSSIDとパスワードを入力します。
sshファイルとwpa_supplicant.confをmicroSDカードに入れて準備は完了です。

# Raspberry Piの起動

Raspberry PiにmicroSDカードを差し込み、microUSBケーブルで電源と接続します。
（無線接続できるようになっているので、PCと接続しなくても大丈夫です）

点滅が消えたら、PCでターミナルを立ち上げ、以下のコマンドを入れます。

```c
ssh pi@raspberrypi.local
```

(yes/no[fingerprint])が出たらyesと入力

passwordを聞かれたら、↑で設定したパスワードを入力

![スクリーンショット 2022-07-02 23.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/e210f186-99f1-d689-7302-4501b1b578fd.png)
無事Raspberry Piに接続できました！

# Pythonのプログラムを動かす

```c
vi auto_light.py
```

で以下のコードを保存します

```
import requests
import json
import sys
import time
import datetime


def getLightId():
    response = requests.get(
        "https://api.switch-bot.com/v1.0/devices", headers=header)
    devices = json.loads(response.text)
    deskLightId = [device["deviceId"] for device in devices['body']
                   ['deviceList'] if "デスクライト（アプリで登録したデバイス名）" == device['deviceName']]
    bedLightId = [device["deviceId"] for device in devices['body']
                  ['deviceList'] if "ベッドライト（アプリで登録したデバイス名）" == device['deviceName']]
    lightList = deskLightId + bedLightId
    return lightList


if __name__ == "__main__":
    wakeUptime = sys.argv[1]
    print(wakeUptime, "時に起きたいな〜")
    header = {"Authorization": "（Switchbotのトークン）"}
    try:
        while True:
            now = datetime.datetime.now()
            if now.hour == int(wakeUptime) - 1:
                lightList = getLightId()
                for light in lightList:
                    url = "https://api.switch-bot.com/v1.0/devices/" + light + "/commands"
                    brightness = {
                        "command": "setBrightness",
                        "parameter": str(100*now.minute/60),
                        "commandType": "command"
                    }
                    requests.post(url, headers=header,
                                  data=json.dumps(brightness))
                print("ライトがついたよ！")
            elif now.hour == int(wakeUptime) + 1:
                lightList = getLightId()
                for light in lightList:
                    url = "https://api.switch-bot.com/v1.0/devices/" + light + "/commands"
                    off = {
                        "command": "turnOff",
                        "parameter": "default",
                        "comandType": "command"
                    }
                    requests.post(url, headers=header, data=json.dumps(off))
                print("ライトが消えたよ！")
            else:
                print("時間外だよ！")
            time.sleep(60)

    except KeyboardInterrupt:
        sys.exit(0)
```


```c
python auto_light.py 8
```
で実行！(8のところは起きたい時間を入力)

起きたい時間の１時間前から徐々に電気が明るくなり、起きたい時間の１時間後に自動で電気が消せるようになりました！

1時間前
<img width="400" alt="IMG_4856.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/ad80e3ac-4d21-5dbf-761d-369faa8e602e.jpeg">

30分前
<img width="400" alt="IMG_4857.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/2dba9a8c-e312-ae0c-de22-414e5e1de48e.jpeg">

起きたい時間
<img width="400" alt="IMG_4854.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610254/79c49d1b-d7ee-6025-e410-a7d2daabe225.jpeg">

# 最後に
今回はRaspberry Piでpythonのコードを実行するだけでしたが、
カメラやセンサをつけてAIと組み合わせてみても面白そう！！夢がひろがりますね〜！

（明日はスッキリ起きられるといいな…）

# 参考資料
[【初心者向け】ラズパイの初期設定をするよ【win/mac対応】](https://sukiburo.jp/setup-raspberry-pi/#5-4)
[2022年版のRaspberry Pi OSではユーザー、パスワード設定が必須に](https://nw-electric.way-nifty.com/blog/2022/05/post-2cdd01.html)
[【SwitchBot】API を使って Python でライトをいじってみた](https://note.com/klayer123/n/nf82ad6c5fd1c)