Raspberry Pi Zero Wで測ってみた温度のグラフを取得してみた

■動機と利用したもの

Zabbixに送信した水槽の温度を、自分のブログに載せてみようかなと思ったところです。
毎回Zabbixの画面を見てたんですけれど、スマホでZabbixのグラフを操作するのは結構大変だと気が付き、見たいのは1日程度の画像だなーって気が付いたので
静的に保存した画像を表示しようと思いまして。

グラフを画像化して保存するっていうのはZabbixの公式サイトで紹介されているプログラムがあったので、参考にして改造してしまおうと思います。

Get Graph Image PHP – Zabbix.org
ここで紹介されているプログラムは複数のアイテムを組み合わせたり、色を変えたりできる「グラフ」の画像を取得するプログラムです。
今取得したいのは1つのアイテムのグラフなので、参考にしたものを作ってみました。

■環境

・CentOS6.9
・Zabbix 3.2
・php5.3.3

プログラムのCONFIGRATIONは適切に変更してください。

■取得プログラム

 // ERROR REPORTING
 error_reporting(E_ALL);
 set_time_limit(1800);
 
 //CONFIGURATION
 $z_server = '';
 $z_user   = '';
 $z_pass   = '';
 $z_img_path    = "************/api/images/";
 
 //NON CONFIGURABLE
 $z_tmp_cookies = "";
 $z_url_index   = $z_server ."index.php";
 $z_url_graph   = $z_server ."chart.php";
 $z_url_api     = $z_server ."api_jsonrpc.php";
 
 // Zabbix 2.0
 $z_login_data  = array('name' => $z_user, 'password' => $z_pass, 'enter' => "Sign in");
 
 // FUNCTION
 function GraphImageById ($itemid, $period = 3600, $stime, $width) {
        global $z_server, $z_user, $z_pass, $z_tmp_cookies, $z_url_index, $z_url_graph, $z_url_api, $z_img_path, $z_login_data;
        // file names
        $filename_cookie = $z_tmp_cookies ."zabbix_cookie_" .$itemid .".txt";
        $image_name = $z_img_path ."zabbix_graph_" .$itemid . '_' . $stime.".png";
 
        //setup curl
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $z_url_index);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $z_login_data);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $filename_cookie);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $filename_cookie);
        // login
        curl_exec($ch);
        // get graph
        $z_url_graph_concat = $z_url_graph . '?period=' . $period . '&stime=' . $stime . '&itemids%5B0%5D=' . $itemid . '&width=' .$width;
        curl_setopt($ch, CURLOPT_URL, $z_url_graph_concat );
        $output = curl_exec($ch);
        curl_close($ch);
        // delete cookie
        header("Content-type: image/png");
        unlink($filename_cookie);
        $fp = fopen($image_name, 'w');
        fwrite($fp, $output);
        fclose($fp);
        header("Content-type: text/html");
}
?>

■Zabbix側の準備

・ユーザーグループを作る。
 → ここで、「Webインターフェースへのアクセス」を最初は無効にしてみたのですが、グラフを取得するにはWEBインタフェースにアクセス権がないとだめなことが分かり、「デフォルト」に戻しました。
 → もちろんですが、対象となるホストが所属しているグループへの読み書き権限を入れています。(書き込みはあとでやりたいことのために入れたので取得だけなら読み取りだけでOKなはず)

・ユーザーを作る。
 → エイリアスとパスワードの設定がそのままプログラムにも設定します。

■試しにログインシェル上で手動実行
test_get.phpはGet_graph_image.phpをインクルードして、「GraphImageById(26256,86400,20180602000001,1054);」という関数の呼び出しをしています。

■失敗

# php api/test_get.php 
 
 
# ls -lha api/images/zabbix_graph_26256.png 
-rw-r--r-- 1 root root 1.8K Jun  6 15:02 api/images/zabbix_graph_26256.png
 
 
# file api/images/zabbix_graph_26256.png 
api/images/zabbix_graph_26256.png: HTML document text

これは、「Webインターフェースへのアクセス」の権限がない場合の失敗。

■成功

# php api/test_get.php 
 
 
# ls -lha api/images/zabbix_graph_26256.png 
-rw-r--r-- 1 root root 29K Jun  6 15:08 api/images/zabbix_graph_26256.png
 
 
# file api/images/zabbix_graph_26256.png 
api/images/zabbix_graph_26256.png: PNG image data, 1170 x 362, 8-bit/color RGB, non-interlaced

widthとかちょっと指定と違う気がするけれど、気にしない…ファイル名に時間的なものを付けていないので、プログラムを修正する前に。
あと、rootで実行しているところとかはあまり褒められるものじゃない…

■2018/6/2 の温度変化グラフ

2018/6/2の水槽温度

2018/6/2の水槽温度

■先進的な水槽管理IoTプロジェクト

Make: Japan | Raspberry Piで自動管理する生きたサンゴを植えた海水アクアリウム

こちらで紹介されているように、様々なセンサーを駆使して水槽を全自動で管理するという野望を持っている人が自分の成果を公開してくれているらしいのです。
自分のは始めたばかりですが、こちらはさすがというか…水槽経験ですら、僕は海水をやったことがないのですごいなあと羨望のまなざしです。