KUSONEKOの見る世界

SwitchBot プラグミニの消費電力を取得しZabbixでグラフ化

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を追加する。
    [追加]を押下。
    アイテムで作成した名前を選択。
    グラフの形式:面
    色:お好きな色に

[追加]を押下。

SwitchBot プラグミニ  消費電力 Zabbixグラフ

過去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軸:右
    色:お好きな色に

[更新]を押下。

SwitchBot プラグミニ  kWh Zabbixグラフ

クラウド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"
}

参考