😎

おうち鯖の電力をカッコよく監視してみた

2023/12/12に公開

この記事は、「UEC 2 Advent Calendar 2023」11日目の記事です。
前回の記事は、すしさんの「2023年を振り返る」でした。

はじめに

UEC21のぼいど(Twitter:@void_tech3)と申します。
工学研究部と呼ばれる謎の団体で、鯖と戯れたり、プラレールで遊んだりしています。
最近Amazonブラックフライデーで勢い余ってSwitchBotSmartPlugを購入してしまったので、今回はこれを使って自宅鯖の電力使用量を可視化してみたというお話です。

用意するもの

  • SwitchBot SmartPlug

    セールで2個セットで、1個1,500円ぐらいでした。+180円ぐらいでHomeKit対応のもあるようなのですが、今回はAPIを使うだけなので安い方にしました。
    また、TP Linkのやつもあるのですが、SwitchBotの方が評価が高かったのでこちらを選びました。

  • 適当な鯖(Proxmox導入済み)
    電通大生なら1台ぐらいはお家に鯖がありますよね?
    今回はZabbixを入れるためにProxmoxを使ってVMを立てましたが、ベアメタルに直接インストールするなら必要ありません。
    そこまでスペックも必要ないので、そこら辺に転がっている鯖で大丈夫です。

PlugMiniを接続してみる

まずはメイン鯖に繋がっているコンセントにPlugMiniを接続します。

コンセントの形状が特殊なのか、ラックで使ってる電源タップに接続できなかったので別の延長ケーブルを噛ませて接続しました。接続後は、ボタンを押してあげると通電するようです。

接続後は、SwitchBotアプリを使って設定をして行きます。手順に従うだけなので簡単です。
アプリで設定してあげると、

こんな感じにリアルタイムで電力の使用量などを確認することができます。

あと、これ本来はライトなどの照明につけてON-OFFできるようにするものなので、間違ってSwitchBotアプリでタップしてしまうと、悲惨なことになってしまいます...


電力を計測したい人のためなのかわからないですが、アプリに「誤操作防止」という設定があったのでONにしておきました。誤ってタップしてしまっても本当にOFFにするかの確認がされるようなので、少し安心かもしれません。
あと、他のSwitchBot製品を使っていてGoogle Homeと連携していたりすると間に勝手消しそうで怖いですね。そういった時は、もはやアカウントを分けてしまった方が良いかも?

SwitchBot APIを試す

まずはSwitchBot APIを用いて、どんな感じのデータが出力できるか確認してみましょう。
まず、API用のTokenを【設定】の【開発社オプション】から取得します。

上にあるトークンをどこかに保存しておいてください。

次にトークンを使って、デバイスの一覧をAPIで取得してみます。

curl -H "Authorization:<TOKEN>" -X GET "https://api.switch-bot.com/v1.0/devices"
{
  "statusCode": 100,
  "body": {
    "deviceList": [
      {
        "deviceId": "<DEVICE ID>",
        "deviceName": "リビング",
        "deviceType": "Plug Mini (JP)",
        "enableCloudService": true,
        "hubDeviceId": "000000000000"
      }
    ],
    "infraredRemoteList": []
  },
  "message": "success"
}

この、<DEVICE ID>からそのデバイスの情報を取得することができます。
以下のように叩くと、

curl -H "Authorization:<TOKEN>" -X GET "https://api.switch-bot.com/v1.0/devices/<DEVICE ID>/status" | jq
{
  "statusCode": 100,
  "body": {
    "deviceId": "34851817E1BE",
    "deviceType": "Plug Mini (JP)",
    "hubDeviceId": "34851817E1BE",
    "power": "on",
    "voltage": 103.3,
    "weight": 68.8,
    "electricityOfDay": 267,
    "electricCurrent": 0.685
  },
  "message": "success"
}

こんな感じにさまざまな情報を取得することができます。

property 内容 単位
voltage 電圧 V
weight 消費電力 W
electricityOfDay その日のデバイスの使用時間 min
electricCurrent 電流 A

今回はこのAPIを用いて情報を定期的に取得することによって、消費電力監視を行います。

Zabbixと連携させる

Zabbixは、OSSの統合監視ツールです。あまり聞き馴染みがないかもしれませんが、ネットワークやサーバーなど様々な情報を一括で監視できるツールになっています。

ネットワーク監視ツールというイメージがある人もいるかもしれませんが、Zabbixは非常に多機能でagentをサーバー内やKubernetesなどに置くことによってサーバーの内部監視を行うこともできます。さらには、IoTのセンサと連携してサーバーラックのCO2濃度や温度湿度などの監視も行うことが可能です。

Zabbixでは外部API経由で監視データを取り込むことができるので、今回はこれを利用してデータ収集を行います。

Zabbixのインストール

