40
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZOZOAdvent Calendar 2024

Day 9

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

Posted at

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

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

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

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

準備

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

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

new_rgb.png

準備はバッチリです。

アーキテクチャ

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

アーキテクチャ図

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

実装

Lambda関数を作る

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

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)
コード全文(クリックして展開)
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)

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

SESでメールを受信する

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

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

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

ルールの作成1
ルールの作成2
ルールの作成3
ルールの作成4
ルールの作成完了

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

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

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

注意点

結果

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

result.png

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

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

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

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

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

40
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?