switcheroo/switcheroo.ino

139 lines
3.1 KiB
C++

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <RCSwitch.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>
#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
// 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.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");
}
void loop() {
if(!digitalRead(0)) {
setRelay(!digitalRead(12));
delay(500); // give the user time to release the button
if(!digitalRead(0)) {
still_pressed = true;
} else {
still_pressed = false;
}
}
if (still_pressed) {
software_reset();
}
server.handleClient();
}
void software_reset() {
wdt_enable(WDTO_15MS);
while(1) {};
}
void handleMainpage() {
server.send(200, "text/html", "<html><a href=\"https://git.geekify.de/sqozz/switcheroo\">https://git.geekify.de/sqozz/switcheroo</a></html>");
}
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;
}