diff web/db2.php @ 0:9dab44dcb331

Initial commit of Greg's code from http://www.lemis.com/grog/tmp/wh1080.tar.gz
author Daniel O'Connor <darius@dons.net.au>
date Tue, 09 Feb 2010 13:44:25 +1030
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/db2.php	Tue Feb 09 13:44:25 2010 +1030
@@ -0,0 +1,422 @@
+<!-- for Emacs, this is a -*- mode: html-fill; coding: utf-8 -*- document -->
+<!-- $Id: db2.php,v 1.1 2009/12/23 23:48:03 grog Exp $ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<?php
+{
+  $title = "Dereel weather observations";
+  $subtitle = "";
+  include "header.php";
+  include "weathergraph.php";
+  $id = '$Id: db2.php,v 1.1 2009/12/23 23:48:03 grog Exp $';
+}
+?>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <?php pagetitle0 ($title); ?>
+    <meta http-equiv="refresh" content="900" ;="">
+  </head>
+
+  <body>
+    <?php pageheader0 ($title); ?>
+
+    <div align="justify">
+      <p>
+	This is an experimental page that I'm working on as part of my weather reporting software.
+	It'll grow over time.  In the meantime, you can get more complete version of this
+	information from the <?php href
+	("http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IVICTORI124",
+	"Wunderground page"); ?> for this station.
+      </p>
+
+<?php
+
+{
+  $doplot = "/home/grog/src/weather/WH-1080/plots/doplots";
+  $weatherdir = "/home/grog/public_html/weather";
+  $me = basename ($_SERVER ["SCRIPT_FILENAME"]);
+
+  if (array_key_exists ("date", $_GET))
+  {
+    $mydate = validdate ($_GET ["date"], "date");
+    if (is_array ($mydate))                       /* valid date */
+      $startdate = formatdate ("Y-m-d", $mydate);
+    else
+    {
+      print <<< EOS
+        <p>
+        <font color="red">Invalid date: $mydate.  Using today's date</font>
+        </p>
+EOS;
+      $startdate = date ("Y-m-d");
+    }
+  }
+  else
+  {
+    $mydate = getdate ();
+    $startdate = date ("Y-m-d");
+  }
+
+  $oneday = 1;      /* Readings for a single day until proven otherwise */
+  if (array_key_exists ("enddate", $_GET))
+  {
+    $myenddate = validdate ($_GET ["enddate"], "date");
+    if (is_array ($myenddate))                       /* valid date */
+      {
+      $oneday = 0;                  /* Multidate XXX check more carefully */
+      $enddate = formatdate ("Y-m-d", $myenddate);
+      }
+    else
+    {
+      $enddate = date ("Y-m-d", addsecs ($mydate,  86400));
+      print <<< EOS
+        <p>
+        <font color="red">Invalid date: $myenddate.  Using $enddate</font>
+        </p>
+EOS;
+    }
+  }
+  else
+  {
+    $myenddate = addsecs ($mydate,  86400);
+    $enddate = formatdate ("Y-m-d", $myenddate);
+  }
+
+  /*
+   * If today, get current readings.  In this case, we ignore enddate, since it
+   * can't mean anything. */
+  $istoday = $startdate == date ("Y-m-d");
+
+  /* Environment to check for graphs */
+  $yesterday = formatdate ("Ymd", (addsecs ($mydate, -86400)));
+  $tomorrow = formatdate ("Ymd", (addsecs ($mydate, 86400)));
+
+
+  print <<< EOS
+
+     <!-- Select new date -->
+    <table>
+      <tr>
+	<td align="left">
+          <form action="$me" method="get">
+	    <input type="submit" value="Previous day"/>
+  	    <input size="20" maxlength="20" type="hidden" name="date" value="$yesterday"/>
+          </form>
+	</td>
+
+	<td>
+	  <form action="$me" method="get">
+	    <table summary="Parameter input" cellspacing="2" border="0">
+              <tr>
+		<td>
+		  <input type="submit" value="New date:"/>
+		</td>
+
+                <!-- value -->
+		<td>
+  		  <input size="20" maxlength="20" type="text" name="date" value="$startdate" />
+		</td>
+              </tr>
+	    </table>
+	  </form>
+	</td>
+EOS;
+
+    if (! $istoday)
+      print <<< EOS
+	<td align="right">
+           <form action="$me" method="get">
+	         <input type="submit" value="Next day"/>
+  	         <input size="20" maxlength="20" type="hidden" name="date" value="$tomorrow"/>
+           </form>
+	</td>
+
+	<td align="right">
+           <form action="$me" method="get">
+	         <input type="submit" value="Today"/>
+           </form>
+	</td>
+
+EOS;
+  print <<< EOS
+
+      </tr>
+    </table>
+
+EOS;
+
+  /* Set up database stuff */
+  /* XXX This stuff should come from config */
+  require "db.inc";
+  $hostname = "localhost";
+  $username = "grog";
+  $password = "";
+  $database = "weather";
+  $dbtable = "observations";
+  $station_id = "Dereel";
+
+  /* Connect to the server */
+  if (! ($connection = @ mysql_pconnect ($hostname, $username, $password)))
+    showerror ();
+
+  if (! mysql_select_db ($database, $connection))
+    showerror ();
+
+  if ($istoday)
+  /* get current readings.  These are really the average of the last 5 minutes */
+  {
+    $now = time ();
+    $start = time () - 600;   /* 5 minutes ago */
+
+    $wind_directions = array ("N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE",
+                              "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW");
+    $result = mysql_query (<<< EOS
+SELECT AVG(inside_humidity),
+       AVG(inside_temp),
+       AVG(inside_dewpoint),
+       AVG(outside_humidity),
+       AVG(outside_temp),
+       AVG(outside_dewpoint),
+       AVG(pressure_msl),
+       AVG(wind_speed),
+       AVG(wind_gust),
+       AVG(wind_direction),
+       SUM(rain)
+FROM $dbtable
+WHERE unix_timestamp(timestamp(date,time)) >= $start
+  AND unix_timestamp(timestamp(date, time)) <= $now
+  AND station_id = "$station_id"
+EOS
+                           , $connection );
+
+    if (! $result)
+      showerror ();
+    if ($row = mysql_fetch_array ($result, MYSQL_NUM))
+    {
+      $inside_humidity = sprintf ("%2.0f", $row [0]);
+      $inside_temperature = sprintf ("%2.1f", $row [1]);
+      $inside_dewpoint = sprintf ("%2.1f", $row [2]);
+      $outside_humidity = sprintf ("%2.1f", $row [3]);
+      $outside_temperature = sprintf ("%2.1f", $row [4]);
+      $outside_dewpoint = sprintf ("%2.1f", $row [5]);
+      $pressure_msl = sprintf ("%2.1f", $row [6]);
+      $wind_speed = sprintf ("%2.1f", $row [7]);
+      $wind_gust = sprintf ("%2.1f", $row [8]);
+      $wind_direction = sprintf ("%2.1f", $row [9]);
+      $rain = sprintf ("%2.1f", $row [10]);
+      $wind_direction_text = $wind_directions [($row [9] + 11.25) / 22.5];
+    }
+  }
+
+  $result = mysql_query (<<< EOS
+SELECT @max_inside_humidity := MAX(inside_humidity),
+       @min_inside_humidity := MIN(inside_humidity),
+       @max_inside_temp := MAX(inside_temp),
+       @min_inside_temp := MIN(inside_temp),
+       @max_inside_dewpoint := MAX(inside_dewpoint),
+       @min_inside_dewpoint := MIN(inside_dewpoint),
+       @max_outside_humidity := MAX(outside_humidity),
+       @min_outside_humidity := MIN(outside_humidity),
+       @max_outside_temp := MAX(outside_temp),
+       @min_outside_temp := MIN(outside_temp),
+       @max_outside_dewpoint := MAX(outside_dewpoint),
+       @min_outside_dewpoint := MIN(outside_dewpoint),
+       @max_pressure_msl := MAX(pressure_msl),
+       @min_pressure_msl := MIN(pressure_msl),
+       @max_wind_speed := MAX(wind_speed),
+       @min_wind_speed := MIN(wind_speed),
+       @max_wind_gust := MAX(wind_gust),
+       @min_wind_gust := MIN(wind_gust),
+       SUM(rain)
+FROM $dbtable
+WHERE date >= "$startdate"
+  AND date < "$enddate"
+  AND station_id = "$station_id"
+EOS
+                           , $connection );
+
+    if (! $result)
+      showerror ();
+    if ($row = mysql_fetch_array ($result, MYSQL_NUM))
+    {
+	$max_inside_humidity = sprintf ("%2.1f", $row [0]);
+	$min_inside_humidity = sprintf ("%2.1f", $row [1]);
+	$max_inside_temp = sprintf ("%2.1f", $row [2]);
+	$min_inside_temp = sprintf ("%2.1f", $row [3]);
+	$max_inside_dewpoint = sprintf ("%2.1f", $row [4]);
+	$min_inside_dewpoint = sprintf ("%2.1f", $row [5]);
+	$max_outside_humidity = sprintf ("%2.1f", $row [6]);
+	$min_outside_humidity = sprintf ("%2.1f", $row [7]);
+	$max_outside_temp = sprintf ("%2.1f", $row [8]);
+	$min_outside_temp = sprintf ("%2.1f", $row [9]);
+	$max_outside_dewpoint = sprintf ("%2.1f", $row [10]);
+	$min_outside_dewpoint = sprintf ("%2.1f", $row [11]);
+	$max_pressure_msl = sprintf ("%2.1f", $row [12]);
+	$min_pressure_msl = sprintf ("%2.1f", $row [13]);
+	$max_wind_speed = sprintf ("%2.1f", $row [14]);
+	$min_wind_speed = sprintf ("%2.1f", $row [15]);
+	$max_wind_gust = sprintf ("%2.1f", $row [16]);
+	$min_wind_gust = sprintf ("%2.1f", $row [17]);
+	$sum_rain = sprintf ("%2.1f", $row [18]);
+    }
+
+    $vars = array ("inside_humidity",
+                   "inside_temp",
+                   "inside_dewpoint",
+                   "outside_humidity",
+                   "outside_temp",
+                   "outside_dewpoint",
+                   "pressure_msl",
+                   "wind_speed",
+                   "wind_gust");
+    foreach ($vars as $var)
+    {
+  $result = mysql_query (<<< EOS
+SELECT date, time from $dbtable
+WHERE date >= "$startdate"
+  AND date < "$enddate"
+  AND station_id = "$station_id"
+  AND $var = @max_$var
+LIMIT 1
+EOS
+                           , $connection );
+
+      if (! $result)
+        showerror ();
+      if ($row = mysql_fetch_array ($result, MYSQL_NUM))
+      {
+        $max = "max_{$var}_time";
+	if ($oneday)
+          $$max = $row [1];           /* omit time */
+        else
+          $$max = $row [0] . " " . $row [1];
+      }
+    else
+    {
+      print <<< EOS
+        <p>
+        No data found for $startdate.
+        </p>
+  </body>
+</html>
+EOS;
+      exit;
+    }
+  $result = mysql_query (<<< EOS
+SELECT date, time from $dbtable
+WHERE date >= "$startdate"
+  AND date < "$enddate"
+  AND station_id = "$station_id"
+  AND $var = @min_$var
+LIMIT 1
+EOS
+                           , $connection );
+
+      if (! $result)
+        showerror ();
+      if ($row = mysql_fetch_array ($result, MYSQL_NUM))
+      {
+        $min = "min_{$var}_time";
+	if ($oneday)
+          $$min = $row [1];           /* omit time */
+        else
+          $$min = $row [0] . " " . $row [1];
+      }
+    }
+}
+  ?>
+
+      <h2>
+        <?php
+        if ($istoday)
+        {
+          $timetext = date ("H:i:s");
+          print "Readings for today at $timetext";
+        }
+        else if ($oneday)
+          print "Readings for $startdate";
+        else
+          print "Readings for period $startdate to $enddate";
+         ?>
+
+      </h2>
+      <table>
+	<?php
+      if ($istoday)                             /* include current readings */
+        makerows (<<< EOS
+-				Current			Minimum			At				Maximum			At
+Outside temperature (°C)	$outside_temperature	$min_outside_temp	$min_outside_temp_time		$max_outside_temp	$max_outside_temp_time
+Outside dewpoint (°C)		$outside_dewpoint	$min_outside_dewpoint	$min_outside_dewpoint_time	$max_outside_dewpoint	$max_outside_dewpoint_time
+Outside humidity (%)		$outside_humidity	$min_outside_humidity	$min_outside_humidity_time	$max_outside_humidity	$max_outside_humidity_time
+
+Inside temperature (°C)		$inside_temperature	$min_inside_temp	$min_inside_temp_time		$max_inside_temp	$max_inside_temp_time
+Inside dewpoint (°C)		$inside_dewpoint	$min_inside_dewpoint	$min_inside_dewpoint_time	$max_inside_dewpoint	$max_inside_dewpoint_time
+Inside humidity (%)		$inside_humidity	$min_inside_humidity	$min_inside_humidity_time	$max_inside_humidity	$max_inside_humidity_time
+
+Pressure (hPa)			$pressure_msl		$min_pressure_msl	$min_pressure_msl_time		$max_pressure_msl	$max_pressure_msl_time
+Wind speed (km/h)		$wind_speed		$min_wind_speed		$min_wind_speed_time		$max_wind_speed		$max_wind_speed_time
+Wind gust (km/h)		$wind_gust		$min_wind_gust		$min_wind_gust_time		$max_wind_gust		$max_wind_gust_time
+Wind direction (°)		$wind_direction ($wind_direction_text)
+Day's rainfall (mm)		$sum_rain
+
+EOS
+, "lrrcrc");
+	else
+	makerows (<<< EOS
+-	Minimum	At	Maximum	At
+Outside temperature (°C)	$min_outside_temp	$min_outside_temp_time	$max_outside_temp	$max_outside_temp_time
+Outside dewpoint (°C)	$min_outside_dewpoint	$min_outside_dewpoint_time	$max_outside_dewpoint	$max_outside_dewpoint_time
+Outside humidity (%)	$min_outside_humidity	$min_outside_humidity_time	$max_outside_humidity	$max_outside_humidity_time
+
+Inside temperature (°C)	$min_inside_temp	$min_inside_temp_time	$max_inside_temp	$max_inside_temp_time
+Inside dewpoint (°C)	$min_inside_dewpoint	$min_inside_dewpoint_time	$max_inside_dewpoint	$max_inside_dewpoint_time
+Inside humidity (%)	$min_inside_humidity	$min_inside_humidity_time	$max_inside_humidity	$max_inside_humidity_time
+
+Pressure (hPa)	$min_pressure_msl	$min_pressure_msl_time	$max_pressure_msl	$max_pressure_msl_time
+Wind speed (km/h)	$min_wind_speed	$min_wind_speed_time	$max_wind_speed	$max_wind_speed_time
+Wind gust (km/h)	$min_wind_gust	$min_wind_gust_time	$max_wind_gust	$max_wind_gust_time
+Day's rainfall (mm)	$sum_rain
+
+EOS
+, "lrcrc");
+?>
+	</table>
+
+	<h2>
+	Graphs for <?php echo $startdate ?>
+	</h2>
+        <?php
+        /*
+         * Ensure that we have the graph files.  Well, ensure that we have at least the first.
+         */
+        if ($oneday)
+            $range = $startdate;
+        else
+            $range = "$startdate-$enddate";
+	if ( ! file_exists ("$weatherdir/rain-$range-small.png"))
+          {
+          if ($oneday)
+            system ("$doplot $startdate 2>/dev/null >/dev/null");
+          else
+            system ("$doplot $startdate $enddate 2>/dev/null >/dev/null");
+          }
+        ?>
+	<div align="left">
+	<?php showgraphs (<<< EOS
+outside-temp-$range	Outside temperature
+inside-temp-$range	inside-temp
+inside-outside-temp-$range	inside-outside-temp
+humidity-$range	humidity
+wind-$range		wind
+pressure-$range		pressure
+rain-$range		rain
+BoM-Dereel-$range	BoM-Dereel
+EOS
+			      , $startdate, $enddate);
+?>
+	</div>
+    </div>
+
+<?php pagefooter ($id); ?>