     // Wait until connected
   }
 
+    ArduinoOTA.onStart([]() {
+    Serial.println("Start");
+  });
+  ArduinoOTA.onEnd([]() {
+    Serial.println("\nEnd");
+  });
+  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
+    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
+  });
+  ArduinoOTA.onError([](ota_error_t error) {
+    Serial.printf("Error[%u]: ", error);
+    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
+    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
+    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
+    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
+    else if (error == OTA_END_ERROR) Serial.println("End Failed");
+  });
+  ArduinoOTA.begin();
+  Serial.println("Ready");
+  Serial.print("IP address: ");
+  Serial.println(WiFi.localIP());
+
+  rtc.begin();
+
+  EEPROM.begin(201); // EEPROM is zero-index: means addresses 0 to 200 are available (not 1 to 201 or 0 to 201).
+
   // START EEPROM WRITEBACK ROUTINE
-  if (EEPROM.read(eeIndex) > 1) // If this is true, than the index has advanced beyond the first position (meaning something was stored there (and maybe higher) to be written back.
-  {
-    for (int i = 1 ; i < 200 ; i++) {
-      eeWBsum += EEPROM.read(i);
-    }
-  }
-
-  // If there's something in EEPROM, write it to Today's Runtime
-  if (eeWBsum > 0) {
-    currentRuntimeSec = (eeWBsum * 60);
-  }
-
-  yesterdayRuntime = (EEPROM.read(200) * 4);
+  if (EEPROM.read(eeIndex) > 1)              // If this is true, than the index has advanced beyond the first position (meaning something was stored there (and maybe higher) to be written back.
+  {
+    for (int i = 1 ; i < 199 ; i++) {
+      eeWBsum += EEPROM.read(i);             // Add up values in addresses 1 through 198 and stick into eeWBsum.
+
+    }
+    eeTodaysStartsCount = EEPROM.read(199);    // Reads how many times the unit has started today (if any runs have been recorded).
+  }
+
+  todaysAccumRuntimeSec = (eeWBsum * 60);    // Writes seconds of today's accumulated runtime back to variable.
+  todaysAccumRuntimeMin = eeWBsum;           // Writes minutes of today's accumulated runtime back to variable (used for app runtime display only).
+  yesterdayRuntime = (EEPROM.read(200) * 4); // Writes minutes of yesterday's accumulated runtime back to variable (use for app runtime display only).
   // END EEPROM WRITEBACK ROUTINE
 
-  rtc.begin();
-
-  timer.setInterval(2500L, sendTemps);        // Temperature sensor polling interval
-  timer.setInterval(2500L, sendBlowerStatus); // Blower fan status polling interval
+  timer.setInterval(2500L, sendTemps);        // Temperature sensor polling and app display refresh interval.
+  timer.setInterval(2500L, sendStatus);       // Unit run status polling interval (for app Current Status display only).
   timer.setInterval(1000L, countRuntime);     // Counts blower runtime for daily accumulation displays.
   timer.setInterval(1000L, totalRuntime);     // Counts blower runtime for daily EEPROM storage.
-  timer.setInterval(500L, timeKeeper);
+  timer.setInterval(500L, timeKeeper);        // Track a cycle start/end time for app display.
   timer.setInterval(15432L, sfUpdate);        // ~15 sec run status updates to data.sparkfun.com
 
   heartbeatOn();
 }
 
-void loop()
+void loop()  // To keep Blynk happy, keep Blynk tasks out of the loop.
 {
   Blynk.run();
   timer.run();
-}
-
-void sfUpdate()  //  data.sparkfun update when unit is on
+  ArduinoOTA.handle();
+}
+
+void sfUpdate()
 {
   if (digitalRead(blowerPin) == LOW)
   {

    Serial.println();
    Serial.println("closing connection");
  }
  
 else if (digitalRead(blowerPin) == HIGH)
  {
    int runStatus = NULL;


  }
}

void sendStatus()
{
  if (resetLatch == 0) // Sets ESP start/reset time and date to display in app until blower activity.
  {
    resetHour = hour();
    resetMin = minute();
    resetMonth = month();
    resetDay = day();
    ++resetLatch;
  }

  // This wonderful mess displays what I need with AM/PM and leading zeros for minutes (for different scenarios).
  // I've tried more elegant or lean solutions, but they ended up more complex with more lines of code!
  if (digitalRead(blowerPin) == HIGH && resetTattle == 0 && resetMin > 9)
  {
    Blynk.virtualWrite(16, String("SYSTEM RESET at ") + resetHour + ":" + resetMin + " on " + resetMonth + "/" + resetDay);
  }
  else if (digitalRead(blowerPin) == HIGH && resetTattle == 0 && resetMin < 10)
  {
    Blynk.virtualWrite(16, String("SYSTEM RESET at ") + resetHour + ":0" + resetMin + " on " + resetMonth + "/" + resetDay);
  }
  else if (digitalRead(blowerPin) == LOW && resetTattle == 0 && resetMin > 9)
  {
    Blynk.virtualWrite(16, String("SYSTEM RESET at ") + resetHour + ":" + resetMin + " on " + resetMonth + "/" + resetDay);
  }
  else if (digitalRead(blowerPin) == LOW && resetTattle == 0 && resetMin < 10)
  {
    Blynk.virtualWrite(16, String("SYSTEM RESET at ") + resetHour + ":0" + resetMin + " on " + resetMonth + "/" + resetDay);
  }
  else if (digitalRead(blowerPin) == HIGH && resetTattle == 1) // Runs when blower is OFF.
  {
