#include #include #include #include #include #include #include //#define SERIAL_DEBUG #ifdef SERIAL_DEBUG # define SERIAL_BEGIN Serial.begin(115200) # define SERIAL_PRINT Serial.print # define SERIAL_PRINTLN Serial.println # define IR_SEND_PIN 2 #else # define SERIAL_BEGIN # define SERIAL_PRINT(...) # define SERIAL_PRINTLN(...) # define IR_SEND_PIN 3 #endif #define WIFI_CONNECT_TIMEOUT 30000L #define WHILE_LOOP_DELAY 200L #define WHILE_LOOP_STEPS (WIFI_CONNECT_TIMEOUT / ( 3 * WHILE_LOOP_DELAY )) #define DELAY_BETWEEN_COMMANDS 200 IRsend irsend(IR_SEND_PIN); std::unique_ptr server; ESP8266HTTPUpdateServer httpUpdater; #ifdef SERIAL_DEBUG void heartBeatPrint(void) { static int num = 1; if (WiFi.status() == WL_CONNECTED) Serial.print("H"); // H means connected to WiFi else Serial.print("F"); // F means not connected to WiFi if (num == 80) { SERIAL_PRINTLN(); num = 1; } else if (num++ % 10 == 0) { Serial.print(" "); } } void check_status() { static ulong checkstatus_timeout = 0; //KH #define HEARTBEAT_INTERVAL 10000L // Print hearbeat every HEARTBEAT_INTERVAL (10) seconds. if ((millis() > checkstatus_timeout) || (checkstatus_timeout == 0)) { heartBeatPrint(); checkstatus_timeout = millis() + HEARTBEAT_INTERVAL; } } #endif void blaster(const uint16_t rawDataA[27], const uint16_t rawDataB[27]) { irsend.sendRaw(rawDataA, 27, 36); delay(DELAY_BETWEEN_COMMANDS); // irsend.sendRaw(rawDataA, 27, 36); // delay(DELAY_BETWEEN_COMMANDS); // irsend.sendRaw(rawDataB, 27, 36); // delay(DELAY_BETWEEN_COMMANDS); irsend.sendRaw(rawDataB, 27, 36); delay(DELAY_BETWEEN_COMMANDS); irsend.sendRaw(rawDataB, 27, 36); delay(DELAY_BETWEEN_COMMANDS); irsend.sendRaw(rawDataA, 27, 36); } // Buttons are using the bootstrap grid for sizing - http://getbootstrap.com/css/#grid String generateButton(String colSize, String id, String text, String url) { return "
\n" + " \n" + "
\n"; } #define TITLE F("
\n/   " \ "/accova   " \ "/infos   " \ "/update   " \ "

\n") void handleRoot() { String res = F(""); res += WiFi.hostname(); res += TITLE; res += F("\n"); server->send(200, "text/html", res); } void handleNotFound() { String res = F(""); res += WiFi.hostname(); res += TITLE; res += "File Not Found

