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
回路配線と温度取得スクリプト
後はこちら記事の手順に則って配線とスクリプトを準備します。
スクリプトもそのまま使えました。
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アーキテクチャのためパッケージが十分にそろってなかったので少しひっかかりポイントありました。
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
設定後も何度か再起動かけたりしましたが止まること無くグラフ取れてそうです。
さいごに
Ruby版のGrowthForecastみたいなツールのfocuslightというものの存在を、ここまで動かしてから知りました。こっち使ってみればよかったかも。。。