2017年4月4日火曜日

Postgres/PHP/JpGraphで小物作り

以前ESP8266を使って一定時間ごとに室内の気温、湿度、気圧を送信する小物を作りましたが、そのデータを四六時中動いているFreeBSDのサーバに送信するようにしてありました。 そして、サーバではデータを受け取るとPostgreSQLのDBにため込むようにしていました。 
実際にはESPのSleepの仕様(?)の関係から一時間おきくらい(不正確)のデータアップロードになっていますで、計測時間はサーバがデータを受け取った時にしています。
このデータをWEBブラウザでグラフで見れるようにと、久しぶりにPHPでプログラムを組んでみました。 昔一度使ったことがあって、デバッグが面倒で好きになれませんでしたが、今回も自分のケアレスミスでまる一日悩まされることになりました。 グラフの描画プログラムの中にデバッグ用のprint文を埋め込むと”データが壊れているよ”ってエラーが出るんですよね、当たり前の話ですが、、。 このデバッグ用のスタブが見つけられずに苦しんでいましたが、今朝やっと見つけて何とか動くようになりました。 

取り敢えず、未完成ですが、備忘録のつもり。 デバッグスタブと$マークで苦しみました。
まだ、スッピンのブスなので、色々メイクして綺麗にしてあげないと、、、、。 慣れちゃえばそんなにムズイ事は無いのですが、使わないと直ぐに忘れちゃいますからね~。

取り敢えず、シャックのモニターで色々な所の温度とか、土壌水分とか見ながら必要な仕事をモニター画面からボタン一つで指示する、というズボラ・システムの基礎実験の初めの始め。

require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_line.php');

  $ydata = array();
  $ymax = array();
  $ymin = array();
  $yhumid = array();
  $ymaxhumid = array();
  $yminhumid = array();
  $ypressure = array();
  $ymaxpressure = array();
  $yminpressure = array();
 
$conn = "hostaddr=192.168.1.3 dbname=data_logger user=ken password=love4u";
$link = pg_connect($conn);
if (!$link) {
   die ('Connection failed '.pg_last_error());
   }

  $result = pg_query('SELECT yyyymmdd, avg_temp, max_temp, min_temp,avg_humid, max_humid, min_humid, avg_pressure,max_pressure,min_pressure from dailydata1month' );
if (!$result){
   die('Query failed'.pg_last_error());
  }

for ($i = 0; $i < pg_num_rows($result); $i++){
    $rows = pg_fetch_array($result, NULL, PGSQL_ASSOC);
    $x_axis[$i] = $rows['yyyymmdd'];
    $ydata[$i] = $rows['avg_temp'];
    $ymax[$i] = $rows['max_temp'];
    $ymin[$i] = $rows['min_temp'];
    $yhumid[$i] = $rows['avg_humid'];
    $ymaxhumid[$i] = $rows['max_humid'];
    $yminhumid[$i] = $rows['min_humid'];
    $ypressure[$i] = $rows['avg_pressure'];
    $ymaxpressure[$i] = $rows['max_pressure'];
    $yminpressure[$i] = $rows['min_pressure'];
}

$close_flag = pg_close($link);


$graph = new Graph(750, 350,"auto");
$graph->SetFrame(true);
$graph->SetScale("textlin",0, 40);
$graph->SetY2Scale("lin",0, 1500);

$lineplot = new LinePlot($ydata);
$lineplot->SetColor("blue");
$lineplot1 = new LinePlot($ymax);
$lineplot1->SetColor("red");
$lineplot2 = new LinePlot($ymin);
$lineplot2->SetColor("orange");

$graph->Add($lineplot);
$graph->Add($lineplot1);
$graph->Add($lineplot2);

$graph1 = new Graph(750, 350,"auto");
$graph1->SetFrame(true);
$graph1->SetScale("textlin",0, 100);

$lineploth = new LinePlot($yhumid);
$lineploth->SetColor("blue");
$lineploth1 = new LinePlot($ymaxhumid);
$lineploth1->SetColor("red");
$lineploth2 = new LinePlot($yminhumid);
$lineploth2->SetColor("orange");

$graph1->Add($lineploth);
$graph1->Add($lineploth1);
$graph1->Add($lineploth2);

$lineplotp = new LinePlot($ypressure);
$lineplotp->SetColor("blue");
$lineplotp1 = new LinePlot($ymaxpressure);
$lineplotp1->SetColor("red");
$lineplotp2 = new LinePlot($yminpressure);
$lineplotp2->SetColor("orange");

$graph->Add($lineplotp);
$graph->Add($lineplotp1);
$graph->Add($lineplotp2);

//$graph->Stroke();
$graph1->Stroke();

?>
 

0 件のコメント:

php のインストールの確認

phpって最初のfacebook書くときに使われたみたいで、それなりに歴史のある言語で、私も2006年位から使っていますが、CLIで使う事はあまり無いので、apacheとの連携のトラブル(mod_phpのバージョンの齟齬)などは気になりますが、拡張モジュールのインストールの問題に...