前回は、ラズパイをセットアップしなおし、吐き出された消費電力のテキストをAdafruit IOに書き出す所まで書きました。
今回は後編。
書き出したデータを日々チェックしやすくするDashboardに仕立てます。
また、文中には書かなかった数々のエラー例を事例として載せておきます。
Adafruit io dashboard
https://io.adafruit.com/dashboards
測定したデータをグラフやテキストで可視化し、パレット状に並べる事ができるのがDashboard。
スライドスイッチやテンキーなど、他機器へのアウトプットにも使えるソフトスイッチも作れます。
Feedsでもグラフは見えるけれど、Dashboardで並べれば複数データを表示範囲を変えてチェックできます。
作り方は以下公式を参照しました。
手順
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`)