\n\n"; res += "URI: "; res += server->uri(); res += "
\nMethod: "; res += (server->method() == HTTP_GET)?"GET":"POST"; res += "
\nArguments: "; res += server->args(); res += "
\n"; for (uint8_t i = 0; i < server->args(); i++) { res += " " + server->argName(i) + ": " + server->arg(i) + "
\n"; } res += F("\n"); server->send(404, "text/html", res); } void handleInfos() { // DEBUG_INFOS_LOGGER(F("infos() : IN")); uint8_t mac[6]; char addr[18]; String res = F(""); res += WiFi.hostname(); res += TITLE; res += F("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
WiFi.hostname()"); res += WiFi.hostname(); res += F("
Compiled at" __DATE__ " " __TIME__); res += F("
Uptime"); res += String((millis() / 1000)); res += F("s
WiFi.getMode()"); res += WiFi.getMode(); res += F("
WiFi.macAddress()"); WiFi.macAddress(mac); snprintf(addr, 18, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); res += addr; res += F("
WiFi.softAPmacAddress()"); WiFi.softAPmacAddress(mac); snprintf(addr, 18, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); res += addr; res += F("
WiFi.softAPgetStationNum()"); res += WiFi.softAPgetStationNum(); res += F("
Address(es)"); for (auto a : addrList) { res += a.toString(); if (a.isLegacy()) { res += F("/"); res += a.netmask().toString(); res += F(" GW "); res += a.gw().toString(); } res += F(" ;\n"); } res += F("
WiFi.dnsIP()"); snprintf(addr, 18, "%d.%d.%d.%d", WiFi.dnsIP()[0], WiFi.dnsIP()[1], WiFi.dnsIP()[2], WiFi.dnsIP()[3]); res += addr; res += F("
BootMode"); res += ESP.getBootMode(); res += F("
SdkVersion"); res += ESP.getSdkVersion(); res += F("
BootVersion"); res += ESP.getBootVersion(); res += F("
ChipId"); res += ESP.getChipId(); res += F("
FlashChipSize"); res += ESP.getFlashChipSize(); res += F("
FlashChipRealSize"); res += ESP.getFlashChipRealSize(); res += F("
FlashChipSizeByChipId"); res += ESP.getFlashChipSizeByChipId(); res += F("
FlashChipId"); res += ESP.getFlashChipId(); res += F("
FreeHeap"); res += ESP.getFreeHeap(); res += F("
\n"); res += F("\n"); server->send(200, "text/html", res); } void setup() { irsend.begin(); SERIAL_BEGIN; SERIAL_PRINTLN("\nStarting"); WiFi.hostname("ESP-SdB"); WiFiManager wifiManager; #ifndef SERIAL_DEBUG wifiManager.setDebugOutput(false); #endif wifiManager.setConnectTimeout(60); wifiManager.setConfigPortalTimeout(180); if(!wifiManager.autoConnect()) { Serial.println("failed to connect and hit timeout"); delay(3000); ESP.reset(); delay(5000); } server.reset(new ESP8266WebServer(80)); httpUpdater.setup(&(*server)); server->on("/", handleRoot); server->onNotFound(handleNotFound); server->on("/infos", handleInfos); server->on("/erase", []() { server->send(200, "text/plain", "erasing wifi config and rebooting in AP mode !"); WiFiManager wm; wm.resetSettings(); delay(3000); ESP.reset(); delay(5000); }); server->on("/accova", []() { SERIAL_PRINTLN("accova"); String res = F(""); res += WiFi.hostname(); res += TITLE; res += F("/accovaOff
" \ "/accovaOn175
" \ "/accovaOn180
" \ "/accovaOn190
" \ "/accovaOn200
" \ "/accovaOn210
" \ "/accovaOn220
" \ "/accovaOn225
" \ "/accovaOn230
" \ "/accovaOn235
" \ "/accovaOn240
" \ "/accovaOn245
" \ "/accovaOn250
" \ "/accovaOn255
" \ "/accovaOn260
" \ "/accovaOn280
" \ "/accovaBoost230
" \ "/accovaBoost260
" \ "/accovaBoost280
\n" \ "\n"); server->send(200, "text/html", res); }); server->on("/accovaOff", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 2000, 2000, 2000, 2000, 1000, 1000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOff"); blaster(rawDataA, rawDataB); res += F("OK accovaOff"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn175", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 2000, 1000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 2000, 1000, 1000, 1000, 1000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn175"); blaster(rawDataA, rawDataB); res += F("OK accovaOn175"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn180", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 1000, 2000, 2000, 2000, 1000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 2000, 1000, 2000, 2000, 1000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 1000, 2000, 2000, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn180"); blaster(rawDataA, rawDataB); res += F("OK accovaOn180"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn190", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 1000, 2000, 2000, 2000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 1000, 1000, 1000, 2000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 1000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 2000, 2000, 2000, 2000, 2000, 2000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn190"); blaster(rawDataA, rawDataB); res += F("OK accovaOn190"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn200", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 1000, 1000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 1000, 2000, 1000, 2000, 2000, 1000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 1000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 1000, 1000, 2000, 1000, 2000, 1000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn200"); blaster(rawDataA, rawDataB); res += F("OK accovaOn200"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn210", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 1000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 1000, 1000, 1000, 1000, 2000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 1000, 1000, 2000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 1000, 2000, 2000, 2000, 2000, 2000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn210"); blaster(rawDataA, rawDataB); res += F("OK accovaOn210"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn220", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 2000, 1000, 1000, 1062, 1000, 1000, 1000, 1000, 1000, 2000, 2000, 2000, 2000, 2000, 1000, 1000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn220"); blaster(rawDataA, rawDataB); res += F("OK accovaOn220"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn225", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 2000, 1000, 2000, 1000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 1000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 1000, 1000, 1000, 2000, 2000, 1000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn225"); blaster(rawDataA, rawDataB); res += F("OK accovaOn225"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn230", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 2000, 1000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 2000, 1000, 1000, 1000, 1000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn230"); blaster(rawDataA, rawDataB); res += F("OK accovaOn230"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn235", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 1000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 1000, 1000, 1000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 2000, 1000, 2000, 2000, 1000, 2000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn235"); blaster(rawDataA, rawDataB); res += F("OK accovaOn235"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn240", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 2000, 1000, 1000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 1000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 2000, 2000, 1000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn240"); blaster(rawDataA, rawDataB); res += F("OK accovaOn240"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn245", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 2000, 1000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 2000, 2000, 2000, 1000, 1000, 1000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn245"); blaster(rawDataA, rawDataB); res += F("OK accovaOn245"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn250", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 2000, 1000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 1000, 2000, 2000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 1000, 2000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 2000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn250"); blaster(rawDataA, rawDataB); res += F("OK accovaOn250"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn255", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 1000, 2000, 2000, 1000, 2000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 2000, 1000, 1000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 1000, 1000, 1000, 2000, 2000, 2000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn255"); blaster(rawDataA, rawDataB); res += F("OK accovaOn255"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn260", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 1000, 2000, 2000, 1000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 1000, 2000, 1000, 1000, 1000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 2000, 2000, 1000, 2000, 1000, 1000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn260"); blaster(rawDataA, rawDataB); res += F("OK accovaOn260"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaOn280", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 2000, 2000, 2000, 2000, 1000, 1000, 1000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 2000, 1000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 2000, 1000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 1000, 1000, 2000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaOn280"); blaster(rawDataA, rawDataB); res += F("OK accovaOn280"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaBoost230", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 1000, 2000, 2000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 1000, 2000, 2000, 2000, 2000, 1000, 2000, 2000, 1000, 1000, 2000, 2000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 2000, 2000, 1000, 2000, 1000, 2000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaBoost230"); blaster(rawDataA, rawDataB); res += F("OK accovaBoost230"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaBoost260", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 1000, 2000, 2000, 1000, 2000, 2000, 1000, 2000, 1000, 1000, 1000, 2000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 2000, 1000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 1000, 2000, 2000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 2000, 2000, 1000, 2000, 1000, 1000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaBoost260"); blaster(rawDataA, rawDataB); res += F("OK accovaBoost260"); res += F("\n"); server->send(200, "text/html", res); }); server->on("/accovaBoost280", [] { const uint16_t rawDataA[27] = {300, 2000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 1000, 2000, 1000, 1000, 1000, 2000, 2000, 2000, 2000, 1000, 1000, 1000, 1000, 1000, 1000, 2000, 2000, 1000}; const uint16_t rawDataB[27] = {300, 2000, 1000, 1000, 1000, 2000, 2000, 1000, 1000, 1000, 2000, 2000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 1000, 2000, 1000, 1000, 1000, 2000, 2000}; String res = F(""); res += WiFi.hostname(); res += TITLE; SERIAL_PRINTLN("accovaBoost280"); blaster(rawDataA, rawDataB); res += F("OK accovaBoost280"); res += F("\n"); server->send(200, "text/html", res); }); server->begin(); } void loop() { server->handleClient(); #ifdef SERIAL_DEBUG check_status(); #endif }