高木のブログ

Raspberry Piを使ってSwitchBot 温湿度計のデータをMackerelで可視化する

2020/12/16

この記事は、「Raspberry Pi Advent Calendar 2020」16日目の記事です。

はじめに

最近、SwitchBot 温湿度計を購入しました。
いろいろ連携させるためには別でSwitchBotハブというものが必要みたいで、急遽代わりにRaspberry Piも購入しました。
(SwitchBotハブではなくRaspberry Piを購入した理由は、スマートリモコンはNature Remoを使っているのでいらなかったのとRaspberry Piなら他にも有効活用できると思ったので。)

今回はRaspberry Piを使って温度や湿度をMackerelで可視化してみたという記事です。

SwitchBot 温湿度計

SwitchBot(スイッチボット) 温湿度計,スマホで温湿度管理,スマート家電, Alexa, GoogleHome, IFTTT対応

手順

各種バージョン

  • Raspberry Pi OS: 10.6
  • Python: 3.7.3
  • pip: 18.1
  • mackerel-agent: 0.70.3

1. SwitchBot 温湿度計のデータを読み取るスクリプトを作成する

既に実装されている方がいらしたので、参考にさせていただきました。(参考にリンク貼ってあります。)
そのままmackerel-agentで使えるフォーマットで値を出力しています。

{metric name}\t{metric value}\t{epoch seconds}

1.1. 必要なパッケージをインストール

$ sudo apt-get install libglib2.0-dev

1.2. bluepyのインストール

$ pip3 install bluepy

1.3. bluepy-helperにsudo権限を付与する

$ sudo setcap 'cap_net_raw,cap_net_admin+eip' bluepy-helper

1.4. SwitchBot 温湿度計のMACアドレスを確認する

SwitchBot公式アプリで確認することができます。別記事で書いたのでそちらを参照してください。1

1.5. 作成したコード

変数macaddrには1.4で調べた温湿度計のMACアドレスが入ります。

swithbot-meter.py
import binascii
from bluepy.btle import Scanner, DefaultDelegate
import time

macaddr = 'xx:xx:xx: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 != 22): continue

      servicedata = binascii.unhexlify(value[4:])

      battery = servicedata[2] & 0b01111111
      temperature = (servicedata[3] & 0b00001111) / 10 + (servicedata[4] & 0b01111111)
      isTemperatureAboveFreezing = servicedata[4] & 0b10000000

      if not isTemperatureAboveFreezing:
        temperature = -temperature

      humidity = servicedata[5] & 0b01111111

      print('\t'.join(['switchbot.meter.battery', str(battery), str(time.time())]))
      print('\t'.join(['switchbot.meter.temperature', str(temperature), str(time.time())]))
      print('\t'.join(['switchbot.meter.humidity', str(humidity), str(time.time())]))

      exit()

scanner = Scanner().withDelegate( ScanDelegate() )
scanner.scan(10)
$ python3 swithbot-meter.py
switchbot.meter.battery 100     1608048131.531135
switchbot.meter.temperature     21.5    1608048131.5313609
switchbot.meter.humidity        40      1608048131.5314553

2. MackerelにSwitchBot 温湿度計のデータを送信する設定をする

Raspberry Piにmackerel-agentをインストールする方法は別記事で書いたのでそちらを参照してください。2

2.1. mackerel-agentの設定ファイルに追記する

$ sudo vim /etc/mackerel-agent/mackerel-agent.conf
/etc/mackerel-agent/mackerel-agent.conf
+ [plugin.metrics.switch-meter]
+ command = "python3 /path/to/swithbot-meter.py"
+ user = "pi"

2.2. mackerel-agentを再起動する

sudo systemctl restart mackerel-agent

結果

しばらくするとグラフが出てきました。 Mackerelカスタムメトリックグラフ

おわりに

後ほど追記します。。。

参考


Written by ytkg, Twitter, GitHub

Pixela