【ネタ】絶対に監視アラートに気づけるお風呂、できました

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/696c6f1f-c816-e456-bf34-f7e5aec96cf0.gif' width='50%'>

システムのアラートはメールや電話やSlackなどに届きますよね。

つまりスマホが手元にないと大ピンチ！ 入浴中にアラートが鳴ったら大変です。

1秒でも早く気づけるように、今日からアラートをお風呂に通知しましょう!!

*お風呂にスマホを持ち込めば良いのでは？というツッコミはだめです。*

# 準備

まずは電球をSwitchBotのスマート電球に取り替えます。

https://www.switchbot.jp/products/switchbot-color-bulb

試しにSwithBotアプリから操作してみます。

![new_rgb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/46681804-0327-9c58-87c9-c7d68c10b076.png)

準備はバッチリです。

# アーキテクチャ

汎用性を考えてメールをトリガーにします。DatadogやNew Relicなどの監視SaaSで、アラートの通知先にメールアドレスを登録して使います。

![アーキテクチャ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/238cd875-8cf1-6877-7e53-5afe8330281a.png)

*ちなみにこんなことをしなくても、SwitchBotはIFTTTと連携できます。*

# 実装

### Lambda関数を作る

APIを叩いて電球の色を`rgb(255,0,0)`にするコードを書きます。

```python: main.py（一部を抜粋し改変）
device_id, token, secret = _get_secrets()
api_header = _create_header(token, secret)

url = f'https://api.switch-bot.com/v1.1/devices/{device_id}/commands'
payload = {
  'command': 'setColor',
  'parameter': '255:0:0'
}

requests.post(url, headers=api_header, json=payload)
```

<details><summary>コード全文（クリックして展開）</summary>

```python: main.py
import base64
import hashlib
import hmac
import json
import time
import uuid

import botocore
import botocore.session
import requests
from aws_secretsmanager_caching import SecretCache, SecretCacheConfig


# Secret Managerからシークレットを取得（面倒くさい場合は環境変数などでどうぞ）
# ref. https://github.com/aws/aws-secretsmanager-caching-python

client = botocore.session.get_session().create_client('secretsmanager')
cache_config = SecretCacheConfig()
cache = SecretCache( config = cache_config, client = client)

def _get_secrets():

  secret_string = cache.get_secret_string('switchbot-led')
  secret_json = json.loads(secret_string)
  device_id = secret_json['device_id']
  token = secret_json['token']
  secret = secret_json['secret']

  return device_id, token, secret


# リクエストヘッダーの作成（認証のため）
# ref. https://github.com/OpenWonderLabs/SwitchBotAPI

def _create_header(token, secret):

  api_header = {}

  nonce = uuid.uuid4()
  t = int(round(time.time() * 1000))
  string_to_sign = '{}{}{}'.format(token, t, nonce)
  string_to_sign = bytes(string_to_sign, 'utf-8')
  secret = bytes(secret, 'utf-8')
  sign = base64.b64encode(hmac.new(secret, msg=string_to_sign, digestmod=hashlib.sha256).digest())

  api_header['Authorization']=token
  api_header['Content-Type']='application/json'
  api_header['charset']='utf8'
  api_header['t']=str(t)
  api_header['sign']=str(sign, 'utf-8')
  api_header['nonce']=str(nonce)

  return api_header


# メインの処理

def lambda_handler(event, context):

  device_id, token, secret = _get_secrets()

  api_header = _create_header(token, secret)

  url = f'https://api.switch-bot.com/v1.1/devices/{device_id}/commands'
  payload = {
    'command': 'setColor',
    'parameter': '255:0:0'
  }

  response = requests.post(url, headers=api_header, json=payload)
  return f"{response.status_code}: {response.json()['message']}"


if __name__ == "__main__":
  lambda_handler(None, None)
```

</details>

---

そしてLambda関数を作ります。詳しい手順は以前の記事をご覧ください。

https://qiita.com/tippy/items/adc3c53d7928e60c5162

### SESでメールを受信する

次はSESの作業です。難しそうに見えて、実は受信だけならカンタンです。

まずはどこかでドメインを手に入れて、DNSレコードを登録しSESで認証します。

https://docs.aws.amazon.com/ja_jp/ses/latest/dg/receiving-email-verification.html

ルールセットとルールを作り、メールアドレスと実行するLambda関数を指定します。

![ルールの作成1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/14a48581-9aae-873e-d6d2-2199f5bd6f90.png)
![ルールの作成2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/1b2d80d0-5109-f0a0-9595-6e8c1e84f49f.png)
![ルールの作成3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/8ec535e6-e863-5fae-2b66-913ff105e8b3.png)
![ルールの作成4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/87d4f00e-cbb6-5dfa-646f-a8a2d0b74b3a.png)
![ルールの作成完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/19958702-ded3-ec35-47c8-8dbb1817ec1a.png)

たったこれだけで完成です！ :tada:

これでメールを受信するとLambda関数が実行されるようになりました。

なお、Lambda関数の画面には何も表示されないのでお知りおきください。

![注意点](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/49bbceea-e574-65ce-b172-b774ab493e53.png)

# 結果

アラートをテスト通知すると、お風呂が`rgb(255,0,0)`に染まりました。

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/4161bc0a-2e97-f1cd-260e-c92d279207af.png)

これなら絶対に気づけますね！ オンコールの担当日も安心して長風呂できます！

最後までお読みいただきありがとうございました。

:::note warn
万が一真似される場合は自己責任でお願いします。

SwitchBotのスマート電球の取扱説明書には次の記載があります。

・水滴のかかる状態や湿度の高いところで使用しないでください。（破損・絶縁不良の原因）
・本製品は乾燥の屋内のみでご使用ください。
・低温・防水仕様ではないので、結露が起こる場所では使用しないでください。
:::