add three wind dials
[dweather.git] / templates / index.html.ep
index 8aeae1ddf8f62feb6d0bb7335dff9f20fdf48c31..ec8487d4dd757560821ed0d5f24494355a5e633d 100644 (file)
@@ -8,10 +8,10 @@
                <meta name="viewport" content="width=device-width, initial-scale=1">
 
                <!-- Latest compiled and minified CSS -->
-               <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
+               <link rel="stylesheet" href="css/bootstrap.min.css">
 
                <!-- Optional theme -->
-               <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
+               <link rel="stylesheet" href="css/bootstrap-theme.min.css">
 
        </head>
        <body>
 
                <script>
                var ws;
-               var day_chart;
+               var daychart;
+               var daychart_days = 5;
+               var windrose;
+               var windrose_mins = 10;
+               var windspeed;
+               var winddir;
 
                var h = new Object();
 
                        }
                }
 
+               var lastwind = 0;
+               var lastdir = 0;
+               var lastt = 0;
+
                function startws() {
                        ws = new WebSocket('<%= $url->to_abs %>');
 
                                        var js = JSON.parse(event.data);
                                        if (js !== null && typeof(js) === 'object') {
                                                traverse(js, fill_html);
-                                               traverse(js, update_h);
-                                               document.getElementById("hh").innerHTML = JSON.stringify(h);
+//                                             traverse(js, update_h);
+//                                             document.getElementById("hh").innerHTML = JSON.stringify(h);
                                                if ("h" in js) {
-                                                       fill_day_chart(js);
+                                                       fill_daychart(js, daychart_days);
+                                               }
+                                               if ("r" in js) {
+//                                                     if (js.t > lastt + 15) {
+                                                               if ("Wind" in js.r) {
+                                                                       lastwind = js.r.Wind;
+                                                               } else {
+                                                                       js.r.Wind = lastwind;
+                                                               }
+                                                               if ("Dir" in js.r) {
+                                                                       lastdir = js.r.dir;
+                                                               } else {
+                                                                       js.r.Dir = lastdir;
+                                                               }
+                                                               lastt = js.t;
+                                                               fill_windrose(js, windrose_mins * (60 / 2.5));
+//                                                     }
+                                                       fill_windspeed(js);
+                                                       fill_winddir(js);
                                                }
                                        }
                                };
                        }
                }
 
