esp8266-remote-timer

ESP8266 based timer w/ remote control and NTP sync
Index Commits Files Refs README LICENSE
data/main.js (4839B)
   1 var received_data;
   2 var main_checkbox, timer_checkbox;
   3 var time_div, system_local_domain, system_ip_addr, wifi_ssid, wifi_rssi;
   4 var system_time, system_time_elem, last_ntp_sync, last_ntp_sync_elem;
   5 var to_time, from_time, timer_save_button;
   6 
   7 const time_formatter = new Intl.DateTimeFormat('en-GB', {
   8     timeZone: 'America/Argentina/Buenos_Aires',
   9     year: 'numeric',
  10     month: '2-digit',
  11     day: '2-digit',
  12     hour: '2-digit',
  13     minute: '2-digit',
  14     hour12: false
  15 });
  16 
  17 const query_types = {
  18     "MAIN_OUTPUT_STATUS": 0,
  19     "MAIN_OUTPUT_TOGGLE": 1,
  20     "TIMER_TOGGLE":       2,
  21     "TIMER_SET_VALUES":   3
  22 }
  23 
  24 function rssi_to_percentage(rssi) {
  25     var quality = 0; 
  26 
  27     if (rssi <= -100) { 
  28         quality = 0; 
  29     } else if (rssi >= -50) { 
  30         quality = 100; 
  31     } else { 
  32         quality = 2 * (rssi + 100); 
  33     } 
  34     return quality; 
  35 }
  36 
  37 function update_checkbox() {
  38     main_checkbox.setAttribute("checked", received_data["main-output-enabled"]);
  39     timer_checkbox.setAttribute("checked", received_data["timer"]["enabled"]);
  40 }
  41 
  42 function update_time() {
  43     system_time = received_data["system-time"];
  44     system_time_elem.innerHTML = time_formatter.format(new Date(system_time*1000))
  45         .replaceAll("/", "-")
  46         .replaceAll(",", "") + " GMT-3";
  47 }
  48 
  49 function update_timer() {
  50     from_time.value = received_data["timer"]["from"]["hour"] + ":"
  51         + received_data["timer"]["from"]["minute"];
  52     to_time.value = received_data["timer"]["to"]["hour"] + ":"
  53         + received_data["timer"]["to"]["minute"];
  54 }
  55 
  56 function update_all() {
  57     update_checkbox();
  58     update_time();
  59     update_timer();
  60 
  61     system_local_domain.href = "http://" + received_data["system-local-domain"] + ".local";
  62     system_local_domain.innerHTML = "http://" + received_data["system-local-domain"] + ".local";
  63 
  64     system_ip_addr.href = received_data["system-ip-addr"];
  65     system_ip_addr.innerHTML = received_data["system-ip-addr"];
  66 
  67     last_ntp_sync = received_data["last-ntp-sync"];
  68     last_ntp_sync_elem.innerHTML = time_formatter.format(new Date(last_ntp_sync*1000))
  69         .replaceAll("/", "-")
  70         .replaceAll(",", "") + " GMT-3";
  71 
  72     wifi_ssid.innerHTML = received_data["wifi-ssid"];
  73     const rssi = received_data["wifi-rssi"];
  74     wifi_rssi.innerHTML = rssi + "dBm (" + rssi_to_percentage(rssi) + "%)";
  75 }
  76 
  77 function socket_onmessage_handler(event) {
  78     received_data = JSON.parse(event.data);
  79 
  80     switch(received_data["type"]) {
  81         case "all":
  82             update_all();
  83             break;
  84         case "time":
  85             update_time();
  86             break;
  87         case "cb":
  88             update_checkbox();
  89             break;
  90         case "timer":
  91             update_timer();
  92             break;
  93         default:
  94             console.log("[SOCKET] received_data: type not known, updating all...");
  95             update_all();
  96     }
  97 }
  98 
  99 function socket_onopen_handler(event) {
 100     console.log("[SOCKET] Connection established")
 101     socket.send(query_types["MAIN_OUTPUT_STATUS"]);
 102 }
 103 
 104 function handle_click(cb) {
 105     if(cb == 'main-toggle') {
 106         socket.send(query_types["MAIN_OUTPUT_TOGGLE"]);
 107     } else if(cb == 'timer-toggle') {
 108         socket.send(query_types["TIMER_TOGGLE"]);
 109     } else {
 110         console.log("handle_click: wrong target");
 111     }
 112 }
 113 
 114 function update_system_time() {
 115     socket.send(query_types["MAIN_OUTPUT_STATUS"]);
 116 }
 117 
 118 function timer_set_time() {
 119     var query_json = new Object();
 120 
 121     query_json.from = new Object();
 122     query_json.from.hour = from_time.value.slice(0, 2);
 123     query_json.from.minute = from_time.value.slice(3, 5);
 124 
 125     query_json.to = new Object();
 126     query_json.to.hour = to_time.value.slice(0, 2);
 127     query_json.to.minute = to_time.value.slice(3, 5);
 128 
 129     socket.send(query_types["TIMER_SET_VALUES"] + JSON.stringify(query_json));
 130 }
 131 
 132 function query_data() {
 133     main_checkbox = document.getElementById("main-checkbox");
 134     timer_checkbox = document.getElementById("timer-checkbox");
 135     system_local_domain = document.getElementById("system-local-domain");
 136     last_ntp_sync_elem = document.getElementById("last-ntp-sync");
 137     system_time_elem = document.getElementById("system-time");
 138     system_ip_addr = document.getElementById("system-ip-addr");
 139     wifi_ssid = document.getElementById("wifi-ssid");
 140     wifi_rssi = document.getElementById("wifi-rssi");
 141 
 142     from_time = document.getElementById("from-time");
 143     to_time = document.getElementById("to-time");
 144 
 145     timer_save_button = document.getElementById("timer-save");
 146     timer_save_button.addEventListener( "click", timer_set_time, false);
 147 
 148     // setInterval(update_system_time, 30*1000); // update time every 30 secs
 149 }
 150 
 151 const socket = new WebSocket("ws:/" + "/" + location.host + ":81");
 152 socket.onmessage = socket_onmessage_handler;
 153 socket.onopen = socket_onopen_handler;
 154 window.onload = query_data;