ホーム » 「SwitchBot」タグがついた投稿
タグアーカイブ: SwitchBot
Switchbot 温湿度CO2センサー
最初の確認
{ "statusCode": 100, "body": { "version": "V1.5", "temperature": 24.9, "battery": 100, "humidity": 58, "CO2": 999, "deviceId": "xxxxxxxxxxxx", "deviceType": "MeterPro(CO2)", "hubDeviceId": "000000000000" }, "message": "success" }
Munin, nagios4 でモニタリング
先に、温湿度モニタで実験してあったから、CO2も含めた Munin でのモニタリング、nagios4 での監視も早々に動き出す。
半日ほどモニタリングした状況だと、朝寒く暖房をかけると、1500[ppm]程から、6000[ppm]まで一度に増えている。CO2モニターを販売している製品の資料を見ると、1000[ppm]を越えると眠気や不快感といった記載もあるし、2500[ppm]を越えると健康被害が予想されるといった記載もある。でもストーブ付けたら、簡単に越えてしまっている。
定常状態(部屋に猫1匹)だと500[ppm]ほどか。
Switchbot CO2センサーようやく配送
10/20に注文した SwitchBot の 温湿度 CO2 センサーだけど、かなり待たされた。
今日は急遽宿直になったし、黒猫なら宿直明けに配送分配所に受け取りに行こうとおもったけど、黒猫のトラッキングIDがない。よくよく見ると 配送 Amazon になってる。そっか、”宅配”じゃないんだ。
Switchbot 温湿度計のファームウェアが更新できない
Switchbot API を使って温湿度計のデータを取得できるようにはなったけど、バッテリー状態は常に 100% 表示。
Switchbot の OpenWonderLabs / SwitchBotAPI の README だと、Swichbot 温湿度計の最新は V4.2 と書いてあるけど、アプリで確認するけど、V0.8 の表示。これが原因かと温湿度計のファームウェアの更新をかける(裏ボタンを押しながら乾電池ONでアプリから更新を行う)けど、ファームウェア更新の表示はでるけど、バージョンは相変わらず V0.8 のまま。
原因不明だなぁ…
curl で switchbot API v1.1 を呼出す
Amazon タイムセールで、SwitchBot CO2 センサー付き温湿度計の割引がでていたので、Hub mini セットで発注。CO2センサーは以前 CCS811 でモニタリングしていたけど、もともと精度が悪かったし異常値がでるようになってモニタリングをやめてるので、SwitchBot で復活させたくて、買ってしまった。だけど、CO2センサーは発送が始まらず、Hub mini だけが届く。ということで、ひとまず Hub mini で遊ぶ。
curl で switchbot API の情報を取得する
Python などで API をたたく記事が多いけど、もう少しシンプルにできないかということで、手抜き curl で試してみる。
まずは、最もシンプルな、v1.0 で取得する方法。
最初の token, secret には、SwitchBot スマホアプリで入手したものを書き込む。(v1.0では secret 使ってないけど)
#!/bin/bash token="xxxxxx....xxxxxxx" secret="yyyy...yyy" url_list_v10="https://api.switch-bot.com/v1.0/devices" curl -s -H "Authorization:${token}" "${url_list_v10}"
switchbot API v1.1 で取得する
ちょっと面倒だけど、セキュリティ的には v1.1 で取得するのが定番。最初は Unauthorized で失敗して色々と試行錯誤したけど、openssl … -binary がキモだった。(こちらの記事を見て、sha256 のハッシュの形式が違うのに気づけた。)
#!/bin/bash token="xxxxxx....xxxxxxx" secret="yyyy...yyy" t="$(/usr/bin/date +%s%3N)" # time = Epoch time 13桁 nonce="$(/usr/bin/uuidgen)" # uuid sign=$(echo -n "$token$t$nonce" \ | /usr/bin/openssl dgst -sha256 -hmac "$secret" -binary \ | /usr/bin/base64 -w 0) url_list_v11="https://api.switch-bot.com/v1.1/devices" curl -s --request GET \ -H "Content-Type: application/json" \ -H "Authorization: ${token}" \ -H "sign: ${sign}" -H "nonce: ${nonce}" -H "t: ${t}" \ "${url_list_v11}"
取得した json コンテンツから特定のデバイスの情報を抜粋する
結果は、JSON 形式なので、jq を使って必要な場所だけ抜粋する。
$ bash swbot.sh \ | jq '.body.deviceList[] | select( .deviceId == "ZZZZZZZZZZZZZZZZ")'
Switchbot meter plus から温度,湿度を表示
Switchbot Hub mini が無い時は、温湿度計(meter plus)からのデータ取得は Bluetooth 経由で動かしていたので、Raspberry Pi で温度を取得していたが、この方法であれば LAN 接続であればどこからでも取得可能なので便利。
(略) swbot_meter="ZZZZZZZZZZZZZZZZ" url_list_v11_meter="${url_list_v11}/${swbot_meter}/status" curl -s --request GET \ -H "Content-Type: application/json" \ -H "Authorization: ${token}" \ -H "sign: ${sign}" -H "nonce: ${nonce}" -H "t: ${t}" \ "${url_list_v11_meter}" \ | jq -r '.body | "Temperature: " + (.temperature|tostring) + "C\n" \ + "Humidity: " + (.humidity|tostring) + "%"'
これで、温度、湿度がとれる。これなら munin 用のスクリプトも shell で簡単に書けそう。だけど、バッテリー残量(.battery)は 60% 台まで落ちているはずだけど、100% なんだよな。他の SwitchBot Plug でも、電力値が取れなかったりと SwitchBotAPI は、全機能を網羅していない様子。
Switchbot Plug の制御
電気毛布が必要な時期、外出時の電源を切り忘れるのを防ぐために、昨年導入していた Switchbot Plug 。
スマホの SwitchBot アプリのタイマー機能で朝に強制オフの制御していたけど、寝る時にスイッチを入れるのは、自分が不在の時だとムダだし、homebridge や cron で制御するのも面白そう。
switchbot-utility のインストール
ということで、Raspberry-Pi に、switchbot-utility をインストール。
((( 事前にSwitchbot アプリは設定済み ))) $ sudo pip3 install switchbot-utility $ cd /usr/local/lib/python3.9/dist-packages/switchbot_utility
制御するには、Switchbot アプリのトークンと秘密鍵が必要なので、アプリを起動して「プロフィール」、「設定」の画面を開いて、「アプリバージョン」の表示を 10 回連打すると、「開発者向けオプション」を表示できる。この画面を開いてトークンとクライアントシークレットをコピーし、上記の switchbot_utility のフォルダ内に、settings.json のファイル名で保存。
Python で以下のスクリプトを実行すると、switchbot-utility で扱えるデバイスの一覧 deviceList.txt が作られる。
((( settings.json ))) // Switchbot アプリで取得したトークンとシークレットを、 // switchbot_utilitiy のフォルダに settings.json で保存しておく { "token": "xxxxx....", "secret": "yyyyy...." } ((( devicelist.py ))) // Python で以下のスクリプトを実行すると、deviceList.txt が作られる。 // 以下を devicelist.py で保存し、python3 devicelist.py で実行! from switchbot_utility.switchbot import Switchbot switchbot = Switchbot() switchbot.devicelist() ((( deviceList.txt ))) 441793xxxxxx, 電気毛布, Plug, 000000000000 C5B496xxxxxx, エアコン, Bot, 000000000000
実際に、Switchbot Plug を動かすために、下記のscriptでスイッチを制御できるようにしてみた。
#!/usr/bin/python3 # -*- mode: python; coding: utf-8; tab-width: 4 ; -*- # SwitchBot をON/OFFする import sys import time import os from switchbot_utility.switchbot_plug import SwitchbotPlug # ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ # 制御するSwitchBot に合わせて、上記~~~ を書き換える。 sb_dir = '/usr/local/lib/python3.9/dist-packages/switchbot_utility' # Switch Bot Plug MAC ADDR # deviceList.txt 調べた MACアドレスを記入 sb_plug_macaddr = '441793xxxxxx' # コマンドライン引数プロセス名 script_file_name = sys.argv.pop( 0 ) # コマンドライン引数 -d <デバイスID> while len( sys.argv ) >= 2 and sys.argv[0] == '-d' : sys.argv.pop( 0 ) sb_plug_macaddr = sys.argv.pop( 0 ) # setting.jsonを読み込むため os.chdir( sb_dir ) # SwitchBot Plug に接続 sb_plug = SwitchbotPlug( sb_plug_macaddr ) # ~~~~~~~~~~~~~ この部分に制御対象用のコンストラクタを書けばいい if len( sys.argv ) == 0 : # 引数なしは、状態を表示 print( sb_plug.get_power() ) elif len( sys.argv ) == 1 : # status | on | off | toggle or turn arg = sys.argv.pop() if arg == 'status' : # exitでスイッチ状態を返す sys.exit( 0 if sb_plug.get_power() == 'on' else 1 ) elif arg == 'on' : sb_plug.turn_on() # ON elif arg == 'off' : sb_plug.turn_off() # OFF elif arg == 'toggle' or arg == 'turn' : # スイッチを反転 pw = sb_plug.get_power() if pw == 'on' : sb_plug.turn_off() elif pw == 'off' : sb_plug.turn_on()
このプログラムを、homebridge-cmdswitch2 の設定に加える。
{ "platform": "cmdSwitch2", "name": "cmdSwitch2", "switches": [ { "name": "電気毛布", "on_cmd": "/usr/local/bin/switchbot-plug.py on", "off_cmd": "/usr/local/bin/switchbot-plug.py off", "state_cmd": "/usr/local/bin/switchbot-plug.py status" } ] }
ということで、「OK Google, 電気毛布を点ける」でON、朝は起床時間にあわせたタイマーでOFF完成。
SwitchBot プラグを使ってみた
SwitchBot プラグを使ってみた。スマホのSwitchBot アプリで初期化を行うけど、SwitchBot-XXXX の WiFi につながるけど初期化ができない。原因が分からず四苦八苦したけど、SwitchBot のホームページで確認したら、SwichBot アプリのローカルネットワークの接続権限が Off になっていた。
ただ、Raspberry-Pi で動かしている Homebridge では対応していない様子。
SwitchBot プラグに電気毛布をつなげたので、ひとまずスマホアプリにて「ON/OFFタイマー」を設定する。
SwitchBotの導入
我が家で、新たに SwitchBot を導入し、エアコンのリモコンを操作させてみた。コンセントプラグ構造のスマートプラグを導入する方法もあるけど、エアコンは電力も大きいし、コンセントプラグの形状も違うので SwitchBot を選んだ。
まずはボタン動作の確認
うちのエアコン nocria は RFリモコンなので、赤外線信号では制御できない。仕方がないので、SwitchBotでリモコンのスイッチを直接押させる。基本的な使い方は、スマホにアプリを入れて SwitchBot を見つけて登録するだけ。スイッチを押す機能が確認できたので、エアコンのリモコンに貼り付け。貼り付けた場所が開く構造なので、押す動作で開きっぱなしになる可能性があったので、奥さんのヘアゴムで押さえる。
Homebridgeに登録しスマートスピーカで制御
homebridgeを導入してるので homebridge-switchbot-ble をインストール。スマホアプリで SwitchBot の Bluetooth の MACアドレスが確認できるので、これらの情報を登録するだけで簡単。これで、google home や Siri から「Ok google (or Hey Siri), エアコンをつける」ができるようになった。
ただし、プッシュ動作しかできないので、現在エアコンがついているのか解らないし、エアコンを消しても「自動クリーニング」状態になるので、ON-自動クリーニング-OFF の3状態。遠隔でON/OFFには使えない。(部屋の温度に応じてエアコンを自動でON/OFFはできない)
次にエアコンを買い替えるときは、素直に赤外線リモコンの機種か、最初からスマートスピーカ対応の機種だなぁ…。