Nature Remo API + Google Chartsでグラフを作ろう!

Nature Remo活用シリーズ

0.開封編 1.ダイキンのエアコン 2.ダイキンのエアコン、その2
3.アイリスオーヤマのサーキュレーター 4.温度計 5.温度計、その2
6.Google Chartsでグラフ作成    

こんな感じのグラフを作ります。

さて前回Nature Remo APIから部屋の気温と湿度を定期的に取得してブラウザで表示する温度計を作りました。今回はそのデータをグラフ化して部屋の温度と湿度を見える化してしまおうという計画です。

グラフ描写はGoogle Chartsを利用

データをグラフ化する手法は沢山ありますが、今回はGoogle Chartsを利用します。Google Chatsはグーグルが提供する無料のグラフ作成ツールで、JavaScriptによるライブラリの読み込みとデータの入力を行うだけで、円グラフや折れ線グラフなどいろいろなグラフを作成することができます。

グラフタイプはLine Chart

Chart Galleryから好みのグラフを選びます。今回は温度と湿度を時系列に並べるので折れ線グラフ(Line Chart)にします。

JavaScriptはサンプルコードをちょこっと改造

Google Chartsのページにグラフを描写するためのサンプルコード載っています。このままでも十分かっこいいグラフができますが、Configration Optionsを見ながら線の色やタイトル、凡例を設定することで更に見やすくカッコよくなります。

Nature Remo APIの温度グラフを描写するコード

コードはこのように書きました。

<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>remo chart</title>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script>
google.charts.load('current', {packages: ['corechart', 'line']});
google.charts.setOnLoadCallback(drawCrosshairs);

function drawCrosshairs() {
  var data = new google.visualization.DataTable();
  data.addColumn('string', '日時');
  data.addColumn('number', '室内の気温');
  data.addColumn('number', '室内の湿度');
  data.addRows([

  ]);

  var options = {
    height: '800',
    hAxis: {
      title: '1時間毎の気温と湿度'
    },
    series: {
      0: { color: '#000065' },
      1: { color: '#6565FF' },
      2: { color: '#CB3200' },
      3: { color: '#FFB299' }
    },
    curveType: 'function',
    crosshair: {
      trigger: 'both',
      focused: {
        color: 'green',
        orientation: 'vertical'
      },
      selected: {
        color: 'aqua',
        opacity: 0.3,
        orientation: 'horizontal'
      }
    },
    tooltip: {
      trigger: 'both'
    },
    focusTarget: 'category'
  };

  var chart = new google.visualization.LineChart(document.getElementById('chart_div'));

  chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>

data.addRows([

の後に温度と湿度の値を入れていくと勝手にグラフになってくれます。

ポイントは height: ‘800’, でグラフの縦を長くしているところです。湿度はわりと上下の変化があるのでいいのですが、室内の温度はそんなに変化がないと思います。デフォルトの縦幅だとあまり変化がないつまらないグラフになってしまうので縦を長くして変化を見えやすくしています。因みに800の単位はピクセルです。

このファイルをremo-chart.htmlとして保存します。

温度と湿度の値を自動で追記するプログラム

グラフのベースとなるHTMLとJavaScriptができましたので、Nature Remo APIから取得した温度と湿度の値を自動でどんどん追記していくプログラムを作ります。値は前回作った温度計プログラムの中間生成物である、tmp.jsonファイルから抽出します。実行環境は前回同様、さくらのレンタルサーバ、言語はPerlです。

#!/usr/bin/perl

$| = 1;

#モジュールを指定
use utf8;

#実行時刻の取得
($sec, $min, $hour, $mday, $mon, $year,$wday, $yday, $isdst) = localtime;
$yyyy = $year + 1900;
$month = $mon + 1;

#ファイル指定
$html = './remo-chart.html';
$tmphtml = './tmp.html';
$tmpjson = './tmp.json';

#コマンドと引数を指定
$jq = "/home/XXXX/bin/jq";

#センサー値の取り出し
$te = `$jq .[].newest_events.te.val $tmpjson`;
$hu = `$jq .[].newest_events.hu.val $tmpjson`;

chomp($te);
chomp($hu);

open(HTML, "<$html");
open(TMP, ">$tmphtml");
while ($line = <HTML>){
	chomp($line);
	if($line =~ /]\)\;/) {
		print(TMP "[\"$yyyy/$month/$mday $hour:$min:$sec\", $te, $hu,],\n");
		print(TMP "$line\n");
	} else {
		chomp($line);
		print(TMP "$line\n");
	}
}

close(TMP);
close(HTML);

rename "$tmphtml", "$html";

exit:

プログラム解説

要点を解説します。

#ファイル指定
$html = './remo-chart.html';
$tmphtml = './tmp.html';
$tmpjson = './tmp.json';

ファイルを変数に代入します。一つ目は上で作ったベースとなるHTML + JavaScriptファイル。二つ目は中間ファイル。三つ目はNature Remo APIから取得した値を保存してあるjsonファイルです。tmp.jsonファイルは前回の温度計プログラムの中間生成ファイルです。作り方は前回を参照してください。

#コマンドと引数を指定
$jq = "/home/XXXX/bin/jq";

#センサー値の取り出し
$te = `$jq .[].newest_events.te.val $tmpjson`;
$hu = `$jq .[].newest_events.hu.val $tmpjson`;

chomp($te);
chomp($hu);

jqコマンドを使ってjsonファイルから温度と湿度の値をそれぞれの変数に代入します。変数代入後、chompコマンドを使ってお尻の改行コードを叩き落とします。

open(HTML, "<$html");
open(TMP, ">$tmphtml");
while ($line = <HTML>){
	chomp($line);
	if($line =~ /]\)\;/) {
		print(TMP "[\"$yyyy/$month/$mday $hour:$min:$sec\", $te, $hu, $owtemp, $owhum],\n");
		print(TMP "$line\n");
	} else {
		chomp($line);
		print(TMP "$line\n");
	}
}

