Browse code

added custom charts

Gandolf authored on 06/12/2021 06:29:52
Showing 2 changed files
1 1
new file mode 120000
... ...
@@ -0,0 +1 @@
1
+/tmp/nodePower
0 2
\ No newline at end of file
1 3
new file mode 100644
... ...
@@ -0,0 +1,222 @@
1
+<html>
2
+<!-- Courtsey ruler
3
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
4
+-->
5
+<head>
6
+<style>
7
+p {
8
+    font: 14px ariel, sans serif;
9
+}
10
+#errorMsg {
11
+    font:bold 18px arial,sans-serif;
12
+    color:red;
13
+    text-align:center;
14
+}
15
+.chartContainer {
16
+    padding: 2px;
17
+}
18
+img.chart {
19
+    width:100%;
20
+}
21
+</style>
22
+</head>
23
+<body>
24
+
25
+<?php
26
+/*
27
+ Script: power.php
28
+
29
+ Description: This scripts generates on the server charts showing
30
+ power data spanning the period supplied by the user.  The script
31
+ does the following:
32
+    - converts user supplied dates to  epoch time
33
+    - gets the times of the first and last data point in the round
34
+      robin database (RRD)
35
+    - from above validates user supplied begin and end dates
36
+    - creates charts of the specified period
37
+
38
+ Copyright 2020 Jeff Owrey
39
+    This program is free software: you can redistribute it and/or modify
40
+    it under the terms of the GNU General Public License as published by
41
+    the Free Software Foundation, either version 3 of the License, or
42
+    (at your option) any later version.
43
+
44
+    This program is distributed in the hope that it will be useful,
45
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
46
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
47
+    GNU General Public License for more details.
48
+
49
+    You should have received a copy of the GNU General Public License
50
+    along with this program.  If not, see http://www.gnu.org/license.
51
+
52
+ Revision History
53
+   * v10 released 11 Jan 2021 by J L Owrey; first release
54
+*/
55
+
56
+# Define global constants
57
+
58
+# round robin database file
59
+define("_RRD_FILE", str_replace("public_html/power/power.php",
60
+                                "database/powerData.rrd",
61
+                                $_SERVER["SCRIPT_FILENAME"]));
62
+# charts html directory
63
+define("_CHART_DIRECTORY", str_replace("power.php",
64
+                                       "dynamic/",
65
+                                       $_SERVER["SCRIPT_FILENAME"]));
66
+# standard chart width in pixels
67
+define("_CHART_WIDTH", 600);
68
+# standard chart height in pixels
69
+define("_CHART_HEIGHT", 150);
70
+# debug mode
71
+define("_DEBUG", false);
72
+
73
+# Set error handling modes.
74
+error_reporting(E_ALL);
75
+
76
+# Get user supplied chart begin and end dates.
77
+$beginDate = $_POST["beginDate"];
78
+$endDate =  $_POST["endDate"];
79
+
80
+# Convert the user supplied dates to epoch time stamps.
81
+$beginDateEp = strtotime($beginDate);
82
+$endDateEp = strtotime($endDate);
83
+
84
+# Get the time stamp of the earliest data point in the RRD file.
85
+$cmd = sprintf("rrdtool first %s --rraindex 1", _RRD_FILE);
86
+$firstDP = shell_exec($cmd);
87
+
88
+# Get the time stamp of the latest data point in the RRD file.
89
+$cmd = sprintf("rrdtool last %s", _RRD_FILE);
90
+$lastDP = shell_exec($cmd);
91
+
92
+# Determine validity of user supplied dates.  User supplied begin
93
+# date must be less than user supplied end date.  Furthermore both
94
+# dates must be within the range of dates stored in the RRD.
95
+if ($beginDateEp > $endDateEp) {
96
+    echo "<p id=\"errorMsg\">" .
97
+         "End date must be after begin date.</p>";
98
+} elseif ($beginDateEp < $firstDP || $endDateEp > $lastDP) {
99
+    echo "<p id=\"errorMsg\">" .
100
+          "Date range must be between " .
101
+          date('m / d / Y', $firstDP) . " and " . 
102
+          date('m / d / Y', $lastDP) . ".</p>";
103
+} else {
104
+    # Generate charts from validated user supplied dates.
105
+    if (_DEBUG) {
106
+        echo "<p>Date range: " . $beginDateEp . " thru " .
107
+              $endDateEp . "</p>";
108
+    }
109
+    createChart('custom_current', 'CUR', 'Amps', 
110
+                'Current', $beginDateEp, $endDateEp,
111
+                 0, 0, 2, false);
112
+    createChart('custom_voltage', 'VOLT', 'Volts', 
113
+                'Voltage', $beginDateEp, $endDateEp,
114
+                 0, 0, 2, false);
115
+    createChart('custom_power', 'PWR', 'Watts', 
116
+                'Power', $beginDateEp, $endDateEp,
117
+                 0, 0, 2, false);
118
+    createChart('custom_battemp', 'BTMP', 'deg\ F', 
119
+                'Battery\ Temperature', $beginDateEp, $endDateEp,
120
+                 0, 0, 2, false);
121
+    createChart('custom_ambtemp', 'ATMP', 'deg\ F', 
122
+                'Ambient\ Temperature', $beginDateEp, $endDateEp,
123
+                 0, 0, 2, false);
124
+    # Send html commands to client browser.
125
+    echo "<div class=\"chartContainer\">" .
126
+         "<img class=\"chart\" src=\"dynamic/custom_current.png\">" .
127
+         "</div>";
128
+    echo "<div class=\"chartContainer\">" .
129
+         "<img class=\"chart\" src=\"dynamic/custom_voltage.png\">" .
130
+         "</div>";
131
+    echo "<div class=\"chartContainer\">" .
132
+         "<img class=\"chart\" src=\"dynamic/custom_power.png\">" .
133
+         "</div>";
134
+    echo "<div class=\"chartContainer\">" .
135
+         "<img class=\"chart\" src=\"dynamic/custom_battemp.png\">" .
136
+         "</div>";
137
+    echo "<div class=\"chartContainer\">" .
138
+         "<img class=\"chart\" src=\"dynamic/custom_ambtemp.png\">" .
139
+         "</div>";
140
+}
141
+
142
+function createChart($chartFile, $dataItem, $label, $title, $begin,
143
+                     $end, $lower, $upper, $addTrend, $autoScale) {
144
+    /*
145
+    Uses rrdtool to create a chart of specified aredn node data item.
146
+    Parameters:
147
+       fileName - name of the created chart file
148
+       dataItem - data item to be charted
149
+       label - string containing a label for the item to be charted
150
+       title - string containing a title for the chart
151
+       begin - beginning time of the chart data
152
+       end   - ending time of the data to be charted
153
+       lower - lower bound for chart ordinate #NOT USED
154
+       upper - upper bound for chart ordinate #NOT USED
155
+       addTrend - 0, show only chart data
156
+                  1, show only a trend line
157
+                  2, show a trend line and the chart data
158
+       autoScale - if True, then use vertical axis auto scaling
159
+           (lower and upper parameters are ignored), otherwise use
160
+           lower and upper parameters to set vertical axis scale
161
+    Returns: True if successful, False otherwise
162
+    */
163
+
164
+    # Define path on server to chart files.
165
+    $chartPath = _CHART_DIRECTORY . $chartFile . ".png";
166
+
167
+    # Format the rrdtool chart command.
168
+
169
+    # Set chart file name, start time, end time, height, and width.
170
+    $cmdfmt = "rrdtool graph %s -a PNG -s %s -e %s -w %s -h %s ";
171
+    $cmd = sprintf($cmdfmt, $chartPath, $begin, $end, _CHART_WIDTH,
172
+                   _CHART_HEIGHT);
173
+    $cmdfmt = "-l %s -u %s -r ";
174
+
175
+    # Set upper and lower ordinate bounds.
176
+    if ($lower < $upper) {
177
+        $cmd .= sprintf($cmdfmt, $lower, $upper);
178
+    } elseif ($autoScale) {
179
+        $cmd .= "-A ";
180
+    }
181
+    $cmd .= "-Y ";
182
+
183
+    # Set the chart ordinate label and chart title. 
184
+    $cmdfmt = "-v %s -t %s ";
185
+    $cmd .= sprintf($cmdfmt, $label, $title);
186
+   
187
+    # Define moving average window width.
188
+    $trendWindow = floor(($end - $begin) / 12);
189
+        
190
+    # Show the data, or a moving average trend line over
191
+    # the data, or both.
192
+    $cmdfmt = "DEF:dSeries=%s:%s:LAST ";
193
+    $cmd .= sprintf($cmdfmt, _RRD_FILE, $dataItem);
194
+    if ($addTrend == 0) {
195
+        $cmd .= "LINE1:dSeries#0400ff ";
196
+    } elseif ($addTrend == 1) {
197
+        $cmdfmt = "CDEF:smoothed=dSeries,%s,TREND LINE3:smoothed#006600 ";
198
+        $cmd .= sprintf($cmdfmt, $trendWindow);
199
+    } elseif ($addTrend == 2) {
200
+        $cmd .= "LINE1:dSeries#0400ff ";
201
+        $cmdfmt = "CDEF:smoothed=dSeries,%s,TREND LINE3:smoothed#006600 ";
202
+        $cmd .=  sprintf($cmdfmt, $trendWindow);
203
+    }
204
+     
205
+    # Execute the formatted rrdtool command in the shell. The rrdtool
206
+    # command will complete execution before the html image tags get
207
+    # sent to the browser.  This assures that the charts are available
208
+    # when the client browser executes the html code that loads the
209
+    # charts into the document displayed by the client browser.
210
+    if (_DEBUG) {
211
+        echo "<p>chart command:<br>" . $cmd . "</p>";
212
+    }
213
+    $result = shell_exec($cmd . " 2>&1");
214
+    if (_DEBUG) {
215
+        echo "<p>result:<br>" . $result . "</p>";
216
+    }
217
+}
218
+
219
+?>
220
+
221
+</body>
222
+</html>