script.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. var rawContent;
  2. var data = [];
  3. var update = [];
  4. var loading = false;
  5. var websock;
  6. var settings = {
  7. modOffset: 0,
  8. inputOffset: 0,
  9. updateInterval: 2,
  10. autoupdate: false,
  11. emulateMaster: false
  12. }
  13. var autoRefreshInterval;
  14. function GetData() {
  15. if (loading)
  16. return;
  17. loading = true;
  18. return fetch("/data")
  19. .then(function (result) {
  20. return result.text().then(function (text) {
  21. rawContent = text;
  22. data = ConvertData(rawContent);
  23. loading = false;
  24. });
  25. })
  26. .catch(function () {
  27. loading = false;
  28. });
  29. }
  30. function ConvertData(rawContent) {
  31. let dataResult = [];
  32. var tmpList = rawContent.split('~');
  33. tmpList.forEach(resultLine => {
  34. var tmpResultLine = resultLine.split(":");
  35. var tmpModule = tmpResultLine[0].split(".");
  36. var dataObj = {
  37. module: parseInt(tmpModule[0]),
  38. input: parseInt(tmpModule[1]),
  39. data: (tmpResultLine[1] == 1)
  40. }
  41. if (!isNaN(dataObj.input) && !isNaN(dataObj.module))
  42. dataResult.push(dataObj);
  43. });
  44. return dataResult;
  45. }
  46. function RenderData(data) {
  47. var table = document.getElementById("overview");
  48. table.innerHTML = "";
  49. var lastModule = -1;
  50. var row;
  51. data.forEach(element => {
  52. if (lastModule != element.module) {
  53. lastModule = element.module
  54. row = table.insertRow(element.module);
  55. var title = row.insertCell(0);
  56. title.innerHTML = (element.module + settings.modOffset);
  57. }
  58. var cell = row.insertCell(element.input + 1);
  59. cell.innerHTML = (element.input + settings.inputOffset);
  60. cell.classList.add('input-value')
  61. cell.classList.add('input-value-' + ((element.data) ? "ON" : "OFF"))
  62. });
  63. document.getElementById("lastUpdate").innerHTML = new Date().toLocaleString();
  64. }
  65. function SaveSettings() {
  66. settings.modOffset = parseInt(document.getElementById("modOffset").value);
  67. settings.inputOffset = parseInt(document.getElementById("inputOffset").value);
  68. settings.updateInterval = parseInt(document.getElementById("updateInterval").value);
  69. settings.autoupdate = document.getElementById("checkoptions-0").checked
  70. settings.emulateMaster = document.getElementById("checkoptions-1").checked
  71. window.localStorage.setItem('settings', JSON.stringify(settings));
  72. SetAutoUpdate();
  73. }
  74. function LoadSettings(rawSettings) {
  75. if (rawSettings == null) {
  76. var tmpsettings = JSON.parse(window.localStorage.getItem('settings'));
  77. if (tmpsettings == null)
  78. return;
  79. settings = tmpsettings;
  80. } else {
  81. settings = rawSettings;
  82. }
  83. document.getElementById("modOffset").value = settings.modOffset;
  84. document.getElementById("inputOffset").value = settings.inputOffset;
  85. document.getElementById("updateInterval").value = settings.updateInterval;
  86. document.getElementById("checkoptions-0").checked = settings.autoupdate;
  87. document.getElementById("checkoptions-1").checked = settings.emulateMaster;
  88. SetAutoUpdate();
  89. }
  90. function SaveSettingsOnDevice() {
  91. SaveSettings();
  92. var urlEncodedSettings = encodeURI(JSON.stringify(settings));
  93. var url = "/config?key=settings&value=" + urlEncodedSettings;
  94. fetch(url)
  95. .then(function (result) {
  96. result.text().then(function (text) {
  97. alert("Saved")
  98. });
  99. })
  100. .catch(function () {
  101. });
  102. }
  103. function LoadSettingsFromDevice() {
  104. fetch("/config?key=settings")
  105. .then(function (result) {
  106. return result.text().then(function (text) {
  107. var settingsraw = JSON.parse(decodeURI(text));
  108. LoadSettings(settingsraw);
  109. });
  110. })
  111. .catch(function () {
  112. loading = false;
  113. });
  114. }
  115. function SetAutoUpdate() {
  116. if (autoRefreshInterval != null)
  117. clearInterval(autoRefreshInterval)
  118. autoRefreshInterval = setInterval(() => {
  119. if (settings.autoupdate) {
  120. if (loading)
  121. return;
  122. DoUpdate();
  123. }
  124. }, settings.updateInterval * 1000);
  125. }
  126. function DoUpdate() {
  127. if (loading)
  128. return;
  129. GetData().then(() => {
  130. RenderData(data)
  131. });
  132. }
  133. function StartSocket() {
  134. websock = new WebSocket('ws://' + window.location.hostname + ':81/');
  135. websock.onopen = function (evt) { console.log('websock open'); };
  136. websock.onclose = function (evt) { console.log('websock close'); };
  137. websock.onerror = function (evt) { console.log(evt); };
  138. websock.onmessage = function (evt) {
  139. console.log(evt);
  140. switch (evt.data) {
  141. case "update":
  142. DoUpdate();
  143. break;
  144. default:
  145. var data = evt.data;
  146. update = data.split(";");
  147. UpdateData(update);
  148. break;
  149. }
  150. };
  151. }
  152. function UpdateData(update) {
  153. update.forEach(u => {
  154. if (u != '') {
  155. var tmp = u.split('|');
  156. var module = tmp[0];
  157. if (tmp[1] != null) {
  158. tmp = tmp[1].split(':');
  159. var input = tmp[0];
  160. if (tmp[1] != null) {
  161. var value = tmp[1];
  162. data.find(d => d.module == module && d.input == input).data = (value == "1");
  163. }
  164. }
  165. }
  166. });
  167. RenderData(data);
  168. }
  169. LoadSettings();
  170. DoUpdate();
  171. StartSocket();
  172. document.getElementById("button-save").addEventListener("click", SaveSettings);
  173. document.getElementById("button-save-device").addEventListener("click", SaveSettingsOnDevice);
  174. document.getElementById("button-load-device").addEventListener("click", LoadSettingsFromDevice);
  175. document.getElementById("button-update").addEventListener("click", DoUpdate);