alarm.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. //########################################################################################
  2. // alarm.js
  3. // Version 4.03
  4. // See 95_Alarm for licensing
  5. //########################################################################################
  6. //# Prof. Dr. Peter A. Henning
  7. //------------------------------------------------------------------------------------------------------
  8. // Determine csrfToken
  9. //------------------------------------------------------------------------------------------------------
  10. var req = new XMLHttpRequest();
  11. req.open('GET', document.location.href, false);
  12. req.send(null);
  13. var csrfToken = req.getResponseHeader('X-FHEM-csrfToken');
  14. if( csrfToken == null ){
  15. csrfToken = "null";
  16. }
  17. //------------------------------------------------------------------------------------------------------
  18. // encode Parameters for URL
  19. //------------------------------------------------------------------------------------------------------
  20. function encodeParm(oldval) {
  21. var newval;
  22. newval = oldval.replace(/"/g, '%27');
  23. newval = newval.replace(/#/g, '%23');
  24. newval = newval.replace(/\+/g, '%2B');
  25. newval = newval.replace(/&/g, '%26');
  26. newval = newval.replace(/'/g, '%27');
  27. newval = newval.replace(/=/g, '%3D');
  28. newval = newval.replace(/\?/g, '%3F');
  29. newval = newval.replace(/\|/g, '%7C');
  30. newval = newval.replace(/\s/g, '%20');
  31. return newval;
  32. }
  33. //------------------------------------------------------------------------------------------------------
  34. // Animated Icon
  35. //------------------------------------------------------------------------------------------------------
  36. var bellfill;
  37. function blinkbell() {
  38. var w = document.getElementById("alarmicon");
  39. if (w) {
  40. if (bellfill == alarmcolor) {
  41. bellfill = "white";
  42. w.getElementsByClassName("alarmst_b")[0].setAttribute("fill", "white");
  43. w.getElementsByClassName("alarmst_sb")[0].setAttribute("fill", "white");
  44. } else {
  45. bellfill = alarmcolor;
  46. w.getElementsByClassName("alarmst_b")[0].setAttribute("fill", alarmcolor);
  47. w.getElementsByClassName("alarmst_sb")[0].setAttribute("fill", alarmcolor);
  48. }
  49. }
  50. }
  51. function updateIcon(name, alarmst) {
  52. var w = document.getElementById(name);
  53. if (w) {
  54. switch (alarmst) {
  55. case "disarmed":
  56. w.getElementsByClassName("alarmst_b")[0].setAttribute("fill", "white");
  57. w.getElementsByClassName("alarmst_sb")[0].setAttribute("fill", "white");
  58. if (blinking == 1) {
  59. clearInterval(blinker);
  60. blinking = 0;
  61. }
  62. break;
  63. case "mixed":
  64. w.getElementsByClassName("alarmst_b")[0].setAttribute("fill", armwaitcolor);
  65. w.getElementsByClassName("alarmst_sb")[0].setAttribute("fill", "white");
  66. if (blinking == 1) {
  67. clearInterval(blinker);
  68. blinking = 0;
  69. }
  70. break;
  71. case "armed":
  72. w.getElementsByClassName("alarmst_b")[0].setAttribute("fill", armcolor);
  73. w.getElementsByClassName("alarmst_sb")[0].setAttribute("fill", "white");
  74. if (blinking == 1) {
  75. clearInterval(blinker);
  76. blinking = 0;
  77. }
  78. break;
  79. default:
  80. if (blinking == 0) {
  81. blinker = setInterval('blinkbell()', 250);
  82. blinking = 1;
  83. }
  84. }
  85. }
  86. }
  87. $("body").on('DOMSubtreeModified', "#hid_levels", function () {
  88. var w = document.getElementById("hid_levels");
  89. var v = document.getElementById("alarmicon");
  90. var t = v.getElementsByClassName("arec");
  91. var ifnd;
  92. var sfnd;
  93. var col;
  94. for (i = 0; i < alarmno; i++) {
  95. var s = w.getElementsByClassName("hid_lx")[i].innerHTML;
  96. if (ast[i] != s) {
  97. switch (s) {
  98. case "disarmed":
  99. col = disarmcolor;
  100. break;
  101. case "armwait":
  102. col = armwaitcolor;
  103. break;
  104. case "armed":
  105. col = armcolor;
  106. break;
  107. default:
  108. col = alarmcolor
  109. }
  110. t[i].setAttribute("fill", col);
  111. ast[i] = s;
  112. ifnd = i;
  113. sfnd = s;
  114. }
  115. }
  116. if (ifnd && (iconmap.includes(ifnd))) {
  117. var aan = true;
  118. var adn = true;
  119. var aln = "";
  120. var atn = "";
  121. for (i = 0; i < alarmno; i++) {
  122. if (iconmap.includes(i)) {
  123. var s = ast[i];
  124. if (s != "disarmed" && s != "armwait" && s != "armed") {
  125. aln = aln + i + ",";
  126. atn = atn + s + ",";
  127. } else {
  128. adn = adn && ((s == "disarmed") ||(s == "armwait"));
  129. aan = aan && (s == "armed");
  130. }
  131. }
  132. }
  133. if (adn != ad || aan != aa || aln != al) {
  134. aa = aan;
  135. ad = adn;
  136. al = aln;
  137. at = atn;
  138. var iconstate;
  139. if (al != "") {
  140. iconstate = al;
  141. } else {
  142. if (aa && (! ad)) {
  143. iconstate = "armed";
  144. } else {
  145. if ((! aa) && ad) {
  146. iconstate = "disarmed";
  147. } else {
  148. iconstate = "mixed";
  149. }
  150. }
  151. }
  152. updateIcon('alarmicon', iconstate);
  153. }
  154. }
  155. });
  156. //------------------------------------------------------------------------------------------------------
  157. // Write the Attribute Value
  158. //------------------------------------------------------------------------------------------------------
  159. function alarm_setAttribute(name, attr, val) {
  160. //set Alarm Attribute
  161. var location = document.location.pathname;
  162. if (location.substr(location.length -1, 1) == '/') {
  163. location = location.substr(0, location.length -1);
  164. }
  165. var url = document.location.protocol + "//" + document.location.host + location;
  166. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20' + encodeParm(attr) + '%20' + encodeParm(val));
  167. }
  168. function alarm_cancel(name, level) {
  169. var val;
  170. var nam;
  171. var location = document.location.pathname;
  172. if (location.substr(location.length -1, 1) == '/') {
  173. location = location.substr(0, location.length -1);
  174. }
  175. var url = document.location.protocol + "//" + document.location.host + location;
  176. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Alarm_Exec("' + name + '",' + level + ',"web","button","off")}');
  177. }
  178. function alarm_arm(name, level) {
  179. var val;
  180. var nam;
  181. var command = document.getElementById('l' + level + 'x').checked;
  182. if (command == true) {
  183. command = "arm";
  184. } else {
  185. command = "disarm";
  186. }
  187. var location = document.location.pathname;
  188. if (location.substr(location.length -1, 1) == '/') {
  189. location = location.substr(0, location.length -1);
  190. }
  191. var url = document.location.protocol + "//" + document.location.host + location;
  192. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Alarm_Arm("' + name + '",' + level + ',"web","button","' + command + '")}');
  193. }
  194. function alarm_testaction(name, dev, type) {
  195. var cmd;
  196. var nam;
  197. if (type == 'set') {
  198. cmd = document.getElementById(dev).parentElement.children[2].children[0].value;
  199. } else {
  200. cmd = document.getElementById(dev).parentElement.children[3].children[0].value;
  201. }
  202. var cmds;
  203. cmds = cmd.replace(/\\/g, '\\');
  204. cmds = cmds.replace(/\'/g, '\"');
  205. cmds = cmds.replace(/\$/g, '\\$');
  206. alert(cmds);
  207. var location = document.location.pathname;
  208. if (location.substr(location.length -1, 1) == '/') {
  209. location = location.substr(0, location.length -1);
  210. }
  211. var url = document.location.protocol + "//" + document.location.host + location;
  212. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Alarm_Test("' + name + '","' + cmds + '")}');
  213. }
  214. function alarm_set(name) {
  215. var val;
  216. var nam;
  217. var location = document.location.pathname;
  218. if (location.substr(location.length -1, 1) == '/') {
  219. location = location.substr(0, location.length -1);
  220. }
  221. var url = document.location.protocol + "//" + document.location.host + location;
  222. // saving arm data
  223. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20armdelay%20' + document.getElementById('armdelay').value);
  224. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20armwait%20' + encodeParm(document.getElementById('armwait').value));
  225. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20 ' + name + '%20armact%20' + encodeParm(document.getElementById('armaction').value));
  226. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20disarmact%20' + encodeParm(document.getElementById('disarmaction').value));
  227. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20cancelact%20' + encodeParm(document.getElementById('cancelaction').value));
  228. // saving start and end times
  229. for (var i = 0;
  230. i < alarmno;
  231. i++) {
  232. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20level' + i + 'start%20' + document.getElementById('l' + i + 's').value);
  233. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20level' + i + 'end%20' + document.getElementById('l' + i + 'e').value);
  234. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20level' + i + 'msg%20' + document.getElementById('l' + i + 'm').value);
  235. if (document.getElementById('l' + i + 'x').checked == true) {
  236. val = "armed";
  237. } else {
  238. val = "disarmed";
  239. }
  240. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=attr%20' + name + '%20level' + i + 'xec%20' + val);
  241. }
  242. // acquiring data for each sensor
  243. var sarr = document.getElementsByName('sensor');
  244. for (var k = 0;
  245. k < sarr.length;
  246. k++) {
  247. nam = sarr[k].getAttribute('informId');
  248. val = "";
  249. for (var i = 0;
  250. i < alarmno;
  251. i++) {
  252. if (sarr[k].children[1].children[i].checked == true) {
  253. val += "alarm" + i + ",";
  254. }
  255. }
  256. val += "|" + encodeParm(sarr[k].children[2].children[0].value);
  257. val += "|" + encodeParm(sarr[k].children[3].children[0].value);
  258. val += "|" + sarr[k].children[4].children[0].options[sarr[k].children[4].children[0].selectedIndex].value;
  259. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + nam + '=attr%20' + nam + '%20alarmSettings%20' + val);
  260. }
  261. // acquiring data for each actor
  262. var aarr = document.getElementsByName('actor');
  263. for (var k = 0;
  264. k < aarr.length;
  265. k++) {
  266. nam = aarr[k].getAttribute('informId');
  267. val = "";
  268. for (var i = 0;
  269. i < alarmno;
  270. i++) {
  271. //alert(" Checking "+k+" "+i)
  272. if (aarr[k].children[1].children[i].checked == true) {
  273. val += "alarm" + i + ",";
  274. }
  275. }
  276. val += "|" + encodeParm(aarr[k].children[2].children[0].value);
  277. val += "|" + encodeParm(aarr[k].children[3].children[0].value);
  278. val += "|" + encodeParm(aarr[k].children[4].children[0].value);
  279. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + nam + '=attr%20' + nam + '%20alarmSettings%20' + val);
  280. }
  281. // creating notifiers
  282. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + ' ={main::Alarm_CreateNotifiers("' + name + '")}');
  283. }