Expected '}' before 'byte' among many other odd errors

Hey all I am getting some odd errors when I compile my sketch:

/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:34:1: error: expected '}' before 'byte'
 byte hh=0; 
 ^
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:34:1: error: expected ',' or ';' before 'byte'
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino: In function 'void loop()':
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:128:27: error: 'hh' was not declared in this scope
     if (mi>=60) { mi-=60; hh++; }
                           ^
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:129:9: error: 'hh' was not declared in this scope
     if (hh>=24) { hh-=24; dddd++; }
         ^
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino: In function 'String getUptime()':
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:136:53: error: 'hh' was not declared in this scope
   sprintf(timestring,"%dd.%02dh.%02dm.%02ds", dddd, hh, mi, ss);
                                                     ^
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino: In lambda function:
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:145:56: error: no matching function for call to 'ESP8266WebServer::send(int, const char [10], const uint8_t [72860], const uint32_t&)'
     server.send(200, "text/html", HTML_Bytes, HTML_SIZE);
                                                        ^
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:145:56: note: candidates are:
In file included from /run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:4:0:
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:118:8: note: void ESP8266WebServer::send(int, const char*, const String&)
   void send(int code, const char* content_type = NULL, const String& content = String(""));
        ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:118:8: note:   candidate expects 3 arguments, 4 provided
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:119:8: note: void ESP8266WebServer::send(int, char*, const String&)
   void send(int code, char* content_type, const String& content);
        ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:119:8: note:   candidate expects 3 arguments, 4 provided
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:120:8: note: void ESP8266WebServer::send(int, const String&, const String&)
   void send(int code, const String& content_type, const String& content);
        ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/libraries/ESP8266WebServer/src/ESP8266WebServer.h:120:8: note:   candidate expects 3 arguments, 4 provided
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino: In function 'void handle_status()':
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:245:3: error: 'esp_err_t' was not declared in this scope
   esp_err_t ret = esp_wifi_get_mac(WIFI_IF_STA, macAddr); 
   ^
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:245:13: error: expected ';' before 'ret'
   esp_err_t ret = esp_wifi_get_mac(WIFI_IF_STA, macAddr); 
             ^
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:254:7: error: 'ret' was not declared in this scope
   if (ret == ESP_OK) {
       ^
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:254:14: error: 'ESP_OK' was not declared in this scope
   if (ret == ESP_OK) {
              ^
In file included from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Numbers/FloatTraits.hpp:13:0,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Numbers/convertNumber.hpp:15,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Variant/VariantData.hpp:10,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Memory/ResourceManager.hpp:13,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Variant/JsonVariantConst.hpp:10,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Variant/VariantRefBase.hpp:9,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp:7,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Array/JsonArray.hpp:7,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson.hpp:29,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson.h:9,
                 from /run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:14:
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace_generic.hpp: In instantiation of 'const T* ArduinoJson::V730PB22::detail::pgm_read(const T* const*) [with T = char]':
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Deserialization/DeserializationError.hpp:85:42:   required from here
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/pgmspace_generic.hpp:25:52: error: 'const void*' is not a pointer-to-object type
   return reinterpret_cast<const T*>(pgm_read_ptr(p));
                                                    ^
In file included from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/type_traits.hpp:16:0,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/utility.hpp:7,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Memory/MemoryPoolList.hpp:9,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Memory/ResourceManager.hpp:8,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Variant/JsonVariantConst.hpp:10,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Variant/VariantRefBase.hpp:9,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp:7,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Array/JsonArray.hpp:7,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson.hpp:29,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson.h:9,
                 from /run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:14:
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp: In instantiation of 'const bool ArduinoJson::V730PB22::detail::is_convertible<IPAddress, long long int>::value':
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_enum.hpp:17:65:   required from 'const bool ArduinoJson::V730PB22::detail::is_enum<IPAddress>::value'
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Variant/VariantRefBase.hpp:300:37:   required from 'bool ArduinoJson::V730PB22::detail::VariantRefBase<TDerived>::doSet(const T&) const [with TConverter = ArduinoJson::V730PB22::Converter<IPAddress, void>; T = IPAddress; TDerived = ArduinoJson::V730PB22::detail::MemberProxy<ArduinoJson::V730PB22::JsonDocument&, ArduinoJson::V730PB22::detail::RamString>]'
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Variant/VariantRefBase.hpp:82:17:   required from 'bool ArduinoJson::V730PB22::detail::VariantRefBase<TDerived>::set(const T&) const [with T = IPAddress; TDerived = ArduinoJson::V730PB22::detail::MemberProxy<ArduinoJson::V730PB22::JsonDocument&, ArduinoJson::V730PB22::detail::RamString>]'
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Object/MemberProxy.hpp:38:5:   required from 'ArduinoJson::V730PB22::detail::MemberProxy< <template-parameter-1-1>, <template-parameter-1-2> >& ArduinoJson::V730PB22::detail::MemberProxy< <template-parameter-1-1>, <template-parameter-1-2> >::operator=(const T&) [with T = IPAddress; TUpstream = ArduinoJson::V730PB22::JsonDocument&; AdaptedString = ArduinoJson::V730PB22::detail::RamString]'
/run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:250:23:   required from here
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp:33:47: error: conversion from 'const IPAddress' to 'long long int' is ambiguous
   static const bool value = sizeof(probe(from_)) == sizeof(int);
                                               ^
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp:33:47: note: candidates are:
In file included from /run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/libraries/ESP8266WiFi/src/ESP8266WiFi.h:31:0,
                 from /run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:2:
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:169:9: note: IPAddress::operator ip_addr_t*() <near match>
         operator       ip_addr_t*()       { return &_ip; }
         ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:169:9: note:   no known conversion for implicit 'this' parameter from 'const IPAddress*' to 'IPAddress*'
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:168:9: note: IPAddress::operator const ip_addr_t*() const <near match>
         operator const ip_addr_t*() const { return &_ip; }
         ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:168:9: note:   no known conversion for implicit 'this' parameter from 'const ip_addr_t* {aka const ip4_addr*}' to 'long long int'
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:96:9: note: IPAddress::operator bool() const
         operator bool () const { return isSet(); } // <-
         ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:97:9: note: IPAddress::operator bool() <near match>
         operator bool ()       { return isSet(); } // <- both are needed
         ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:97:9: note:   no known conversion for implicit 'this' parameter from 'const IPAddress*' to 'IPAddress*'
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:92:9: note: IPAddress::operator u32_t() const
         operator u32_t()    const { return isV4()? v4():    (u32_t)0; }
         ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:93:9: note: IPAddress::operator u32_t() <near match>
         operator u32_t()          { return isV4()? v4():    (u32_t)0; }
         ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:93:9: note:   no known conversion for implicit 'this' parameter from 'const IPAddress*' to 'IPAddress*'
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:90:9: note: IPAddress::operator uint32_t() const
         operator uint32_t() const { return isV4()? v4(): (uint32_t)0; }
         ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:91:9: note: IPAddress::operator uint32_t() <near match>
         operator uint32_t()       { return isV4()? v4(): (uint32_t)0; }
         ^
/run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/IPAddress.h:91:9: note:   no known conversion for implicit 'this' parameter from 'const IPAddress*' to 'IPAddress*'
In file included from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/type_traits.hpp:16:0,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/utility.hpp:7,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Memory/MemoryPoolList.hpp:9,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Memory/ResourceManager.hpp:8,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Variant/JsonVariantConst.hpp:10,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Variant/VariantRefBase.hpp:9,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp:7,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Array/JsonArray.hpp:7,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson.hpp:29,
                 from /var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson.h:9,
                 from /run/arduino/sketches/new_sketch_1735593095998/new_sketch_1735593095998.ino:14:
/var/run/arduino/directories-user/libraries/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp:27:14: error:   initializing argument 1 of 'static int ArduinoJson::V730PB22::detail::is_convertible<From, To>::probe(To) [with From = IPAddress; To = long long int]'
   static int probe(To);
              ^
Multiple libraries were found for "ArduinoJson.h"
  Used: /run/arduino/directories-data/internal/ArduinoJson_7.3.0_a945343896527e13
  Not used: /run/arduino/directories-data/internal/ThingESP_1.3.0_208e658d67936be5
  Not used: /run/arduino/directories-data/internal/IOTKME_3.0.1_7d34512d830e21de
  Not used: /run/arduino/directories-data/internal/BaleMessengerBot_Arduino_0.1.0_1c24e4f4119896e7
  Not used: /run/arduino/directories-data/internal/Antares_ESP8266_MQTT_0.9.2_1274de5a8b70ade9
  Not used: /run/arduino/directories-data/internal/CMMC_MQTT_Connector_1.3.3_dcef02afc5e24717
  Not used: /run/arduino/directories-data/internal/ThingsIoT_1.2.0_edc19382eb41a2f2
  Not used: /run/arduino/directories-data/internal/CoogleIOT_1.3.1_313ac29f75180276
  Not used: /run/arduino/directories-data/internal/AllThingsTalk_LTE-M_SDK_2.0.4_dc42d2d7f4bad257
  Not used: /run/arduino/directories-data/internal/Antares_ESP8266_HTTP_1.3.3_e986087bedd31584
Multiple libraries were found for "Adafruit_BusIO_Register.h"
  Used: /run/arduino/directories-data/internal/Adafruit_BusIO_1.16.2_6b04f8b31fa0f1a8
  Not used: /run/arduino/directories-data/internal/VEGAIoT_BusIO_1.0.0_68606b9abaf94dc3
Multiple libraries were found for "Wire.h"
  Used: /run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/libraries/Wire
  Not used: /run/arduino/directories-data/internal/FlexWire_1.2.1_1fc5f1d1a14af0e7
Multiple libraries were found for "SPI.h"
  Used: /run/arduino/directories-data/packages/esp8266/hardware/esp8266/2.5.0/libraries/SPI
  Not used: /run/arduino/directories-data/internal/EventEthernet_1.0.0_bd9dd894ef7641f8

Sketch:

#if defined(ESP8266)
  #include <ESP8266WiFi.h>
  #include <WiFiClient.h>
  #include <ESP8266WebServer.h>
#elif defined(ESP32)
  #include <WiFi.h>
  #include <WiFiClient.h>
  #include <WebServer.h>
#endif

#include <WiFiUdp.h>
#include <Adafruit_EMC2101.h>

#include <ArduinoJson.h>
#include "customOTA.h"


/*       /---------\
        /           \
       /    WeMos    \
   TX |o            o| RST
   RX |o            o| A0
   D1 |o            o| D0
   D2 |o            o| D5
   D3 |o            o| D6
   D4 |o            o| D7
   G  |o            o| D8
   5v |o            o| 3v3
      |             /
      |            |
      --------------
*/

byte hh=0; 
byte mi=0; 
byte ss=0;
unsigned int dddd=0;
unsigned long lastTick=0;

Adafruit_EMC2101  emc2101;

String buf;

#define APSSID "tellurideRelay"
#define APPSK "Tdkcjitn"

uint8_t macAddr[6];
int relayOn = 1;
int relayOff = 0;

boolean relay1State = false;
boolean relay2State = false;
boolean ledState = false;

const int relay1 = D5; //Relay 2 (right side) [Monitors]
const int relay2 = D6; //Relay 1 (left side) [Wifi Internet]
const int blueLED = 2;

IPAddress ip(192, 168, 77, 77);
IPAddress gateway(192, 168, 77, 1);
IPAddress subnet(255, 255, 255, 0);

DynamicJsonDocument doc(512);

ESP8266WebServer server(80);

void setup() {  
  Serial.begin(115200);

  Serial.println("Setting relays off");

  digitalWrite(relay1, relayOff); //First to prevent relays
  digitalWrite(relay2, relayOff); //from coming on during boot

  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);

  Serial.println("Setting blue LED off");
  pinMode(blueLED, OUTPUT);
  digitalWrite(blueLED, relayOn);

  createStaticIP();
  addOTAUpdate();

  server.on("/r1/1", handle_relay1on);
  server.on("/r1/0", handle_relay1off);
  server.on("/r2/1", handle_relay2on);
  server.on("/r2/0", handle_relay2off);
  server.on("/status", handle_status);
  server.on("/led/1", handle_ledon);
  server.on("/led/0", handle_ledoff);
  server.on("/both/1", handle_bothon);
  server.on("/both/0", handle_bothoff);
  server.on("/fan", handle_fanSpeed);
  server.onNotFound(handleNotFound);

  // Try to initialize!
  if (!emc2101.begin()) {
    Serial.println("Failed to find EMC2101 chip");
    while (1) { delay(10); }
  }

  switch (emc2101.getDataRate()) {
    case EMC2101_RATE_1_16_HZ: Serial.println("1/16_HZ"); break;
    case EMC2101_RATE_1_8_HZ: Serial.println("1/8_HZ"); break;
    case EMC2101_RATE_1_4_HZ: Serial.println("1/4_HZ"); break;
    case EMC2101_RATE_1_2_HZ: Serial.println("1/2_HZ"); break;
    case EMC2101_RATE_1_HZ: Serial.println("1 HZ"); break;
    case EMC2101_RATE_2_HZ: Serial.println("2 HZ"); break;
    case EMC2101_RATE_4_HZ: Serial.println("4 HZ"); break;
    case EMC2101_RATE_8_HZ: Serial.println("8 HZ"); break;
    case EMC2101_RATE_16_HZ: Serial.println("16 HZ"); break;
    case EMC2101_RATE_32_HZ: Serial.println("32 HZ"); break;
  }

  emc2101.enableTachInput(true);
  emc2101.setPWMDivisor(0);
  emc2101.setDutyCycle(50);
}

void loop() {
  server.handleClient();
  
  if ((micros() - lastTick) >= 1000000UL) {
    lastTick += 1000000UL;
    ss++;
    if (ss>=60) { ss-=60; mi++; }
    if (mi>=60) { mi-=60; hh++; }
    if (hh>=24) { hh-=24; dddd++; }
  }
}

String getUptime() {
  char timestring[25];

  sprintf(timestring,"%dd.%02dh.%02dm.%02ds", dddd, hh, mi, ss);

  return timestring;
}

void addOTAUpdate() {
  server.on("/", HTTP_GET, []() { 
    server.sendHeader(F("Content-Encoding"), F("gzip"));
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", HTML_Bytes, HTML_SIZE);
  });

  server.on("/ssidVer", HTTP_GET, []() { 
    handle_status();
  });

  server.on(
    "/upload", HTTP_POST, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
      ESP.restart();
    },
    []() {
      HTTPUpload& upload = server.upload();

      if (upload.status == UPLOAD_FILE_START) {
        Serial.setDebugOutput(true);
        WiFiUDP::stopAll();
        Serial.printf("Update: %s\n", upload.filename.c_str());
        uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;

        if (!Update.begin(maxSketchSpace)) {  // start with max available size
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_WRITE) {
        if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_END) {
        if (Update.end(true)) {  // true to set the size to the current progress
          Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
        } else {
          Update.printError(Serial);
        }

        Serial.setDebugOutput(false);
      }

      yield();
    }
  );
}

void createStaticIP() {
  Serial.print("Setting AP Mode...");
  WiFi.mode(WIFI_AP);
  Serial.println("Done!");

  Serial.print("Setting soft-AP configuration...");
  WiFi.softAPConfig(ip, ip, subnet);
  Serial.println("Done!");

  Serial.print("Setting AP...");
  WiFi.softAP(APSSID, APPSK);
  Serial.println("Done!");

  Serial.print("Setting up auto reconnect...");
  WiFi.setAutoReconnect(true);
  Serial.println("Done!");

  Serial.print("Setting up persistent...");
  WiFi.persistent(true);
  Serial.println("Done!");

  WiFi.begin();
  server.begin();

  Serial.print("IP: ");
  Serial.println(ip);
  Serial.println("All completed!");
}

void handleNotFound() {
  String message = "File Not Found\n\n";

  message += "URI:";
  message += server.uri();
  message += "\nMethod:";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments:";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++)
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";

  server.sendHeader("Access-Control-Allow-Origin", "*");
  server.send(404, "text/plain", message);
}

void sendOutJsonResponse() {
  serializeJson(doc, buf);
  server.sendHeader("Access-Control-Allow-Origin", "*");
  server.send(200, F("application/json"), buf);
  doc.clear();
  buf = "";
}

void handle_status() {
  char buffer[20];
  esp_err_t ret = esp_wifi_get_mac(WIFI_IF_STA, macAddr); 

  doc["relay1"]       = relay1State;
  doc["relay2"]       = relay2State;
  doc["led"]          = ledState;
  doc["ip"]           = ip;
  doc["gateway"]      = gateway;
  doc["subnet"]       = subnet;

  if (ret == ESP_OK) {
    sprintf(buffer, "%02x:%02x:%02x:%02x:%02x:%02x", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
    doc["mac"]          = buffer;
  } else {
    doc["mac"]          = "0.0.0.0.0.0";
  }

  doc["ssid"]         = APSSID;
  doc["file"]         = __FILE__;
  doc["compile_date"] = __DATE__;
  doc["compile_time"] = __TIME__;
  doc["chipId"]       = ESP.getChipId();
  doc["SDK"]          = ESP.getSdkVersion();
  doc["uptime"]       = getUptime();
  doc["temp"]         = getTemp();
  doc["fan"]          = getFan();

  sendOutJsonResponse();
}

int getTemp() {
  return emc2101.getInternalTemperature();
}

int getFan() {
  return emc2101.getFanRPM();
}

void handle_fanSpeed() {
  String value = server.arg("value"); //this lets you access a query param (http://x.x.x.x/action1?value=1)
  emc2101.setDutyCycle(atoi(server.arg(0).c_str())); //server.pathArg(0)
}

void handle_bothon() {
  if (!relay1State) {
    Serial.println("relay 1 ON");
    digitalWrite(relay1, relayOn);
    relay1State = true;
    doc["relay1"] = relay1State;
  } else {
    doc["relay1"] = relay1State;
  }

  if (!relay2State) {
    Serial.println("relay 2 ON");
    digitalWrite(relay2, relayOn);
    relay2State = true;
    doc["relay2"] = relay2State;
  } else {
    doc["relay2"] = relay2State;
  }

  sendOutJsonResponse();
}

void handle_bothoff() {
  if (relay1State) {
    Serial.println("relay 1 OFF");
    digitalWrite(relay1, relayOff);
    relay1State = false;
    doc["relay1"] = relay1State;
  } else {
    doc["relay1"] = relay1State;
  }

  if (relay2State) {
    Serial.println("relay 2 OFF");
    digitalWrite(relay2, relayOff);
    relay2State = false;
    doc["relay2"] = relay2State;
  } else {
    doc["relay2"] = relay2State;
  }

  sendOutJsonResponse();
}

void handle_ledon() {
  ledState = true;
  doc["led"] = ledState;

  Serial.println("Led ON");
  digitalWrite(blueLED, LOW);

  sendOutJsonResponse();
}

void handle_ledoff() {
  ledState = false;
  doc["led"] = ledState;

  Serial.println("Led OFF");
  digitalWrite(blueLED, HIGH);

  sendOutJsonResponse();
}

void handle_relay1on() {
  relay1State = true;
  doc["relay1"] = relay1State;
  doc["relay2"] = relay2State;

  Serial.println("relay 1 ON");
  digitalWrite(relay1, relayOn);

  sendOutJsonResponse();
}

void handle_relay1off() {
  relay1State = false;
  doc["relay1"] = relay1State;
  doc["relay2"] = relay2State;

  Serial.println("relay 1 OFF");
  digitalWrite(relay1, relayOff);

  sendOutJsonResponse();
}

void handle_relay2on() {
  relay2State = true;
  doc["relay1"] = relay1State;
  doc["relay2"] = relay2State;

  Serial.println("relay 2 ON");
  digitalWrite(relay2, relayOn);

  sendOutJsonResponse();
}

void handle_relay2off() {
  relay2State = false;
  doc["relay1"] = relay1State;
  doc["relay2"] = relay2State;

  Serial.println("relay 2 OFF");
  digitalWrite(relay2, relayOff);

  sendOutJsonResponse();
}

I dont understand why I am getting this error as I have the variable defined?

Can someone spot what I obvious can not see?

My full code can be compiled here.

Please post your sketch and full error message here, using code tags when you do

Done.

What board is it for

Sorry, can't compile, missing a file ArduinoJson.h

Now missing CustomOTA

From the error messages, looks like ESP8266, v2.5.0 core.

I tried an 8266, but now I am working through missing files but the last one doesn't show up at all. customOTA

Yeah, I imagine that's local. My patience is quickly evaporating.

Me too, all kinds of ifdef for hardware etc. If he knows enough to write code for multiple platforms he should be able to spot a missing ; or}

If . . .

:wink:

customOTA should be there?

Ah. The header file in question comprises two (well, almost two) statements, starting with:

const uint32_t HTML_SIZE = 184748;
const uint8_t HTML_Bytes[] PROGMEM = { 31,139,8,0,0,0,0,0,4,0,212,187,215,178,227,72,150,45,248,92,253,21,49,217,214,115,171,12,25,5,173,34,187,219,46,20,9,128,0,72,8,18,226,13,90,11,66,16,0,211,234,223,199,121,78,68,102,68,170,202,106,187,54,99,195,48,30,2,46,183,111,223,98,45,7,226,63,255,47,241,44,56,254,69,250,80,204,109,243,223,255,246,1,124,254,243,235,203,52,76,62,95,182,233,28,126,232,194,54,253,175,239,30,101,186,14,253,56,127,247,

and 607 lines later

10,63,144,120,237,251,104,169,184,118,23,145,148,220,55,45,115,189,141,3

and that's it. Unless the online editor is not showing the complete file, you're missing

};

to make that second statement complete. Maybe that's because less than half of the supposed 184K bytes are present.

Yeah not sure why it left out the }; but I had that already in the original one.

From my many tests it seems that the version of the AndroidJSON needed to be in the 6.x range instead of the 7.x range. After setting it to the highest 6.x it compiled without any issues.