index.html 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <!DOCTYPE html>
  2. <html lang="en" xml:lang="en">
  3. <head>
  4. <link rel="icon" href="favicon.ico?v=$COMMIT_HASH" type="image/x-icon">
  5. <title>AI on the edge</title>
  6. <meta charset="UTF-8" />
  7. <meta name="viewport" content="width=device-width, initial-scale=1">
  8. <link rel="stylesheet" href="style.css?v=$COMMIT_HASH" type="text/css" >
  9. <link href="firework.css?v=$COMMIT_HASH" rel="stylesheet">
  10. <script type="text/javascript" src="common.js?v=$COMMIT_HASH"></script>
  11. <script type="text/javascript" src="readconfigcommon.js?v=$COMMIT_HASH"></script>
  12. <script type="text/javascript" src="readconfigparam.js?v=$COMMIT_HASH"></script>
  13. <script type="text/javascript" src="jquery-3.6.0.min.js?v=$COMMIT_HASH"></script>
  14. <script type="text/javascript" src="firework.js?v=$COMMIT_HASH"></script>
  15. <script>
  16. var streamPopup;
  17. var streamFlashlight = false;
  18. var streamWindowFeatures =
  19. 'channelmode=no,directories=no,fullscreen=no,' +
  20. 'location=no,dependent=yes,menubar=no,resizable=no,scrollbars=no,' +
  21. 'status=no,toolbar=no,titlebar=no,' +
  22. 'left=10,top=250,width=640px,height=480px';
  23. function loadPage(page) {
  24. console.log("loadPage( " + page + " )");
  25. if (streamPopup) // Ensure that stream popup is closed because it's blocking web interface
  26. streamPopup.close();
  27. asyncPageLoad(page);
  28. }
  29. async function asyncPageLoad(page ) {
  30. console.log(" loading " + page + " ...");
  31. document.cookie = "page="+page + "; path=/";
  32. document.getElementById('maincontent').src = page;
  33. [].forEach.call(document.querySelectorAll('.submenu'), function (el) {
  34. el.style.visibility = 'hidden';
  35. });
  36. }
  37. function resetMenu() {
  38. [].forEach.call(document.querySelectorAll('.submenu'), function (el) {
  39. el.style.visibility = 'visible';
  40. });
  41. }
  42. function getCookie(cname) {
  43. let name = cname + "=";
  44. let decodedCookie = decodeURIComponent(document.cookie);
  45. let ca = decodedCookie.split(';');
  46. for(let i = 0; i <ca.length; i++) {
  47. let c = ca[i];
  48. while (c.charAt(0) == ' ') {
  49. c = c.substring(1);
  50. }
  51. if (c.indexOf(name) == 0) {
  52. return c.substring(name.length, c.length);
  53. }
  54. }
  55. return "";
  56. }
  57. </script>
  58. </head>
  59. <body>
  60. <div class="main">
  61. <table style="border: none; width:100%">
  62. <tr>
  63. <td style="padding-right: 10px;"><img style="width:64px; height:64px" src="favicon.ico?v=$COMMIT_HASH"></td>
  64. <td><h1 id="id_title"> Digitizer - AI on the edge</h1>
  65. <h2>An ESP32 all inclusive neural network recognition system for meter digitalization</h2>
  66. </td>
  67. </tr>
  68. </table>
  69. <div class="menu" onmouseover="resetMenu()">
  70. <ul>
  71. <li><a href="#" onclick="loadPage('overview.html?v=$COMMIT_HASH');">Overview</a></li>
  72. <li><a>Settings <i class="arrow down"></i></a>
  73. <ul class="submenu">
  74. <li><a href="#" onclick="loadPage('prevalue_set.html?v=$COMMIT_HASH');">Set "Previous Value"</a></li>
  75. <li><a href="#" onclick="loadPage('edit_config_param.html?v=$COMMIT_HASH');">Configuration</a></li>
  76. <li><a>Alignment <i class="arrow right"></i></a>
  77. <ul>
  78. <li><a href="#" onclick="loadPage('edit_reference.html?v=$COMMIT_HASH');">Reference Image</a></li>
  79. <li><a href="#" onclick="loadPage('edit_alignment.html?v=$COMMIT_HASH');">Alignment Marker</a></li>
  80. </ul>
  81. </li>
  82. <li><a><strong>R</strong>egions <strong>O</strong>f <strong>I</strong>nterest <i class="arrow right"></i></a>
  83. <ul>
  84. <li><a href="#" onclick="loadPage('edit_digits.html?v=$COMMIT_HASH');">Digit ROI</a></li>
  85. <li><a href="#" onclick="loadPage('edit_analog.html?v=$COMMIT_HASH');">Analog ROI</a></li>
  86. </ul>
  87. </li>
  88. </ul>
  89. <li><a>Data<i class="arrow down"></i></a>
  90. <ul class="submenu">
  91. <li><a href="#" onclick="loadPage(getDomainname() + '/value?full');">Recognition</a></li>
  92. <li><a>Livestream <i class="arrow right"></i></a>
  93. <ul>
  94. <li><a href="#" onclick="start_livestream(false);">Live Stream (Light off)</a></li>
  95. <li><a href="#" onclick="start_livestream(true);">Live Stream (Light on)</a></li>
  96. </ul>
  97. </li>
  98. <li><a href="#" onclick="loadPage('graph.html?v=$COMMIT_HASH');">Data Graph</a></li>
  99. <li><a href="#" onclick="loadPage('data.html?v=$COMMIT_HASH');">Data Table</a></li>
  100. <li><a href="#" onclick="loadPage(getDomainname() + '/fileserver/log/data/');">Data Files</a></li>
  101. </ul>
  102. </li>
  103. <li><a>System <i class="arrow down"></i></a>
  104. <ul class="submenu">
  105. <li><a href="#" onclick="loadPage('backup.html?v=$COMMIT_HASH');">Backup/Restore</a></li>
  106. <li><a href="#" onclick="loadPage('ota_page.html?v=$COMMIT_HASH');">OTA Update</a></li>
  107. <li><a href="#" onclick="loadPage('log.html?v=$COMMIT_HASH');">Log Viewer</a></li>
  108. <li><a href="#" onclick="loadPage(getDomainname() + '/fileserver/');">File Server</a></li>
  109. <li><a href="#" onclick="loadPage('reboot_page.html?v=$COMMIT_HASH');">Reboot</a></li>
  110. <li><a href="#" onclick="loadPage('info.html?v=$COMMIT_HASH');">Info</a></li>
  111. <li><a href="https://jomjol.github.io/AI-on-the-edge-device-docs/" target="_blank">Help</a></li>
  112. </ul>
  113. </li>
  114. <li id="ManualControl" style="display:none;"><a>Manual Control <i class="arrow down"></i></a> <!-- Workaround: Hide menu if no entry is available -->
  115. <ul class="submenu">
  116. <!--<li><a href="#" onclick="flow_start()">Start Round</a></li>--> <!-- Needs to be adapted on code side first to ensure proper user feedback -->
  117. <li id="HASendDiscovery" style="display:none;"><a href="#" onclick="HA_send_discovery()">Resend HA Discovery</a></li>
  118. </ul>
  119. </li>
  120. </ul>
  121. </div>
  122. <iframe title="maincontent" name="maincontent" class="iframe" id="maincontent"></iframe>
  123. <span id="Version" style="font-size: 10px; margin-top: -5px;padding-left: 10px;">Loading version...</span>
  124. <script type="text/javascript">
  125. LoadHostname();
  126. LoadFwVersion();
  127. LoadWebUiVersion();
  128. HA_send_discovery_visibility();
  129. if (getCookie("page") == "" || getCookie("page") == "reboot_page.html?v=$COMMIT_HASH") {
  130. document.cookie = "page=overview.html?v=$COMMIT_HASH" + "; path=/";
  131. }
  132. console.log("Loading page: " + getCookie("page"));
  133. document.getElementById('maincontent').src = getCookie("page");
  134. /*
  135. function flow_start() {
  136. var url = getDomainname() + '/flow_start';
  137. var xhttp = new XMLHttpRequest();
  138. xhttp.onreadystatechange = function() {
  139. if (this.readyState == 4 && this.status == 200) {
  140. if (xhttp.responseText.substring(0,3) == "001") {
  141. firework.launch('Flow start triggered', 'success', 5000);
  142. window.location.reload();
  143. }
  144. else if (xhttp.responseText.substring(0,3) == "002") {
  145. firework.launch('Flow start scheduled. Start after round is completed', 'success', 5000);
  146. }
  147. else if (xhttp.responseText.substring(0,3) == "099") {
  148. firework.launch('Flow start triggered, but start not possible (no flow task available)', 'danger', 5000);
  149. }
  150. }
  151. }
  152. xhttp.open("GET", url, true);
  153. xhttp.send();
  154. }
  155. */
  156. function HA_send_discovery_visibility() {
  157. loadConfig(domainname);
  158. ParseConfig();
  159. category = getConfigCategory();
  160. param = getConfigParameters();
  161. if (category["MQTT"]["enabled"] && param["MQTT"]["HomeassistantDiscovery"]["value1"] == "true") {
  162. document.getElementById("ManualControl").style.display="";
  163. document.getElementById("HASendDiscovery").style.display="";
  164. }
  165. }
  166. function HA_send_discovery() {
  167. console.log("HA Discovery scheduled");
  168. var url = getDomainname() + '/mqtt_publish_discovery';
  169. var xhttp = new XMLHttpRequest();
  170. xhttp.onreadystatechange = function() {
  171. if (this.readyState == 4 && this.status == 200) {
  172. firework.launch('Sending HA discovery topics scheduled. The sending will be processed in state "Publish to MQTT"', 'success', 5000);
  173. }
  174. }
  175. xhttp.open("GET", url, true);
  176. xhttp.send();
  177. }
  178. function start_livestream(streamFlashlight) {
  179. if (streamPopup)
  180. streamPopup.close();
  181. if (streamFlashlight)
  182. streamPopup = window.open(getDomainname() + '/stream?flashlight=true','LivestreamWithlight',streamWindowFeatures);
  183. else
  184. streamPopup = window.open(getDomainname() + '/stream','Livestream',streamWindowFeatures);
  185. streamPopup.focus();
  186. }
  187. </script>
  188. </body>
  189. </html>