close(TMP);
close(HTML);

rename "$tmphtml", "$html";

exit:

open関数を使ってremo-chart.htmlを開きます。同時にtmp.htmlも開きます。続いてwhile関数を使ってremo-chart.htmlを一行づつ読み込みます。その際、 ” ]);  ” にマッチしたら、実行時間、温度、湿度をtmp.htmlに書き込みます。無ければ読み込んだ行をそのままtmp.htmlに書き込みます。

こうすることで

data.addRows([

以降にグラフデータとなる温度と湿度が実行されるたびに追記されていくという仕組みです。

最後に、tmp.htmlをremo-chart.htmlにリネームして終了です。

cronを使って一時間に一回実行

このプログラムをcronを使って1時間に1度実行します。

2 * * * * cd /home/XXXX/bin/remo-chart ; /usr/bin/perl /home/XXXX/bin/remo-chart/remo-chart.pl 1> /dev/null

crontabにこのように登録します。毎時2分に実行するように登録します。

さあ、アクセスしてみよう。remo-chart.html

cronからプログラムが実行されたらグラフが出来上がっているはず・・・。無事グラフが出来上がっています!サンプルはこちら!

remo-chart

1時間毎の温度と湿度が自動で追記されていっています。

これで部屋の温度と湿度の見える化ができるようになりました。

おわり

【安全第一主義】イスラエルに聖地を見に行こう! 〜 ヴィア・ドロローサ編 〜

【目次】イスラエルに聖地を見に行こう!シリーズ

0. 計画編 1. 準備編 2. 事前勉強編 3. 出発編
4. 入国編 5. マミーラホテル 6. ヴィア・ドロローサ編  

遂に旧市街に向かいます。まずはイエスが十字架を背負って歩いた道、ヴィア・ドロローサを歩きます。

イエス・キリスト最後の歩み、ヴィア・ドロローサ

ヴィア・ドロローサとはイエス・キリストが総督から磔の刑を宣告された後、自ら十字架を背負って歩いた道のことです。日本語では悲しみの道や苦難の道と訳されるようです。約2000年前にイエスが歩いた道がまだ残ってるなんて神秘的ですね。これは歩かないわけには行かない!!というわけで始発点から巡ってみたいと思います。

第1留から第14留

ヴィア・ドロローサは第1留から第14留まで中継点があり、それぞれに目印があります。そのうち幾つかは現在では学校や教会の中のようで全部は見られない模様ですが、見つけられるだけ探してみたいと思います。

第2留 鞭打ち教会

第1留は現在は学校になっているらしく一般の人は入れません。実質、第2留が出発点です。第2留は現在、博物館になっています。入り口にはヴィア・ドロローサの道順を示した看板があります。

看板の向かいに鞭打ち教会があります。こじんまりしていますが重厚な雰囲気です。

第3留 最初に倒れた場所

第3留は見つけられず。曲がり角なので場所はあっているはずですが、目印が見つけられませんでした。人通りも多く銃を持った警察が見ているのでウロウロ探すこともできず断念。次に向かいます。

第4留 悲しむ母マリアと出会う

現在は教会になっているようです。

第5留 イエスに変わってシモンが十字架を背負う

扉があります。

5と6の間

5と6の間の路地です。足元を見ると結構段差になっていることが分かります。現在の道は舗装されているので当時の道でないですが、起伏は同じようにあったのでしょう。ここを十字架を背負って歩くというのは本当に苦難の道ですね・・・。

第6留 ベロニカがイエスの顔を拭く

扉があります。写真に写っている外国人は恐らくヴィア・ドロローサを巡るツアーだと思います。英語が分かればこのようなツアーに参加するのもいいかなと思いました。少し見ていましたが、解説の後はみんなでお祈りをしていました。

第7留 二度目に倒れた場所

中に祭壇があります。

入り口に交通整理をしているおじさんが一人いましたがこの人がオフィシャルな人なのか地元のボランティアなのか分かりませんでした。

第8留 悲しむ婦人を慰めた

目印があるだけです。ここはメイン通りから一本路地に入ったところにあります。

第9留 三度目に倒れた場所

はっきりとした場所は分からず。恐らく左の教会の中だと思います。突き当りの壁が聖墳墓教会です。

第10留 衣服を剥ぎ取られる

右に写っているドームの屋根が付いた小さな聖堂が第10留です。階段が付いていますが中には入れませんでした。

この建物が聖墳墓教会です。第11留から第14留までは聖墳墓教会の中にあります。

ここがゴルゴダの丘なんだなぁ。遂にここまで来れたんだなぁとむちゃくちゃ感動します。

ヴィア・ドロローサはどこにあるの?

名称: ヴィア・ドロローサ
住所: Jerusalem

今回はここまで。次回は聖墳墓教会です!

【安全第一主義】イスラエルに聖地を見に行こう! 〜 マミーラホテル 〜

【目次】イスラエルに聖地を見に行こう!シリーズ

0. 計画編 1. 準備編 2. 事前勉強編 3. 出発編
4. 入国編 5. マミーラホテル    

今回はエルサレム観光の拠点となるマミーラホテルのレビューです。

マミーラホテルはエルサレム旧市街と新市街のちょうど中間にあるマミーラモール内にある高級ホテルです。

 

 

 

新市街の入り口までは徒歩で約10分、旧市街の入り口であるヤッフォ門までも徒歩5分です。ヤッフォ門まではマミーラモールを抜ける格好になるため夜間でも明るくエルサレム観光拠点としてはベストロケーションにあります。

スタジオ

私が泊まったのはスタジオと呼ばれるタイプの部屋です。キングサイズのベットが一つのシングルルームです。一人で泊まるには十分な広さです。

お風呂はなぜかガラス張りです。

アメニティーはなんとブルガリです。体を洗うとブルガリな香りがします(謎

バスタブあります。(大事)

便器がなぜか四角いです。ふんばるとケツが痛い。

Ballroom(朝食)

朝食は地下にあるBallroomというレストランで頂きます。

地下ですが日差しが入るようになっています。朝食は午前6時30分から開いています。初日は時差ボケで開店と同時に行ったら貸切状態でした。

朝食はバイキング形式です。メニューはすごく豊富でお国柄、野菜が中心です。その他に豆を使った料理とパンが多い印象です。

私の朝食はだいたいこんな感じ。魚はイワシ?の塩漬けとスモークサーモンです。緑の葉っぱは何か分かりませんでしたがすごく苦い。パンは砂糖の甘い味付けです。尚、目玉焼きはその都度オーダーして焼いてもらうスタイルですが、シャバット(安息日)はやってません。

テラス席もあります。

Rooftop Restaurant

マミーラホテルには最上階にルーフトップレストランがあります。

ロケーションが最高です。周りに高い建物はなくエルサレムの南側が一望できます。写真の左奥に写っている城壁は旧市街を取り囲んでいる壁です。

ランチにローストビーフサンドイッチを頂きました(食べかけ)。

他にもカップリが何組かおり賑わっていました。恐らくエルサレムでも1、2を争うオシャレレストランなんだと思います。

夜景。右下の明るい通りがマミーラモールでその奥がエルサレム旧市街です。

ディナーでも一度、利用しました。フォアグラと牛ヒレステーキです。これとサラダとパンとビールで1万円ぐらいだったと記憶しています。因みに夜は人気店なので予約が必須です!私は当日の午前にホテルのフロントで予約しました。

ホテル周辺

ホテルを出るとマミーラモールというショッピング街と繋がっています。マミーラモールはレストラン、パン屋、お土産、アイスクリームなどいろいろあり、割りとなんでも揃います。夜も明るくヤッフォ門まで繋がっているので夜の散策も楽しめます。

マミーラモールとは反対側の入り口の向かいに24時間スーパーがあります。ここはなんだかんだで一番お世話になったお店と思います。エルサレムは日差しが強いので水を大量に消費します。買いだめには最適なお店です。結構混んでます。

24時間スーパーを挟んで道の一本隣りが両替所です。一度だけ利用しました。日本円から現地通貨のシェケルへの両替もやっています。手数料が高かったかな?ドルからシェケルへはホテルのフロントでもやってくれます。

ランドリー

長期滞在だったので一度だけランドリーを頼んでみました。料金はよくあるホテルのランドリーサービスと同等で安くはないですが、丁寧にやってくれます。品質に問題はありません。

マミーラホテルはどこにあるの?

名称: マミーラホテル
住所: Shlomo ha-Melekh St 11, Jerusalem, イスラエル

以上でマミーラホテル編は終了です。次回は遂に旧市街入り。ヴィア・ドロローサ編です!