あたた日記

あたたん。

RaspberyPiで温度を計測、日次でグラフを作る【gnuplot】

※2019/05/03 商品リンクを修正

USB温度計とPCを組み合わせて、部屋の気温の推移を計測する。
日毎のグラフを作成し、サーバーへアップロードする仕組みを実装した記録。

使うものたち

常時、電源をONさせる必要があるため、RaspberyPiを使用。
OSはRaspbianを使用
USB温度計は、amazonで低価格だった、下記商品を購入。

USB温度計! USB thermometer-528018

USB温度計! USB thermometer-528018

RaspberryPi側のデバイスの用意

RaspberryPiでUSB温度計を使用できるための設定内容は、
"RaspberryPi 温度計"で検索すると、設定例などがヒットするので、そちらを参考にする。
今回、参考にしたのは下記サイト。わかりやすいです。
dolls.orz.hm

デフォルトでは時刻が世界標準時になっている(gmtime)ため、
サーバーの時刻を使用する(localtime)ようにtemper.cを修正する。

temperの実行結果は、下記のようになる。

root@raspberrypi:/work/temper# ./temper
11-Feb-2016 21:50,21.074169
root@raspberrypi:/work/temper#

cronには10分毎に実行されるよう、下記で登録。
これで、各日00:00〜23:50までの10分毎の気温が、
1つのテキストファイルに書き込まれる。

*/10 * * * * /work/temper/temper >> /work/temper_log/temp_`date +\%Y\%m\%d`.txt

グラフ作成プログラムについて

今回はgnuplotを使用する。

gnuplotの導入

gnuplotは下記で導入する。

# apt-get install gnuplot

バッチ用ファイル(雛形)の用意

gnuplot用のコマンドを記述したテキストファイルを用意しておくことで、
バッチ処理でグラフ作成ができる。

バッチ用ファイルの中身は下記、

set timefmt "%d-%b-%Y %H:%M"
set xdata time
set datafile separator ","
set format x "%H"
set yrange[5:25]
set title "YYYYMMDD_TEMPER"
unset key

set terminal png
set output "YYYYMMDD.png"
plot "temp_YYYYMMDD.txt" using 1:2 with line

1行目のtimefmtで、日付および時刻部分の形式を指定してあげて、
2行目で「x軸(横方向)は時刻だよ」って定義してあげる。
形式の指定は、下記が参考になるかも。
34.54 Timefmt
今回はデータの区切りにカンマを使用しているため、3行目のdatafile separatorで定義しておく。

実際のグラフ出力を行っているのは、最後の3行部分。
png形式で、YYYYMMDD.pngという名前でファイルを出力させる。
※YYYYMMDDは、後ほど計測日の日付に変更する。

バッチ用ファイルからグラフの作成

上記のバッチ用ファイルのうち、"YYYYMMDD"を計測日の日付に置換してから、
gnuplotでグラフを生成する。
この時、グラフ作成は計測が終わった翌日に実施させる想定のため、計測日はコマンド実行日の前日とする。

こんな感じの処理を、cronで日次で動かせばいけそう。
上記のバッチ用ファイル(雛形)は"gnuplot.txt"

date=`date +%Y%m%d -d '1 day ago'`            #実行日が2016年2月10日なら変数dateには"20160210"
output_file="${date}_gnuplot.txt"
sed -e "s/YYYYMMDD/$date/" gnuplot.txt > $output_file       #バッチ用ファイルの"YYYYMMDD"を、
                                                            #"20160210"に置換させる
gnuplot $output_file        #2016年2月10日の気温グラフを作成し、"20160210.png"として出力する
    

できあがったグラフはこちら。
f:id:com-wing0605:20160211213945p:plain

毎朝、6時ごろに暖房が自動でONにする設定にしているため、
その時間帯は急に部屋の温度が上昇していることがわかる。

7-Zipで固めたtarがAIXで解凍失敗することがありそう。

AIXでは、ある特定の条件でtar解凍が失敗することがある。
その一例が、長いパスを含むフォルダを少し古いバージョンの「7-Zipツールでtarに固めたときに起こる模様。

試しに、に文字長15のフォルダを作り、その中に文字長15のフォルダ、またその中に文字長15のフォルダ…
これを10回ほど繰り返した構成のフォルダを作る。
上記のマトリョーシカみたいなフォルダを、7-Zipでtarに固める。
7-Zipのバージョンは9.20、Windows7で実行した。