まずは、Zabbixがインストールされた環境が必要です。コンテナやクラウドイメージなど色々な方法があるのですが、私はProxmox上に適当な仮想マシンを立ててその上に直接Zabbixをインストールしました。

参考までに私は、CPU2コア、メモリ2GB、ディスク100Gbぐらいの仮想マシンを用意して、Ubuntu Server 22.04 LTSの環境を用意しました。

インストール手順に関しては公式サイトでわかりやすく紹介されています。
https://www.zabbix.com/download
様々な組み合わせがあるようですが、私はApache
Zabbix 6.0 LTS + Ubuntu 22.04 + Server,Frontend,Agent + MySQL + Apache
の構成で構築しました。
注意点としては、MySQLとApacheはあらかじめインストールされた前提で手順が組まれているので、

sudo apt install mysql-server apache2

であらかじめインストールしておきましょう。

無事にインストールが完了すると、http://[サーバーのIP]/zabbixで以下のようなログイン画面が表示されます。デフォルトではAdmin:zabbixでログインできます。

テンプレートの作成

Zabbixにはテンプレートというものが存在します。これは、デフォルトで各メーカーの機器ごとに用意されてるもので、機器との情報交換の形式や得られる情報、グラフなどがセットになっているものです。
標準でSwitchBot APIとの連携はないので、テンプレートを自作します。

まずは、左側のタブから[設定]-[テンプレート]を選択し、

右上のボタンから[テンプレートを作成]します。

適当にグループや名前を設定して作成します。

作成したテンプレートを開いて、今度はアイテムを追加します。右上から「アイテムを作成」してください。

以下のようにAPIのエンドポイントや、Authorization Headerを追加します。

また、取得したデータからBodyを取り出すために次のような保存前処理を追加します。

「テスト」を実行して正常にデータが取れたら大丈夫です!

あとは、取得したデータから得られる各プロパティをアイテムとして追加していきましょう。
先ほど作成したアイテムの依存アイテムとして次のようにアイテムを作ります。

保存前処理は次のような感じです。

同様にして各プロパティごとにアイテムを作っていきます。

最後にデータを確認するためのグラフを作成しましょう。上のグラフタブから

ひとまず、こんな感じに作りました。

最後に作成したテンプレートを使って監視対象のホストを追加します。同じ設定タブから、

よしなにホストを作成してあげます。
あとは、1分おきにデータが追加されていくので数風ぐらい待ってから、監視データのホストのグラフを見てみると、

こんな感じに無事にデータが保存されていることが確認できます。

ただ皆さん思ったのではないでしょうか?なんかこれダサい!!!*
というわけで、別のツールと組み合わせてイケてるグラフにして行きましょう。

Grafanaでの表示

GrafanaはGrafana Labが公開しているログ・データ可視化のためのツールです。OSS版なら無料で使える上に、様々なサービスと連携できるので非常に便利です。
Grafanaを使うことで、イケてるかっこいい監視画面を作ることができます!

Grafanaのインストール

Zabbixと同じく公式ドキュメントに従うだけで手軽に導入できます。
https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/#2-start-the-server
インストールが終わったら、/etc/grafana/grafana.iniを開いてください。
この中の;protocol = httpとなっている行のコメントアウトを外してprotocol = httpにします。

あとは、サービスを再起動すれば

sudo systemctl restart grafana-server

http://[サーバーのIP]:3000でログイン画面が表示されます。
初期パスワードは、admin:adminです。

Zabbixとの連携

AdministrationのPluginsを開いて、ZabbixプラグラインをInstall&Enableします。

あとは、ConnectionsからZabbixのData sourceを追加してあげるだけです。

設定はZabbixのAPIエンドポイントとログイン情報を指定するだけでOKです。

Dashboardの作成

最後にDashboardを作成します。
左のタブからDashboardで「New」を押し、DatasourceにZabbixを指定します。
あとは、次のような感じでHostやItemを指定してあげるとグラフが表示できます。
よしなにカスタマイズしてください。

完成品

Zabbixのグラフと比べるととてもイケてるかっこいいDashboardが完成しました。
1分おきにリアルタイムで更新されるので、見ているだけでも楽しいです。
また、Zabbixの本来の用途である監視と組み合わせば以上な電流や電力使用を検知してアラートを飛ばすことも可能です。

SwitchBotの温湿度センサーなども同じような手法で可視化することが可能です。
やっぱり、こうゆうかっこいいダッシュボードってロマンがありますね。
興味があれば、皆さんも是非色々なデータを可視化してお家にかっこいい監視画面を作ってみてください!

参考にさせていただいたサイト

https://nrlay00.hatenablog.jp/entry/2023/09/09/193730
https://www.zabbix.com/download
https://akng-engineer.hatenablog.com/entry/2019/05/02/201820
https://www.server-world.info/query?os=Ubuntu_22.04&p=grafana
https://satoweb.net/2021/09/switchbotonzabbix/

Discussion