Zabbix で電力監視してみる – オレオレアドベントカレンダー22日目

みんな、Zabbixで監視してますよね。

この記事は、Zabbix アドベントカレンダー2018の22日目でもありますです。毎日自宅NASとこのWebサイトをZabbixで監視を行ってる身(Zabbixだけじゃないけど)としては、2回位は書かねばなるまい。ということで、今回2回目です。前回はZabbixをKUSANAGIで動かすという、よくあるネタなので、今回は使用電力量をZabbixで監視しようという話です。

電力監視とは

最近は、電力量をスマートメーターで集計しているようです。自宅も例に漏れず、スマートメーター化してました。で、電力会社にBルートの申し込みをすると、HEMSじゃないですが使用電力量が測れるというじゃないですか。
でもお高いんでしょ?とお思いでしょうが、Bルートの申込みは無料です。電力量を図るには、専用の機器が必要なのですが高いものは高いです(当たり前)。
しかし、自作してしまえばUSBドングルや基板+αだけで済むのです。

ECHONET Liteによる監視

詳しいことはググっていただくとして、bp35a1というWi-SUN(
Wireless Smart Utility Network)に 対応したチップで、スマートメーターを始めとしたスマート家電と ECHONET Lite というプロトコルで通信できるようです。 ECHONET Lite の企画は公開されているので、このプロトコルに従えばUDPでスマートメーターと通信できます。
で、肝心のbp35a1ですが、USBに搭載した製品が売ってます。もちろん、Raspberry Pi使いの方向けの製品もあります。
自分が買ったのは、RL7023 Stick-D/IPSとなります。1万円を切るお値段。

NASに接続すると

家のNASは中身Debianなので、zabbix-agentも走らせております。ここに、USBをポチッと指すと、/dev/ttyUSB0 と認識してくれました。よしよし。

さて、プログラムですが、嶋村さんが書いたPythonスクリプトを使わせていただいております。ただ、このプログラムは最初のネゴシエーションして、IPv6アドレスなどを取得する部分に時間がかかるので、イロイロ設定ファイルで決め打ちしました。
恥ずかしいコードですが、githubにあげておきます(Python詳しくない)。

Zabbix Senderで送る。

最初、UserParameterで実行しようと思ったのですが、余裕でタイム・アウトするので、Zabbix sender で送りつけることにしました。ただ、cronで実行しても誤差が激しいので、デーモン化してSerialに接続しっぱなしにして一定期間で瞬間電力を送りつけるようにしました。暗号化しているので、以下のようにコマンドを実行します。

/usr/bin/zabbix_sender --tls-connect psk --tls-psk-identity アイデンティティ --tls-psk-file /etc/zabbix/zabbix_agentd.psk -v -z zabbixサーバ名 -T -i -

そして、上記プロセスに標準入力から日付ごとキーと値を、以下のような文字列で送りつけます。時間はUNIX epoch time、405が瞬間電力量(W)になります。

 ホスト名 sender.power 時間 405

Zabbix Server側は、指定したkeyで受け取る設定にしとけば良いんじゃないですかね。受け取った結果をグラフにすることも可能ですね。

電力量のVisualizeは面白いぞ

こうしてみると、朝食や夕食時に電子レンジ使ったときに瞬間電力量が跳ね上がったり、昼間より夜のほうが使用電力量高くなるなとか、深夜はそんなに使ってないよね、という気付きが得られます。ええ、1200Wの電気ヒーター付けたら跳ね上がりましたとも。ということで、簡単に監視できるので皆様もお試しください。

Follow me!

3 thoughts on “Zabbix で電力監視してみる – オレオレアドベントカレンダー22日目

  1. よし。 says:

    参考にさせていただいております。唐突ですみませんがご教示いただきたくお願い致します。
    Traceback (most recent call last):
    File “/var/power/bp35a1_v02_loop.py”, line 241, in
    (ser, ipv6Addr) = connect(ipv6Addr, channel, panid)
    NameError: name ‘ipv6Addr’ is not defined
    となり、名前解決ができないのですが何が考えられるでしょうか。

    1. s-miyaza says:

      お返事遅くなり、申し訳ありません
      connect の引数のipv6Addrは設定ファイル内に書かれた値を取得して、それを利用しています。
      このIPv6アドレスはスマートメーター側のIPv6アドレスを指定します。

      [config]
      ipv6 = FE80::xxxx
      

      スマートメータのIPv6アドレスは、自分がもとにした嶋村さんのコード(bp35a1.py)で得られます。
      https://github.com/shakemid/hems-bp35a1

      もし、IPv6アドレスを記述していて読み取れない場合、configparser のバージョンが異なる可能性があります。configparser周りは嶋村さんのコードを参考に修正する必要があるかもしれません。
      自分のPython3のバージョンは3.4.2で、configparser は3.7.1となります。

      ご参考になれば幸いです。

      1. よし。 says:

        ご質問しながら放置してしまいすみませんでした。
        けっきょくこんな感じで落ち着きました。どうもありがとうございました。
        http://blog.andromeda.jp/archives/2194

Leave a Reply