Workaround for broken data transmission from Arduino part
[weathermon.git] / web / archive.php
1 <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
2 <html>
3 <head>
4   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
5   <meta name="GENERATOR" content="Mozilla/4.72 (X11; U; Linux 2.2.12-20smp i686) [Netscape]">    
6   <title>WeatherMon (архив)</title>                      
7   <link rel="icon" href="favicon.png" />
8   <style type="text/css">
9     a.year   {
10         padding:20px;
11         margin: 10px;
12         border:2px solid darkgrey;
13         border-radius: 10px;
14         display:inline-block;
15         width:200px;
16         float:left;
17         font-size:100%;
18         text-align:center;
19     }                                          
20     a.month   {
21         font-size:100%;
22         text-align:center;
23     }                                          
24     a:visited { text-decoration: none; color:darkblue; }
25     a:link { text-decoration: none; color:blue; }
26     a:hover { text-decoration: none; color:navy; }  
27   </style>
28 </head>
29 <body text="black" bgcolor="silver" link="blue" vlink="#000080" alink="#FF0000">         
30 <?php
31
32 include('config_local.php');
33 include('calendar.php');
34
35 function get_unit($db,$param) {
36
37   $qug = $db -> prepare(
38     'select u.id,u.unit_group from st_parameters st,units u where st.id='.$param.' and st.st_unit=u.id'
39   );
40   $qug -> execute();
41                                     
42   while ($row = $qug -> fetch(PDO::FETCH_ASSOC)) {
43     $from_unit = $row['id'];
44     $unit_group = $row['unit_group'];
45   }
46                                                                        
47   if (!empty($_COOKIE['unit_'.$unit_group])) {
48     $to_unit=intval($_COOKIE['unit_'.$unit_group]);
49   } else {
50     $to_unit=$from_unit;
51   }
52                                                                                                                 
53   $qu = $db -> prepare(
54     'select u.name_short from units u where u.id='.$to_unit
55   );
56   $qu -> execute();
57                                                                                                                                                                  
58   while ($row = $qu -> fetch(PDO::FETCH_ASSOC)) {
59     $param_unit = $row['name_short'];
60   }
61  
62   return Array(
63     'from' => $from_unit,
64     'to' => $to_unit,
65     'name' => $param_unit
66   );                                                                                                                                                                                    
67
68 }
69
70 function convert_unit($db,$value,$from,$to) {
71
72   if ($from==$to) {
73
74     $val = $value;
75
76   } else {
77
78     $qv = $db -> prepare(
79       'select round(unitconv('.$value.','.$from.','.$to.'),2) res'
80     );
81     $qv -> execute();
82                             
83     while ($row = $qv -> fetch(PDO::FETCH_ASSOC)) {
84       $val = $row['res'];
85     }
86
87   }
88                                                         
89   return $val;
90
91 }
92
93 $year = $_REQUEST['year']; 
94 $month = $_REQUEST['month'];
95 $day = $_REQUEST['day'];
96
97 if (! ($db = new PDO("mysql:host=$mysql_host;port=$mysql_port;dbname=$mysql_schema",$mysql_user,$mysql_pwd,array( PDO::ATTR_PERSISTENT => false)))) {
98   die($err);
99   }  
100
101 $db -> exec('SET CHARACTER SET utf8');
102
103 if (! $year) {
104         
105   $q = $db -> prepare(
106     'select 
107        date_format(day,\'%Y\') as year
108      from 
109        calendar
110      group by year  
111      order by year');
112   $q -> execute();
113 ?>
114 <h1>Архив метеоданных</h1>
115 <?php
116   while ($row = $q -> fetch(PDO::FETCH_ASSOC)) {
117 ?> 
118   <a class="year" href="?year=<?php echo $row['year']; ?>">Данные за <?php echo $row['year']; ?> год</a><br>
119 <?php
120   }
121       
122 } else {
123
124   if (! $month) {
125       
126     $next_year = $year+1;
127     $year      = sprintf('%04d',$year);
128     $next_year = sprintf('%04d',$next_year);
129     $q = $db -> prepare(
130           'select 
131              date_format(day,\'%m\') as month,
132              date_format(day,\'%d\') as day
133            from 
134              calendar
135            where 
136              day>=str_to_date(\''.$year.'-01-01\',\'%Y-%m-%d\') and 
137              day<str_to_date(\''.$next_year.'-01-01\',\'%Y-%m-%d\')
138            group by month,day
139            order by month,day'
140           );
141     $q -> execute();
142 ?>
143 <h1 align="center"><?php echo $year; ?> год</h1>
144 <?php
145     $data = $q -> fetchAll(PDO::FETCH_ASSOC);
146     $months = [];
147     foreach ($data as $row) {
148       $days [$year.$row['month'].$row['day']] = '&month='.$row['month'].'&day='.$row['day'];
149       $months[$row['month']]=1;
150     }
151     $m = 1;
152     echo '<table align="center">';
153     for ($i=1; $i<=3; $i++) {
154       echo '<tr>';
155       for ($j=1; $j<=4; $j++) {
156         echo '<td valign="top">';
157         $month=sprintf('%02d',$m);
158         $month_name = strftime('%B',mktime(0,0,0,$month,1,$year));
159         if (!empty($months[$month])) {
160           echo '<h3 align="center"><a class="month" href="?year='.$year.'&month='.$month.'">'.$month_name.'</a></h3>';
161         } else {
162           echo '<h3 align="center">'.$month_name.'</h3>';
163         }
164         calendar($year,$month,$days,'?year='.$year.'%s',0);
165         echo '</td>';
166         $m++;
167         }
168       echo '</tr>';
169     }
170     echo '</table>';
171     
172     $next_year = $year+1;
173
174     $q = $db -> prepare (
175       'select 
176          s.id sensor,p.id param,s.s_description sensor_name,p.st_description param_name,
177          count(distinct day) cnt,
178          round(min(v.min),1) min_value,
179          round(max(v.max),1) max_value,
180          u.name_short unit
181        from
182          sensors_ranges v,sensors s,st_parameters p,units u
183        where 
184          v.sensor=s.id and
185          v.parameter=p.id and
186          p.st_unit=u.id and
187          v.day>=str_to_date(\''.$year.'-01-01\',\'%Y-%m-%d\') and 
188          v.day<str_to_date(\''.$next_year.'-01-01\',\'%Y-%m-%d\')
189       group by s.id,p.id,s.s_description,p.st_description
190       order by s.id,p.id'
191       );
192         
193     $q -> execute();
194     $sensors = $q -> fetchAll(PDO::FETCH_ASSOC);
195       
196     foreach ($sensors as $sensor) {
197
198       $units = get_unit($db,$sensor['param']);
199       $from_unit = $units['from'];
200       $to_unit = $units['to'];
201       $param_unit = $units['name'];
202
203       $min_val = convert_unit($db,$sensor['min_value'],$from_unit,$to_unit);
204       $max_val = convert_unit($db,$sensor['max_value'],$from_unit,$to_unit);
205      
206       echo '<h3 align="center">'.$sensor['param_name'].'('.$sensor['sensor_name'].')</h3>';
207       echo '<table align="center">';
208       echo '<tr><td>';
209       echo 'Минимальное значение за год <b>'.$min_val.' '.$param_unit.'</b><br>';
210       echo 'Максимальное значение за год <b>'.$max_val.' '.$param_unit.'</b><br>';
211       echo '</td></tr>';
212       echo '</table>';
213
214       if ($sensor['cnt']>1) {
215         
216         echo '<center><img src="image_minmax.php?sensor='.$sensor['sensor'].'&param='.$sensor['param'].
217           '&type=year&year='.$year.'"></center>';
218         
219       }
220       
221     }
222
223
224   } else {
225       
226     if (!$day) {
227       
228       $next_year = $year;
229       $next_month = $month+1;
230
231       if ($next_month == 13) {
232         $next_month = 1;
233         $next_year = $next_year+1;
234       }
235
236       $next_month = sprintf('%02d',$next_month); 
237       $next_year  = sprintf('%04d',$next_year);
238       $month      = sprintf('%02d',$month);
239       $year      = sprintf('%04d',$year);
240
241       $q = $db -> prepare( 
242           'select  
243              date_format(day,\'%d\') as day
244            from 
245              sensors_ranges
246            where 
247              day>=str_to_date(\''.$year.'-'.$month.'-01\',\'%Y-%m-%d\') and 
248              day<str_to_date(\''.$next_year.'-'.$next_month.'-01\',\'%Y-%m-%d\')
249            group by day
250            order by day'
251           );
252       $q -> execute();
253       
254       $data = $q -> fetchAll(PDO::FETCH_ASSOC);
255
256       $month_name = strftime('%B %Y',mktime(0,0,0,$month,1,$year));
257
258 ?>
259 <h1 align="center"><?php echo 'Данные за '.$month_name; ?></h1>
260 <?php          
261       foreach ($data as $row) {
262         $days [$year.$month.$row['day']] = $row['day'];
263       }
264
265       calendar($year,$month,$days,'?year='.$year.'&month='.$month.'&day=%s',3);
266               
267       $q = $db -> prepare (
268           'select 
269              s.id sensor,p.id param,s.s_description sensor_name,p.st_description param_name,
270              count(distinct day) cnt,
271              round(min(v.min),1) min_value,
272              round(max(v.max),1) max_value,
273              u.name_short unit
274            from
275              sensors_ranges v,sensors s,st_parameters p,units u
276            where 
277              v.sensor=s.id and
278              v.parameter=p.id and
279              p.st_unit=u.id and
280              v.day>=str_to_date(\''.$year.'-'.$month.'-01\',\'%Y-%m-%d\') and 
281              v.day<str_to_date(\''.$next_year.'-'.$next_month.'-01\',\'%Y-%m-%d\')
282            group by s.id,p.id,s.s_description,p.st_description
283            order by s.id,p.id'
284         );
285         
286       $q -> execute();
287       $sensors = $q -> fetchAll(PDO::FETCH_ASSOC);
288       
289       foreach ($sensors as $sensor) {
290
291         $units = get_unit($db,$sensor['param']);
292         $from_unit = $units['from'];
293         $to_unit = $units['to'];
294         $param_unit = $units['name'];
295
296         $min_val = convert_unit($db,$sensor['min_value'],$from_unit,$to_unit);
297         $max_val = convert_unit($db,$sensor['max_value'],$from_unit,$to_unit);
298       
299         echo '<h3 align="center">'.$sensor['param_name'].'('.$sensor['sensor_name'].')</h3>';
300         echo '<table align="center">';
301         echo '<tr><td>';
302         echo 'Минимальное значение за месяц <b>'.$min_val.' '.$param_unit.'</b><br>';
303         echo 'Максимальное значение за месяц <b>'.$max_val.' '.$param_unit.'</b><br>';
304         echo '</td></tr>';
305         echo '</table>';
306
307         if ($sensor['cnt']>1) {
308         
309           echo '<center><img src="image_minmax.php?sensor='.$sensor['sensor'].'&param='.$sensor['param'].
310             '&type=month&year='.$year.'&month='.$month.'"></center>';
311         
312         }
313       
314       }
315
316     } else {
317
318       $month      = sprintf('%02d',$month);
319       $year      = sprintf('%04d',$year);
320       $day       = sprintf('%02d',$day);
321
322       $q = $db -> prepare(
323             'select 
324                 distinct v.sensor as sensor_id,s.s_description,p.id as param_id,p.st_description 
325              from 
326                 sensors_ranges v,st_parameters p,sensors s 
327              where 
328                 v.day=str_to_date(\''.$year.'-'.$month.'-'.$day.'\',\'%Y-%m-%d\')
329                 and v.sensor=s.id 
330                 and v.parameter=p.id'
331             );
332       $q -> execute();
333
334       while ($row = $q -> fetch(PDO::FETCH_ASSOC)) {
335
336         echo '<h3 align="center">'.$row['s_description'].'/'.$row['st_description'].'</h3>';
337 ?>
338 <center><img src="image.php?sensor=<?php echo $row['sensor_id']; ?>&param=<?php echo $row['param_id']?>&type=range&fromdate=<?php echo $year.$month.$day.'000000'; ?>&todate=<?php echo $year.$month.$day.'235959'?>"></center>
339 <?php  
340
341       }                                                            
342     }
343   }
344 }
345 ?>
346 </body>
347