tar -tvfで中身を確かめてみるのだが、本来はこうなるはず。
まずはFreeBSDにtarを送りつけて、試す。

% tar --version
bsdtar 2.8.5 - libarchive 2.8.5
% tar -tvf 0ABCDEFGHIJKLMN.tar
drwxrwxrwx  0 0      0           0 Jan 24 19:27 0ABCDEFGHIJKLMN/
drwxrwxrwx  0 0      0           0 Jan 24 19:27 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/
drwxrwxrwx  0 0      0           0 Jan 24 19:27 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/
drwxrwxrwx  0 0      0           0 Jan 24 19:27 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/
drwxrwxrwx  0 0      0           0 Jan 24 19:27 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/
drwxrwxrwx  0 0      0           0 Jan 24 19:27 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/
drwxrwxrwx  0 0      0           0 Jan 24 19:27 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6ABCDEFGHIJKLMN/
drwxrwxrwx  0 0      0           0 Jan 24 19:27 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6ABCDEFGHIJKLMN/7ABCDEFGHIJKLMN/
drwxrwxrwx  0 0      0           0 Jan 24 19:28 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6ABCDEFGHIJKLMN/7ABCDEFGHIJKLMN/8ABCDEFGHIJKLMN/
drwxrwxrwx  0 0      0           0 Jan 24 19:28 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6ABCDEFGHIJKLMN/7ABCDEFGHIJKLMN/8ABCDEFGHIJKLMN/9ABCDEFGHIJKLMN/
%

で、AIXでtar -tvfで中身を確認した結果がこちら。

l273pp020_pub[/test/7zp] > tar -tvf 0ABCDEFGHIJKLMN.tar
drwxrwxrwx 0   0        0 Jan 24 04:27:23 2016 0ABCDEFGHIJKLMN/
drwxrwxrwx 0   0        0 Jan 24 04:27:27 2016 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/
drwxrwxrwx 0   0        0 Jan 24 04:27:34 2016 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/
drwxrwxrwx 0   0        0 Jan 24 04:27:39 2016 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/
drwxrwxrwx 0   0        0 Jan 24 04:27:44 2016 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/
drwxrwxrwx 0   0        0 Jan 24 04:27:48 2016 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/
drwxrwxrwx 0   0        0 Jan 24 04:27:52 2016 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6AB
drwxrwxrwx 0   0        0 Jan 24 04:27:56 2016 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6AB
drwxrwxrwx 0   0        0 Jan 24 04:28:03 2016 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6AB
drwxrwxrwx 0   0        0 Jan 24 04:28:07 2016 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6AB
l273pp020_pub[/test/7zp] >

"6AB"のように、パスが途中で切れてしまっている…
よく調べていないけど、パスの文字長が合計100文字を超えるとうまく動かないっぽい。

この不具合の嫌なところは、一見正常に解凍できているようでも、
実は失敗してました。ということが起こるところ。
実際にtar -xvfで展開してみると、

l273pp020_pub[/test/7zp] > tar -xvf 0ABCDEFGHIJKLMN.tar
x 0ABCDEFGHIJKLMN
x 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN
x 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN
x 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN
x 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN
x 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN
x 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6AB
x 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6AB
x 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6AB
x 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6AB
l273pp020_pub[/test/7zp] > echo $?
0
l273pp020_pub[/test/7zp] > cd 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN
l273pp020_pub[/test/7zp/0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN] > ls -l
合計 0
drwxrwxrwx    2 root     system          256 Jan 24 04:27 6AB
l273pp020_pub[/test/7zp/0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN] > ls -l 6AB
合計 0
l273pp020_pub[/test/7zp/0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN] >

リターンコード0でコマンドが実行終了するが、6ABCDEFGHIJKLMNフォルダより下位のフォルダが作られていない。
標準出力にもエラーメッセージは出ないので、ファイルのパスやファイル名が正しいものになっているかチェックするしかなさそう。

ただ、この不具合は下記のように回避ができる。
・「7-zip」の別バージョンを使用する。
※2016/01時点で最新Verの15.14では発生しなかった。
・"AIX Toolbox for Linux Applications"から導入したtarで代用する。
下記は導入したtarで中身を確認した結果。正常にフォルダ名が見れている。

