switchbot-exporterを書いた


2 min read
switchbot-exporterを書いた

先だって、SwitchBot APIのGo言語用クライアント実装であるgithub.com/nasa9084/go-switchbotを書いた、という記事を書きましたが、これを使用してPrometheusでSwitchBot温湿度計の情報を収集できるswitchbot-exporterを書いてみたので紹介します。

switchbot-exporterはblackbox exporterのように、起動時にはターゲットを指定せず、Prometheusがメトリクスを収集する際にrelabel_configでターゲットを与えるタイプのexporterです。
起動時に必要な情報はSwitchBotアプリから取得できるOpenTokenのみです。OpenTokenはコマンドラインオプションか、環境変数SWITCHBOT_OPENTOKEN経由で渡すことができます。

$ switchbot-exporter -switchbot.opentoken=blahblahblah
# or
$ SWITCHBOT_OPENTOKEN=blahblahblah switchbot-exporter

docker imageも用意してありますので、例えばKubernetes上で動かすこともできます:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: switchbot-exporter
spec:
  revisionHistoryLimit: 3
  selector:
    matchLabels:
      app: switchbot-exporter
  template:
    metadata:
      labels:
        app: switchbot-exporter
    spec:
      containers:
        - name: switchbot-exporter
          image: nasa9084/switchbot-exporter:0.1.0
          ports:
            - protocol: TCP
              containerPort: 8080
          env:
            - name: SWITCHBOT_OPENTOKEN
              valueFrom:
                secretKeyRef:
                  name: switchbot
                  key: opentoken
---
apiVersion: v1
kind: Service
metadata:
  name: switchbot-exporter
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: switchbot-exporter

このようにして起動した後、READMEに記載のあるようにprometheusの設定をします

scrape_configs:
  - job_name: switchbot
    scrape_interval: 5m
    metrics_path: /metrics
    static_configs:
      - targets:
          - DFA0029F2622 # meter 01
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: switchbot-exporter:8080

static_configstargetsには温湿度計のIDを記入します。IDは例えばget_switchbot_devices.goの様な簡単なスクリプトで取得することができます。
relabel_configsで、__address_のreplacementにはprometheusがswitchbot-exporterにアクセスする際のURLやアドレスを記入します。

SwitchBot APIのrate limitが1000 requests/dayなので、一日すべての値を取得したい場合は途中でrate limitに引っかからないよう、scrape_intervalをうまく調整して下さい。

設定ができたら、温度はswitchbot_meter_temperatureで、湿度はswitchbot_meter_humidityで取得することができます。デバイスの名前はswitchbot_devicesに格納されていますので、group_leftなどでjoinすると良いでしょう:

switchbot_meter_temperature + ignoring (device_name) group_left(device_name) switchbot_device

後はGrafanaなどを使用すると良い感じにグラフを書くことができます。

できるだけAPI rate limitに影響を与えないよう、device_listはキャッシュして、起動時以降はdevice_listの取得をしないようにしてありますので、デバイスの増減があった場合はSIGHUPを送るか、/-/reloadにアクセスしてdevice_listを更新して下さい。

SwitchBot加湿器などは持っていないので現在のところ温湿度計のみの対応ですが、加湿器を持っていてメトリクスを収集したい、という場合はPull Requestを送ってください。お待ちしております。


SwitchBot APIのGoクライアント、go-switchbotを書いた
Previous article

SwitchBot APIのGoクライアント、go-switchbotを書いた

SwitchBotは所謂IoT機器を扱っているメーカーで、温度計を専用のハブ経由でインターネットに接続し、アプリから室温を確認したり、室温によってエアコンの設定を変更する、などといったホームオートメーションに役立つガジェットを複数販売しています。 しかし、それらのデータを確認できるのはSwitchBotのアプリからか、Bluetooth経由だけ、という状況で、私もHTTPのAPIを用意してくれたら良いのに、とずっと思っていました。 ところが昨日、社のSlackで、こちらのissueを共有してもらい、どうやら昨年12月ごろにはHTTPのAPIが使えるようになっていたっぽいことが分かりました。 我が家にはHub Miniもあり、インターネットに接続してある状態ですから、早速次の手順でtokenを手に入れて試してみました: スマホでSwitchBotのアプリを開く プロフィールタブ > 設定と進み、アプリバージョンを10回連打する 開発者向けオプションが表示されるので、

Desk Tour 2021.04
Next article

Desk Tour 2021.04

COVID-19が猛威を振るい、自宅で勤務するようになり早一年、少しずつ機材を増やし、入れ替え、作業環境を改善してきました。自分のデスクを紹介するDesk Tourの流行も少し落ち着いたところではありますが、ここで一度デスク環境を記録がてらご紹介します。 Overview 全体像としてはこんな感じ。デスクはニトリの組み合わせフリーデスク プレフェを使用しています。天板の幅は140cmです。最近腰痛がアレでアレなので、昇降デスクにしたい気持ちがあります。写真には写っていませんが、イスはアーロンチェアを使用していて、足下にはエルゴノミクスフットレストを置いています。 ディスプレイはLG 27UK850-Wという4K 27インチのディスプレイ2枚をモニターアーム(右がHP、右がエルゴトロン。HPのものもエルゴトロンのOEM商品なのでロゴ以外は実質同じ)で設置しています。


Related Articles

Desk Tour 2021.04
4 min read
Soundcore Life Q30
3 min read

2020年買って良かった物

世間の波に乗って、書いてみる。 ガジェット類 Anker PowerWave 10 Pad(改善版) ワイヤレス充電器は安物だったり、ノベルティでもらった物だったりしか使ったことがなかったためあまりいい印象がなかったが(といってもこれも別に高くはないけど)、改めてちゃんと買って見たら充電速度も十分でかなり良い。 サンワサプライケーブルトレー(メッシュ・汎用タイプ) CB-CT5 クランプでデスク下に付けるタイプのケーブルトレー。デスクの上が大分すっきりした。キーボードの配線だけは現状どうしようもないので、なんとかしたい。

2 min read
Rakuten Mini unpacking
3 min read

GO TOP

🎉 You've successfully subscribed to something tech.!
OK