From 776d331412dc0c68bf47d9cc58516eeabfd6712b Mon Sep 17 00:00:00 2001 From: boris Date: Mon, 14 Aug 2023 01:21:46 +0200 Subject: [PATCH] Init --- webfiles/Reports/.placeholder.txt | 0 webfiles/css/colours.css | 40 + webfiles/css/gauges.css | 101 + webfiles/css/mx-templates.css | 215 + webfiles/css/w3Pro.css | 151 + webfiles/gauges.htm | 257 + webfiles/historic.htm | 112 + webfiles/images/CumulusMX-Logo.png | Bin 0 -> 22972 bytes webfiles/images/favicon.png | Bin 0 -> 58136 bytes webfiles/images/picture.jpg | Bin 0 -> 12929 bytes webfiles/index.htm | 238 + webfiles/js/alltimerecdata.js | 40 + webfiles/js/cumuluscharts.js | 2463 ++++++ webfiles/js/historiccharts.js | 1129 +++ webfiles/js/menu.js | 36 + webfiles/js/menuSample.js | 38 + webfiles/js/monthlyrecdata.js | 74 + webfiles/js/noaarpts.js | 142 + webfiles/js/selectachart.js | 1465 ++++ webfiles/js/setpagedata.js | 237 + webfiles/lib/jquery/jquery-latest.min.js | 2 + webfiles/lib/jquery/jquery.tmpl.js | 484 ++ .../scripts/RGraph.common.core.min.js | 1 + .../steelseries/scripts/RGraph.rose.min.js | 1 + webfiles/lib/steelseries/scripts/gauges.js | 4390 +++++++++++ .../lib/steelseries/scripts/language.min.js | 4 + .../scripts/src/RGraph.common.core.js | 2959 +++++++ .../steelseries/scripts/src/RGraph.rose.js | 1204 +++ .../lib/steelseries/scripts/src/language.js | 2987 +++++++ .../steelseries/scripts/src/steelseries.js | 6974 +++++++++++++++++ .../scripts/src/steelseries.min.js | 25 + webfiles/lib/steelseries/scripts/src/tween.js | 380 + .../lib/steelseries/scripts/src/tween.min.js | 31 + .../scripts/steelseries_tween.min.js | 55 + webfiles/monthlyrecord.htm | 265 + webfiles/noaareport.htm | 130 + webfiles/record.htm | 240 + webfiles/selectachart.htm | 137 + webfiles/thismonth.htm | 235 + webfiles/thisyear.htm | 240 + webfiles/today.htm | 239 + webfiles/todayyest.htm | 283 + webfiles/trends.htm | 125 + webfiles/upload.php | 364 + webfiles/yesterday.htm | 225 + 45 files changed, 28718 insertions(+) create mode 100644 webfiles/Reports/.placeholder.txt create mode 100644 webfiles/css/colours.css create mode 100644 webfiles/css/gauges.css create mode 100644 webfiles/css/mx-templates.css create mode 100644 webfiles/css/w3Pro.css create mode 100644 webfiles/gauges.htm create mode 100644 webfiles/historic.htm create mode 100644 webfiles/images/CumulusMX-Logo.png create mode 100644 webfiles/images/favicon.png create mode 100644 webfiles/images/picture.jpg create mode 100644 webfiles/index.htm create mode 100644 webfiles/js/alltimerecdata.js create mode 100644 webfiles/js/cumuluscharts.js create mode 100644 webfiles/js/historiccharts.js create mode 100644 webfiles/js/menu.js create mode 100644 webfiles/js/menuSample.js create mode 100644 webfiles/js/monthlyrecdata.js create mode 100644 webfiles/js/noaarpts.js create mode 100644 webfiles/js/selectachart.js create mode 100644 webfiles/js/setpagedata.js create mode 100644 webfiles/lib/jquery/jquery-latest.min.js create mode 100644 webfiles/lib/jquery/jquery.tmpl.js create mode 100644 webfiles/lib/steelseries/scripts/RGraph.common.core.min.js create mode 100644 webfiles/lib/steelseries/scripts/RGraph.rose.min.js create mode 100644 webfiles/lib/steelseries/scripts/gauges.js create mode 100644 webfiles/lib/steelseries/scripts/language.min.js create mode 100644 webfiles/lib/steelseries/scripts/src/RGraph.common.core.js create mode 100644 webfiles/lib/steelseries/scripts/src/RGraph.rose.js create mode 100644 webfiles/lib/steelseries/scripts/src/language.js create mode 100644 webfiles/lib/steelseries/scripts/src/steelseries.js create mode 100644 webfiles/lib/steelseries/scripts/src/steelseries.min.js create mode 100644 webfiles/lib/steelseries/scripts/src/tween.js create mode 100644 webfiles/lib/steelseries/scripts/src/tween.min.js create mode 100644 webfiles/lib/steelseries/scripts/steelseries_tween.min.js create mode 100644 webfiles/monthlyrecord.htm create mode 100644 webfiles/noaareport.htm create mode 100644 webfiles/record.htm create mode 100644 webfiles/selectachart.htm create mode 100644 webfiles/thismonth.htm create mode 100644 webfiles/thisyear.htm create mode 100644 webfiles/today.htm create mode 100644 webfiles/todayyest.htm create mode 100644 webfiles/trends.htm create mode 100644 webfiles/upload.php create mode 100644 webfiles/yesterday.htm diff --git a/webfiles/Reports/.placeholder.txt b/webfiles/Reports/.placeholder.txt new file mode 100644 index 0000000..e69de29 diff --git a/webfiles/css/colours.css b/webfiles/css/colours.css new file mode 100644 index 0000000..2bfeddc --- /dev/null +++ b/webfiles/css/colours.css @@ -0,0 +1,40 @@ +/* ------------------------------------------------------------------- + * Colours for the CumulusMX Alternative Interface + * Produced using w3Schools colour generator + * + * Key Colour: #4e5b31 + * + * Theme modified to change font 'color's to either lightest or darkest + * theme colour. Also modified names for text, borders & hover colours. + * I have added a few extras. Not all are used. + * Neil Thomas + ------------------------------------------------------------------*/ + +/* Check that your theme is named as shown below */ + +.w3-theme-white {color:#2e5473; background-color:#FFFFFF;} +.w3-theme-l5 {color:#2e5473; background-color:#f7fafc;} +.w3-theme-l4 {color:#2e5473; background-color:#e4edf4;} +.w3-theme-l3 {color:#2e5473 ; background-color:#c9dbe9;} +.w3-theme-l2 {color:#2e5473 ; background-color:#aec9df;} +.w3-theme-l1 {color:#2e5473 ; background-color:#93b7d4;} +.w3-theme-d1 {color:#f7fafc ; background-color:#6195c0;} +.w3-theme-d2 {color:#f7fafc ; background-color:#4a86b7;} +.w3-theme-d3 {color:#f7fafc ; background-color:#4075a1;} +.w3-theme-d4 {color:#f7fafc ; background-color:#37658a;} +.w3-theme-d5 {color:#f7fafc ; background-color:#2e5473;} + +.w3-theme-light {color:#2e5473 ; background-color:#f7fafc;} +.w3-theme-dark {color:#f7fafc ; background-color:#2e5473;} +.w3-theme-action {color:#f7fafc ; background-color:#2e5473;} + +.w3-theme {color:#f7fafc ; background-color:#78a5c9;} +.w3-theme-txt {color:#78a5c9;} +.w3-theme-bdr {border-color:#78a5c9;} +.w3-theme-d5-bdr {border-color:#2e5473;} +.w3-theme-l1-bdr {border-color:#f7fafc;} + +.w3-theme-hvr:hover {color:#f7fafc; background-color:#78a5c9;} +.w3-theme-d5-hvr:hover {color:#f7fafc; background-color:#2e5473;} +.w3-theme-txt-hvr:hover {color:#78a5c9;} +.w3-theme-bdr-hvr:hover {border-color:#78a5c9;} diff --git a/webfiles/css/gauges.css b/webfiles/css/gauges.css new file mode 100644 index 0000000..ed4068b --- /dev/null +++ b/webfiles/css/gauges.css @@ -0,0 +1,101 @@ +/* CSS for SteelSeries Gauges + * Mark Crossley | modified by Neil Thomas + * v2.5.0 - 03 Dec 2014 | Feb 2021 + */ + +.gauge { + position: relative; +} + +.odo { + position: absolute; + top: 67%; + left: 50%; + transform: translateX(-50%); + -webkit-transform: translateX(-50%); +} +.gaugeSmall { + max-width:181px; + max-height: 181px; + width:100%; + height:100%; +} +.at-gaugeSmall { + width: 221px; + margin-left:8px; + margin-right:8px; +} + +.gaugeMedium { + max-width: 221px; + max-height:221px; +} +.at-gaugeMedium { + width: 261px; + margin-left:8px; + margin-right:8px; +} + +.gaugeLarge { + max-width:261px; + max-height:261px; + width:100%; + height:100%; +} + +.at-gaugeLarge { + width:301px; + margin-left:8px; + margin-right:8px; +} + +@media screen and (max-width:550px) { + .at-gaugeSmall { width:100%; } + .at-gaugeMedium{ width:100%;} +} + +@media screenand (max-width:640px) { + .at-gaugeLarge { width:100%;} + } + +@font-face { + font-family: 'LCDMono2Ultra'; + src: url('data:font/woff;charset=utf-8;base64,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') format('woff'), + url('../fonts/lcdmono2ultra-webfont.eot'), + url('../fonts/lcdmono2ultra-webfont.ttf') format('truetype'), + url('../fonts/lcdmono2ultra-webfont.svg#LCDMono2Ultra') format('svg'); + font-weight: normal; + font-style: normal; +} + +.ddimgtooltip{ + z-index: 2000; + box-shadow: 3px 3px 5px #818181; /*shadow for CSS3 capable browsers.*/ + border-radius: 8px; + display: none; + position: absolute; + border: 2px solid #2e5473!important; /* Changed to match d5 of theme */ + background: #f7fafc!important; /* Changed to match l1 of theme */ + color: #2e5473!important; /* Changed to match d5 of theme */ + padding: 0 7px 3px 7px; + /*font-family: sans-serif; */ + font-size: 86%!important; + max-width: 300px; +} + +.tipinfo{ + text-align: left; + padding: 3px 0 3px 2px; +} + +.tipinfo h5, .tipinfo h6 { + + line-height:1.2em; + margin:0; + padding:0; +} + +.tipimg{ + width: 438px; /* suggest 380 for wxgraphs */ + height: 175px; /* suggest 260 for wxgraphs */ +} diff --git a/webfiles/css/mx-templates.css b/webfiles/css/mx-templates.css new file mode 100644 index 0000000..97ffaca --- /dev/null +++ b/webfiles/css/mx-templates.css @@ -0,0 +1,215 @@ +/* ----------------------------------- + * Styles for CumulusMX Templates + Last modified: 2021/03/19 09:23:15 + * ----------------------------------*/ + +html, body, p, h1, h2, h3, h4, h5, h6, li, td, th { + font-family: 'Rosario', sans-serif; +} + +p { + font-size: 15px; +} + +#Header { + border-style: solid; + border-width: 0 0 10px 0; +} + +.site-width { + max-width:1140px; + margin:auto; +} + +.graph-width { + max-width:1250px; + margin:auto; +} + +#Footer { + border-width:5px 0 0 0; + border-style: solid; +} + +.logo { + max-width:250px; + margin: 5px 0 5px 16px; +} + +.subText { + font-size: 80% !important; + font-weight:400; +} + +body { + background-image: url('../images/picture.jpg'); + background-position: bottom left; + background-repeat: no-repeat; + background-attachment: fixed; +} + +.statusPanel h5 { + margin-bottom: -5px; +} +/* ------------------------------------- + * Flex boxes + * -------------------------------------*/ +.at-flex-start { display:flex;} +.at-flex-end { + display:flex; + justify-content: flex-end; + flex-wrap:wrap; +} + +.at-flex-justify { + display:flex; + justify-content: space-around; + flex-wrap:wrap; +} + +.at-flex-between { + display:flex; + justify-content: space-between; + flex-wrap:wrap; +} + +.at-flex-bottom, +.at-flex-items-bottom { + align-items: flex-end; +} + +.at-flex-items-center { + align-items: center; +} + +/* -------------------------------------------------- + * Menu enhancements + * --------------------------------------------------*/ +#Main_Menu { + margin-bottom: 4px; + border-width:2px 0 0 0 ; + border-style: solid; + min-height: 32px; +} + +.at-slim { + padding: 4px 14px!important; +} + +.at-divider { + margin: 0 5px; + color:#F80; +} + +.at-spacer { + min-height:2em; +} + +.at-menu-lable { + display:block; + width:100%; + font-size: 13px; + font-style: italic; + padding-bottom: 2px!important; + padding-top:4px!important; + border-bottom: 1px dotted #c2cfa5!important; +} + +.at-menu-bar { + display:block; + height: 2px; + padding: 0 2px!important; +} + +.at-indent { + padding-left: 40px!important; +} + +/* ------------------------------- + * Model enhancements + * ------------------------------*/ + +.w3-modal-content { + margin-top:10%; + border-radius: 8px; +} + +.w3-modal header { border-radius: 8px 8px 0 0;} +.w3-modal footer { border-radius: 0 0 8px 8px;} +.w3-modal .w3-btn { border-radius: 0 8px;} + +/* ---------------------------------------- + * Media enhancements + * ---------------------------------------*/ +@media screen and (max-width:780px) { + #Footer { position: unset; } + #Content { + /*margin-top: 170px!important;*/ + margin-bottom: 5px!important; + } + + .statusPanel { + text-align:center!important; + margin:auto!important; + } +} + +@media screen and (max-height:768px) { + #Footer { position: unset; item: center;} + #Content { + margin-bottom: 5px!important; + } +} + +/* -------------------------------------- + * LED enhancements + * -------------------------------------*/ +.at-led-round { + display:inline-block; + height: 1.2em; + width: 1.2em; + margin: 0 0.5em -3px 0.5em; + border-radius: 50%; + background-color: #888; + box-shadow: inset 3px 3px 2px rgba(220, 220, 220, 0.6), inset -2px -2px 2px rgba(32, 32, 32,0.6); +} + +.at-led-block { + display:inline-block; + height: 1.2em; + width: 1.2em; + margin: 0 0.5em -3px 0.5em; + background-color: #888; + box-shadow: inset 3px 3px 2px rgba(220, 220, 220, 0.6), inset -2px -2px 2px rgba(32, 32, 32,0.6); +} + +.at-led-brick { + display:inline-block; + height:0.8em; + width:1.6em; + margin:0 0.5em -3px 0.5em; + background-color: #888; + box-shadow: inset 3px 3px 2px rgba(220, 220, 220, 0.6), inset -2px -2px 2px rgba(32, 32, 32,0.6); +} +.at-led-oval { + display:inline-block; + height:1em; + width:2em; + margin:0 0.5em -3px 0.5em; + border-radius: 50%; + background-color: #888; + box-shadow: inset 3px 3px 2px rgba(220, 220, 220, 0.6), inset -2px -2px 2px rgba(32, 32, 32,0.6); +} + +.at-led-green { + background-color: #0b0; +} + +.at-led-flash-red { + animation: flashR 1s infinite; +} + +@keyframes flashR { + 0%, 60% {background-color: #f00;} + 61%,100% {background-color: #800;} +} diff --git a/webfiles/css/w3Pro.css b/webfiles/css/w3Pro.css new file mode 100644 index 0000000..3e59f4c --- /dev/null +++ b/webfiles/css/w3Pro.css @@ -0,0 +1,151 @@ +/* W3PRO.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent}a:active,a:hover{outline-width:0} +abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} +h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px} +.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace} +h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} +hr{border:0;border-top:1px solid #eee;margin:20px 0} +.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} +.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} +.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} +.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} +.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} +.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} +.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} +.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} +.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} +.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} +.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} +.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} +.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} +.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} +.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} +.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} +.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} +.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} +.w3-dropdown-hover:hover .w3-dropdown-content{display:block} +.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} +.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} +.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} +/*.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px}*/ +.w3-check,.w3-radio{width:24px;position:relative;} +.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} +.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} +.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} +.w3-main,#main{transition:margin-left .4s} +.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} +.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} +.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} +.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} +.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} +.w3-bar .w3-button{white-space:normal} +.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} +.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} +.w3-responsive{display:block;overflow-x:auto} +.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, +.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} +.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} +.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} +.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} +.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} +@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} +.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} +.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} +@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} +.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} +.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} +.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px} +.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px} +.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} +.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} +.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} +@media (max-width:1205px){.w3-auto{max-width:95%}} +@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} +.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} +.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} +.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} +@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} +@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} +@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} +@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} +.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} +.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} +.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} +.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} +.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} +.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} +.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} +.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} +.w3-display-position{position:absolute} +.w3-circle{border-radius:50%} +.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} +.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} +.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} +.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} +.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} +.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} +.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} +.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} +.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} +.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} +.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} +.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} +.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} +.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} +.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} +.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} +.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} +.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} +.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} +.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} +.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} +.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} +.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} +.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} +.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} +.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} +.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} +.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} +.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} +.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} +.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} +.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} +.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} +.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} +.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} +.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} +.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important} +.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important} +.w3-left{float:left!important}.w3-right{float:right!important} +.w3-button:hover{color:#000!important;background-color:#ccc!important} +.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} +.w3-hover-none:hover{box-shadow:none!important} diff --git a/webfiles/gauges.htm b/webfiles/gauges.htm new file mode 100644 index 0000000..e7b546a --- /dev/null +++ b/webfiles/gauges.htm @@ -0,0 +1,257 @@ + + + + + + + + + Cumulus MX + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

Gauges

+
+
+
+
Status:
+
+
+ +
+ +
+
Temperature
+
+
+
Other Temps
+
+
+
+
+
+
+
Humidity
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
Temperature
+
+
+ +
+
+
+
+ +
Other Temps
+
+
+ +
+
+
+
+ +
Humidity
+
+
+ +
+
+
+
+ +
Wind
+
+ +
+
+
+ +
Wind Direction
+
+ +
+
+
+ +
Wind Rose
+
+ +
+
+
+ +
Pressure
+
+ +
+
+
+ +
Rainfall
+
+ +
+
+
+ +
Rainfall Rate
+
+ +
+
+
+ +
UV Radiation
+
+ +
+
+
+ +
Solar
+
+ +
+
+
+ +
Cloudbase
+
+ +
+
+
+ +
+
+
+
+ + + +
+
+
+ × +

Gauge Units

+
+
+
+
Temperature:
+
+
+ +
Rainfall
+
+
+ +
Pressure
+
+
+
 
+
+
+ +
Wind Speed
+
+
+
 
+
+
+ +
Cloud Base
+
+
+
+
+
+

Powered by Cumulus MX

+
+
+
+ + + + + + + + + + + diff --git a/webfiles/historic.htm b/webfiles/historic.htm new file mode 100644 index 0000000..5199e69 --- /dev/null +++ b/webfiles/historic.htm @@ -0,0 +1,112 @@ + + + + + + + + + Cumulus MX + + + + + + + + + + + + + + + + + + + + +
+
+
+

Charts based on summary data

+

Welcome to

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + +
+

Mouse over the chart to see the values at any given time. + You can add or remove data sets from the chart by clicking the entry on the chart legend.

+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/webfiles/images/CumulusMX-Logo.png b/webfiles/images/CumulusMX-Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf0246f86a1ea9e2c9c1049779d8bb3e372c919 GIT binary patch literal 22972 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 Aq5uE@ literal 0 HcmV?d00001 diff --git a/webfiles/images/favicon.png b/webfiles/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..26f009f8791fff1ac019756b1e069ce23e3babe2 GIT binary patch literal 58136 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 z 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 literal 0 HcmV?d00001 diff --git a/webfiles/images/picture.jpg b/webfiles/images/picture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2336b37427525b627d32eac3292adaaa9f3a477d GIT binary patch literal 12929 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 F`5%APW^Dif literal 0 HcmV?d00001 diff --git a/webfiles/index.htm b/webfiles/index.htm new file mode 100644 index 0000000..5d4bb51 --- /dev/null +++ b/webfiles/index.htm @@ -0,0 +1,238 @@ + + + + + + + + + Cumulus MX + + + + + + + + + + + + + + + + + + + + +
+
+
+

Weather

+
+
+
+
+
+
+
+

Almanac

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dawn:Sun Rise:Moon Rise:MoonVisible %
Dusk:Sun Set:Moon Set:
Daylight:Day Length:Moon Phase:
Current conditions:
+
+
+
+
+
+
+
+

Conditions at local time

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Temperature and Humidity
Temperature Dew Point 
Windchill Humidity %
Heat Index Apparent TemperatureFeels Like 
Temp change last hour 
Rainfall
Rainfall Today Rainfall Rate /hr
Rainfall This Month Rainfall This Year 
Rainfall Last Hour Last rainfall
Rainfall Since Midnight Rainfall Last 24 Hours 
Wind
Wind Speed (gust) Wind Speed (avg) 
Wind Bearing° Beaufort
Wind Variation (last 10 minutes)From ° to °
Pressure (sea level)
Barometer  /hr
Solar
Solar Radiation W/m²Evapotranspiration Today 
UV Index
+
+

Page updated .

+
+
+
+
+
+
+
+
+

Welcome to

+

The weather station in use is the
+ This page is updated every minutes. The meteorological day used at this station ends at . +

+

Forecast:

+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/webfiles/js/alltimerecdata.js b/webfiles/js/alltimerecdata.js new file mode 100644 index 0000000..a719166 --- /dev/null +++ b/webfiles/js/alltimerecdata.js @@ -0,0 +1,40 @@ +// Last modified: 2021/03/19 09:15:55 + + +$.getJSON("websitedata.json", function (json) { + console.log( "success" ); + var cmx_data = json; + + $(document).prop('title', cmx_data['cmx-location'] + ' weather'); + $('meta[name=description]').attr('content', cmx_data['cmx-location'] + ' weather data'); + $('meta[name=keywords]').attr('content', $('meta[name=keywords]').attr('content') + ', ' + cmx_data['cmx-location'] + ' weather data'); + + $.getJSON("alltimerecdata.json", function (json) { + console.log( "success" ); + Object.keys(json).forEach(key => { + cmx_data[key] = json[key]; + }); + + // Update all spans with id beginning "cmx-" + $('span[id^=cmx-]').each(function () { + this.innerHTML = cmx_data[this.id]; + }); + // Update all spans with class beginning "cmx-" + $('span[class^=cmx-]').each(function () { + this.innerHTML = cmx_data[this.className]; + }); + }) + .fail(function (jqxhr, textStatus, error) { + var err = textStatus + ", " + error; + console.log("Request Failed: " + err); + }); + + +}) +.fail(function (jqxhr, textStatus, error) { + var err = textStatus + ", " + error; + console.log( "Request Failed: " + err ); +}); + +$(document).ready(function() { +}); \ No newline at end of file diff --git a/webfiles/js/cumuluscharts.js b/webfiles/js/cumuluscharts.js new file mode 100644 index 0000000..54f3c3c --- /dev/null +++ b/webfiles/js/cumuluscharts.js @@ -0,0 +1,2463 @@ +// Last modified: 2023/03/16 09:59:29 + +var chart, config; + +var myRangeBtns = { + buttons: [{ + count: 12, + type: 'hour', + text: '12h' + }, { + count: 24, + type: 'hour', + text: '24h' + }, { + count: 2, + type: 'day', + text: '2d' + }, { + type: 'all', + text: 'All' + }], + inputEnabled: false, + selected: 1 +}; + +$(document).ready(function () { + $('#mySelect').change(function () { + changeGraph($('#mySelect').val()); + }); + + + $.ajax({ + url: "availabledata.json", + dataType: "json", + success: function (result) { + if (result.Temperature === undefined || result.Temperature.Count == 0) { + $('#mySelect option[value="temp"]').remove(); + } + if (result.DailyTemps === undefined || result.DailyTemps.Count == 0) { + $('#mySelect option[value="dailytemp"]').remove(); + } + if (result.Humidity === undefined || result.Humidity.Count == 0) { + $('#mySelect option[value="humidity"]').remove(); + } + if (result.Solar === undefined || result.Solar.Count == 0) { + $('#mySelect option[value="solar"]').remove(); + } + if (result.Sunshine === undefined || result.Sunshine.Count == 0) { + $('#mySelect option[value="sunhours"]').remove(); + } + if (result.AirQuality === undefined || result.AirQuality.Count == 0) { + $('#mySelect option[value="airquality"]').remove(); + } + if (result.ExtraTemp == undefined || result.ExtraTemp.Count == 0) { + $('#mySelect option[value="extratemp"]').remove(); + } + if (result.ExtraHum == undefined || result.ExtraHum.Count == 0) { + $('#mySelect option[value="extrahum"]').remove(); + } + if (result.ExtraDewPoint == undefined || result.ExtraDewPoint.Count == 0) { + $('#mySelect option[value="extradew"]').remove(); + } + if (result.SoilTemp == undefined || result.SoilTemp.Count == 0) { + $('#mySelect option[value="soiltemp"]').remove(); + } + if (result.SoilMoist == undefined || result.SoilMoist.Count == 0) { + $('#mySelect option[value="soilmoist"]').remove(); + } + if (result.LeafWetness == undefined || result.LeafWetness.Count == 0) { + $('#mySelect option[value="leafwet"]').remove(); + } + if (result.UserTemp == undefined || result.UserTemp.Count == 0) { + $('#mySelect option[value="usertemp"]').remove(); + } + if (result.CO2 == undefined || result.CO2.Count == 0) { + $('#mySelect option[value="co2"]').remove(); + } + } + }); + + $.ajax({ + url: "graphconfig.json", + dataType: "json", + success: function (result) { + config = result; + var value = parent.location.hash.replace('#', ''); + if (value == '') + value = 'temp'; + + changeGraph(value); + // set the correct option + $('#mySelect option[value="' + value + '"]').attr('selected', true); + } + }); +}); + + +function changeGraph(graph) { + switch (graph) { + case 'temp': + doTemp(); + break; + case 'dailytemp': + doDailyTemp(); + break; + case 'press': + doPress(); + break; + case 'wind': + doWind(); + break; + case 'windDir': + doWindDir(); + break; + case 'rain': + doRain(); + break; + case 'dailyrain': + doDailyRain(); + break; + case 'humidity': + doHum(); + break; + case 'solar': + doSolar(); + break; + case 'sunhours': + doSunHours(); + break; + case 'airquality': + doAirQuality(); + break; + case 'extratemp': + doExtraTemp(); + break; + case 'extrahum': + doExtraHum(); + break; + case 'extradew': + doExtraDew(); + break; + case 'soiltemp': + doSoilTemp(); + break; + case 'soilmoist': + doSoilMoist(); + break; + case 'leafwet': + doLeafWet(); + break; + case 'usertemp': + doUserTemp(); + break; + case 'co2': + doCO2(); + break; + default: + doTemp(); + break; + } + parent.location.hash = graph; +} + +var doTemp = function () { + var freezing = config.temp.units === 'C' ? 0 : 32; + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: { + text: 'Temperature' + }, + credits: { + enabled: true + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: { + text: 'Temperature (°' + config.temp.units + ')' + }, + opposite: false, + labels: { + align: 'right', + x: -5, + formatter: function () { + return '' + this.value + ''; + } + }, + plotLines: [{ + // freezing line + value: freezing, + color: 'rgb(0, 0, 180)', + width: 1, + zIndex: 2 + }] + }, { + // right + gridLineWidth: 0, + linkedTo: 0, + opposite: true, + labels: { + align: 'left', + x: 5, + formatter: function () { + return '' + this.value + ''; + } + } + }], + legend: { + enabled: true + }, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: { + lineWidth: 2 + } + }, + tooltip: { + shared: true, + crosshairs: true, + valueDecimals: config.temp.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'tempdata.json', + cache: false, + dataType: 'json', + success: function (resp) { + var titles = { + 'temp' : 'Temperature', + 'dew' : 'Dew Point', + 'apptemp' : 'Apparent', + 'feelslike': 'Feels Like', + 'wchill' : 'Wind Chill', + 'heatindex': 'Heat Index', + 'humidex' : 'Humidex', + 'intemp' : 'Inside' + }; + var idxs = ['temp', 'dew', 'apptemp', 'feelslike', 'wchill', 'heatindex', 'humidex', 'intemp']; + var yaxis = 0; + + idxs.forEach(function(idx) { + var valueSuffix = ' °' + config.temp.units; + yaxis = 0; + + if (idx in resp) { + if (idx === 'humidex') { + valueSuffix = null; + if (config.temp.units == 'F') { + chart.yAxis[1].remove(); + chart.addAxis({ + id: 'humidex', + title:{text: 'Humidex'}, + opposite: true, + labels: { + align: 'left' + }, + alignTicks: true, + gridLineWidth: 0, // Not working? + gridZIndex: -10, // Hides the grid lines for this axis + showEmpty: false + }, false, false); + + yaxis = 'humidex'; + } + } + + chart.addSeries({ + name: titles[idx], + id: 'series-' + idx, + data: resp[idx], + color: config.series[idx].colour, + yAxis: yaxis, + tooltip: {valueSuffix: valueSuffix} + }, false); + + if (idx === 'temp') { + chart.get('series-' + idx).options.zIndex = 99; + } + } + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doPress = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: { + text: 'Pressure' + }, + credits: { + enabled: true + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: { + text: 'Pressure (' + config.press.units + ')' + }, + opposite: false, + labels: { + align: 'right', + x: -5 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + title: { + text: null + }, + labels: { + align: 'left', + x: 5 + } + }], + legend: { + enabled: true + }, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: { + lineWidth: 2 + } + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' ' + config.press.units, + valueDecimals: config.press.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [{ + name: 'Pressure', + color: config.series.press.colour + }], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'pressdata.json', + dataType: 'json', + cache: false, + success: function (resp) { + chart.hideLoading(); + chart.series[0].setData(resp.press); + } + }); +}; + +var compassP = function (deg) { + var a = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW']; + return a[Math.floor((deg + 22.5) / 45) % 8]; +}; + +var doWindDir = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'scatter', + alignTicks: false + }, + title: { + text: 'Wind Direction' + }, + credits: { + enabled: true + }, + navigator: { + series: { + // pseudo scatter + type: 'line', + dataGrouping: { + groupPixelWidth: 1, + anchor: 1 + }, + lineWidth: 0, + marker : { + // enable the marker to simulate a scatter + enabled: true, + radius : 1 + } + } + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: { + text: 'Bearing' + }, + opposite: false, + min: 0, + max: 360, + tickInterval: 45, + labels: { + align: 'right', + x: -5, + formatter: function () { + return compassP(this.value); + } + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + title: { + text: null + }, + min: 0, + max: 360, + tickInterval: 45, + labels: { + align: 'left', + x: 5, + formatter: function () { + return compassP(this.value); + } + } + }], + legend: { + enabled: true + }, + plotOptions: { + scatter: { + cursor: 'pointer', + enableMouseTracking: true, + boostThreshold: 200, + marker: { + states: { + hover: { + enabled: false + }, + select: { + enabled: false + } + } + }, + shadow: false, + label: { + enabled: false + } + } + }, + tooltip: { + enabled: true, + split: true, + useHTML: true + }, + series: [{ + name: 'Bearing', + type: 'scatter', + color: config.series.bearing.colour, + marker: { + symbol: 'circle', + radius: 2 + }, + enableMouseTracking: false, + showInNavigator: false + }, { + name: 'Avg Bearing', + type: 'scatter', + color: config.series.avgbearing.colour, + marker: { + symbol: 'circle', + radius: 2 + }, + showInNavigator: true, + tooltip: { + headerFormat: '', + xDateFormat: '%A, %b %e %H:%M ', + pointFormatter() { + return '\u25CF ' + + this.series.name + ': ' + (this.y == 0 ? 'calm' : this.y + '°') + '
'; + } + } + }], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'wdirdata.json', + dataType: 'json', + cache: false, + success: function (resp) { + chart.hideLoading(); + chart.series[0].setData(resp.bearing); + chart.series[1].setData(resp.avgbearing); + } + }); +}; + +var doWind = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: { + text: 'Wind Speed' + }, + credits: { + enabled: true + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: { + text: 'Wind Speed (' + config.wind.units + ')' + }, + opposite: false, + min: 0, + labels: { + align: 'right', + x: -5 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + min: 0, + title: { + text: null + }, + labels: { + align: 'left', + x: 5 + } + }], + legend: { + enabled: true + }, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: { + lineWidth: 2 + } + }, + tooltip: { + shared: true, + crosshairs: true, + valueSuffix: ' ' + config.wind.units, + valueDecimals: config.wind.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [{ + name: 'Wind Speed', + color: config.series.wspeed.colour + }, { + name: 'Wind Gust', + color: config.series.wgust.colour + }], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'winddata.json', + dataType: 'json', + cache: false, + success: function (resp) { + chart.hideLoading(); + chart.series[0].setData(resp.wspeed); + chart.series[1].setData(resp.wgust); + } + }); +}; + +var doRain = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: true + }, + title: { + text: 'Rainfall' + }, + credits: { + enabled: true + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: { + text: 'Rainfall rate (' + config.rain.units + '/hr)' + }, + min: 0, + opposite: false, + labels: { + align: 'right', + x: -5 + }, + showEmpty: false + }, { + // right + opposite: true, + title: { + text: 'Rainfall (' + config.rain.units + ')' + }, + min: 0, + labels: { + align: 'left', + x: 5 + } + }], + legend: { + enabled: true + }, + plotOptions: { + series: { + boostThreshold: 0, + dataGrouping: { + enabled: false + }, + showInNavigator: true, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: { + lineWidth: 2 + } + }, + tooltip: { + shared: true, + crosshairs: true, + valueDecimals: config.rain.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [{ + name: 'Daily rain', + type: 'area', + color: config.series.rfall.colour, + yAxis: 1, + tooltip: {valueSuffix: ' ' + config.rain.units}, + fillOpacity: 0.3 + }, { + name: 'Rain rate', + type: 'line', + color: config.series.rrate.colour, + yAxis: 0, + tooltip: {valueSuffix: ' ' + config.rain.units + '/hr'} + }], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'raindata.json', + dataType: 'json', + cache: false, + success: function (resp) { + chart.hideLoading(); + chart.series[0].setData(resp.rfall); + chart.series[1].setData(resp.rrate); + } + }); +}; + +var doHum = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: { + text: 'Relative Humidity' + }, + credits: { + enabled: true + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: { + text: 'Humidity (%)' + }, + opposite: false, + min: 0, + max: 100, + labels: { + align: 'right', + x: -5 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + min: 0, + max: 100, + title: { + text: null + }, + labels: { + align: 'left', + x: 5 + } + }], + legend: { + enabled: true + }, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: { + lineWidth: 2 + } + }, + tooltip: { + shared: true, + crosshairs: true, + valueSuffix: ' %', + valueDecimals: config.hum.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'humdata.json', + dataType: 'json', + cache: false, + success: function (resp) { + var titles = { + 'hum' : 'Outdoor Humidity', + 'inhum': 'Indoor Humidity' + } + var idxs = ['hum', 'inhum']; + var cnt = 0; + idxs.forEach(function(idx) { + if (idx in resp) { + chart.addSeries({ + name: titles[idx], + color: config.series[idx].colour, + data: resp[idx] + }, false); + + cnt++; + } + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doSolar = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: true + }, + title: { + text: 'Solar' + }, + credits: { + enabled: true + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [], + legend: { + enabled: true + }, + plotOptions: { + series: { + boostThreshold: 0, + dataGrouping: { + enabled: false + }, + showInNavigator: true, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: { + lineWidth: 2 + } + }, + tooltip: { + shared: true, + crosshairs: true, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'solardata.json', + dataType: 'json', + cache: false, + success: function (resp) { + var titles = { + SolarRad : 'Solar Radiation', + CurrentSolarMax: 'Theoretical Max', + UV: 'UV Index' + }; + var types = { + SolarRad: 'area', + CurrentSolarMax: 'area', + UV: 'line' + }; + var colours = { + SolarRad: 'rgb(255,165,0)', + CurrentSolarMax: 'rgb(128,128,128)', + UV: 'rgb(0,0,255)' + }; + var tooltips = { + SolarRad: { + valueSuffix: ' W/m\u00B2', + valueDecimals: 0 + }, + CurrentSolarMax: { + valueSuffix: ' W/m\u00B2', + valueDecimals: 0 + }, + UV: { + valueSuffix: null, + valueDecimals: config.uv.decimals + } + }; + + var idxs = ['SolarRad', 'CurrentSolarMax', 'UV']; + var cnt = 0; + var solarAxisCreated = false; + + idxs.forEach(function(idx) { + if (idx in resp) { + if (idx === 'UV') { + chart.addAxis({ + id: 'uv', + title:{text: 'UV Index'}, + opposite: true, + min: 0, + labels: { + align: 'left' + }, + showEmpty: false + }); + } else if (!solarAxisCreated) { + chart.addAxis({ + id: 'solar', + title: {text: 'Solar Radiation (W/m\u00B2)'}, + min: 0, + opposite: false, + labels: { + align: 'right', + x: -5 + }, + showEmpty: false + }); + solarAxisCreated = true; + } + + + chart.addSeries({ + name: titles[idx], + type: types[idx], + yAxis: idx === 'UV' ? 'uv' : 'solar', + tooltip: tooltips[idx], + data: resp[idx], + color: config.series[idx.toLowerCase()].colour, + fillOpacity: idx === 'CurrentSolarMax' ? 0.2 : 0.5, + zIndex: 100 - cnt + }, false); + + cnt++; + } + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doSunHours = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'column', + alignTicks: false + }, + title: { + text: 'Sunshine Hours' + }, + credits: { + enabled: true + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: { + text: 'Sunshine Hours' + }, + min: 0, + opposite: false, + labels: { + align: 'right', + x: -12 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + title: { + text: null + }, + labels: { + align: 'left', + x: 12 + } + }], + legend: { + enabled: true + }, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + pointPadding: 0, + groupPadding: 0.1, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + } + }, + tooltip: { + shared: true, + crosshairs: true, + xDateFormat: "%A, %b %e" + }, + series: [{ + name: 'Sunshine Hours', + type: 'column', + color: config.series.sunshine.colour, + yAxis: 0, + valueDecimals: 1, + tooltip: { + valueSuffix: ' Hrs' + } + }] + }; + + chart = new Highcharts.Chart(options); + chart.showLoading(); + + $.ajax({ + url: 'sunhours.json', + dataType: 'json', + cache: false, + success: function (resp) { + chart.hideLoading(); + chart.series[0].setData(resp.sunhours); + } + }); +}; + +var doDailyRain = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'column', + alignTicks: false + }, + title: { + text: 'Daily Rainfall' + }, + credits: { + enabled: true + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: { + text: 'Daily Rainfall' + }, + min: 0, + opposite: false, + labels: { + align: 'right', + x: -12 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + title: { + text: null + }, + labels: { + align: 'left', + x: 12 + } + }], + legend: { + enabled: true + }, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + pointPadding: 0, + groupPadding: 0.1, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + } + }, + tooltip: { + shared: true, + crosshairs: true, + xDateFormat: "%A, %b %e" + }, + series: [{ + name: 'Daily Rainfall', + type: 'column', + color: config.series.rfall.colour, + yAxis: 0, + valueDecimals: config.rain.decimals, + tooltip: { + valueSuffix: ' ' + config.rain.units + } + }] + }; + + chart = new Highcharts.Chart(options); + chart.showLoading(); + + $.ajax({ + url: 'dailyrain.json', + dataType: 'json', + cache: false, + success: function (resp) { + chart.hideLoading(); + chart.series[0].setData(resp.dailyrain); + } + }); +}; + +var doDailyTemp = function () { + var freezing = config.temp.units === 'C' ? 0 : 32; + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: { + text: 'Daily Temperature' + }, + credits: { + enabled: true + }, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: { + text: 'Daily Temperature (°' + config.temp.units + ')' + }, + opposite: false, + labels: { + align: 'right', + x: -5, + formatter: function () { + return '' + this.value + ''; + } + }, + plotLines: [{ + // freezing line + value: freezing, + color: 'rgb(0, 0, 180)', + width: 1, + zIndex: 2 + }] + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + title: { + text: null + }, + labels: { + align: 'left', + x: 5, + formatter: function () { + return '' + this.value + ''; + } + } + }], + legend: { + enabled: true + }, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: { + lineWidth: 2 + } + }, + tooltip: { + shared: true, + crosshairs: true, + valueSuffix: ' °' + config.temp.units, + valueDecimals: config.temp.decimals, + xDateFormat: "%A, %b %e" + }, + rangeSelector: { + enabled: false + }, + series: [] + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'dailytemp.json', + dataType: 'json', + cache: false, + success: function (resp) { + var titles = { + 'avgtemp': 'Avg Temp', + 'mintemp': 'Min Temp', + 'maxtemp': 'Max Temp' + }; + var idxs = ['avgtemp', 'mintemp', 'maxtemp']; + + idxs.forEach(function (idx) { + if (idx in resp) { + chart.addSeries({ + name: titles[idx], + data: resp[idx], + color: config.series[idx].colour + }, false); + } + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doAirQuality = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Air Quality'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'µg/m³'}, + opposite: false, + min: 0, + labels: { + align: 'right', + x: -5 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + min: 0, + title: {text: null}, + labels: { + align: 'left', + x: 5 + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' µg/m³', + valueDecimals: 1, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'airquality.json', + dataType: 'json', + cache: false, + success: function (resp) { + var titles = { + 'pm2p5': 'PM 2.5', + 'pm10' : 'PM 10' + } + var idxs = ['pm2p5', 'pm10']; + idxs.forEach(function(idx) { + if (idx in resp) { + chart.addSeries({ + name: titles[idx], + color: config.series[idx].colour, + data: resp[idx] + }, false); + } + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doExtraTemp = function () { + var freezing = config.temp.units === 'C' ? 0 : 32; + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Extra Temperature'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Temperature (°' + config.temp.units + ')'}, + opposite: false, + labels: { + align: 'right', + x: -5, + formatter: function () { + return '' + this.value + ''; + } + }, + plotLines: [{ + // freezing line + value: freezing, + color: 'rgb(0, 0, 180)', + width: 1, + zIndex: 2 + }] + }, { + // right + gridLineWidth: 0, + opposite: true, + linkedTo: 0, + labels: { + align: 'left', + x: 5, + formatter: function () { + return '' + this.value + ''; + } + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' °' + config.temp.units, + valueDecimals: config.temp.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'extratempdata.json', + dataType: 'json', + success: function (resp) { + Object.entries(resp).forEach(([key, value]) => { + var id = config.series.extratemp.name.findIndex(val => val == key); + chart.addSeries({ + name: key, + color: config.series.extratemp.colour[id], + data: value + }); + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doExtraHum = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Extra Humidity'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Humidity (%)'}, + opposite: false, + min: 0, + max: 100, + labels: { + align: 'right', + x: -5 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + min: 0, + max: 100, + title: {text: null}, + labels: { + align: 'left', + x: 5 + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' %', + valueDecimals: config.hum.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'extrahumdata.json', + dataType: 'json', + success: function (resp) { + Object.entries(resp).forEach(([key, value]) => { + var id = config.series.extrahum.name.findIndex(val => val == key); + chart.addSeries({ + name: key, + color: config.series.extrahum.colour[id], + data: value + }); + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doExtraDew = function () { + var freezing = config.temp.units === 'C' ? 0 : 32; + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Extra Dew Point'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Dew Point (°' + config.temp.units + ')'}, + opposite: false, + labels: { + align: 'right', + x: -5, + formatter: function () { + return '' + this.value + ''; + } + }, + plotLines: [{ + // freezing line + value: freezing, + color: 'rgb(0, 0, 180)', + width: 1, + zIndex: 2 + }] + }, { + // right + gridLineWidth: 0, + opposite: true, + linkedTo: 0, + labels: { + align: 'left', + x: 5, + formatter: function () { + return '' + this.value + ''; + } + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' °' + config.temp.units, + valueDecimals: config.temp.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'extradewdata.json', + dataType: 'json', + success: function (resp) { + Object.entries(resp).forEach(([key, value]) => { + var id = config.series.extradew.name.findIndex(val => val == key); + chart.addSeries({ + name: key, + color: config.series.extradew.colour[id], + data: value + }); + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doSoilTemp = function () { + var freezing = config.temp.units === 'C' ? 0 : 32; + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Soil Temperature'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Temperature (°' + config.temp.units + ')'}, + opposite: false, + labels: { + align: 'right', + x: -5, + formatter: function () { + return '' + this.value + ''; + } + }, + plotLines: [{ + // freezing line + value: freezing, + color: 'rgb(0, 0, 180)', + width: 1, + zIndex: 2 + }] + }, { + // right + gridLineWidth: 0, + opposite: true, + linkedTo: 0, + labels: { + align: 'left', + x: 5, + formatter: function () { + return '' + this.value + ''; + } + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' °' + config.temp.units, + valueDecimals: config.temp.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'soiltempdata.json', + dataType: 'json', + success: function (resp) { + Object.entries(resp).forEach(([key, value]) => { + var id = config.series.soiltemp.name.findIndex(val => val == key); + chart.addSeries({ + name: key, + color: config.series.soiltemp.colour[id], + data: value + }); + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doSoilMoist = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Soil Moisture'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Moisture (' + config.soilmoisture.units + ')'}, + opposite: false, + labels: { + align: 'right', + x: -5 + } + }, { + // right + gridLineWidth: 0, + opposite: true, + linkedTo: 0, + labels: { + align: 'left', + x: 5 + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' ' + config.soilmoisture.units, + valueDecimals: 0, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'soilmoistdata.json', + dataType: 'json', + success: function (resp) { + Object.entries(resp).forEach(([key, value]) => { + var id = config.series.soilmoist.name.findIndex(val => val == key); + chart.addSeries({ + name: key, + color: config.series.soilmoist.colour[id], + data: value + }); + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doLeafWet = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Leaf Wetness'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Leaf Wetness' + (config.leafwet.units == '' ? '' : '(' + config.leafwet.units + ')')}, + opposite: false, + min: 0, + labels: { + align: 'right', + x: -5 + } + }, { + // right + gridLineWidth: 0, + opposite: true, + min: 0, + linkedTo: 0, + labels: { + align: 'left', + x: 5 + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' ' + config.leafwet.units, + valueDecimals: config.leafwet.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'leafwetdata.json', + dataType: 'json', + success: function (resp) { + Object.entries(resp).forEach(([key, value]) => { + var id = config.series.leafwet.name.findIndex(val => val == key); + chart.addSeries({ + name: key, + color: config.series.leafwet.colour[id], + data: value + }); + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doUserTemp = function () { + var freezing = config.temp.units === 'C' ? 0 : 32; + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'User Temperature'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Temperature (°' + config.temp.units + ')'}, + opposite: false, + labels: { + align: 'right', + x: -5, + formatter: function () { + return '' + this.value + ''; + } + }, + plotLines: [{ + // freezing line + value: freezing, + color: 'rgb(0, 0, 180)', + width: 1, + zIndex: 2 + }] + }, { + // right + gridLineWidth: 0, + opposite: true, + linkedTo: 0, + labels: { + align: 'left', + x: 5, + formatter: function () { + return '' + this.value + ''; + } + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' °' + config.temp.units, + valueDecimals: config.temp.decimals, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'usertempdata.json', + dataType: 'json', + success: function (resp) { + Object.entries(resp).forEach(([key, value]) => { + var id = config.series.usertemp.name.findIndex(val => val == key); + chart.addSeries({ + name: key, + color: config.series.usertemp.colour[id], + data: value + }); + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doCO2 = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'CO₂ Sensor'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + id: 'co2', + title: {text: 'CO₂ (ppm)'}, + opposite: false, + min: 0, + minRange: 10, + alignTicks: true, + showEmpty: false, + labels: { + align: 'right', + x: -5 + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: true, + xDateFormat: "%A, %b %e, %H:%M" + }, + series: [], + rangeSelector: myRangeBtns + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'co2sensordata.json', + dataType: 'json', + success: function (resp) { + Object.entries(resp).forEach(([key, value]) => { + var yaxis = 0; + var tooltip; + // id - remove all spaces and lowercase + var id = key.toLowerCase().split(' ').join(''); + + if (key == 'CO2' || key == 'CO2 Average') { + yaxis = 'co2'; + tooltip = {valueSuffix: ' ppm'}; + } else if (key.startsWith('PM')) { + yaxis = 'pm'; + tooltip = {valueSuffix: ' µg/m³'}; + + + if (!chart.get('pm')) { + chart.addAxis({ + // left + id: 'pm', + title: {text: 'PM (µg/m³)'}, + opposite: false, + min: 0, + minRange: 10, + alignTicks: true, + showEmpty: false, + labels: { + align: 'right', + x: -5 + } + }); + } + } else if (key == 'Temperature') { + yaxis = 'temp'; + tooltip = {valueSuffix: ' °' + config.temp.units}; + chart.addAxis({ + // right + id: 'temp', + title: {text: 'Temperature (°' + config.temp.units + ')'}, + //gridLineWidth: 0, + opposite: true, + alignTicks: true, + showEmpty: false, + labels: { + align: 'left', + x: 5 + } + }); + } else if (key == 'Humidity') { + yaxis = 'hum'; + tooltip = {valueSuffix: ' %'}; + chart.addAxis({ + // right + id: 'hum', + title: {text: 'Humidity (%)'}, + min: 0, + //gridLineWidth: 0, + opposite: true, + alignTicks: true, + showEmpty: false, + labels: { + align: 'left', + x: 5 + } + }); + } + + chart.addSeries({ + name: config.series.co2[id].name, + color: config.series.co2[id].colour, + data: value, + yAxis: yaxis, + tooltip: tooltip + }); + + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; diff --git a/webfiles/js/historiccharts.js b/webfiles/js/historiccharts.js new file mode 100644 index 0000000..0b6fdad --- /dev/null +++ b/webfiles/js/historiccharts.js @@ -0,0 +1,1129 @@ +// Last modified: 2023/01/18 16:48:20 + +var chart, config, available; + +$(document).ready(function () { + $.ajax({ + url: "availabledata.json", + dataType: "json", + success: function (result) { + available = result; + if (result.Temperature === undefined || result.Temperature.Count == 0) { + $('#btnTemp').remove(); + } + if (result.Humidity === undefined || result.Humidity.Count == 0) { + $('#btnHum').remove(); + } + if (result.Solar === undefined || result.Solar.Count == 0) { + $('#btnSolar').remove(); + } + if (result.DegreeDays === undefined || result.DegreeDays.Count == 0) { + $('#btnDegDay').remove(); + } + if (result.TempSum === undefined || result.TempSum.Count == 0) { + $('#btnTempSum').remove(); + } + } + }); + + $.ajax({ + url: "graphconfig.json", + dataType: "json", + success: function (result) { + config = result; + changeGraph(parent.location.hash.replace('#', '')); + } + }); +}); + + +function changeGraph(graph) { + switch (graph) { + case 'temp': + doTemp(); + break; + case 'press': + doPress(); + break; + case 'wind': + doWind(); + break; + case 'rain': + doRain(); + break; + case 'humidity': + doHum(); + break; + case 'solar': + doSolar(); + break; + case 'degday': + doDegDays(); + break; + case 'tempsum': + doTempSum(); + break; + default: + doTemp(); + break; + } + parent.location.hash = graph; +} + +var doTemp = function () { + var freezing = config.temp.units === 'C' ? 0 : 32; + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Temperature'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b %y', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Temperature (°' + config.temp.units + ')'}, + opposite: false, + labels: { + align: 'right', + x: -5, + formatter: function () { + return '' + this.value + ''; + } + }, + plotLines: [{ + // freezing line + value: freezing, + color: 'rgb(0, 0, 180)', + width: 1, + zIndex: 2 + }] + }, { + // right + gridLineWidth: 0, + opposite: true, + linkedTo: 0, + labels: { + align: 'left', + x: 5, + formatter: function () { + return '' + this.value + ''; + } + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' °' + config.temp.units, + valueDecimals: config.temp.decimals, + xDateFormat: '%e %b %y' + }, + series: [], + rangeSelector: { + inputEnabled: false, + selected: 1 + } + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'alldailytempdata.json', + dataType: 'json', + success: function (resp) { + var titles = { + 'minTemp' : 'Min Temp', + 'maxTemp' : 'Max Temp', + 'avgTemp' : 'Avg Temp', + 'heatIndex': 'Heat Index', + 'minApp' : 'Min Apparent', + 'maxApp' : 'Max Apparent', + 'minDew' : 'Min Dewpoint', + 'maxDew' : 'Max Dewpoint', + 'minFeels' : 'Min Feels', + 'maxFeels' : 'Max Feels', + 'humidex' : 'Humidex', + 'windChill': 'Wind Chill' + }; + var visibility = { + 'minTemp' : true, + 'maxTemp' : true, + 'avgTemp' : false, + 'heatIndex': false, + 'minApp' : false, + 'maxApp' : false, + 'minDew' : false, + 'maxDew' : false, + 'minFeels' : false, + 'maxFeels' : false, + 'humidex' : false, + 'windChill': false + }; + var idxs = ['minTemp', 'maxTemp', 'avgTemp', 'heatIndex', 'minApp', 'maxApp', 'minDew', 'maxDew', 'minFeels', 'maxFeels', 'windChill', 'humidex']; + + idxs.forEach(function(idx) { + var valueSuffix = ' °' + config.temp.units; + yaxis = 0; + + if (idx in resp) { + var clrIdx = idx.toLowerCase(); + if ('heatIndex' === idx || 'humidex' === idx) { + clrIdx = 'max' + clrIdx; + } else if ('windChill' === idx) { + clrIdx = 'min' + clrIdx; + } + + if (idx === 'humidex') { + valueSuffix = null; + // Link Humidex and temp scales if using Celsius + // For Fahrenheit use separate scales + if (config.temp.units === 'F') { + chart.yAxis[1].remove(); + chart.addAxis({ + id: 'humidex', + title:{text: 'Humidex'}, + opposite: true, + labels: { + align: 'left' + }, + alignTicks: true, + gridLineWidth: 0, // Not working? + gridZIndex: -10, // Hides the grid lines for this axis + showEmpty: false + }); + yaxis = 'humidex'; + } + } + + chart.addSeries({ + name: titles[idx], + data: resp[idx], + color: config.series[clrIdx].colour, + visible: visibility[idx], + showInNavigator: visibility[idx], + yAxis: yaxis, + tooltip: {valueSuffix: valueSuffix} + }, false); + } + }); + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doPress = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Pressure'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b %y', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Pressure (' + config.press.units + ')'}, + opposite: false, + labels: { + align: 'right', + x: -5 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + title: {text: null}, + labels: { + align: 'left', + x: 5 + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' ' + config.press.units, + valueDecimals: config.press.decimals, + xDateFormat: '%e %b %y' + }, + series: [{ + name: 'High Pressure', + color: config.series.maxpress.colour, + showInNavigator: true + }, { + name: 'Low Pressure', + color: config.series.minpress.colour, + showInNavigator: true + }], + rangeSelector: { + inputEnabled: false, + selected: 1 + } + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'alldailypressdata.json', + dataType: 'json', + success: function (resp) { + chart.hideLoading(); + chart.series[0].setData(resp.maxBaro); + chart.series[1].setData(resp.minBaro); + } + }); +}; + +var compassP = function (deg) { + var a = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW']; + return a[Math.floor((deg + 22.5) / 45) % 8]; +}; + +var doWind = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Wind Speed'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b %y', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Wind Speed (' + config.wind.units + ')'}, + opposite: false, + min: 0, + labels: { + align: 'right', + x: -5 + } + }, { + // right + //linkedTo: 0, + gridLineWidth: 0, + opposite: true, + min: 0, + title: {text: 'Wind Run (' + config.wind.rununits + ')'}, + labels: { + align: 'left', + x: 5 + }, + showEmpty: false + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' ' + config.wind.units, + valueDecimals: config.wind.decimals, + xDateFormat: '%e %b %y' + }, + series: [{ + name: 'Wind Speed', + color: config.series.wspeed.colour, + showInNavigator: true + }, { + name: 'Wind Gust', + color: config.series.wgust.colour, + showInNavigator: true + }, { + name: 'Wind Run', + type: 'column', + color: config.series.windrun.colour, + yAxis: 1, + visible: false, + tooltip: { + valueSuffix: ' ' + config.wind.rununits, + valueDecimals: 0 + }, + zIndex: -1 + }], + rangeSelector: { + inputEnabled: false, + selected: 1 + } + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'alldailywinddata.json', + dataType: 'json', + success: function (resp) { + chart.hideLoading(); + chart.series[0].setData(resp.maxWind); + chart.series[1].setData(resp.maxGust); + chart.series[2].setData(resp.windRun); + } + }); +}; + +var doRain = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'column', + alignTicks: true + }, + title: {text: 'Rainfall'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b %y', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Rainfall (' + config.rain.units + ')'}, + opposite: false, + min: 0, + labels: { + align: 'right', + x: -5 + } + }, { + // right + title: {text: 'Rainfall rate (' + config.rain.units + '/hr)'}, + opposite: true, + min: 0, + labels: { + align: 'left', + x: 5 + }, + showEmpty: false + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + pointPadding: 0, + groupPadding: 0.1, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueDecimals: config.rain.decimals, + xDateFormat: '%e %b %y' + }, + series: [{ + name: 'Daily rain', + type: 'column', + color: config.series.rfall.colour, + yAxis: 0, + tooltip: {valueSuffix: ' ' + config.rain.units} + }, { + name: 'Rain rate', + type: 'column', + color: config.series.rrate.colour, + yAxis: 1, + tooltip: {valueSuffix: ' ' + config.rain.units + '/hr'}, + visible: false + }], + rangeSelector: { + inputEnabled: false, + selected: 1 + } + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'alldailyraindata.json', + dataType: 'json', + success: function (resp) { + chart.hideLoading(); + chart.series[0].setData(resp.rain); + chart.series[1].setData(resp.maxRainRate); + } + }); +}; + +var doHum = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false + }, + title: {text: 'Relative Humidity'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b %y', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [{ + // left + title: {text: 'Humidity (%)'}, + opposite: false, + min: 0, + max: 100, + labels: { + align: 'right', + x: -5 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + min: 0, + max: 100, + title: {text: null}, + labels: { + align: 'left', + x: 5 + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + valueSuffix: ' %', + valueDecimals: config.hum.decimals, + xDateFormat: '%e %b %y' + }, + series: [], + rangeSelector: { + inputEnabled: false, + selected: 1 + } + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'alldailyhumdata.json', + dataType: 'json', + success: function (resp) { + var titles = { + 'minHum' : 'Minimum Humidity', + 'maxHum': 'Maximum Humidity' + } + var idxs = ['minHum', 'maxHum']; + var cnt = 0; + idxs.forEach(function(idx) { + if (idx in resp) { + chart.addSeries({ + name: titles[idx], + color: config.series[idx.toLowerCase()].colour, + data: resp[idx], + showInNavigator: true + }, false); + + cnt++; + } + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doSolar = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: true + }, + title: {text: 'Solar'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b %y', + week: '%e %b %y', + month: '%b %y', + year: '%Y' + } + }, + yAxis: [], + legend: {enabled: true}, + plotOptions: { + boostThreshold: 0, + series: { + dataGrouping: { + enabled: false + }, + pointPadding: 0, + groupPadding: 0.1, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + xDateFormat: '%e %b %y' + }, + series: [], + rangeSelector: { + inputEnabled: false, + selected: 1 + } + }; + + chart = new Highcharts.StockChart(options); + chart.showLoading(); + + $.ajax({ + url: 'alldailysolardata.json', + dataType: 'json', + success: function (resp) { + var titles = { + solarRad: 'Solar Radiation', + uvi : 'UV Index', + sunHours: 'Sunshine Hours' + }; + var types = { + solarRad: 'area', + uvi : 'line', + sunHours: 'column' + }; + var tooltips = { + solarRad: { + valueSuffix: ' W/m\u00B2', + valueDecimals: 0 + }, + uvi: { + valueSuffix: ' ', + valueDecimals: config.uv.decimals + }, + sunHours: { + valueSuffix: ' hours', + valueDecimals: 0 + } + }; + var indexes = { + solarRad: 1, + uvi : 2, + sunHours: 0 + } + var fillColor = { + solarRad: { + linearGradient: { + x1: 0, + y1: 0, + x2: 0, + y2: 1 + }, + stops: [ + [0, config.series.solarrad.colour], + [1, Highcharts.color(config.series.solarrad.colour).setOpacity(0).get('rgba')] + ] + }, + uvi : null, + sunHours: null + }; + var idxs = ['solarRad', 'uvi', 'sunHours']; + + idxs.forEach(function(idx) { + if (idx in resp) { + var clrIdx; + if (idx === 'uvi') + clrIdx ='uv'; + else if (idx === 'solarRad') + clrIdx = 'solarrad'; + else if (idx === 'sunHours') + clrIdx = 'sunshine'; + + if (idx === 'uvi') { + chart.addAxis({ + id: idx, + title: {text: 'UV Index'}, + opposite: true, + min: 0, + labels: { + align: 'left' + }, + showEmpty: false + }); + } else if (idx === 'sunHours') { + chart.addAxis({ + id: idx, + title: {text: 'Sunshine Hours'}, + opposite: true, + min: 0, + labels: { + align: 'left' + }, + showEmpty: false + }); + } else if (idx === 'solarRad') { + chart.addAxis({ + id: idx, + title: {text: 'Solar Radiation (W/m\u00B2)'}, + min: 0, + opposite: false, + labels: { + align: 'right', + x: -5 + }, + showEmpty: false + }); + } + chart.addSeries({ + name: titles[idx], + type: types[idx], + yAxis: idx, + tooltip: tooltips[idx], + data: resp[idx], + color: config.series[clrIdx].colour, + showInNavigator: idx !== 'sunHours', + index: indexes[idx], + fillColor: fillColor[idx], + zIndex: idx === 'uvi' ? 99 : null + }, false); + } + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doDegDays = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false, + zoomType: 'x' + }, + title: {text: 'Degree Days'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b', + month: '%b', + year: '' + } + }, + yAxis: [{ + // left + title: {text: '°' + config.temp.units + ' days'}, + opposite: false, + min: 0, + labels: { + align: 'right', + x: -10 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + min: 0, + title: {text: null}, + labels: { + align: 'left', + x: 10 + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + xDateFormat: '%e %B', + useHTML: true, + headerFormat: '{point.key}', + pointFormat: '' + + '', + footerFormat: '
\u25CF {series.name}: {point.y:.1f}
' + }, + series: [] + }; + + chart = new Highcharts.Chart(options); + chart.showLoading(); + + $.ajax({ + url: 'alldailydegdaydata.json', + dataType: 'json', + success: function (resp) { + var subtitle = ''; + if (available.DegreeDays.indexOf('GDD1') != -1) { + subtitle = 'GDD#1 base: ' + resp.options.gddBase1 + '°' + config.temp.units; + if (available.DegreeDays.indexOf('GDD2') != -1) { + subtitle += ' - '; + } + } + if (available.DegreeDays.indexOf('GDD2') != -1) { + subtitle += 'GDD#2 base: ' + resp.options.gddBase2 + '°' + config.temp.units; + } + + chart.setSubtitle({text: subtitle}); + + available.DegreeDays.forEach(idx => { + if (idx in resp) { + Object.keys(resp[idx]).forEach(yr => { + chart.addSeries({ + name: idx + '-' + yr, + visible: false, + data: resp[idx][yr] + }, false); + }); + // make the last series visible + chart.series[chart.series.length -1].visible = true; + } + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; + +var doTempSum = function () { + var options = { + chart: { + renderTo: 'chartcontainer', + type: 'line', + alignTicks: false, + zoomType: 'x' + }, + title: {text: 'Temperature Sum'}, + credits: {enabled: true}, + xAxis: { + type: 'datetime', + ordinal: false, + dateTimeLabelFormats: { + day: '%e %b', + week: '%e %b', + month: '%b', + year: '' + } + }, + yAxis: [{ + // left + title: {text: 'Total °' + config.temp.units}, + opposite: false, + labels: { + align: 'right', + x: -10 + } + }, { + // right + linkedTo: 0, + gridLineWidth: 0, + opposite: true, + title: {text: null}, + labels: { + align: 'left', + x: 10 + } + }], + legend: {enabled: true}, + plotOptions: { + series: { + dataGrouping: { + enabled: false + }, + states: { + hover: { + halo: { + size: 5, + opacity: 0.25 + } + + } + }, + cursor: 'pointer', + marker: { + enabled: false, + states: { + hover: { + enabled: true, + radius: 0.1 + } + } + } + }, + line: {lineWidth: 2} + }, + tooltip: { + shared: true, + split: false, + xDateFormat: '%e %B', + useHTML: true, + headerFormat: '{point.key}', + pointFormat: '' + + '', + footerFormat: '
\u25CF {series.name}: {point.y:0f}
' + }, + series: [] + }; + + chart = new Highcharts.Chart(options); + chart.showLoading(); + + $.ajax({ + url: 'alltempsumdata.json', + dataType: 'json', + success: function (resp) { + var subtitle = ''; + if (available.TempSum.indexOf('Sum0') != -1) { + subtitle = 'Sum#0 base: 0°' + config.temp.units; + if (available.TempSum.indexOf('Sum1') != -1 || available.TempSum.indexOf('Sum2') != -1) { + subtitle += ' - '; + } + } + if (available.TempSum.indexOf('Sum1') != -1) { + subtitle += 'Sum#1 base: ' + resp.options.sumBase1 + '°' + config.temp.units; + if (available.TempSum.indexOf('Sum2') != -1) { + subtitle += ' - '; + } + } + if (available.TempSum.indexOf('Sum2') != -1) { + subtitle += 'Sum#2 base: ' + resp.options.sumBase2 + '°' + config.temp.units; + } + + chart.setSubtitle({text: subtitle}); + + available.TempSum.forEach(idx => { + if (idx in resp) { + Object.keys(resp[idx]).forEach(yr => { + chart.addSeries({ + name: idx + '-' + yr, + visible: false, + data: resp[idx][yr] + }, false); + }); + // make the last series visible + chart.series[chart.series.length -1].visible = true; + } + }); + + chart.hideLoading(); + chart.redraw(); + } + }); +}; diff --git a/webfiles/js/menu.js b/webfiles/js/menu.js new file mode 100644 index 0000000..9f7d7f2 --- /dev/null +++ b/webfiles/js/menu.js @@ -0,0 +1,36 @@ +/* + Menu configuration file for NEW CuMX template + Last modified: 2022/07/05 11:39:38 + menu.js - typical name, you define the one used in setpagedata.js + + It is STRONGLY RECOMMENDED that if you customise this file, you create a new file with a different name, e.g. mymenu.js + and change setpagedata.js to use that file. This will avoid your customisations being accidentally overwritten during upgrades + + Properties: + .menu - can be 'b' (both menus), 'w' (wide menu ONLY), 'n' (narrow menu ONLY) + .new_window:true - forces the link to open in new browser window + .forum:true - flags a forum link menu item, it will use the url provided in CuMX config, if that is blank the menu item will be hidden + .webcam:true - flags a webcam link menu item, it will use the url provided in CuMX config, if that is blank the menu item will be hidden +*/ + +menuSrc = [ + {title: "Now", menu: "b", url: "index.htm"}, + {title: "Today", menu: "b", url: "today.htm"}, + {title: "Yesterday", menu: "b", url: "yesterday.htm"}, + {title: "Today-Yest", menu: "b", url: "todayyest.htm"}, + {title: "Gauges", menu: "b", url: "gauges.htm"}, + {title: "Records", menu: "b", submenu: true, items: [ + {title: "This Month", menu: "b", url: "thismonth.htm"}, + {title: "This Year", menu: "b", url: "thisyear.htm"}, + {title: "All Time", menu: "b", url: "record.htm"}, + {title: "Monthly", menu: "b", url: "monthlyrecord.htm"} + ]}, + {title: "Charts", menu: "b", submenu: true, items: [ + {title: "Trends", menu: "b", url: "trends.htm"}, + {title: "Select-a-graph", menu: "b", url: "selectachart.htm"}, + {title: "Historic", menu: "b", url: "historic.htm"} + ]}, + {title: "Reports", menu: "b", url: "noaareport.htm"}, + {title: "Forum", menu: "b", url: "#", forum: true, new_window: true}, + {title: "Webcam", menu: "b", url: "#", webcam: true} +]; diff --git a/webfiles/js/menuSample.js b/webfiles/js/menuSample.js new file mode 100644 index 0000000..68277c6 --- /dev/null +++ b/webfiles/js/menuSample.js @@ -0,0 +1,38 @@ +/* + An example extended/modified Menu configuration file for NEW CuMX template + Last modified: 2021/03/19 09:17:14 + menuSample.js - typical name, you define the one used in setpagedata.js + + Properties: + .menu - can be 'b' (both menus), 'w' (wide menu ONLY), 'n' (narrow menu ONLY) + .new_window:true - forces the link to open in new browser window + .forum:true - flags a forum link menu item, it will use the url provided in CuMX config, if that is blank the menu item will be hidden + .webcam:true - flags a webcam link menu item, it will use the url provided in CuMX config, if that is blank the menu item will be hidden +*/ + +menuSrc = [ + {title: "Now", menu: "b", url: "index.htm"}, + {title: "Today", menu: "b", url: "today.htm"}, + {title: "Yesterday", menu: "b", url: "yesterday.htm"}, + {title: "Gauges", menu: "b", url: "gauges.htm"}, + {title: "Records", menu: "b", submenu: true, items: [ + {title: "This Month", menu: "b", url: "thismonth.htm"}, + {title: "This Year", menu: "b", url: "thisyear.htm"}, + {title: "All Time", menu: "b", url: "record.htm"}, + {title: "Monthly", menu: "b", url: "monthlyrecord.htm"} + ]}, + {title: "Charts", menu: "b", submenu: true, items: [ + {title: "Trends", menu: "b", url: "trends.htm"}, + {title: "Select-a-graph", menu: "b", url: "selectachart.htm"}, + {title: "Historic", menu: "b", url: "historic.htm"} + ]}, + {title: "Reports", menu: "b", url: "noaareport.htm"}, + {title: "Forum", menu: "n", url: "#", new_window: true}, + {title: "Webcam", menu: "n", url: "#", new_window: true}, + {title: "Other Links", menu: "w", submenu: true, items: [ + {title: "Cumulus Forum", menu: "w", url: "#", forum: true, new_window: true}, + {title: "Webcam", menu: "b", url: "#", webcam: true, new_window: true}, + {title: "My Cat", menu: "b", url: "mycatpage.htm"}, + {title: "Some Cat", menu: "b", url: "https://pixnio.com/free-images/2020/07/26/2020-07-26-08-52-19-1200x1200.jpg", new_window: true} + ]} +]; diff --git a/webfiles/js/monthlyrecdata.js b/webfiles/js/monthlyrecdata.js new file mode 100644 index 0000000..6b8528c --- /dev/null +++ b/webfiles/js/monthlyrecdata.js @@ -0,0 +1,74 @@ +// Last modified: 2022/07/27 15:35:57 + +$(document).ready(function() { + dataLoadedPromise.then(function() { + var yesterday = new Date() + yesterday.setDate(yesterday.getDate() - 1) + changeData(yesterday.getMonth()); + $('#btnMon' + yesterday.getMonth()).attr('aria-pressed', true); + }); +}); + +var monthnames = new Array("January","February","March","April","May","June","July","August","September","October","November","December"); + +function changeData(month) { + document.getElementById('MonthName').innerHTML = monthnames[month]; + document.getElementById('TempH').innerHTML = cmx_data.monthlyrecs.hightemp[month]; + document.getElementById('TempHT').innerHTML = cmx_data.monthlyrecs.hightempT[month]; + document.getElementById('TempL').innerHTML = cmx_data.monthlyrecs.lowtemp[month]; + document.getElementById('TempLT').innerHTML = cmx_data.monthlyrecs.lowtempT[month]; + document.getElementById('DewPointH').innerHTML = cmx_data.monthlyrecs.highDP[month]; + document.getElementById('DewPointHT').innerHTML = cmx_data.monthlyrecs.highDPT[month]; + document.getElementById('DewPointL').innerHTML = cmx_data.monthlyrecs.lowDP[month]; + document.getElementById('DewPointLT').innerHTML = cmx_data.monthlyrecs.lowDPT[month]; + document.getElementById('AppTempH').innerHTML = cmx_data.monthlyrecs.highapptemp[month]; + document.getElementById('AppTempHT').innerHTML = cmx_data.monthlyrecs.highapptempT[month]; + document.getElementById('AppTempL').innerHTML = cmx_data.monthlyrecs.lowapptemp[month]; + document.getElementById('AppTempLT').innerHTML = cmx_data.monthlyrecs.lowapptempT[month]; + document.getElementById('FeelsLikeH').innerHTML = cmx_data.monthlyrecs.highfeelslike[month]; + document.getElementById('FeelsLikeHT').innerHTML = cmx_data.monthlyrecs.highfeelslikeT[month]; + document.getElementById('FeelsLikeL').innerHTML = cmx_data.monthlyrecs.lowfeelslike[month]; + document.getElementById('FeelsLikeLT').innerHTML = cmx_data.monthlyrecs.lowfeelslikeT[month]; + document.getElementById('WChillL').innerHTML = cmx_data.monthlyrecs.lowchill[month]; + document.getElementById('WChillLT').innerHTML = cmx_data.monthlyrecs.lowchillT[month]; + document.getElementById('HeatIndexH').innerHTML = cmx_data.monthlyrecs.highheatindex[month]; + document.getElementById('HeatIndexHT').innerHTML = cmx_data.monthlyrecs.highheatindexT[month]; + document.getElementById('MinTempH').innerHTML = cmx_data.monthlyrecs.highmintemp[month]; + document.getElementById('MinTempHT').innerHTML = cmx_data.monthlyrecs.highmintempT[month]; + document.getElementById('MaxTempL').innerHTML = cmx_data.monthlyrecs.lowmaxtemp[month]; + document.getElementById('MaxTempLT').innerHTML = cmx_data.monthlyrecs.lowmaxtempT[month]; + document.getElementById('HumH').innerHTML = cmx_data.monthlyrecs.highhum[month]; + document.getElementById('HumHT').innerHTML = cmx_data.monthlyrecs.highhumT[month]; + document.getElementById('HumL').innerHTML = cmx_data.monthlyrecs.lowhum[month]; + document.getElementById('HumLT').innerHTML = cmx_data.monthlyrecs.lowhumT[month]; + document.getElementById('HighDailyTempRange').innerHTML = cmx_data.monthlyrecs.hightemprange[month]; + document.getElementById('HighDailyTempRangeT').innerHTML = cmx_data.monthlyrecs.hightemprangeT[month]; + document.getElementById('LowDailyTempRange').innerHTML = cmx_data.monthlyrecs.lowtemprange[month]; + document.getElementById('LowDailyTempRangeT').innerHTML = cmx_data.monthlyrecs.lowtemprangeT[month]; + document.getElementById('RainRateH').innerHTML = cmx_data.monthlyrecs.rainrate[month]; + document.getElementById('RainRateHT').innerHTML = cmx_data.monthlyrecs.rainrateT[month]; + document.getElementById('HourlyRainH').innerHTML = cmx_data.monthlyrecs.hourlyrain[month]; + document.getElementById('HourlyRainHT').innerHTML = cmx_data.monthlyrecs.hourlyrainT[month]; + document.getElementById('Rain24HourH').innerHTML = cmx_data.monthlyrecs.rain24h[month]; + document.getElementById('Rain24HourHT').innerHTML = cmx_data.monthlyrecs.rain24hT[month]; + document.getElementById('DailyRainH').innerHTML = cmx_data.monthlyrecs.dailyrain[month]; + document.getElementById('DailyRainHT').innerHTML = cmx_data.monthlyrecs.dailyrainT[month]; + document.getElementById('MonthlyRainH').innerHTML = cmx_data.monthlyrecs.monthlyrain[month]; + document.getElementById('MonthlyRainHT').innerHTML = cmx_data.monthlyrecs.monthlyrainT[month]; + document.getElementById('LongestDryPeriod').innerHTML = cmx_data.monthlyrecs.dryperiod[month]; + document.getElementById('LongestDryPeriodT').innerHTML = cmx_data.monthlyrecs.dryperiodT[month]; + document.getElementById('LongestWetPeriod').innerHTML = cmx_data.monthlyrecs.wetperiod[month]; + document.getElementById('LongestWetPeriodT').innerHTML = cmx_data.monthlyrecs.wetperiodT[month]; + document.getElementById('GustH').innerHTML = cmx_data.monthlyrecs.highgust[month]; + document.getElementById('GustHT').innerHTML = cmx_data.monthlyrecs.highgustT[month]; + document.getElementById('WindH').innerHTML = cmx_data.monthlyrecs.highwind[month]; + document.getElementById('WindHT').innerHTML = cmx_data.monthlyrecs.highwindT[month]; + document.getElementById('WindRunH').innerHTML = cmx_data.monthlyrecs.highwindrun[month]; + document.getElementById('WindRunHT').innerHTML = cmx_data.monthlyrecs.highwindrunT[month]; + document.getElementById('PressL').innerHTML = cmx_data.monthlyrecs.lowpress[month]; + document.getElementById('PressLT').innerHTML = cmx_data.monthlyrecs.lowpressT[month]; + document.getElementById('PressH').innerHTML = cmx_data.monthlyrecs.highpress[month]; + document.getElementById('PressHT').innerHTML = cmx_data.monthlyrecs.highpressT[month]; + $('#btnArray').children('button').attr("aria-pressed", false); + $('#btnMon' + month).attr('aria-pressed', true); +} diff --git a/webfiles/js/noaarpts.js b/webfiles/js/noaarpts.js new file mode 100644 index 0000000..f501d15 --- /dev/null +++ b/webfiles/js/noaarpts.js @@ -0,0 +1,142 @@ +/* ---------------------------------------------------------- + * noaarpts.js + * Last modified: 2021/07/10 13:19:42 + * Populates the dropdown menus using the records began date + * + * Requires jQuery + * ----------------------------------------------------------*/ + +let rptPath = 'Reports/'; // Your path should have a trailing "/", eg. 'Reports/' +let startYear, endYear; +let startMonth, endMonth; +let rptAvail = {}; + +if (rptPath.length && rptPath.slice(-1) !== '/') + rptPath += '/'; + +$(document).ready(function() { + dataLoadedPromise.then(function() { + startYear = cmx_data.recordsbegandateISO.split('-')[0] * 1; + startMonth = cmx_data.recordsbegandateISO.split('-')[1] * 1; + endYear = cmx_data.metdateyesterdayISO.split('-')[0] * 1; + endMonth = cmx_data.metdateyesterdayISO.split('-')[1] * 1; + + // This does the initial disable of out of range months this year + rptAvail[endYear] = []; + for (let m = 1; m < 13; m++) { + // greater than end month + rptAvail[endYear][m] = m <= endMonth; + // if start year is this year, then less start month + if (startYear == endYear) { + rptAvail[endYear][m] = rptAvail[endYear][m] && m >= startMonth + } + $('#opt-' + m).prop('hidden', !rptAvail[endYear][m]); + } + + // get the current year report and display it whilst we sort out the rest in background + getYearRpt(endYear); + + // add the year select dropdown values, most recent first + for (let y = endYear; y >= startYear; y--) { + let option = $(''); + optgrp.attr('label', k); + result1[k].forEach(function (val) { + var option = $('