Subversion Repositories portal2

Rev

Rev 717 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/*  emg - Energy Monitoring & Graphing
*  Copyright (C) 2006-2012 Romain Lievin
*
*  This program is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 3 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software Foundation,
*  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

?>

<?php
include_once('auth_check.php');
$_SESSION['error'] = new Error();
?>

<?php

//print_r($_POST);

$date         = getdate();
$data_century = 20; // fixed value

if(!isset($_POST['data_year']) && !isset($_GET['data_year']))
{
        $data_year = $date['year'];
}
else
if(isset($_POST['data_year']))
{
        $data_year = $_POST['data_year'];
}
else
if(isset($_GET['data_year']))
{
        $data_year = $_GET['data_year'];
}

if(!isset($_POST['data_month']) && !isset($_GET['data_month']))
{
        $data_month = $date['mon'];
}
else
if(isset($_POST['data_month']))
{
        $data_month = $_POST['data_month'];
}
else
if(isset($_GET['data_month']))
{
        $data_month = $_GET['data_month'];
}

if(!isset($_POST['data_day']) && !isset($_GET['data_day']))
{
        $data_day = $date['mday'];
}
else
if(isset($_POST['data_day']))
{
        $data_day = $_POST['data_day'];
}
else
if(isset($_GET['data_day']))
{
        $data_day = $_GET['data_day'];
}

if(!isset($_POST['form_device_key']))
{
        // the form has not been submitted yet
}
else
{
        $form_device_key = $_POST['form_device_key'];
}

if(!isset($_POST['form_datum_key']))
{
        // the form has not been submitted yet
        $data = $_SESSION['data'];
        $datum_keys = $data->getDatumsKeys();
        $form_datum_key = $datum_keys[0];      
}
else
{
        $form_datum_key = $_POST['form_datum_key'];
}

if(isset($_POST['form_browse_type']))
{
        $form_browse_type = $_POST['form_browse_type'];
}
else
{
        $form_browse_type = 'line';
}
?>

<div id="page_form_data_day">
        <h1>
                <?php echo _('Data'); ?>
        </h1>

        <?php

        $id = link_get_id_from_filename("form_browse_data.php");
        echo "<form action=\"index.php?id_page=$id\" method=\"post\">";
        ?>
       
        <fieldset id="form_list">
        <legend>
                <?php
                //echo str_replace('_', ' ', $form_datum_key);
                if(isset($form_datum_key))
                {
                        $data       = $_SESSION['data'];
                        $datum      = $data->getItem($form_datum_key);
                        $datum_name = $datum->getName();
                        echo $datum_name;
                }
                ?>
        </legend>

        <?php
                include_once('ymd.php');
        ?>

        <!--
        <label for="form_device_key">
                <?php echo _('Device'); ?>:
        </label>       
        -->

        <?php
        // Create device list form     
        /*
        if(isset($_SESSION['park']))
        {
                $select = "\r\n";
                $select .= "<select name=\"form_device_key\" id=\"form_device_key\">";

                $park = $_SESSION['park'];
                if($park)
                {
                        if(!isset($form_device_key))
                        {
                                $device_keys     = $park->getDevicesKeys();
                                $form_device_key = $device_keys[0];
                        }

                        foreach($park as $key => $device)
                        {
                                $device_name = $device->getName();

                                if($key == $form_device_key)
                                {
                                        $select .= "<option value=\"$key\" selected=\"selected\"> $device_name </option>";
                                }
                                else
                                {
                                        $select .= "<option value=\"$key\"> $device_name </option>";
                                }
                        }
                }

                $select .= "</select>\n";
                echo $select;
        }
        echo "<br/>\n";
        */

        ?>     

        <label for="form_datum_key">
                <?php echo _('Data'); ?>:
        </label>

        <?php
        if(isset($_SESSION['data']))
        {
                $data = $_SESSION['data'];
                $data->sortItems('name', true);

                if($data)
                {
                        $select = "\r\n";
                        $select .= "<select name=\"form_datum_key\" id=\"form_datum_key\">\n";

                        foreach($data as $datum_key => $datum)
                        {
                                $datum_name = $datum->getName();
                                $datum_type = DatumFactory::typeToString($datum->getType());
                                                       
                                /*     
                                if($form_device_key != Park::getDeviceKeyFromPath($datum_key))
                                {
                                        continue;      
                                }
                                */


                                if($datum_key == $form_datum_key)
                                {
                                        $select .= "  <option value=\"$datum_key\" selected=\"selected\"> $datum_name </option>\n";
                                }
                                else
                                {
                                        $select .= "  <option value=\"$datum_key\"> $datum_name </option>\n";
                                }
                        }

                        $select .= "</select>\n";
                        echo $select;
                }
               
                /* Removed device selection; replaced by detection of parent device based on datum object */
                $datum = $data->getItem($form_datum_key);
                $form_device_key = $_SESSION['park']->getDeviceKeyFromPath($datum->getPath());
        }
        ?>
        <br/>

        <?php
        // Create year / month / day list form from database query (list of tables)
        function form_create($filter, $data_target, $form_device_key)
        {
                //$field = "data_$filter";
                $field = "data_year";

                if(isset($_SESSION['park']))
                {
                        $park = $_SESSION['park'];

                        // Extract list of tables
                        if($park)
                        {
                                $device   = $park->getDevice($form_device_key);
                                $route    = $device->getRoute();

                                $db       = new SqliteEngine($route);
                                $db->setUuid($device->getUuid());
                                try
                                {
                                        $db->open();
                                        $query    = new SQliteQuery(SqliteQuery::QUERY_TABLE_YEARS);
                                        $range    = $db->fetchStampsRange($query);
                                        $db->close();

                                        $min      = new DateTime('@' . $range['min']);
                                        $min->setTimezone($_SESSION['timezone']);
                                        $max      = new DateTime('@' . $range['max']);
                                        $max->setTimezone($_SESSION['timezone']);
                                        $min_year = $min->format('Y');
                                        $max_year = $max->format('Y');
                                }
                                catch(MyException $e)
                                {
                                        $_SESSION['error']->push($e->getErrorReport());
                                               
                                        $min_year = 0;
                                        $max_year = 0;
                                }
                        }

                        //if($data_target == 0) $data_target = current($array);

                        // Once we have a list, we can create menu
                        $select = "\r\n";
                        $select .= "<select name=\"$field\" id=\"$field\">\n";


                        if($data_target == 0)
                        {
                                $select .= "  <option value=\"0\" selected=\"selected\"> --- </option>\n";
                        }
                        else
                        {
                                $select .= "  <option value=\"0\"> --- </option>\n";
                        }

                        for($year = $min_year; $year <= $max_year; $year++)
                        {
                                if($year == $data_target)
                                {
                                        $select .= "  <option value=\"$year\" selected=\"selected\"> $year </option>\n";
                                }
                                else
                                {
                                        $select .= "  <option value=\"$year\">$year</option>\n";
                                }
                        }

                        $select .= "</select>\n";
                        echo $select;
                }

                return $data_target;
        }
        ?>

        <label>
                <?php echo _('Date'); ?>:
        </label>
        <!--
        <select name="data_century" id="data_century" \>
        <option value="20">20</option>;
        </select>
        -->

        <?php
        // Dump the 3 forms
        $data_year = form_create(SqliteEngine::DB_TABLES_FILTER_YEARS, $data_year, $form_device_key);
        //$data_month = form_create('month', $data_month, $form_device_key);
        //$data_day = form_create('day', $data_day, $form_device_key);

        form_create_month('data_month', $data_month);
        form_create_day('data_day', $data_day);
        ?>
        <input type="submit" value=<?php echo _('Update'); ?> id="data_refresh" name="data_refresh" alt="refresh" />
        <br/>

        <label>
                <?php echo _('Browse type'); ?>:
        </label>
       
        <input type="radio" name="form_browse_type" value="table" id="form_browse_type_table"
                <?php if($form_browse_type == 'table') echo "checked=\"checked\""; ?>
        />
        <?php echo _("table"); ?>
       
        <input type="radio" name="form_browse_type" value="line" id="form_browse_type_line"
                <?php if($form_browse_type == 'line') echo "checked=\"checked\""; ?>
        />
        <?php echo _("line"); ?>
               
        <input type="radio" name="form_browse_type" value="column" id="form_browse_type_column"
        <?php if($form_browse_type == 'column') echo "checked=\"checked\""; ?>
        />
        <?php echo _("column"); ?>     
       
        <input type="radio" name="form_browse_type" value="combo" id="form_browse_type_combo"
        <?php if($form_browse_type == 'combo') echo "checked=\"checked\""; ?>
        />
        <?php echo _("combo"); ?>

        </fieldset>
        </form>

        <?php
        // Use user selection to build and populate HTML table
        if(isset($_SESSION['park'], $_SESSION['data']))
        {
                $park = $_SESSION['park'];
                $data = $_SESSION['data'];

                /* Extract list of entries and merge */
                if($park && $data)
                {
                        $datum      = $data->getItem($form_datum_key);
                        $datum_name = $datum->getName();
                        $datum_unit = $datum->getUnit();
                        $datum_type = $datum->getType();
                       
                        try
                        {
                                $query      = new  SqliteQuery(SqliteQuery::getTableFromYMD($data_year, $data_month, $data_day));
                                $query->setStart(SqliteQuery::cnvYmd2DateTime($data_year, $data_month, $data_day));
                               
                                $column     = $datum->getValues($query);
                                $total      = $column->opTotal();
                                $dump       = $column->dumpAsGoogle(false);
                        }
                        catch(MyException $e)
                        {
                                $_SESSION['error']->push($e->getErrorReport());
                                $column = $total = $dump = null;
                        }                                      

                        //if($datum_type != DatumFactory::SINGLE && $form_browse_type == 'combo')
                        if(0)
                        {
                                $array = $datum->getAllValues($query);

                                $table = SqliteTableFactory::createTable($query);
                                foreach($array as $key => $column)
                                {
                                        if($key == 'result')
                                        {
                                                continue;
                                        }

                                        $table->setColumn($column);
                                }

                                $final = $array['result'];
                                $table->setColumn($final);

                                $dump  = $table->dumpAsGoogle(false);
                                //echo $dump;           // now we can use ComboChart
                        }

                        switch($query->getTable())
                        {
                                case SqliteQuery::QUERY_TABLE_SAMPLES: $format = "HH:mm"; break;
                                case SqliteQuery::QUERY_TABLE_DAYS: $format = "MM-dd"; break;
                                case SqliteQuery::QUERY_TABLE_MONTHS: $format = "yyyy-MM"; break;
                                case SqliteQuery::QUERY_TABLE_YEARS: $format = "yyyy"; break;
                                //case SqliteQuery::QUERY_TABLE_WEEKS: $format = "yyyy"; break;
                        }

                        $js_data = "<script type='text/javascript'>\n";
                        $js_data .= "view = '" . $form_browse_type . "';\n";
                        $js_data .= "label = '" . $datum_name . "';\n";
                        $js_data .= "unit = '" . $datum_unit . "';\n";
                        $js_data .= "date_format = '" . $format . "';\n";
                        $js_data .= "type = '" . $datum_type . "';\n";
                       
                        $js_data .= "values=";
                        $js_data .= $dump . ";\n";
                        $js_data .= "</script>";
                        echo $js_data;
                        //var_dump($js_data);
                        //var_dump($format);
                }
        }
        ?>

        <?php
        if($form_browse_type == 'table')
        {
                echo "<div id='table_div'></div>";
        }
        else
        {
                echo "<div id='chart_div' style=\"width: 600px; height: 400px;\"></div>";
        }

        $str = sprintf("<p>Total: %.2f %s</p>\n", $total, $datum_unit);
        echo $str;
        ?>

        <p>
                <?php echo _('Need to export your data? Choose `table` mode, select the whole table, copy from browser and paste contents in your favourite spreadsheet program.'); ?>
        </p>

        <!-- if not connected -->
        <script type="text/javascript" src="google/01.js">
        </script>
        <script type="text/javascript" src="google/02.js">
        </script>
        <script type="text/javascript" src="google/03.js">
        </script>
        <script type="text/javascript" src="google/04.js">
        </script>
        <script type="text/javascript" src="google/05.js">
        </script>
        <!-- if connected -->
        <script type='text/javascript' src='https://www.google.com/jsapi'>
        </script>
        <script type='text/javascript'>

                if(view == 'table')
                {
                        google.load('visualization', '1', {packages:['table']});
                        google.setOnLoadCallback(function(){drawTable(values)});

                        function drawTable(array)
                        {
                                var data = new google.visualization.DataTable();

                                data.addColumn('datetime','Date');
                                data.addColumn('number', label + ' (' + unit + ')');
                                data.addRows(array);

                                var formatter_col2 = new google.visualization.NumberFormat({fractionDigits: 3});
                                formatter_col2.format(data, 1);

                                var table = new google.visualization.Table(document.getElementById('table_div'));
                                table.draw(data, {showRowNumber: true});
                        }
                }

                if(view == 'line' || view == 'column' || view=='combo')
                {
                        google.load('visualization', '1', {packages:['corechart']});
                        google.setOnLoadCallback(function(){drawChart(values)});

                        function drawChart(array)
                        {
                                var data = new google.visualization.DataTable();

                                if((type != 0) && (view == 'combo'))
                                {
                                        var options =
                                        {
                                                title: label + ' (' + unit + ')',
                                                hAxis:
                                                {
                                                        format: date_format, title: "Date"
                                                },
                                                seriesType: "bars",
                                                series:
                                                {
                                                        2:
                                                        {
                                                                type: "line"
                                                        }
                                                }
                                        };

                                        data.addColumn('datetime','Date');
                                        data.addColumn('number', label + ' (' + unit + ')');

                                        data.addRows(array);

                                        var chart = new google.visualization.ComboChart(document.getElementById('chart_div'));
                                }
                                else
                                {
                                        var options =
                                        {
                                                title: label + ' (' + unit + ')',
                                                legend:
                                                {
                                                        position: 'none', textStyle:
                                                        {
                                                                color: 'black', fontSize: 16
                                                        }
                                                },
                                                series:
                                                {
                                                        1:
                                                        {
                                                                targetAxisIndex:1
                                                        }
                                                },
                                                vAxis:
                                                {
                                                        0:
                                                        {
                                                                format:'####,###'
                                                        }, title: "Consumption"
                                                },
                                                hAxis:
                                                {
                                                        format: date_format, title: "Date"
                                                },
                                        };

                                        data.addColumn('datetime','Date');
                                        data.addColumn('number', label + ' (' + unit + ')');
                                        data.addRows(array);

                                        if(view == 'column')
                                        {
                                                var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
                                        }
                                        else if(view == 'line')
                                        {
                                                var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
                                        }
                                }

                                chart.draw(data, options);
                        }
                }
        </script>
       
        <?php echo $_SESSION['error']->display(); ?>
       
</div>