2015年10月28日水曜日

復旧最終回:bme280で気圧・温度・湿度!

まずはi2cの動作からです。
i2c機器がこの状態で検出されるかどうか確認して見ます。

$ sudo i2cdetect -y 1

コマンドが無いって怒られました。まあ、想定通りなんですが(^^;)。
i2c機器の認識から始めます。

$ raspi-config
でi2cを有効にします。
$ sudo vi /etc/modules

i2c-bcm2708
i2c-dev
を追加します。うちのはi2c-devはすでに追加されていましたので、i2c-bcm2708を追加します。
(意味はわかりませんが(笑))

$ sudo vi /boot/config.txt
で下記を追記。具体的には先頭の#を削除。
dtparam=i2c_arm=on

$ sudo reboot
でリブートします。

立ち上がったらi2c-toolsをインストールします。
$ sudo apt-get install i2c-tools

この段階でようやくi2cの検出が可能になりました。
$ sudo i2cdetect -y 1

うちでは
i2c_address = 0x76
となっています。

次はbme280からデータを持ってくるための準備です。
bme280のアクセス用プログラムはスイッチサイエンスさんがpythonコードで提供してくれていますのでそれを利用します。

python-smbusをインストールします。
$ sudo apt-get install python-smbus

次に適当なフォルダにおいたスイッチサイエンスさんのPythonコードを実行してみます。
私は出力を改造しているので、ここでは名前をbme280_non2.pyとでもして、/home/pi/に保存しておきます。
$ python /home/pi/bme280_non2.py
で気温、気圧、湿度が表示されるはずです。
例えば、私の改造後の出力は
31.023869
991.371934
44.143983
となっています。上から気温、気圧、湿度です。

さて、ここまで来たら次はこの結果をmuninプラグインに取り込んでグラフ化します。

例によってmuninのプラグインをさくっと書きます。

---ここから
#!/bin/bash
# bme280 munin plugin by nonnon

#%# family=auto
#%# capabilities=autoconf

sensor_in=$(sudo python /home/pi/bme280_non2.py)
count=0
sensor=()
for L in $sensor_in
do
count=`expr $count + 1`
sensor[$count]=$L
done

if [ "$1" = "autoconf" ]; then
if [ -n ${sensor[1]} ]; then
echo yes
exit 0
else
echo no
exit 0
fi
fi

if [ "$1" = "config" ]; then
echo 'multigraph m_humi'
echo 'graph_title 3 BME280 Humidity'
echo 'graph_args -Y -J'
echo 'graph_scale no'
echo 'graph_vlabel Percent' 
echo 'graph_category BME280'
echo 'humidity.label humidity'
echo ''
echo 'multigraph m_temp'
echo 'graph_title 2 BME280 Temperature'
echo 'graph_args -Y -J'
echo 'graph_scale no'
echo 'graph_vlabel Celsius' 
echo 'graph_category BME280'
echo 'temperature.label temperature'
echo ''
echo 'multigraph m_pres'
echo 'graph_title 1 BME280 Pressure'
echo 'graph_args -Y -J'
echo 'graph_scale no'
echo 'graph_vlabel hPa' 
echo 'graph_category BME280'
echo 'pressure.label pressure'
exit 0
fi

echo 'multigraph m_humi'
echo "humidity.value ${sensor[3]}"
echo ''
echo 'multigraph m_temp'
echo "temperature.value ${sensor[1]}"
echo ''
echo 'multigraph m_pres'
echo "pressure.value ${sensor[2]}"
---ここまで

名前をbme280_non2とでもしておきましょう。
では、例によってこのプラグインをCPU温度のときと同じ手順で使えるようにします。
bme280_non2を
/usr/share/munin/plugins
に移動します。

実行権限を付けます。
$ sudo chmod +x bme280_non2

/etc/munin/pluginsにシンボリックを作成します。
$ cd /etc/munin/plugins
$ sudo ln -s /usr/share/munin/plugins/bme280_non2 bme280_non2

munin-nodeを再起動します。
$ sudo service munin-node restart

わすれてました。パーミッションを追加します。
/etc/munin/plugin-conf.d/munin-node

[bme280_*]
user root
を追加します。念のためmunin-nodeを再起動します。

さて、プラグインの動作実験です。
$ sudo /usr/sbin/munin-run bme280_non2

ここでは、
multigraph m_humi
humidity.value 42.298481

multigraph m_temp
temperature.value 30.668437

multigraph m_pres
pressure.value 991.962348
等と表示していれば完了です。

あとは数分待ってグラフが表示されるのを待つだけです!
ようやく復旧しました!

2015年10月27日火曜日

復旧7:muninでRaspberry PiのCPU温度を表示してみよう!

予定通り、muninのプラグインを書いてみます。

