diff --git a/switcheroo.ino b/switcheroo.ino index 60ab4c9..8afcba0 100644 --- a/switcheroo.ino +++ b/switcheroo.ino @@ -1,40 +1,57 @@ #include +#include +#include +#include +#include +#include #include "secrets.h" +ESP8266WebServer server(80); +bool still_pressed = false; +bool relay_active = false; + void setup() { + WiFi.mode(WIFI_STA); + pinMode(12, OUTPUT); // relay pinMode(13, OUTPUT); // button pinMode(0, INPUT); // led - Serial.begin(9600); - Serial.println(); - Serial.println(); - Serial.print("Connecting to "); - Serial.println(ssid); - WiFi.mode(WIFI_STA); + // setup serial and network + Serial.begin(115200); WiFi.begin(ssid, password); + Serial.println("Serial interface initialized"); + Serial.print("Connecting to wifi "); + Serial.print(ssid); + + // Wait for connection while (WiFi.status() != WL_CONNECTED) { digitalWrite(13, !digitalRead(13)); delay(500); Serial.print("."); } + // serial output of connection details Serial.println(""); - Serial.println("WiFi connected"); - Serial.println("IP address: "); + Serial.print("Connected to "); + Serial.println(ssid); + Serial.print("IP address: "); Serial.println(WiFi.localIP()); + + // create HTTP server + server.on("/", handleMainpage); + server.on("/relay", handleRelay); + + server.begin(); + Serial.println("HTTP server started"); } -bool still_pressed = false; void loop() { if(!digitalRead(0)) { - uint8_t relay_status = digitalRead(12); - Serial.print("Old status: "); - Serial.println(relay_status); - digitalWrite(13, !relay_status); // set LED - digitalWrite(12, !relay_status); // set relay - delay(200); + setRelay(!digitalRead(12)); + delay(500); // give the user time to release the button + if(!digitalRead(0)) { still_pressed = true; } else { @@ -46,10 +63,76 @@ void loop() { software_reset(); } - delay(10); + server.handleClient(); } void software_reset() { wdt_enable(WDTO_15MS); while(1) {}; } + +void handleMainpage() { + server.send(200, "text/html", "https://git.geekify.de/sqozz/switcheroo"); +} + +void handleRelay() { + String data = server.arg("plain"); + String result; + + Serial.println("relay endpoint requested"); + + if (data != "") { + Serial.println("change request"); + StaticJsonBuffer<200> newBuffer; + JsonObject& json = newBuffer.parseObject(data); + + if (json["active"] == "true") { + Serial.println("on"); + result = setRelay(true); + } else if (json["active"] == "false") { + Serial.println("off"); + result = setRelay(false); + } + } else { + Serial.println("status requested"); + result = generateStatusJson(); + } + server.send(200, "text/json", result); + + Serial.println(""); + Serial.println(""); +} + +String setRelay(bool req_status) { + Serial.print("Old status: "); + Serial.println(relay_active); + Serial.print("New status: "); + Serial.println(req_status); + + + digitalWrite(12, req_status); // set relay + bool old_status = relay_active; + relay_active = digitalRead(12); + digitalWrite(13, !relay_active); // set LED to the physical relay status + + Serial.println(""); + Serial.println(""); + + return generateChangeJson(old_status, req_status, relay_active); +} + +String generateChangeJson(bool old_status, bool req_status, bool new_status) { + String status = ""; + bool success = (req_status == new_status); + if (success) { + status = ", \"status\" : { \"old\" : " + String(old_status) + ", \"new\" : " + String(new_status) + ", \"req\": " + String(req_status) + " }"; + } + String retJson = "{ \"success\" : " + String(success) + status + " }"; + + return retJson; +} + +String generateStatusJson() { + String status = "{ \"status\" : " + String(relay_active) + " }"; + return status; +}