システムのアラートはメールや電話やSlackなどに届きますよね。
つまりスマホが手元にないと大ピンチ! 入浴中にアラートが鳴ったら大変です。
1秒でも早く気づけるように、今日からアラートをお風呂に通知しましょう!!
お風呂にスマホを持ち込めば良いのでは?というツッコミはだめです。
準備
まずは電球をSwitchBotのスマート電球に取り替えます。
試しにSwithBotアプリから操作してみます。
準備はバッチリです。
アーキテクチャ
汎用性を考えてメールをトリガーにします。DatadogやNew Relicなどの監視SaaSで、アラートの通知先にメールアドレスを登録して使います。
ちなみにこんなことをしなくても、SwitchBotはIFTTTと連携できます。
実装
Lambda関数を作る
APIを叩いて電球の色をrgb(255,0,0)
にするコードを書きます。
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)
コード全文(クリックして展開)
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)
そしてLambda関数を作ります。詳しい手順は以前の記事をご覧ください。
SESでメールを受信する
次はSESの作業です。難しそうに見えて、実は受信だけならカンタンです。
まずはどこかでドメインを手に入れて、DNSレコードを登録しSESで認証します。
ルールセットとルールを作り、メールアドレスと実行するLambda関数を指定します。
たったこれだけで完成です!
これでメールを受信するとLambda関数が実行されるようになりました。
なお、Lambda関数の画面には何も表示されないのでお知りおきください。
結果
アラートをテスト通知すると、お風呂がrgb(255,0,0)
に染まりました。
これなら絶対に気づけますね! オンコールの担当日も安心して長風呂できます!
最後までお読みいただきありがとうございました。
万が一真似される場合は自己責任でお願いします。
SwitchBotのスマート電球の取扱説明書には次の記載があります。
・水滴のかかる状態や湿度の高いところで使用しないでください。(破損・絶縁不良の原因)
・本製品は乾燥の屋内のみでご使用ください。
・低温・防水仕様ではないので、結露が起こる場所では使用しないでください。