Raspberry Pi の CPU 温度は以下のように打てば表示されます。

$ cat /sys/class/thermal/thermal_zone0/temp

例えばうちの環境だと、

47615

と表示されました。これは47.615℃という意味らしいです(^^;)。

基本的な流れは、
1.プラグインを作る。
2.プラグインを
  /usr/share/munin/plugins
  へ入れる。
3.実行権限をつける。
4.シンボリックリンクを作成する。
5.munin-node 再起動
となります。

まずはプラグインから。さくっと作ります(笑)。

---ここから
#!/bin/sh
# Raspberry Pi CPU temperature munin plugin by nonnon

#%# family=auto
#%# capabilities=autoconf

temp=$(cat /sys/class/thermal/thermal_zone0/temp)

if [ "$1" = "autoconf" ]; then
if [ -n ${temp} ]; then
echo yes
exit 0
else
echo no
exit 0
fi
fi

if [ "$1" = "config" ]; then
echo 'graph_title CPU Temperature'
echo 'graph_args -Y -J'
echo 'graph_scales yes'
echo 'graph_vlabel Celsius' 
echo 'graph_category Raspberry Pi'
echo 'temperature.label Temperature'
exit 0
fi

echo "temperature.value $((temp / 1000))"
---ここまで

こんな感じですかね。簡単に言うと、
必要な変数を取得する部分、
ちゃんと取得できているかどうか確認する部分、
グラフの設定部分
最後の行がデータを渡す部分、
となっています。超適当な解説なので詳しくは詳しい解説が記載していある他のサイトを御覧ください(笑)。

名前を
raspi_cpu_temp
とでもして
/usr/share/munin/plugins
に保存します。

実行権限を付けます。
$ sudo chmod +x raspi_cpu_temp

/etc/munin/pluginsにシンボリックを作成します。
$ cd /etc/munin/plugins
$ sudo ln -s /usr/share/munin/plugins/raspi_cpu_temp raspi_cpu_temp

munin-nodeを再起動します。
$ sudo service munin-node restart

と、ここまで勢い良く来たんですがどうやらこれでは小数点が出力されないらしい・・・。

いろいろなサイトを見てみるとシェルスクリプトだけで計算しているのは見つからなかったので、あえてここではシェルスクリプトにこだわって以下のように改造しました。

echo "temperature.value $((temp / 1000)).$((temp % 1000))"

いや、偉そうに言うほどのことでもないですね(^^;)。
しかし思うに中学生ごろにはこんなコードを書いていた気がしますが、ここ最近はとんとお目にかかったことがありません。かくいう私もなんとかして普通に計算できないかと調べまくっちゃいました(^^;)。しかし結果的には我ながら良いコードが書けたと思います(笑)。

せっかくなのでプラグインのデバッグ方法など。
・・・実はこれを動かすだけでも結構苦労しました(笑)。打ち間違いから小数点の扱いまで、答えが書いてあると簡単そうに見えるのですが、水面下では白鳥の如くすごい勢いで水を掻いていたりします(^^;)。

プラグインをテストする。
$ sudo /usr/sbin/munin-run raspi_cpu_temp

プラグインが組み込まれているか確認する。
$ munin-node-configure

ひとまずグラフを表示するようになったので、今日はここまで。

次はいよいよ本題のbme280です。i2cの有効化をしてbme280を認識できるようにしてpythonでデータを取得し、muninのプラグインに渡します。

2015年10月26日月曜日

復旧6:nginexとmuninのインストール

では、つづけましょう。

まずは環境の復旧なので、BME280で気圧、温度、湿度のグラフ化を復旧します。
最初にWEBサーバーを立ち上げます。私が使用しているのは、nginex(エンジンエックスと読むそうです。今日初めて知りました(笑)。)ですので、nginexをまずはインストールすることになります。

$ sudo apt-get update
$ sudo apt-get install nginx
$ sudo reboot

この状態で、外から(家庭LAN内ではなく、文字通りWANから)アクセスが可能になりました。もちろんSDカードが壊れる前から運用していたからで、実際にはルーター設定が必要になるでしょう。LANからRaspberry Piのアドレスを叩いても、当然ながらアクセスできました。

