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を送ってください。お待ちしております。

Related Articles

RAMマウントをQi対応にする
· 2 min read
Desk Tour 2021.04
· 4 min read
Soundcore Life Q30
· 3 min read