Raspberry Piで測った消費電力をAdafruit IOでグラフ化する -後編-

Raspberry Piで測った消費電力をAdafruit IOでグラフ化する -後編-

前回は、ラズパイをセットアップしなおし、吐き出された消費電力のテキストをAdafruit IOに書き出す所まで書きました。

Raspberry Piで測った消費電力をAdafruit IOでグラフ化する -前編-

今回は後編。
書き出したデータを日々チェックしやすくするDashboardに仕立てます。

また、文中には書かなかった数々のエラー例を事例として載せておきます。

Adafruit io dashboard

https://io.adafruit.com/dashboards

測定したデータをグラフやテキストで可視化し、パレット状に並べる事ができるのがDashboard。
スライドスイッチやテンキーなど、他機器へのアウトプットにも使えるソフトスイッチも作れます。

Feedsでもグラフは見えるけれど、Dashboardで並べれば複数データを表示範囲を変えてチェックできます。

作り方は以下公式を参照しました。

Create Your Adafruit.io Dashboard | Create an Internet of Things Dashboard with Adafruit IO | Adafruit Learning System

手順

Dashboardsから”+New Dashboard”をクリック。
名前はSensorPiにしました。

作成したDashboardに入り、右上のギアマークから”Create New Block”をクリック。
今回はLine Chartを選びます。

どのフィードをプロットするか選びます。
”Epower”グループの”watt-power_ch0″を選択しました。Next stepへ。

Line Chartのオプションを自由に選びます。
タイトルを入れ、”Draw Grid Line”(背景の罫線)にチェックを入れました。

小さな棒グラフウィジェットが完成しました。

これをch分並べたり、Gauge(円メータみたいなもの)などを並べたりして完成。

ハマり事例集

見事完成しましたが、もちろん数々のハマりがありました。

それを文中に描くとゴチャゴチャになるので、取り除いてここへ墓地として埋めます。

gem installでリソースにアクセスできない

# gem install pi_piper
ERROR: Could not find a valid gem 'pi_piper' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - timed out (https://api.rubygems.org/specs.4.8.gz)

そもそもgem update –systemでもコケてました。gemのバージョンは最新3.1.4。

httpsアクセスがプロバイダにより弾かれる事例などがあり、httpで指定してみる。

# gem update --system --source http://rubygems.org/
ERROR:  While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
    timed out (https://rubygems.org/specs.4.8.gz)

やっぱりだめ。

純粋にホストアクセスできてないっぽい?
まてよと思いIPv6を確認。

# ping rubygems.org
PING rubygems.org(2a04:4e42::70 (2a04:4e42::70)) 56 data bytes
^C

IPv6アドレスで名前解決している。
IPv6を切ってみる。

[Raspbian] IPv6を無効にする方法(Raspbian Jessie Lite) – Life with IT

# ip a
....
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:22:cf:26:80:78 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.143/24 brd 192.168.1.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
inet6 240d:18:b:6100:6b43:f74d:eef4:772f/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 86203sec preferred_lft 14203sec
inet6 fe80::42fb:6811:a877:2221/64 scope link
valid_lft forever preferred_lft forever

 (※ip6アドレスが割あたっている)

# vi /etc/sysctl.conf
>net.ipv6.conf.all.disable_ipv6 = 1
 (※末尾に追記)
# sysctl -p
net.ipv6.conf.all.disable_ipv6 = 1
# ip a
...
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:22:cf:26:80:78 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.143/24 brd 192.168.1.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever

inet6~が消え、無事にアクセスできました。
最新のRaspberry Pi  OS Liteを使う時は気をつけましょう。

入れたはずのライブラリが無い

インストールしたpi_piperが無いと言われ、しばらく悩みました。

$ ruby sample.rb
Traceback (most recent call last):
        2: from sample.rb:1:in `<main>'
        1: from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
/usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- pi_piper (LoadError)

2.7.2に切り替えてpi_piperを入れた後、rubyが古いバージョンの2.5.2に戻っていました。

rbenv localではなく、文中の通りrbenv globalで切り替えましょう。
実行したユーザー以外でも切り替わっているか要確認。

adafruit ioのID/パスワードが蹴られる

当初はusername = ENV[‘username’]の部分に素直にusername = ENV[‘自分のusername‘]と書いていて、延々進みませんでした。

# ruby ada_samp.rb
create
Traceback (most recent call last):
        2: from ada_samp.rb:11:in `<main>'
        1: from /root/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/adafruit-io-2.0.0/lib/adafruit/io/client/feeds.rb:32:in `create_feed'
/root/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/adafruit-io-2.0.0/lib/adafruit/io/arguments.rb:15:in `extract_username': cannot make request when username is nil (RuntimeError)

正しくはusername = ‘自分のusername‘。
Rubyの書式を全然わかっていなかった事が敗因。

文中の通り、開発者は”ID/パスワードは直接書かず環境変数で入れろ”と書いてるのでENVなのでしょう。

Ruby 2.7.x以上で非推奨のメソッド

/root/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/adafruit-io-2.0.0/lib/adafruit/io/request_handler.rb:73: warning: URI.escape is obsolete

これは未だに出ます。

adafruit ruby clientは3年前のコード。Rubyが2.7.xになり、コードの一部が非推奨記述になったため。

Warningなのでそのまま放置・・・

ioの既存のフィードに追記できない

/root/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/adafruit-io-2.0.0/lib/adafruit/io/request_handler.rb:95:in `handle_post': POST error: {"error":["Name must be unique within the selected group","Key must be unique within the selected group","Group feeds is invalid"],"status":"bad_request"} (Adafruit::IO::RequestError)

APIでDefautフィードグループに書き込むには、都度新しいFeed名が必要になります。サンプルではランダムナンバーを付与していました。
よって続けて1つのフィードに書き込むにはMQTTを使うのが良いと思います。

crontabでrubyのrequireのパスが切れていない

# cat cronlog_epower.log
/usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- pi_piper (LoadError)
        from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
        from /usr/local/etc/piper/epower.rb:1:in `<main>'

ruby自体のライブラリのパスが通る事、実行されたコードでrequireされるモジュールにもパスが通る事が必要。
色々整合を取るのが大変で文中の方法に逃げました。

一度削除したfeedは登録できない

忘れそうなのでメモです。

Groupからフィードを削除した場合、同じ名前のフィードはRuby Clientから作成できなくなります。
よって一度グループを削除して作り直す必要があります(同じGroup名で再度動くかは未テスト)

最後に一度綺麗にしてから記録開始!と思ったらハマります。

やっと出来た

結構時間かかりました。

いつも人まねばかりなので、1から情報集めるのは久しぶり。
用意されたライブラリを組み合わせるだけでもかかるものです。

ちなみにch0はPCのある部屋全体の電力。メインPCでゲームすると跳ね上がります。
ch1はセントラルヒーティングのボイラーの電力。常時80Wを消費した上、瞬間的に800Wのピークを繰り返します。お金かかるわ(‘A`)

Raspberry Piカテゴリの最新記事