l273pp020_pub[/test/7zp] > which gtar
/usr/bin/gtar
l273pp020_pub[/test/7zp] > gtar -tvf 0ABCDEFGHIJKLMN.tar
drwxrwxrwx 0/0               0 2016-01-24 04:27:23 0ABCDEFGHIJKLMN/
drwxrwxrwx 0/0               0 2016-01-24 04:27:27 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/
drwxrwxrwx 0/0               0 2016-01-24 04:27:34 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/
drwxrwxrwx 0/0               0 2016-01-24 04:27:39 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/
drwxrwxrwx 0/0               0 2016-01-24 04:27:44 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/
drwxrwxrwx 0/0               0 2016-01-24 04:27:48 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/
drwxrwxrwx 0/0               0 2016-01-24 04:27:52 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6ABCDEFGHIJKLMN/
drwxrwxrwx 0/0               0 2016-01-24 04:27:56 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6ABCDEFGHIJKLMN/7ABCDEFGHIJKLMN/
drwxrwxrwx 0/0               0 2016-01-24 04:28:03 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6ABCDEFGHIJKLMN/7ABCDEFGHIJKLMN/8ABCDEFGHIJKLMN/
drwxrwxrwx 0/0               0 2016-01-24 04:28:07 0ABCDEFGHIJKLMN/1ABCDEFGHIJKLMN/2ABCDEFGHIJKLMN/3ABCDEFGHIJKLMN/4ABCDEFGHIJKLMN/5ABCDEFGHIJKLMN/6ABCDEFGHIJKLMN/7ABCDEFGHIJKLMN/8ABCDEFGHIJKLMN/9ABCDEFGHIJKLMN/
l273pp020_pub[/test/7zp] >

ミドルウェアの導入ドキュメントには、たまにモジュールの解凍はGNUのtarコマンドを推奨と書かれていることもある。
公式が出すドキュメントに書いてあることは素直に聞きましょう(迫真)。

【VirtualBox】supR3HardNtChildWaitForみたいなエラーでゲストOSが起動しない

久しぶりにVirtualBoxのゲストOSを立ち上げていろいろやろうかなって思ったときに、
ゲストOSの起動にいつもより時間かかるな…と思っていたら
↓みたいなエラーが出て起動失敗した。

f:id:com-wing0605:20151219214920j:plain

f:id:com-wing0605:20151219214924j:plain

ログ見ろよみたいなこと書いてあるけど、見たところでさっぱり…

メッセージボックスにあった、"supR3HardNtChildWaitFor"でググってみて、
自分と同じエラーメッセージがあったサイトを発見。

linuxpasapas.blog.free.fr

google翻訳でフランス語を解読していくと、
文中に"Avira"の文字列が。
そういや、ホストOS(Windows 7)にアンチウイルスとして導入していたな。。。

まさかとは思い、Aviraのウイルス対策ソフトをアンインストールしたところ、
ゲストOSが立ち上がるようになった!これで一安心。
Avira系の製品でAntiVirusとFirewallの2つが入っていたけど、
AntiVirusのアンインストール中に失敗したはずのゲストOSが立ち上がった?ので、コイツが悪さをしてたんだな。


ちなみに、この記事書いている時に見つけた投稿。
virtualbox - VirtualBoxのゲストがタイムアウトする(Error In supR3HardNtChildWaitFor) - スタック・オーバーフロー

Aviraの製品バージョンも自分と同じ「15.0.15.129」だったので、
アンインストールしなくても、このやり方でよかったんだろうな。

早く別のアンチウイルスソフト探さなきゃ、Avastに戻すかな。。。

exprで負の数を含む計算が失敗する【FreeBSD】

exprコマンドで少しハマったこと。

HackerRankの問題を解くのに「簡単そうだからシェルスクリプトでやってみるか」とガリガリ書いてみたが、
どうもexprの計算でエラーになる箇所がある。

### 1つ目が正の数だと、エラーにならない
% expr 1 + -1
0
### 1つ目が負の数だと、エラーになる
% expr -1 + 1
expr: illegal option -- 1
expr: usage: expr [-e] expression

%

