index.html 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <!DOCTYPE html>
  2. <html lang="et" data-theme="light">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
  6. <meta name="theme-color" content="#1f6feb" id="meta-theme" />
  7. <meta name="robots" content="noindex" />
  8. <title>Nutikodu — andurid</title>
  9. <link rel="icon" href="/icon.svg" type="image/svg+xml" />
  10. <link rel="manifest" href="/manifest.webmanifest" />
  11. <link rel="apple-touch-icon" href="/icon.svg" />
  12. <link rel="stylesheet" href="/style.css" />
  13. </head>
  14. <body>
  15. <header>
  16. <div class="brand">
  17. <span class="logo" aria-hidden="true">🏠</span>
  18. <div>
  19. <h1>Nutikodu</h1>
  20. <div class="sub" id="subtitle">Zigbee andurid</div>
  21. </div>
  22. </div>
  23. <div class="header-actions">
  24. <span class="status" id="status" title="Ühenduse olek"></span>
  25. <a id="auth-link" class="icon-btn" href="/login" title="Sisselogimine" style="text-decoration:none">🔒</a>
  26. <button id="theme-toggle" class="icon-btn" title="Vaheta teema" aria-label="Vaheta teema">🌙</button>
  27. </div>
  28. </header>
  29. <main>
  30. <nav class="tabs" id="tabs" aria-label="Vahelehed">
  31. <button type="button" class="tab active" data-view="andurid">🏠 Andurid</button>
  32. <button type="button" class="tab" data-view="transport">🚌 Transport</button>
  33. <button type="button" class="tab" data-view="varv">🎨 Värv</button>
  34. </nav>
  35. <div id="view-andurid" class="view">
  36. <section class="cards" id="cards"></section>
  37. <section class="panel">
  38. <div class="controls">
  39. <div class="presets" id="presets">
  40. <button type="button" data-days="1">24 h</button>
  41. <button type="button" data-days="7" class="active">7 p</button>
  42. <button type="button" data-days="30">30 p</button>
  43. <button type="button" data-days="90">90 p</button>
  44. <button type="button" data-days="365">1 a</button>
  45. <button type="button" data-days="all">Kõik</button>
  46. </div>
  47. <div class="custom-range">
  48. <label>Algus<input type="datetime-local" id="from" /></label>
  49. <label>Lõpp<input type="datetime-local" id="to" /></label>
  50. <button type="button" id="apply" class="btn">Kuva</button>
  51. </div>
  52. <div class="toggles">
  53. <label class="chk"><input type="checkbox" id="show-temp" checked /> <span>Temperatuur</span></label>
  54. <label class="chk"><input type="checkbox" id="show-hum" checked /> <span>Niiskus</span></label>
  55. <label class="chk"><input type="checkbox" id="show-out" checked /> <span>Väli</span></label>
  56. <div class="seg" id="agg">
  57. <button type="button" data-agg="hour" class="active">Tund</button>
  58. <button type="button" data-agg="day">Päev</button>
  59. </div>
  60. </div>
  61. </div>
  62. <div id="chart" aria-label="Temperatuuri ja niiskuse ajatelg"></div>
  63. <div id="hint" class="hint" hidden></div>
  64. </section>
  65. <div id="protected" hidden>
  66. <section class="cards" id="cards-uus67"></section>
  67. <section class="panel">
  68. <h2 class="panel-title">⚡ Energia (pistikud)</h2>
  69. <div id="chart-energy" aria-label="Energia ajatelg" style="height:300px"></div>
  70. <div id="hint-energy" class="hint" hidden></div>
  71. </section>
  72. <section class="panel">
  73. <h2 class="panel-title">🚶 Liikumine / kohalolu</h2>
  74. <div id="chart-motion" aria-label="Liikumise ajatelg" style="height:220px"></div>
  75. <div id="hint-motion" class="hint" hidden></div>
  76. </section>
  77. </div>
  78. <footer class="foot">
  79. <span id="range-label"></span>
  80. </footer>
  81. </div>
  82. <div id="view-transport" class="view" hidden>
  83. <section class="panel">
  84. <h2 class="panel-title">🚌 Suuremõisa küla — bussid</h2>
  85. <div id="bus-list" class="dep-list"></div>
  86. <div id="bus-hint" class="hint" hidden></div>
  87. </section>
  88. <section class="panel">
  89. <div class="panel-head">
  90. <h2 class="panel-title">🚢 Heltermaa – Rohuküla</h2>
  91. <div class="seg" id="praam-days">
  92. <button type="button" data-days="1" class="active">Täna</button>
  93. <button type="button" data-days="2">Täna + homme</button>
  94. </div>
  95. </div>
  96. <div id="praam-warning" class="warn-banner" hidden></div>
  97. <div id="praam-list" class="dep-list"></div>
  98. <div id="praam-hint" class="hint" hidden></div>
  99. </section>
  100. <footer class="foot">
  101. <span id="transport-updated"></span>
  102. </footer>
  103. </div>
  104. <div id="view-varv" class="view" hidden>
  105. <section class="panel" id="varv-power" hidden>
  106. <div class="varv-power-row">
  107. <h2 class="panel-title" style="margin:0">🔌 Värvusemõõtja</h2>
  108. <span id="varv-power-status" class="badge muted">—</span>
  109. <div class="varv-power-btns">
  110. <button type="button" id="varv-on" class="btn">Lülita sisse</button>
  111. <button type="button" id="varv-off" class="btn">Lülita välja</button>
  112. </div>
  113. </div>
  114. <div id="varv-power-hint" class="hint" hidden></div>
  115. </section>
  116. <section class="panel" id="varv-calib-panel" hidden>
  117. <div class="varv-power-row">
  118. <h2 class="panel-title" style="margin:0">🎯 Kalibreerimine</h2>
  119. <span id="varv-calib-status" class="badge muted">—</span>
  120. <div class="varv-power-btns">
  121. <button type="button" id="varv-calib-dark" class="btn">Salvesta tume</button>
  122. <button type="button" id="varv-calib-white" class="btn">Salvesta valge</button>
  123. </div>
  124. </div>
  125. <div class="varv-sub" style="margin-top:8px">
  126. 1) Kata andur → „Salvesta tume". 2) Pane valge pind sama valgustusega → „Salvesta valge".
  127. Oota ~30 s, kuni mõõtmine stabiliseerub.
  128. </div>
  129. <div id="varv-calib-live" class="varv-sub" style="margin-top:4px"></div>
  130. <label class="chk" style="margin-top:10px;display:inline-flex">
  131. <input type="checkbox" id="varv-calib-view" /> <span id="varv-calib-view-label">Kuva kalibreeritud värvi</span>
  132. </label>
  133. <div id="varv-calib-hint" class="hint" hidden></div>
  134. </section>
  135. <section class="panel">
  136. <div class="varv-current">
  137. <div id="varv-current-swatch" class="varv-current-swatch"></div>
  138. <div class="varv-current-info">
  139. <div class="varv-hex" id="varv-hex">#------</div>
  140. <div class="varv-meta" id="varv-current-meta">Laadin…</div>
  141. </div>
  142. </div>
  143. </section>
  144. <section class="panel">
  145. <h2 class="panel-title">🎨 Viimased mõõtmised</h2>
  146. <div id="varv-grid" class="swatch-grid"></div>
  147. <div id="varv-hint" class="hint" hidden></div>
  148. </section>
  149. <section class="panel">
  150. <h2 class="panel-title">📊 Spekter <span class="varv-sub" id="varv-spectrum-label"></span></h2>
  151. <div id="chart-varv-spectrum" style="height:280px" aria-label="Kanali spekter"></div>
  152. </section>
  153. <section class="panel">
  154. <h2 class="panel-title">🕓 Värvitelg (viimased 24 h)</h2>
  155. <div id="varv-timeline" class="swatch-timeline"></div>
  156. </section>
  157. <section class="panel">
  158. <h2 class="panel-title">🧭 Kromaatilisus (x, y)</h2>
  159. <div id="chart-varv-chroma" style="height:340px" aria-label="Kromaatilisuse hajuvus"></div>
  160. </section>
  161. <footer class="foot">
  162. <span id="varv-updated"></span>
  163. </footer>
  164. </div>
  165. </main>
  166. <script src="/vendor/echarts.min.js"></script>
  167. <script src="/app.js"></script>
  168. <!-- HyperDX Browser Integration: session replays + RUM (vt LOEMIND) -->
  169. <script src="https://unpkg.com/@hyperdx/browser@0.26.0/build/index.js"></script>
  170. <script>
  171. if (window.HyperDX) {
  172. HyperDX.init({
  173. apiKey: '02a19ecf-f62e-4e17-819f-3ee1498d69f3',
  174. service: 'nutikodu-web',
  175. url: 'https://otel.odamus.com',
  176. consoleCapture: true,
  177. advancedNetworkCapture: true,
  178. maskAllInputs: true,
  179. maskAllText: true,
  180. });
  181. }
  182. </script>
  183. </body>
  184. </html>