-               function start_day_chart() {
-                       day_chart = new Highcharts.Chart({
+               function start_daychart() {
+                       daychart = new Highcharts.Chart({
                                chart: {
-                                       renderTo: 'day_chart',
+                                       renderTo: 'daychart',
                                        zoomType: 'xy'
                                },
                                title: {
-                                       text: '24 Hour Chart'
+                                       text: 'Five Day Chart'
                                },
                                xAxis: [{
                                        type: 'datetime',
                        });
                }
 
-               function fill_day_chart(js) {
-                       var rainfall = day_chart.series[0].data.length > 48;
-                       var pressure = day_chart.series[1].data.length > 48;
-                       var temp = day_chart.series[2].data.length > 48;
+               function start_windrose() {
+
+                       // Load the fonts
+                       Highcharts.createElement('link', {
+                               href: '//fonts.googleapis.com/css?family=Dosis:400,600',
+                               rel: 'stylesheet',
+                               type: 'text/css'
+                       }, null, document.getElementsByTagName('head')[0]);
+
+                       Highcharts.theme = {
+                               colors: ["#7cb5ec", "#f7a35c", "#90ee7e", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+                                       "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+                               chart: {
+                                       backgroundColor: null,
+                                       style: {
+                                               fontFamily: "Dosis, sans-serif"
+                                       }
+                               },
+                               title: {
+                                       style: {
+                                               fontSize: '16px',
+                                               fontWeight: 'bold',
+                                               textTransform: 'uppercase'
+                                       }
+                               },
+                               tooltip: {
+                                       borderWidth: 0,
+                                       backgroundColor: 'rgba(219,219,216,0.8)',
+                                       shadow: false
+                               },
+                               legend: {
+                                       itemStyle: {
+                                               fontWeight: 'bold',
+                                               fontSize: '13px'
+                                       }
+                               },
+                               xAxis: {
+                                       gridLineWidth: 1,
+                                       labels: {
+                                               style: {
+                                                       fontSize: '12px'
+                                               }
+                                       }
+                               },
+                               yAxis: {
+                                       minorTickInterval: 'auto',
+                                       title: {
+                                               style: {
+                                                       textTransform: 'uppercase'
+                                               }
+                                       },
+                                       labels: {
+                                               style: {
+                                                       fontSize: '12px'
+                                               }
+                                       }
+                               },
+                               plotOptions: {
+                                       candlestick: {
+                                               lineColor: '#404048'
+                                       }
+                               },
+
+
+                               // General
+                               background2: '#F0F0EA'
+                               
+                       };
+
+                       // Apply the theme
+                       Highcharts.setOptions(Highcharts.theme);
+
+                       windrose = new Highcharts.Chart({
+                               chart: {
+                                       polar: true,
+                                       renderTo: 'windrose'
+                               },
+                               
+                               title: {
+                                       text: 'Wind Rose'
+                               },
+                               
+                               pane: {
+                                       startAngle: 0,
+                                       endAngle: 360
+                               },
+
+                               xAxis: {
+                                       tickInterval: 15,
+                                       min: 0,
+                                       max: 360,
+                                       labels: {
+                                               formatter: function () {
+                                                       return this.value + '°';
+                                               }
+                                       }
+                               },
+
+                               yAxis: {
+                                       min: 0
+                               },
+
+                               plotOptions: {
+                                       series: {
+                                               pointStart: 0,
+                                               pointInterval: 15
+                                       },
+                                       column: {
+                                               pointPadding: 0,
+                                               groupPadding: 0
+                                       }
+                               },
+
+                               series: [ {
+                                       type: 'scatter',
+                                       name: 'Wind mph',
+                                       data: []
+                               }]
+                       });
+               }
+
+               function start_windspeed() {
+                       windspeed = new Highcharts.Chart({
+                               chart: {
+                                       type: 'gauge',
+                                       renderTo: 'windspeed',
+                                       plotBackgroundColor: null,
+                                       plotBackgroundImage: null,
+                                       plotBorderWidth: 0,
+                                       plotShadow: false
+                               },
+
+                               title: {
+                                       text: 'Wind Speed'
+                               },
+
+                               pane: {
+                                       startAngle: -150,
+                                       endAngle: 150,
+                                       background: [{
+                                               backgroundColor: {
+                                                       linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+                                                       stops: [
+                                                               [0, '#FFF'],
+                                                               [1, '#333']
+                                                       ]
+                                               },
+                                               borderWidth: 0,
+                                               outerRadius: '109%'
+                                       }, {
+                                               backgroundColor: {
+                                                       linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+                                                       stops: [
+                                                               [0, '#333'],
+                                                               [1, '#FFF']
+                                                       ]
+                                               },
+                                               borderWidth: 1,
+                                               outerRadius: '107%'
+                                       }, {
+                                               // default background
+                                       }, {
+                                               backgroundColor: '#DDD',
+                                               borderWidth: 0,
+                                               outerRadius: '105%',
+                                               innerRadius: '103%'
+                                       }]
+                               },
+
+                               // the value axis
+                               yAxis: {
+                                       min: 0,
+                                       max: 50,
+
+                                       minorTickInterval: 'auto',
+                                       minorTickWidth: 1,
+                                       minorTickLength: 10,
+                                       minorTickPosition: 'inside',
+                                       minorTickColor: '#666',
+
+                                       tickPixelInterval: 30,
+                                       tickWidth: 2,
+                                       tickPosition: 'inside',
+                                       tickLength: 10,
+                                       tickColor: '#666',
+                                       labels: {
+                                               step: 2,
+                                               rotation: 'auto'
+                                       },
+                                       title: {
+                                               text: 'mph'
+                                       },
+                                       plotBands: [{
+                                               from: 0,
+                                               to: 15,
+                                               color: '#55BF3B' // green
+                                       }, {
+                                               from: 16,
+                                               to: 29,
+                                               color: '#DDDF0D' // yellow
+                                       }, {
+                                               from: 30,
+                                               to: 50,
+                                               color: '#DF5353' // red
+                                       }]
+                               },
+
+                               series: [{
+                                       name: 'Speed',
+                                       data: [0],
+                                       tooltip: {
+                                               valueSuffix: ' mph'
+                                       }
+                               }]
+                       });
+               }
+
+               function start_winddir() {
+                       winddir = new Highcharts.Chart({
+                               chart: {
+                                       type: 'gauge',
+                                       renderTo: 'winddir',
+                                       plotBackgroundColor: null,
+                                       plotBackgroundImage: null,
+                                       plotBorderWidth: 0,
+                                       plotShadow: false
+                               },
+
+                               title: {
+                                       text: 'Wind Direction'
+                               },
+
+                               pane: {
+                                       startAngle: 0,
+                                       endAngle: 359,
+                                       background: [{
+                                               backgroundColor: {
+                                                       linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+                                                       stops: [
+                                                               [0, '#FFF'],
+                                                               [1, '#333']
+                                                       ]
+                                               },
+                                               borderWidth: 0,
+                                               outerRadius: '109%'
+                                       }, {
+                                               backgroundColor: {
+                                                       linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+                                                       stops: [
+                                                               [0, '#333'],
+                                                               [1, '#FFF']
+                                                       ]
+                                               },
+                                               borderWidth: 1,
+                                               outerRadius: '107%'
+                                       }, {
+                                               // default background
+                                       }, {
+                                               backgroundColor: '#DDD',
+                                               borderWidth: 0,
+                                               outerRadius: '105%',
+                                               innerRadius: '103%'
+                                       }]
+                               },
+
+                               // the value axis
+                               yAxis: {
+                                       min: 0,
+                                       max: 360,
+
+                                       minorTickInterval: 'auto',
+                                       minorTickWidth: 1,
+                                       minorTickLength: 10,
+                                       minorTickPosition: 'inside',
+                                       minorTickColor: '#666',
+
+                                       tickPixelInterval: 15,
+                                       tickWidth: 2,
+                                       tickPosition: 'inside',
+                                       tickLength: 10,
+                                       tickColor: '#666',
+                                       labels: {
+                                               step: 2,
+                                               rotation: 'auto'
+                                       },
+                                       title: {
+                                               text:  '° deg'
+                                       },
+                               },
+
+                               series: [{
+                                       name: 'Direction',
+                                       data: [0],
+                                       tooltip: {
+                                               valueSuffix: ' ° deg'
+                                       }
+                               }]
+                       });
+               }
+
+               function fill_daychart(js, days) {
+                       var rainfall = daychart.series[0].data.length > (days * 48);
+                       var pressure = daychart.series[1].data.length > (days * 48);
+                       var temp = daychart.series[2].data.length > (days * 48);
 
                        var hr = js.h;
                        var t = js.t * 1000;
                        var pr = [t, hr.Pressure];
                        var te = [t, hr.Temp_Out];
                                
-                       do_debug(js.tm + " " + t + " " + te + "<br>"); 
-                       day_chart.series[0].addPoint(ra, true, rainfall);
-                       day_chart.series[1].addPoint(pr, true, pressure);
-                       day_chart.series[2].addPoint(te, true, temp);
+//                     do_debug(js.tm + " " + t + " " + te + "<br>"); 
+                       daychart.series[0].addPoint(ra, true, rainfall);
+                       daychart.series[1].addPoint(pr, true, pressure);
+                       daychart.series[2].addPoint(te, true, temp);
+               }
+
+               var conv = 2.23694;
+
+               function fill_windrose(js, points) {
+                       var p = windrose.series[0].data.length > points;
+                       var rr = js.r;
+                       windrose.series[0].addPoint([rr.Dir, Math.round(rr.Wind*conv)], true, p);
+               }
+
+               function fill_windspeed(js) {
+                       var rr = js.r;
+                       var point = windspeed.series[0].points[0];
+                       point.update(Math.round(rr.Wind*conv));
+               }
+
+               function fill_winddir(js) {
+                       var rr = js.r;
+                       var point = winddir.series[0].points[0];
+                       point.update(rr.Dir);
                }
 
                window.onload = function() {
                        startws();
-                       start_day_chart();
+                       start_daychart();
+                       start_windrose();
+                       start_windspeed();
+                       start_winddir();
                        window.setInterval(function() {
                                if (ws === null)
                                        startws();
 
                </script>
 
+               <div id="container">
+                       <div id="daychart" style="min-width: 400px; height: 400px; margin: 0 auto"> </div>
+               </div>
+
+               <div id="container">
+                       <table border="0" align="center">
+                               <tr>
+                                       <td id="windrose" style="min-width: 350px; max-width: 400px; height: 330px; margin: 0 auto"> </td>
+                                       <td id="windspeed" style="min-width: 280px; max-width: 400px; height: 270px; margin: 0 auto"> </td>
+                                       <td id="winddir" style="min-width: 280px; max-width: 400px; height: 270px; margin: 0 auto"> </td>
+                               </tr>
+                       </table>
+               </div>
+
                <div id="container">
                        <div id="start-template">
                                <br><br>
                                                <th>Humidity:</th><td> <span id="Humidity_In"> </span></td>
                                        </tr>
                                        <tr>
-                                               <th>Temperature out:</th><td> <span id="Temp_Out"> </span></td>
                                                <th>Min:</th><td> <span id="Temp_Out_Min"> </span> @ <span id="Temp_Out_Min_T"> </span></td>
                                                <th>Max:</th><td> <span id="Temp_Out_Max"> </span> @ <span id="Temp_Out_Max_T"> </span></td>
                                                <th>Humidity:</th><td> <span id="Humidity_Out"> </span></td>
                                                <th>Dew Point:</th><td> <span id="Dew_Point"> </span></td>
                                        </tr>
                                        <tr>
-                                               <th>Wind Direction:</th><td> <span id="Dir"> </span></td>
-                                               <th>Minute Avg:</th><td> <span id="Dir_1m">  </span></td>
-                                               <th>Speed:</th><td> <span id="Wind"> </span></td>
-                                               <th>Minute Avg:</th><td> <span id="Wind_1m">  </span></td>
+                                               <th>Wind Dir Minute Avg:</th><td> <span id="Dir_1m">  </span></td>
+                                               <th>Wind Speed Minute Avg:</th><td> <span id="Wind_1m">  </span></td>
                                        </tr>
                                        <tr>
                                                <th>Rain 30mins:</th><td> <span id="Rain_1h"> </span></td>
                                                <th>Year:</th><td> <span id="Rain_Year"> </span></td>
                                        </tr>
                                </table>
-                               <br>
-                               <div id="wsconnect" align="center"> </div>
-                               <br>
-                               <div id="hh" align="center"> </div>
                        </div>
                </div>
 
-               <div id="container">
-                       <div id="day_chart" style="min-width: 400px; height: 400px; margin: 0 auto"> 
-                       </div>
-               </div>
-
-               <div id="container">
-                       <center><div id="do_debug"> </div></center>
-               </div>
 
                <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
-               <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
+               <script src="js/jquery.min.js"></script>
                <!-- Latest compiled and minified JavaScript -->
-               <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
+               <script src="js/bootstrap.min.js"></script>
                <!-- High Chart stuff -->
-               <script src="http://code.highcharts.com/highcharts.js"></script>
-               <script src="http://code.highcharts.com/modules/exporting.js"></script>
+               <script src="js/highcharts.js"></script>
+               <script src="js/highcharts-more.js"></script>
+               <script src="js/modules/exporting.js"></script>
 
        </body>
 </html>