/etc/nginx/sites-available/default
の中に
server {
...
root /var/www/html;
...
という記述があり、デフォルトのフォルダは
/var/www/html
となっています。

次はいよいよmuninをインストール。
$ sudo apt-get update
$ sudo apt-get install munin munin-node

nginxのルートにmunin用のディレクトリを作成します。
$ sudo mkdir -p /var/www/html/munin
$ sudo chown -R munin:munin /var/www/html/munin
nginxを再起動して設定を適用します。
$ sudo service nginx restart
ついでにmuninも再起動しておきます。
$ sudo service munin-node restart

しばらくして、muninフォルダにアクセスすると、無事muninのグラフが表示されるはずです。

本日はここまで。
明日はRaspberry PiのCPU温度をグラフ化するプラグインを書いてみたいと思います。


2015年10月25日日曜日

復旧5:起動SSDのパーティション拡張

なにわともあれ、まずはキーボード。キーボード配列が違うと泣きたくなります。
$ sudo raspi-configで
Generic 105-key (Intl) PC → Other → Japanese → Japanese (OADG 109A)
→ The default for the keyboard layout → No compose key → No

次にIPアドレスの固定化。
/etc/network/interfacesの
iface eth0 inet manual
を例えば、以下のようにする。
#iface eth0 inet manual
iface eth0 inet static
address 192.168.1.25
netmask 255.255.255.0
gateway 192.168.1.1

次はsshの有効化。これはそんなに難しくないので軽く流します。
sshクライアントはputtyjpを使います。

あとはpasswordも変更しておきます。
これ以降はsshで作業します。

このへんでそろそろアップデート
$ sudo apt-get update
$ sudo apt-get upgrade

そういえば、ハードディスクのパーティションが小さいままだったので
gpartedをインストールして広げてみます。
$ sudo apt-get install gparted

さくっとやりつもりがエラー。現在起動しているパーティションだからと判断し、
先ほどSSD化するときに使った8GBのSDカードで立ち上げ、gpartedをインストールして
SSDを4GBから15GBに無事拡張。また、1GBのSDカードに戻して起動するのを確認しました。

今日はこんなところかな?

復旧4:外付けUSB-SSDから起動完了!

1GBのSD(いちいちminiを付けるのは面倒なので省略します(^^;)。)カードを先ほどWindowsから見えていたSSDと同じようにFATでフォーマットします。フォーマットしたらSSDからSDへWindows環境で普通にファイルをコピーして、起動するかどうか実験します。

RasPiにSDを挿して電源を入れてみます。お、kernel panicで止まりました。当然ですね(^^;)。
ではここからwindowsに戻ってboot領域を書き換えてみます。

調べてみると、cmdline.txtの
root=/dev/mmcblk0p2

root=/dev/sda1
に変えればいいらしい(^^;)。で、今回使うSSDはbootパーティションもあるので、sda1をsda2に変更してトライ。何事もやってみることが大事です(笑)。

はい、失敗(笑)。Kernel panicでは無いですが動きません。ちなみにsda2をsda1に変えてもダメでした。

しかたがないので初心に帰って、普通の起動ディスクをつくろう・・・。
壊れた8GBのPanasonic製SDカードはSDFormatterでもフォーマットできないし、AOMEI Partition Assistant Standard Edition 5.5でも開放できない。しかたがないので4GBのマイクロSDカードを持ってきて、Jessieを書き込もうと思ったらサイズが足りない・・・。
面倒ですが別の8GBのSDカードを調達し、それにJessieを書いて立ち上げることにしました。

次の作戦は
1.8GBのSDカードにJessieを書く。
2.上記SDカードでSSDのドライブの認識具合を観察して、次の手を考える。
3.おまけで上記SDカードでRaspberry Piを立ち上げて壊れた8GBをフォーマットしてみる。
です。

さくっと8GBにJessieを書いて当たり前のように起動したんですが、XWindowが立ち上がりました・・・。デフォルトでX Windowが立ち上がるんでしたっけ・・・?
マウスを繋げていないのでマウスをつなげて再起動。

Terminalを開いて、
df -h
やはりdev/sda1にSSDのboot、OSはsda2にあるようです。

sda2がどこにマウントされているか確認して、etc/fstabの3行目を
dev/mmcblk0p2 ←システムによって違っている可能性あり。
から
dev/sda2
に書き換えます。

再起動。うーん、これ、SSDから起動しているのか???
(追記:cmdline.txtを変更していない気がするので、今思えば動いてないと思います(^^;)。)

・・・よくわわからないので、こういう時はぶっつけ本番で(笑)。もともと作ってあった1GBのSDに交換して起動するかどうか試してみることにしました。

・・・起動しました。うむー・・・。起動しましたがこれでいいのか(笑)!

結局ここまでやったこと。
1.USB-SSDにJessieイメージを書き込み。
2.1GB SSDをFATでフォーマットしてUSB-SSDからbootパーティションのファイルをコピー。SDのボリューム名をbootに変更。
3.1GBのSSDのcmdline.txtを変更。
 root=/dev/mmcblk0p2
 ↓
 root=/dev/sda2
4.USB-SSDのetc/fstabを変更。
 /dev/mmcblk0p2
 ↓
 /dev/sda2
5.起動。
って感じです。

さて、これから細かい設定をやっていこう。

復旧3:無事USB-SSDに書き込み完了!

ということで、まずはRaspberry PiのOSをUSB-SSDに書き込んでみます。
RaspbianとNOOBSが選べますが、ここでは公式OSということでRaspbianを選択します。
さらにRaspbianはJessieとWheezyが選べます。まあKernel versionが新しいほうがいいだろう、ってことでJessieを選択しました。
さらにUSB-SSDにOSイメージを書き込むためにWin32 Disk Imagerをダウンロードします。

A tool for writing images to USB sticks or SD/CF cards
と書いてあるがUSB sticksってUSB SSDも書き込めるんだろうか・・・。

とりあえずUSB-SSDの先頭20GBをFAT32でフォーマットしました。
Win32 Disk Imagerを起動してみると、USB-SSDを指定できる事が確認できました。
どうやら書き込めそうな気がします。

さて書き込み。Writeボタンを押すと警告メッセージが出るけど無視します(笑)。

いったんUSB-SSDを抜いて挿し直すとこんな結果になりました。
先頭にboot領域、Windowsから見ているので不明なパーティションになっていますが、次にRaspberry PiのOS領域となっています。予想していた通りの結果になりました。

次はこのboot領域を1GBのminiSDにコピーして、起動ドライブに不明なパーティションとなっている領域を指定してあげればうまくいくはずです。

さて・・・。

2015年10月24日土曜日

復旧2:チラシの裏

ここはお前の日記じゃねぇんだ。
チラシの裏にでも書いてろ。な?

私はこの言葉が好きです。自分勝手というか、聞く耳を持たないというか、なんかそういう人に対するすべての思いがここには表現されている気がします(笑)。

さて、ここは私のチラシの裏なので覚書として書き溜めていこうと思ってたりします(^^;)。

前回まででようやく安定動作するようになった私のRaspberry Pi(以下RasPi)ですが、薄々予想していたんですが、SDカードで問題が起きました。薄々予想していたので当然バックアップなんかとってありません。これで4、5回は同じ目にあっているのですが(笑)、遅ればせながらようやく重い腰を上げようと決意しました。

とりあえず前回までで1GBのminiSDカードを用意したんですが、相棒となる40GBのUSB SATAケースに入れらたSSDのパーティションとフォーマットをどうするか悩んでいました。

NTFSなら何かあってもすぐにWindowsに刺して確認できるので便利かと思ったのですが、それでうまくいくかどうかの知識がなさすぎでモヤモヤするので、初心者は初心者らしく、40GBを半分に切って、前半をRasPi起動用にext4でフォーマットして、残りの20GBは今後のためにとっておくことにします。

ということでここまでの成果。

1GB miniSDカード:ブート、FAT
USB接続SSD:
 前半20GBパーティション:起動用、ext4
 後半20GBは未使用

を決定。

さて、次はどうやってbootを作って、どうやってUSB SSDにRasPiのOSを書き込むかだ!

復旧1:Raspberry PiをSSDで!(これらからやる予定(笑))

とは言っても、これからチャレンジするんで自分の腰を上げるために宣言してみました。

Raspberry Piの本体そのものは非常に安定していたんですが、ついにSDカードが飛びました。ちょうど2ヶ月ですね・・・。まあ、SDカードが飛んだのは1度や2度ではないので想定内ですが、バックアップはとってないので(^^;)、せっかくだからSDカードはブート用として、運用はSSDにしてみようと思ってます。

さて、どうなることやら・・・。

追記1:
まずはこの使い道のなくなった、1GBのminiSDカードと壊れたというか分解したminiを標準サイズに変換するアダプタを用意しました(^^;)。
この1GBのminiSDカードにブートを入れて、USB変換ケースに入れたSSDで起動させようという作戦です。

作業1.SD変換アダプタの内部のピンが曲がっていたので、分解してピンを元通りに直し、プラモデル用の接着剤で接着しました。

現在接着待ち中(笑)。

2015年10月4日日曜日

続^11・(経過報告)Raspberry Piがハングアップする原因と対策とは

うちのRaspberry Piはケースをしたまますこぶる安定しています。確かに気温も毎日30℃を超えていたことを考えると低くなってきましたが、それでもこの安定は対策の成果と言ってもいいでしょう。

・・・と偉そうなことを言っても結局ACアダプタのせいだったんですけどね(笑)。

さて、現在の状況です。
   
結論から言うとハングアップ知らずです。ちなみに前回のグラフは8月終わりからだったのですが、今回は途中から湿度も計測できるようにモジュールをBME280に変更したためにこうなっています。

やっぱり気圧、気温、湿度のグラフは面白いですね。この後年末にかけて20℃近く下がってくるはずです。

ちなみに今回のmuninはmultigraphというテクニックを使ってまして、これを導入するにあたってつまらないところでつまずいたので機会があればそのうちに書こうと思っています。