SwitchBot温湿度計と一緒に、SwitchBot プラグミニも購入していました。
元々は、屋根裏の換気扇を遠隔でオンオフできるようにと思っていましたが、屋根裏の電気工事が進んでいないため、エアコンの消費電力を測定してみることにしました。
サーバ環境:
CentOS Stream 8
Zabbix 5.0.26
実現方法
SwitchBot プラグミニは、消費電力の情報や電源のオン/オフなどをBLE(Bluetooth Low Energy)を使用し、スマホアプリとやりとりしています。
また、この製品は、Wi-Fiを搭載しており、単体でもクラウドに繋がり、APIで値を取得することができます。
今回もLinuxサーバ上のZabbixでデータを取り込みますが、前回のSwitchBot温湿度計と同様にBluetoothで取得します。
あとは、取得した消費電力(W)をZabbixでグラフ化します。
サーバのBluetooth準備
SwitchBot プラグミニの時と同様です。
SwitchBot温湿度計の値をLinuxで取得しLINEへ通知 | KUSONEKOの見る世界
LinuxサーバでBluetoothを使用し、SwitchBot温湿度計プラスの情報を取得しました。その情報からZabbixでグラフやアラートをLINEに通知できるようにしました。
ZabbixでSwitchBot プラグミニの値を取得
Zabbix用スクリプト作成
SwitchBot プラグミニは、温湿度計プラスと違い、常にManufacturerに情報が載りブロードキャストされているようです。
以下のスクリプトを参考にさせてもらいつつ作成しました。
SwitchBot 温湿度計の測定値を BLE Advertisement パケットから直接読み取る - Qiita
はじめに先日、Amazon でセールになっていたので SwitchBot 温湿度計(SwitchBot Meter) を購入しました。この機器は Bluetooth を内蔵しており、温度・湿度を本体でデジタル表示するとともに、...
macaddrの部分は、プラグミニのBLEのMACアドレス小文字です。
# vi switchbot-plugmini_zabbix.py import binascii from bluepy.btle import Scanner, DefaultDelegate macaddr = 'a0:76:4e:xx:xx:xx' class ScanDelegate(DefaultDelegate): def __init__(self): DefaultDelegate.__init__(self) def handleDiscovery(self, dev, isNewDev, isNewData): if dev.addr != macaddr: return for (adtype, desc, value) in dev.getScanData(): if (adtype != 255): continue manufacturer = binascii.unhexlify(value) isState = ( manufacturer[9] & 0b10000000 ) >> 7 Rssi = manufacturer[11] isOverload = ( manufacturer[12] & 0b10000000 ) >> 7 Power = ( ( ( manufacturer[12] << 8 ) + manufacturer[13] ) & 0x7fff ) / 10 print( 'Power on: ' + str( bool( isState ) ) ) print( 'AP RSSI: -' + str( Rssi ) ) print( 'isOverload: ' + str( bool( isOverload ) ) ) print( 'Watt: ' + str( Power ) ) exit() scanner = Scanner().withDelegate( ScanDelegate() ) scanner.scan(10)
実行すると以下のように出力されます。
# python3 switchbot-plugmini_zabbix.py Power on: True AP RSSI: -52 isOverload: False Watt: 230.3
isOverloadは15Aを超えた場合にTrueになるはずです。
Zabbix Agentで実行テスト
Zabbix Agentの設定変更。
# vi /etc/zabbix/zabbix_agentd.conf (最後に追記) AllowKey=system.run[python3 /root/switchbot-plugmini_zabbix.py]
ZabbixでPythonを実行するには、rootユーザである必要があります。
# vi /usr/lib/systemd/system/zabbix-agent.service (ユーザ、グループを変更) User=root Group=root
# systemctl daemon-reload # systemctl restart zabbix-agent
作成したスクリプトをZabbix Agentで実行します。
# zabbix_agentd -t "system.run[python3 /root/switchbot-plugmini_zabbix.py]" system.run[python3 /root/switchbot-plugmini_zabbix.py] [t|Power on: True AP RSSI: -55 isOverload: False Watt: 12.8]
Zabbix グラフ作成
SwitchBot プラグミニの値の取得は、マスターアイテムで一括取得し、依存アイテムでマスターから必要な値を取ることにします。
アイテム作成(マスター)
[設定]→[ホスト]→[Zabbix server]→[アイテム]
[アイテムの作成]を押下。
名前:SwitchBot PlugMini Master
タイプ:Zabbixエージェント
キー:system.run[python3 /root/switchbot-plugmini_zabbix.py]
データ型:文字列
監視間隔:1m
[追加]を押下。
アイテム作成(依存アイテム)消費電力
[設定]→[ホスト]→[Zabbix server]→[アイテム]
[アイテムの作成]を押下。
名前:SwitchBot PlugMini Watt
タイプ:依存アイテム
キー:switchbot.plugmini.watt
マスターアイテム:SwitchBot PlugMini Master
データ型:数値(浮動小数)
単位:W
保存前処理
名前:正規表現
パラメータ:Watt:.+?(\d+\.\d+)
:\1
[追加]を押下。
グラフ作成
[設定]→[ホスト]→[Zabbix server]→[グラフ]
[グラフの作成]を押下。
名前:SwitchBot PlugMini
アイテム: SwitchBot PlugMini Wattを追加する。
[追加]を押下。
アイテムで作成した名前を選択。
グラフの形式:面
色:お好きな色に
[追加]を押下。
過去1日のkWh
ついでに、過去一日の消費電力量(kWh)が見えるようにしてみます。
データが集まれば、消費電力が多い日が見えてくるでしょう。
1分間隔で取得している値なのでWmとなり、それを60で割ればWhとなるはず。
アイテム作成(計算アイテム)
[設定]→[ホスト]→[Zabbix server]→[アイテム]
[アイテムの作成]を押下。
名前:SwitchBot PlugMini Watt Hour of Day
タイプ:計算
キー:switchbot.plugmini.watt.sum
式:sum(switchbot.plugmini.watt,1d)/60
データ型:数値(浮動小数)
単位:Wh
監視間隔:1m
[追加]を押下。
グラフ作成
[設定]→[ホスト]→[Zabbix server]→[グラフ]
[SwitchBot PlugMini]を押下。
アイテム: SwitchBot PlugMini Watt Hour of Dayを追加する。
[追加]を押下。
アイテムで作成した名前を選択。
グラフの形式:線
Y軸:右
色:お好きな色に
[更新]を押下。
クラウドAPIから取得する場合
SwitchBot プラグミニが、Wi-Fiでクラウドに接続出来ていれば、LinuxでBluetoothを使わなくても、curlで情報の取得ができます。
SwitchBotアプリの[プロフィール]→[設定]
アプリバージョンをタップしまくる。
表示された[開発者向けオプション]でクラウドのトークンを取得できます。
[プラグミニ]→[設定]→[デバイス情報]
でMACアドレスを確認できます。
あとは、以下のようにcurlで情報が取得できます。(私はハブミニを持っていないので、温度湿度は出てきません)
curl -s -X GET "https://api.switch-bot.com/v1.0/devices/MACアドレスの大文字コロン無し/status" -H "Authorization: トークン" -H "Content-Type: application/json; charset=utf8" | jq { "statusCode": 100, "body": { "deviceId": "A0764E******", "deviceType": "Plug Mini (JP)", "hubDeviceId": "A0764E******", "power": "on", "voltage": 98.1, "weight": 265.7, "electricityOfDay": 982, "electricCurrent": 32.01 }, "message": "success" }