SNMPクランプメーター(Raspberry Pi 4 + CentOS + AVIOSYS e-Meter)


「クランプメーター」と「デマンドメーター」って何が違うの?( ;゚Д゚)y─ ~~

概要

消費電力をSNMP経由で測りたい。

ただ、SNMP対応電力計は高価である。

作るしかない。

なお、精度は二の次である。

材料

Raspberry Pi 4 model B

AVIOSYS e-Meter 8870

工具

microSDHCが扱えるPC

Perlのちょっとした知識(すみませんね 腐った言語でヽ(`Д´#)ノ 

ちょっとした電気工事士の知識(「単相3線」とか「クランプメーター」あたり)

気合いとビビってるぐらいの注意深さ

ブレーカー部分ではなくてコンセント以下を調べるなら
三和電気計器 ラインセパレータ LS11 (https://www.sanwa-meter.co.jp/japan/products/accessory-fuse/ls11.html) で電源ラインをセパレートしてクランプすると便利。

準備

Raspberry PiのEPROMを更新

  • bootloader≒いわゆるファームウェア。
  • 結構頻繁に更新されていて、消費電力や発熱の改善があってるっぽい。

Raspberry PiウェブサイトからEEPROMをダウンロード

  • Raspberry Pi公式ウェブサイト (https://www.raspberrypi.org/) の [Downloads] → [Download the bootloader] からzipをダウンロード
  • FATフォーマット済みのmicroSDに展開したファイルを全てそのまま置く。
  • microSDをRaspberry Piに挿して電源を入れ、電源ランプ(赤)が点灯し、ステータスランプ(緑)が点滅すれば焼き上がり。
  • 電源を抜いてmicroSDを抜く。microSDの中身は削除やらフォーマットして良い。
  • 心配ならばmicroSDを挿さない状態で電源を入れると画面にbootloaderのバージョンが表示されるので確認する。

Raspberry PiにCentOSをインストール

  • なぜCentOSか?いままでCentOSメインで使っていたから。。。

CentOSからディスクイメージをダウンロード

  • https://www.centos.org/
  • [Get CentOS] → [More download choices] → AltArch Releases の armhfp (Arm32)
  • [nearby mirror] の適当な HTTP location の centos-altarch/7/isos/armhfp あたりのディレクトリ
  • CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-4-2003-sda.raw.xz
    • RaspberryPI-Minimal-4がRaspberryPi 4用のイメージ

Silicon Linux社サイトからDD for Windowsをダウンロード
Raspberry PiのImagerでもかまわないが、仕様が単純だったのでSilicon LinuxのDDを使用した。

  • https://www.si-linux.co.jp/
  • DD for Windows Ver.0.9.9.8をダウンロード
    • なぜか最新版のR2はディスクイメージを書き込めなかった

DDを起動するときに、右クリック→管理者として実行

microSDに書き込む

Raspberry Piに差し込む

電源を挿す

(∩´∀`)∩ワーイ

CentOSの設定

ログイン

  • ログインプロンプト
    • user: root
    • password: centos
    • あとでpasswdコマンドで変更しましょう

キーボード

  • インストール時は英語キーボードなので日本語キーボードに設定(変更点のみ表記)
    • vi /etc/vconsole.conf
#KEYMAP="us"
KEYMAP="jp106"

ロケール(地域情報)

  • UTCになっているので、日本東京に設定。
    • timedatectl set-timezone Asia/Tokyo

不要なサービス停止

  • firewalld(ファイアウォール)
    • systemctl disable firewalld
    • ノーガード戦法orz  (本当はfirewalldをちゃんと設定しましょう)
  • SELinux(セキュリティ)
    • vi /etc/sysconfig/selinux
    • ノーガード(以下略
#SELINUX=enforcing
SELINUX=disabled

ネットワーク

  • ホスト名の設定
    • nmcli general hostname Amp-DCJn
    • systemctl restart systemd-hostnamed または、再起動後に反映される
  •  デバイス一覧を確認、wlan0とeth0が見えてる
    • nmcli d
  • WiFiステータス
    • nmcli radio wifi
  • WiFi情報
    • nmcli dev wifi list
  • 接続設定
    • WiFi(wlan0)接続する場合
      nmcli con add con-name wlan0 ifname wlan0 type wifi ssid ****** wifi-sec.key-mgmt wpa-psk wifi-sec.psk ********
    • 有線LAN(eth0)接続する場合
      nmcli c add con-name eth0 ifname eth0 type ethernet ipv4.method manual ipv4.address 192.168.0.2/24 ipv4.gateway 192.168.0.1 ipv4.dns “192.168.0.1 8.8.8.8”
    • もっと細かい例や変更などは奥村研究室 Network Manager まとめ もご参考に。
  • 確認
    • nmcli c show wlan0
    • ip a

パーティション

  • インストール時はroot(mmcblk0p3)が2GBしかなくて狭すぎるので、fdiskで拡張。
    • fdisk /dev/mmcblk0
    • p
Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes, 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00046e49

Device Boot Start End Blocks Id System
/dev/mmcblk0p1 * 8192 593919 292864 c W95 FAT32 (LBA)
/dev/mmcblk0p2 593920 1593343 499712 82 Linux swap / Solaris
/dev/mmcblk0p3 1593344 5109759 1758208 83 Linux
  • パーティションを消して即再作成
    • mmcblk0p3のstart値をメモ
    • d 3 n p 3
    • 1593344(元p3のstart値)
    • +13G(適当にこのぐらいかな)
    • w
  • 再起動してパーティションのサイズを認識させる
    • reboot
  • ファイルシステムをパーティションサイズいっぱいまで拡張
    • resize2fs /dev/mmcblk0p3

パッケージアップデート

  • アップデート
    • yum update

ssh

  • 有効化(自動起動)
    • systemctl enable sshd
  • 今すぐ起動
    • systemctl start sshd
  • これ以降の作業はWindowsPCからSSHで操作した。

NTP

  • 時刻調整サーバーChrony
    • 一部資料ではntpdをインストールしているようだが、CentOS7からはntpd廃止してchronydになっているので注意。
    • 設定しなくても十分動作する。
  • vi /etc/chrony.conf
server NTP1.JamFunk.jp iburst
server NTP2.JamFunk.jp iburst
    • ただ、自前のNTPに設定したかっただけ。

パッケージインストール

  • 必要(と思われる)なパッケージのインストール
    • 一部不要なパッケージまでインストールしている。
    • yum install perl-core perl-libwww-perl perl-Carp-Clan perl-CGI perl-GD wget bind-utils traceroute unzip net-snmp net-snmp-utils deltarpm
    • yum install gcc-c++
    • yum install minicom

Perlモジュールインストール(rpmで提供されていないもの)

  • Device::Serial
    • wget “https://cpan.metacpan.org/authors/id/C/CO/COOK/Device-SerialPort-1.04.tar.gz”
    • tar zxvf Device-SerialPort-1.04.tar.gz
    • cd Device-SerialPort-1.04
    • ./configure
    • perl Makefile.PL
    • make install

構築

設置

ブレーカーや家庭内のコンセントよりも上位(電力会社側)は電気工事士持っていないと扱ったらいけないんだぞー?
でもクランプメーター取り付けは知らない。

  • Raspberry Piをブレーカーや計測点付近に設置。
  • ネットワークを無線なり有線なりで接続しておく。


  • ケーブルをクランプメーターで挟む。
    • コンセント配下を測る場合は、電源ケーブルの片側だけ挟む。
      2本とも挟むのではない。
      つまり、冒頭の材料で紹介したラインセパレータを使うか、電源ケーブルを裂く(!)しかない。
    • ブレーカー盤の単相3線(赤白黒の3本線の場所)を測る場合は赤線と黒線をそれぞれクランプする(右図:クランプメーターが2本必要)。
    • ちなみにリミッターブレーカーが落ちる容量は赤線・黒線のどちらかの最大値。
    • ちなみに赤線・黒線で原則としてバランス(平衡)を保たないといけないことが法律で定められている。流量差が40%を超えると漏電ブレーカーが落ちるらしい。


AVIOSYS 8870のテスト

詳しくは後述。

  • ターミナルで接続。
    • minicom -b 19200 -D /dev/ttyACM0
    • Ctrl+A Qで終了 ※Ctrl+A Ctrl+Qではない。

Perlスクリプト

データ取得用スクリプト(Perl)

  • tar zxvf ampread_0.10.tar.gz
    • ダウンロード→WinSCPか何かでRaspberry Piにアップロード→tarで解凍
  • cp ampread*.pl /usr/local/bin
  • chmod 755 /usr/local/bin/ampread_*.pl

使い方

  • ampread_1secloop.pl [(device_path)]
    • ex: ./ampread_1secloop.pl /dev/ttyACM0
    • 1秒間隔でひたすらcsv出力
    • (unixtime),(count),(min),(max),(avg),(error)
    • 1588954237,20,2.6,2.7,2.70,0
  • ampread_onetime.pl [(device_path) [(read_count) [(read_interval)]]]
    • ex: /usr/local/bin/ampread_onetime.pl /dev/ttyACM0
    • 1secloopのcsv形式ではなく、1行1値形式でだけ出力。
    • read_countで回数、read_intervalで取得間隔(sec)。

今回はSNMPからonetimeを引っ張るように設定する。

snmpd設定

#view systemview included .1.3.6.1.2.1.1
#view systemview included .1.3.6.1.2.1.25.1.1
view systemview included .1

access notConfigGroup "" any noauth exact systemview none none

#syslocation Unknown (edit /etc/snmp/snmpd.conf)
#syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
syslocation Studio JamPack DCJn
syscontact SUNAGAWA Hiroyuki <user@example.com>

# 取得するクランプメーターのデバイスの数だけ記載
extend ampread-ttyACM0 /usr/local/bin/ampread_onetime.pl /dev/ttyACM0
extend ampread-ttyACM1 /usr/local/bin/ampread_onetime.pl /dev/ttyACM1
  • snmpdの自動起動と起動
    • systemctl enable snmpd
    • systemctl start snmpd
  • テスト(とりあえずampread_onetime.plの出力だけ見てみる)
    • snmpwalk -v 2c -c public localhost nsExtendOutputFull
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."ampread-ttyACM0" = STRING: 1588687449
20
0.05
2.4
2.6
2.45
0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."ampread-ttyACM1" = STRING: 1588687450
20
0.05
5.1
5.5
5.25
0
  • テスト(EXTENDのMIBを全て見てみる)
    • snmpwalk -v 2c -c public localhost nsExtendObject
NET-SNMP-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 2
(略)
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."ampread-ttyACM0" = INTEGER: 7
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."ampread-ttyACM1" = INTEGER: 7
NET-SNMP-EXTEND-MIB::nsExtendResult."ampread-ttyACM0" = INTEGER: 0
NET-SNMP-EXTEND-MIB::nsExtendResult."ampread-ttyACM1" = INTEGER: 0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM0".1 = STRING: 1588687472
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM0".2 = STRING: 20
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM0".3 = STRING: 0.05
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM0".4 = STRING: 2.4
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM0".5 = STRING: 2.6
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM0".6 = STRING: 2.44
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM0".7 = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM1".1 = STRING: 1588687473
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM1".2 = STRING: 20
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM1".3 = STRING: 0.05
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM1".4 = STRING: 5.0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM1".5 = STRING: 5.2
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM1".6 = STRING: 5.15
NET-SNMP-EXTEND-MIB::nsExtendOutLine."ampread-ttyACM1".7 = STRING: 0
  • テスト(MIBを数値で見てみる。後にZabbixなどでMIBを指定するときに使う)
    • snmpwalk -v 2c -c public -On localhost nsExtendObject
.1.3.6.1.4.1.8072.1.3.2.1.0 = INTEGER: 2
(略)
.1.3.6.1.4.1.8072.1.3.2.3.1.3.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.48 = INTEGER: 7
.1.3.6.1.4.1.8072.1.3.2.3.1.3.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.49 = INTEGER: 7
.1.3.6.1.4.1.8072.1.3.2.3.1.4.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.48 = INTEGER: 0
.1.3.6.1.4.1.8072.1.3.2.3.1.4.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.49 = INTEGER: 0
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.48.1 = STRING: 1588688178
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.48.2 = STRING: 20
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.48.3 = STRING: 0.05
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.48.4 = STRING: 2.6
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.48.5 = STRING: 2.7
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.48.6 = STRING: 2.62
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.48.7 = STRING: 0
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.49.1 = STRING: 1588688179
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.49.2 = STRING: 20
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.49.3 = STRING: 0.05
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.49.4 = STRING: 5.2
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.49.5 = STRING: 5.4
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.49.6 = STRING: 5.31
.1.3.6.1.4.1.8072.1.3.2.4.1.2.15.97.109.112.114.101.97.100.45.116.116.121.65.67.77.49.7 = STRING: 0

Zabbix設定

ここではZabbixサーバーの立て方MRTGサーバーの立て方には触れないので、奥村研究室を・・・

  • Zabbixテンプレート
    • Zabbix_template_AmpReadpl010_byStudioJamPack.zip
    • 設定→テンプレート でインポート
    • 設定→ホスト でReaspberry PiのIPを登録
    • とりあえずOSに関わる情報と/dev/ttyACM0, /dev/ttyACM1を監視できるようになる。
Zabbix
Zabbixでグラフを設定したテンプレート

テンプレートの仕様

  • アイテムで2系統(ttyACM0とttyACM1)を設定しているので、ホストのアイテムで必要な分だけ増やしたり減らしたり。
  • 1秒間に約20サンプリングした平均・最大・最小を求めている。
  • グラフを設定した。平均・最大・最小の平均・最大・最小をとるおかしな表記になっているがご愛敬。
  • ICMPやらSNMP v2やらおまけで依存させているテンプレートが含まれている。
  • なお、上の画面で途中途切れているところはクランプするラインを変えたため。

メモ

AVIOSYS e-Meter 8870の挙動

USB-Serialとして動作する。

なのでデバッグしたければWindows PCに接続してTeraTermで叩けば応答する。

コマンドは以下のとおり

  • read
    • 電流値を取得
    • 通常はauto onなのでコマンドを打たなくても勝手に出力される
  • auto (on|off)
    • 電流値を自動で出力する(on)、出力しない(off)
    • 起動時はon、抜き差ししたり電源をOFF/ONするまで保持する。
  • ver
    • バージョンを取得
    • 今回はver:8870,1.00,2013/08/15,15110010が出力された(2020/04購入)。

挙動は以下のとおり

  • 19200 bps, 8bit, Parity none, Stop bit 1, Flow control none
    • 説明書にも書いてある。
  • 起動時はたまにコマンドラインやら出力してくることがある。
    • z>
  • enterするとヘルプを出力してくる。
  • 通常はauto on状態で7秒に1回出力してくる。
    • 00.0A の形式
    • 秋月電子通商は1時間に1回と言っているがどこがやねん。
  • auto offを打ち込むとoffと出力し、黙る(自動出力しなくなる)。
    • readを打ち込んでやらないと電流値を出力してこない。
  • auto off状態でreadを連発すると電流値を返すので、取得間隔を短くできる。
    • 説明書に0.5秒間隔(2 times per second)と書いてあるが、試したところ0.05秒間隔(20回/秒)あたりまで頑張ってくれている。OSやハードウェアによるのかもしれない。
  • 実効値なのか平均値なのか明記されていない?
    • なんとなく平均値なのかな。。。
  • 説明書に10Aまでと書いてある。
    • 怖いからまだ試していない。ドライヤーでもつなげば良いのか?燃えるのか?

Raspberry Piの挙動

  • いきなり電源を引っこ抜いて電源断してもいいのか?
    • 良くはないと思う、うん。
    • でも、停電時はそうなるし、実運用時はキーボードとかディスプレイつながないしどうすれば。。。
    • やっぱりネット上でmicroSDがトンだ報告が。microSDをreadonlyにする方法もあるらしい。
  • PoEするにはオプションのPoE HATを接続しないといけない。
    • 便利だけど、でもファンが付くからうるさいのかな。。。

シリアルポートの挙動

Linuxにおけるシリアルポートのトラブルシューティング – Qiita
https://qiita.com/yuiseki/items/bfa9ad984f7333377870

Perlでシリアル通信をする【修正編】 – 銀の鍵 (The Silver Key)
https://www.ginnokagi.com/2012/04/perl-2.html

今後

  • timeコマンドみたいに直近の1分間, 5分間, 15分間を出力できるようにデーモン化したい。
  • クランプメーターで10A以上流すとどうなるのか検証したい。

面白そうなもの

電力会社のスマートメーター(電力計)とHEMS用通信(Bルート)を使った電力使用量監視