CentOS7 on Raspberry Pi + GrowthForecastで部屋の温度をグラフ化してみた

Raspberry Piに入れたCentOS7で前回のLチカに引き続き温度センサー使って温度取得してみました。

更にせっかくなのでGrowthForecastでグラフ化してみました。

Rubyのインストール

温度取得のスクリプトRubyで書きます。Python等他の言語で書く場合はこの項目は関係ありません。

Raspberry PiのCentOS7にはRubyがインストールされていませんのでRubyのインストールから始めます。

インストール作業は待ち時間がとても長いです。1時間くらいの覚悟は必要です。

インストール中にセッション切れたりすると面倒なので、仮想コンソールのtmux使って行ったり対策をすることをお勧めします。

rbenvでインストールしますが、必要なパッケージさえ準備すれば後は普通の手順なのでコマンドだけで。

# yum install make git gcc bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel  gcc-c++ bitmap-console-fonts

# git clone https://github.com/rbenv/rbenv.git ~/.rbenv
# cd ~/.rbenv && src/configure && make -C src  


# git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

# echo 'export PATH=~/.rbenv/bin:${PATH}' >> ~/.bash_profile

# echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# source  ~/.bash_profile

2.2.5を使ってみました。

# rbenv install 2.2.5
# rbenv global 2.2.5

rubyが入ったらpi_piperを入れます。

# gem install pi_piper

回路配線と温度取得スクリプト

後はこちら記事の手順に則って配線とスクリプトを準備します。

lchikaamazon.hatenablog.com

スクリプトもそのまま使えました。

require 'pi_piper'
loop do
  value = 0
  PiPiper::Spi.begin do |spi|
    raw = spi.write [0b01101000,0]
    value = ((raw[0]<<8) + raw[1]) & 0x03FF
  end
  volt = (value * 3300)/1024
  degree = (volt - 500)/10
  puts degree
  sleep(1)
end

このスクリプトの中心はADコンバータのMCP3002です。

この動きはデータシートを見るのが一番なのですが、私みたいな初心者にはそのデータシート自体が難解でした。

データシート

こちらのページの解説を読みながら、読み進めることでやっと意味がわかってきました。

アナログ値を測る(ADコンバータ使用)(WebIOPi利用)

話がそれましたが、ブレッドボードの配線も完了しました。

スクリプトを実行してみます。(rootユーザで実行しないとエラーが出ます)

# ruby mcp3002.rb

26度です。たぶん合っています。だんだん暑くなってきました。夏が近いですね。

Perlインストール

部屋の温度が取れるようになりました。これをグラフ化したいのですが、GrowthForecastを使ってみます。

まずは、GrowthForecastのためにPerl入れます。

perlbrewのインストール

何はともあれperl入れます。perlbrew使います。

# wget get -O - http://install.perlbrew.pl | bash
# echo "source ~/perl5/perlbrew/etc/bashrc" >> ~/.bash_profile
# source ~/.bash_profile

perlインストール

利用できるバージョンを確認します。

# perlbrew available

今回は以下のバージョンにしました。Perlのインストールには2時間くらいかかります。

# perlbrew install perl-5.22.2
# perlbrew switch 5.22.2

cpanmを入れる

通常の手順と変わりません。

curl -L https://raw.githubusercontent.com/miyagawa/cpanminus/master/cpanm | perl - App::cpanminus

GrowthForecastインストール

Perlが入ったのでGrowthForecastを入れていきます。前にもGrowthForecastをCentOS7に入れたのですが、ARMアーキテクチャのためパッケージが十分にそろってなかったので少しひっかかりポイントありました。

yomon.hatenablog.com

GrowthForecastインストール

必要なパッケージをインストールします。

yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel autoconf automake libtool pkgconfig ragel gtk-doc pkgconfig gettext libxml2-devel

armv7hlアーキテクチャのレポジトリは歯抜け状態なので、手順通りにはパッケージ入れることができません。pango-develで引っかかりました。

# yum install pango-devel
Error: Package: pango-devel-1.36.8-2.el7.armv7hl (updates)
           Requires: pkgconfig(harfbuzz)

リポジトリに無いものはソースからビルドします。

# wget https://www.freedesktop.org/software/harfbuzz/release/harfbuzz-1.2.7.tar.bz2
# tar xvf harfbuzz-1.2.7.tar.bz2
# cd harfbuzz-1.2.7
# ./configure
# make
# make install 


# wget ftp://ftp.gnome.org/pub/gnome/sources/pango/1.28/pango-1.28.4.tar.gz
# tar xvf pango-1.28.4.tar.gz
# cd pango-1.28.4
# make
# make install

ソースからビルドしたパッケージがpkg-configからチェックできるように設定します。

# echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig

# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

# cat <<EOF >> /etc/profile.d/pkg-config.sh
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
EOF

# chmod +x /etc/profile.d/pkg-config.sh

まずは一番はまったAlien::RRDtoolのインストールから。上記のパッケージが入っていればインストール正常に終わるはずです。

# cpanm -v Alien::RRDtool

Alien::RRDtoolが入ればGrowthForecastはすぐに入るはずです。これでGrowthForecast導入できました。

# cpanm -n GrowthForecast

GrowthForecast稼働確認

稼働確認してみましょう。

起動前にデータ用のディレクトリを作成します。

mkdir -p /var/lib/growthforecast

作成したディレクトリを指定しながらGrowthForecast起動します。

# /root/perl5/perlbrew/perls/perl-5.22.2/bin/growthforecast.pl --data-dir /var/lib/growthforecast

5125番ポートで起動するので、ブラウザからアクセスしてみます。

http://192.168.11.15:5125/

アクセスできました。

Systemd登録

systemdにサービス登録しておきます。

# cat <<EOF > /etc/systemd/system/growthforecast.service
[Unit]
Description=GrowthForecast

[Service]
Type=simple
ExecStart=/root/perl5/perlbrew/perls/perl-5.22.2/bin/growthforecast.pl --data-dir /var/lib/growthforecast

[Install]
WantedBy=multi-user.target
EOF
# systemctl daemon-reload
# systemctl start growthforecast
# systemctl status growthforecast
# systemctl enable growthforecast

GrowthForecastへの温度センサーのデータを登録

温度の取得と、グラフ化のためのGrowthForecastの準備が完了しました。ついに実装です。

Ruby スクリプト

先ほどのスクリプトに手を加えてGrowthForecastへデータ登録できるようにしました。

require 'pi_piper'
require 'net/http'

# Get current temperature of my room
value = 0
PiPiper::Spi.begin do |spi|
  raw = spi.write [0b01101000,0]
  value = ((raw[0]<<8) + raw[1]) & 0x03FF
end
volt = (value * 3300)/1024
degree = (volt - 500)/10


# Send data to GrowthForecast
service = 'MyHome'
section = 'MyRoom'
graph   = 'Degree'
host    = '192.168.11.15'
port    = '5125'

uri = URI.parse("http://#{host}:#{port}/api/#{service}/#{section}/#{graph}")
response = Net::HTTP.start(uri.host, uri.port) do |http|
    request = Net::HTTP::Post.new(uri.path)
    request.set_form_data(:number => degree)
    http.request(request)
end

puts response.header
puts response.body

Systemd Timer登録で定期実行

cronではなくsystemdで定期実行してみます。

サービスとしてスクリプト実行処理を登録します。

# cat <<EOF > /etc/systemd/system/MyRoomTemperatureMonitor.service
[Unit]
Description=MyRoomTemperatureMonitor

[Service]
Type=simple
ExecStart=/root/.rbenv/shims/ruby /root/tools/mcp3002_growthforecast.rb

[Install]
WantedBy=multi-user.target
EOF

5分毎に実行されるようにタイマー登録します。

# cat <<EOF > /etc/systemd/system/MyRoomTemperatureMonitor.timer
[Unit]
Description=Runs MyRoomTemperatureMonitor

[Timer]
OnBootSec=1min
OnUnitActiveSec=5min
Unit=MyRoomTemperatureMonitor.service

[Install]
WantedBy=multi-user.target
EOF

定義を起動・有効化します。

systemctl enable MyRoomTemperatureMonitor.service
systemctl start MyRoomTemperatureMonitor.timer
systemctl enable MyRoomTemperatureMonitor.timer

タイマーが登録されました。これで5分毎に温度が取れるはずです。

# systemctl --system list-timers
NEXT                         LEFT          LAST                         PASSED       UNIT                           ACTIVATES
Sun 2016-06-05 00:52:31 JST  3min 38s left Sun 2016-06-05 00:47:31 JST  1min 21s ago MyRoomTemperatureMonitor.timer MyRoomTemperatureMonitor.service

後はjournalctl -f オプション(tail -fみたいなもの)でログ確認しておけば動いている孤とを確認できるはずです。

# journalctl -f -u MyRoomTemperatureMonitor.service

設定後も何度か再起動かけたりしましたが止まること無くグラフ取れてそうです。

f:id:yomon8:20160605160954p:plain

さいごに

Ruby版のGrowthForecastみたいなツールのfocuslightというものの存在を、ここまで動かしてから知りました。こっち使ってみればよかったかも。。。

github.com

参考URL

perl-users.jp

HarfBuzz

Introduction - Pango