先だって、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_configs
のtargets
には温湿度計の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を送ってください。お待ちしております。