見出し画像

SwitchBotの温湿度計を購入しました

乾燥し過ぎていると風邪なんかにかかりやすくなりますし、肌もパリパリしていいことがないです。とはいえ肌感覚だけで湿度に気を付けることはできないので、温湿度計を購入することにしました。んで、購入したのが以下の「SwitchBot 温湿度計プラス」と、「SwitchBot ハブミニ」です。

SwitchBot温湿度計プラスとハブミニ

温湿度計プラスはマグネットが付いていて壁に取り付けることが出来ます。

SwitchBot温湿度計プラス取付

可読性も高く非常に良い感じです。南向きのリビングでは外気温と比べて、思った以上に室内温度が高くなるんだなぁとか思ったりしています。

非常によかったので、先日のAmazonタイムセールで「SwitchBot温湿度計」を購入してみました。プラスととれるデータに違いはなくって700円お安いので、キッチンと寝室用に2つ購入してみました。

SwitchBot温湿度計

大きな問題はないんですが、思った以上に文字が細くて可読性が低いのが残念でした。

SwitchBot温湿度計

SwitchBot製品は「ハブミニ」を介してインターネットにつなげることが出来ます。所謂IOTですね。アプリを使って外出先から各部屋の温度を確認したり、エアコンやテレビを点けることもできます。

SwitchBotアプリ

更には、アプリに表示されているような情報を取得したり、操作することがAPIから出来ます。例えば以下のコードを実行すると

import time
import hashlib
import hmac
import base64
import uuid
import configparser

import requests

def main():
    base_url, token, secret = get_config()

    url = "{}/v1.1/devices".format(base_url)
    headers = make_headers(token, secret)
    res  = requests.get(url, headers=headers).json()
    devices = res['body']['deviceList']
    meters = []
    
    for device in devices:
        if device['deviceType'] == 'MeterPlus' or device['deviceType'] == 'Meter':
            meters.append(device)
    
    # print(meterplus_ids)
    for meter in meters:
        url = "{}/v1.1/devices/{}/status".format(base_url, meter['deviceId'])
        res = requests.get(url, headers=headers).json()
        print('=======================================')
        print('名前: {}'.format(meter['deviceName']))
        print('気温: {} ℃'.format(res['body']['temperature']))
        print('湿度: {} %'.format(res['body']['humidity']))
        print('=======================================')

def get_config():
    config_ini = configparser.ConfigParser()
    config_ini.read('config.ini', encoding='utf-8')
    base_url = config_ini['switchbot']['url']
    token = config_ini['switchbot']['token']
    secret = config_ini['switchbot']['secret']

    return base_url, token, secret


def make_auth_data(token: str, secret: str):
    # A random UUID generated by developers themselves to blend into the string to sign.
    nonce = str(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())

    return sign, str(t), nonce

def make_headers(token: str, secret: str):
    sign,t,nonce = make_auth_data(token, secret)
    headers={
            "Authorization": token,
            "sign": sign,
            "t": str(t),
            "nonce": nonce,
        }
    return headers

if __name__ == '__main__':
    main()

以下のように温湿度計にアプリ上で設定した名前と、温度湿度が表示されます。

スクリプトの実行結果

これを応用すれば、湿度が下がったらアラートしたり(アプリでもできますが)、湿度や気温をキーにしてエアコン等周辺の機器を稼働させたりできるはずです。夢が広がりますね。

ちなみにSwitchBotシリーズはAmazonのタイムセールでほぼ毎度値引きされているようなので、購入するのであればそのタイミングがお薦めです。


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?