どうやらFreeBSDのexprコマンドでは、第一引数に負の数を渡すと
エラーになる仕様みたい。
http://www.freebsd.org/cgi/man.cgi?query=expr&sektion=&n=1
"EXAMPLE"の項目に、「negative number(負の数)は括弧で囲むように」って書いてある。
しかも、括弧をつけるときはエスケープしてあげないといけない。

### '('や')'をエスケープしないとエラー
% expr ( -1 + 1 )
Badly placed ()’s.
### \でエスケープしたら成功
% expr \( -1 + 1 \)
0
%

そういえば、dateコマンドで表示する日付をずらすときも
FreeBSDではコマンドが違ったような。
d.hatena.ne.jp

【VirtualBox】デフォルトで作られるホストオンリーネットワークがDHCPが有効になっていた

VirtualBox(5.0.10)でいくつか仮想OSを立ち上げたときに、少しハマったこと。

 

ホストOS(Windows 7)からゲストOSへの通信用に、ネットワーク設定で「ホストオンリーネットワーク」を選択。

特にゲストOSから外部ネットワークへ接続する必要もないので。

f:id:com-wing0605:20151205231141j:plain

ただ、この「ホストオンリーネットワーク」、ゲストOS側のIPアドレスが固定できない。

ホストOSからゲストOSへ、常に同じIPアドレスでアクセスするには別の方法(NAT?)を使うしかないのか。。。

 

で、調べてみると、VirtualBoxインストール時に追加される「ホストオンリーネットワーク」は、DHCPの機能が有効になっていました。すごい単純なお話し。

「ファイル」>「環境設定」>「ネットワーク」>「ホストオンリーネットワーク」で確認ができます。

f:id:com-wing0605:20151205231150j:plain

上記の図のように、デフォルトでDHCPサーバーが有効になっていました。

これのチェックを外せば、固定IPアドレスを割り振れることが可能になりました。

 

ちなみに、Windowsではインストール時にホストオンリーネットワークが追加されるみたいだけど、Macだとインストール時には追加されないみたい。

f:id:com-wing0605:20151205233451j:plain

右側の「+」みたいなボタン押せば、追加できるので、特に問題はないですが。

TeraTermで目的サーバーへログイン&個別の設定がされるショートカットをデスクトップに作る

タイトルが長くなってしまったけど、やりたいことはタイトルの通り。

TeraTermでサーバーにログインして、作業する機会が多いですが、

  • ログインする度にユーザー/パスワードを入力するのは面倒。
  • 複数サーバーにログインすると、どれがどのサーバーか分からなくなる。

という悩み(些細かもしれないけど)を抱えていました。

それを解決するため、自分は以下のようにしています。

 

①デスクトップにTeraTermのショートカットができたら、右クリックして「プロパティ」を表示させ、「ショートカット」タブを表示。

 

f:id:com-wing0605:20151108183019j:plain

 

②上記の赤枠内を、以下のように変更する。

修正前:"C:\Program Files (x86)\teraterm\ttermpro.exe"

修正後:"C:\Program Files (x86)\teraterm\ttermpro.exe" 192.168.1.1 /F="C:\Documents\teraterm 設定\TERATERM_CR01.ini" /auth=password /user=admin /passwd=zaq12wsx

もともとのttermpro.exeの後ろに、コマンドを追記する感じです。

追記した部分の簡単な説明、各自の環境に応じて適宜変更してくださいな。

  • 192.168.1.1←ログインしたいサーバーのIPアドレス
  • /F="C:\Documents\teraterm 設定\TERATERM_CR01.ini"←個別に作っておいた設定ファイル。ちなみに設定ファイルのパスに半角スペースがある場合はダブルクオーテーションで囲んであげる必要あり。
  • /auth=password←ログイン方法。今回は鍵を使用しないパスワード認証方式のため、password。
  • /user=admin←ログインユーザー(adminでログインする)
  • /passwd=zaq12wsx←パスワード(zaq12wsxがadminのパスワード)

 

③ あとは、OKでプロパティ画面を閉じれば完了。

 

これで、デスクトップのアイコンをダブルクリックするだけでログインできます。

f:id:com-wing0605:20151108190030p:plain

 制約としては、telnetログインの場合はユーザー/パスワードの設定は上記の方法じゃできないみたい。

 

参考サイト

www.softel.co.jp