esp8266-remote-timer

ESP8266 based timer w/ remote control and NTP sync
Index Commits Files Refs README LICENSE
commit 882748a5323653a119dec0ac61d4692b6b867a77
parent c4acf731a0464e3702d17147aec12c3b5e7f2858
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Mon, 31 Mar 2025 23:02:43 -0300

reduce use of global variables

Diffstat:
Mdata/main.js | 9+++++----
Msrc/main.cpp | 59++++++++++++++++++++++++++++++++---------------------------
2 files changed, 37 insertions(+), 31 deletions(-)
diff --git a/data/main.js b/data/main.js
@@ -36,7 +36,7 @@ function rssi_to_percentage(rssi) {
 
 function update_checkbox() {
     main_checkbox.setAttribute("checked", received_data["main-output-enabled"]);
-    timer_checkbox.setAttribute("checked", received_data["timer-enabled"]);
+    timer_checkbox.setAttribute("checked", received_data["timer"]["enabled"]);
 }
 
 function update_time() {
@@ -47,9 +47,10 @@ function update_time() {
 }
 
 function update_timer() {
-    console.log(received_data);
-    from_time.value = received_data["from"]["hour"] + ":" + received_data["from"]["minute"];
-    to_time.value = received_data["to"]["hour"] + ":" + received_data["to"]["minute"];
+    from_time.value = received_data["timer"]["from"]["hour"] + ":"
+        + received_data["timer"]["from"]["minute"];
+    to_time.value = received_data["timer"]["to"]["hour"] + ":"
+        + received_data["timer"]["to"]["minute"];
 }
 
 function update_all() {
diff --git a/src/main.cpp b/src/main.cpp
@@ -27,9 +27,8 @@ typedef struct {
 
 ESP8266WebServer server(80);
 WebSocketsServer web_socket = WebSocketsServer(81);
-JSONVar data, system_time_data, timer_data;
+JSONVar data, timer_data;
 timer_values_t timer_values;
-char from_hour[4], from_minute[4], to_hour[4], to_minute[4];
 
 time_t system_time, last_ntp_sync;
 tm tm;
@@ -60,7 +59,6 @@ void save_timer_values_to_file() {
     }
 
     update_timer_data();
-
     if (file.print(JSON.stringify(timer_data).c_str())) {
         Serial.printf("[LITTLEFS] writing `%s` to file\n", JSON.stringify(timer_data).c_str());
         Serial.println("[LITTLEFS] Timer values saved");
@@ -109,6 +107,8 @@ void read_timer_values_from_file() {
         (uint8_t)String(timer_values["to"]["minute"]).toInt()
     };
 
+    timer_enabled = String(timer_values["enabled"]).toInt();
+
     Serial.printf("[UPDATE_TIMER_VALUES] %02d:%02d to %02d:%02d\n",
             new_values.from_hour, new_values.from_minute,
             new_values.to_hour, new_values.to_minute);
@@ -271,6 +271,13 @@ void timer_toggle() {
     timer_enabled = !timer_enabled;
 }
 
+void clear_data() {
+    JSONVar keys = data.keys();
+    for (int i = 0; i < keys.length(); i++) {
+        data[keys[i]] = undefined;
+    }
+}
+
 void update_data() {
     data["main-output-enabled"] = String(main_output_enabled);
     data["system-local-domain"] = String(MDNS_DOMAIN);
@@ -279,13 +286,9 @@ void update_data() {
     data["system-time"]         = (long)system_time;
     data["wifi-ssid"]           = WIFI_SSID;
     data["wifi-rssi"]           = WiFi.RSSI();
-    data["timer-enabled"]       = String(timer_enabled);
 
     update_timer_data();
-    data["from"]["hour"]   = from_hour;
-    data["from"]["minute"] = from_minute;
-    data["to"]["hour"]     = to_hour;
-    data["to"]["minute"]   = to_minute;
+    data["timer"] = timer_data;
 }
 
 void update_all_socket_clients() {
@@ -298,28 +301,30 @@ void update_all_clients_checkbox() {
     JSONVar output_data;
     output_data["type"] = "cb";
     output_data["main-output-enabled"] = String(main_output_enabled);
-    output_data["timer-enabled"] = String(timer_enabled);
+    output_data["timer"]["enabled"] = String(timer_enabled);
     String output_data_as_json = JSON.stringify(output_data);
     web_socket.broadcastTXT(output_data_as_json);
 }
 
+String left_pad(uint8_t n) {
+    return n < 10 ? "0" + String(n) : String(n);
+}
+
 void update_timer_data() {
-    snprintf(from_hour,   4, "%02d", timer_values.from_hour);
-    snprintf(from_minute, 4, "%02d", timer_values.from_minute);
-    snprintf(to_hour,     4, "%02d", timer_values.to_hour);
-    snprintf(to_minute,   4, "%02d", timer_values.to_minute);
-
-    timer_data["from"]["hour"]   = from_hour;
-    timer_data["from"]["minute"] = from_minute;
-    timer_data["to"]["hour"]     = to_hour;
-    timer_data["to"]["minute"]   = to_minute;
+    timer_data["enabled"]        = String(timer_enabled);
+    timer_data["from"]["hour"]   = left_pad(timer_values.from_hour);
+    timer_data["from"]["minute"] = left_pad(timer_values.from_minute);
+    timer_data["to"]["hour"]     = left_pad(timer_values.to_hour);
+    timer_data["to"]["minute"]   = left_pad(timer_values.to_minute);
 }
 
 void update_all_clients_timer_values() {
     // String output_data_as_json = build_timer_values_json();
-    timer_data["type"] = "timer";
+    clear_data();
+    data["type"] = "timer";
     update_timer_data();
-    web_socket.broadcastTXT(JSON.stringify(timer_data).c_str());
+    data["timer"] = timer_data;
+    web_socket.broadcastTXT(JSON.stringify(data).c_str());
 }
 
 void update_timer_values(const timer_values_t new_values) {
@@ -364,20 +369,20 @@ void webp_socket_event(uint8_t num, WStype_t type, uint8_t *payload, size_t len)
                 update_all_clients_checkbox();
                 break;
             case TIMER_SET_VALUES: {
-                    payload++;
+                    payload++; // skip query type
                     Serial.printf("[SOCKET] %s\n", payload);
-                    JSONVar timer_values = JSON.parse((char *)payload);
+                    timer_data = JSON.parse((char *)payload);
 
-                    if(JSON.typeof(timer_values) == "undefined") {
+                    if(JSON.typeof(timer_data) == "undefined") {
                         Serial.println("[SOCKET] Parsing payload failed!");
                         break;
                     }
 
                     timer_values_t new_values = {
-                        (uint8_t)String(timer_values["from"]["hour"]).toInt(),
-                        (uint8_t)String(timer_values["from"]["minute"]).toInt(),
-                        (uint8_t)String(timer_values["to"]["hour"]).toInt(),
-                        (uint8_t)String(timer_values["to"]["minute"]).toInt()
+                        (uint8_t)String(timer_data["from"]["hour"]).toInt(),
+                        (uint8_t)String(timer_data["from"]["minute"]).toInt(),
+                        (uint8_t)String(timer_data["to"]["hour"]).toInt(),
+                        (uint8_t)String(timer_data["to"]["minute"]).toInt()
                     };
 
                     update_timer_values(new_values);