なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

VictoriaMetrics + Grafana で SwitchBot で取得した温度・湿度を可視化したい

SwitchBot 、便利ですよね。
そこそこ安くて、かつ一応 SwitchBot にロックインされるということもないので、わたしも使っています。

ところで、 SwitchBot の温湿度計やプラグでは、 API 経由で各種値が取得できます。
今回はそれらを VictoriaMetrics という時系列データベースに保存し、 Grafana で可視化してみようと思います。

今回は、 Vultr VPS 上にある Alpine Linux に Docker 経由でインストール、設定するということを想定します (自鯖欲しかったけどね。。。)
ということで、まずは Docker のインストールから。

$ sudo apk add docker
$ sudo rc-update add docker boot
$ sudo service docker start

起動したら各種コンポーネントの設定を行っていきます。
今回は別件で Alpine Linux 上で別の Web サービスをホストしているので、とりあえず Grafana だけ見られるようにします。

version: "3.7"
services:
  victoriametrics:
    image: victoriametrics/victoria-metrics:stable
    container_name: victoriametrics
    restart: always
    volumes:
      - vmdata:/storage
    command:
      - "--storageDataPath=/storage"
    networks:
      - vm_net

  grafana:
    image: grafana/grafana:10.0.2
    depends_on:
      - victoriametrics
    environment:
      GF_FEATURE_TOGGLES_ENABLE: publicDashboards
      # 他あれば雑に
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
      - ./datasources:/etc/grafana/provisioning/datasources/
    networks:
      - vm_net

volumnes:
  vmdata:
  grafana-data:

networks:
  vm_net:

あとは、 Grafana に対して、プロビジョニング用のデータソースも設定しておきます。

datasources:
  - name: VictoriaMetrics
    type: prometheus
    url: "http://victoriametrics:8428/"

必要最低限の設定はこんな感じ。
この状態で docker compose up すると、起動して Grafana のダッシュボード上にサンプルデータが表示されます。
データソースとして、 VictoriaMetrics が登録されていることも確認しておきましょう。
ただし、中身は虚無なので、ここから SwitchBot との連携を行っていきます。

docker-compose.yml に下記を追加します。

services:
 switchbot:
    image: nasa9084/switchbot-exporter:0.3.0
    container_name: switchbot
    environment:
      SWITCHBOT_OPENTOKEN: ${SWITCHBOT_ACCESS_TOKEN}
      SWITCHBOT_SECRETKEY: ${SWITCHBOT_CLIENT_SECRET}
    restart: always
    networks:
      - vm_net

また、 VictoriaMetrics の設定として下記のデータも追加します。

scrape_configs:
  - job_name: SwitchBot
    metrics_path: /metrics
    scrape_interval: 5m
    static_configs:
      - targets:
          - "SWITCHBOT_DEVICE_BLE_MAC" # 設定画面のデバイス情報の BLE MAC アドレスから `:` を除いたものが ID になる
    relabel_configs:
      - source_labels:
          - __address__
        target_label: __param_target
      - source_labels:
          - __param_target
        target_label: instance
      - target_label: __address__
        replacement: "switchbot:8080"

scrape_interval は SwitchBot の API リミットに引っかからない程度にしましょう。
GitHub のドキュメントによると、 10000 req/day らしいので、1 デバイスなら 1m とかでも余裕です。

追加したら、これも設定してあげましょう。

services:
 vmagent:
    image: victoriametrics/vmagent:stable
    container_name: vmagent
    depends_on:
      - victoriametrics
      - switchbot
    restart: always
    ports:
      - "8429:8429"
    volumes:
      - vmagentdata:/vmagentdata
      - "./exporters/prometheus.yml:/etc/prometheus/prometheus.yml"
    command:
      - "--promscrape.config=/etc/prometheus/prometheus.yml"
      - "--remoteWrite.url=http://victoriametrics:8428/api/v1/write"
    networks:
      - vm_net

volumes:
  vmagentdata:

あとは雑に docker compose up してあげれば、 SwitchBot から定期的にデータが取得され、保存、閲覧できるようになります。
割と簡単 (ダッシュボードは自分で設定してね)。