#include #include #include #include #include #include #include #include #include #include const char* host = "esp32gragedoor"; const char* ssid = "JoNelsDarlings"; const char* password = "Paris2016"; const char* mqtt_server = "mqtt.ddns.kawomi.com"; const int buttonPin = 4; // Reed switch - don't forget the pull down resistor. const int ledPin = 2; // Internal LED boolean bForceResend=false; int previousState; WebServer server(80); WiFiClient espClient; PubSubClient mqttClient(espClient); #define MSG_BUFFER_SIZE (50) char msg[MSG_BUFFER_SIZE]; /* * Login page */ const char* loginIndex = "
" "" "" "" "
" "
" "" "" "" "" "
" "
" "" "" "" "
" "
" "" "" "" "" "
" "
ESP32 Login Page
" "
" "
Username:
Password:
" "
" ""; /* * Server Index Page */ const char* serverIndex = "" "
" "" "" "
" "
progress: 0%
" ""; void send_notification(String subject){ //return; Serial.println("Sending Notification."); WiFiClientSecure client; client.setInsecure(); // NOT RECOMMENDED const char* host="deadswitch.kawomi.com"; const int port=443; if (!client.connect(host,port)) { Serial.println("connection failed"); return; } String url = "/api/v1?topic=" + subject + "&secs=0&email=none"; Serial.print("Requesting URL: "); Serial.println(url); client.print(String("POST ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 14\r\n\r\n" + "platform=esp32\r\n"); } void send_mqtt(String value){ const size_t CAPACITY = JSON_OBJECT_SIZE(1); StaticJsonDocument doc; // create an object JsonObject object = doc.to(); object["status"] = value.c_str(); // serialize the object and send the result to Serial static char sensorStatus[150]; serializeJson(doc, sensorStatus); Serial.println(sensorStatus); mqttClient.publish("Address/Livorno/Garagedoor", sensorStatus,true); } void reconnect() { // Loop until we're reconnected while (!mqttClient.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP32Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (mqttClient.connect(clientId.c_str())) { Serial.println("MQTT connected"); // Once connected, publish an announcement... } else { Serial.print("MQTT failed, rc="); Serial.print(mqttClient.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } /* * setup function */ void setup(void) { Serial.begin(9600); delay(500); Serial.println(">>>>>>>>>> Garage Door Monitor <<<<<<<<<<<<<<"); pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); // if we stat up we need to see what the status is... digitalWrite(ledPin, previousState= digitalRead(buttonPin)); Serial.printf("Initial State: %d",previousState); randomSeed(micros()); // Connect to WiFi network WiFi.begin(ssid, password); Serial.println(""); // Wait for connection or reboot if it doesn't connect for too long uint32_t wifiConnAttements = 0; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); if (wifiConnAttements++ > 120) { Serial.println(""); ESP.restart(); } } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); /*use mdns for host name resolution*/ if (!MDNS.begin(host)) { //http://esp32garagedoor.local while (1) { Serial.println("Error setting up MDNS responder!"); delay(1000); } } Serial.println("mDNS responder started"); mqttClient.setServer(mqtt_server, 1883); Serial.println("mqtt server set."); if(!SPIFFS.begin(true)){ Serial.println("An Error has occurred while mounting SPIFFS"); } //send_mqtt("rebooted"); send_notification("garagedoor.rebooted.livorno.address"); /*return index page which is stored in serverIndex */ server.on("/", HTTP_GET, []() { server.sendHeader("Connection", "close"); File file = SPIFFS.open("/index.html"); String thePage = ""; if (!file) { Serial.println("There was a problem opening the file for reading."); thePage += "There was a problem opening the file for reading."; } while (file.available()) { thePage+=String((char)file.read()); } file.close(); server.send(200, "text/html", thePage); }); server.on("/status", HTTP_GET, []() { server.sendHeader("Connection", "close"); boolean isOpen=digitalRead(buttonPin)==HIGH; server.send(200, "application/json", "{ \"isOpen\": " + String(isOpen?"true":"false") + " }"); //send_mqtt("statusquery"); }); server.on("/sendmqtt", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html", "mqtt resend."); bForceResend=true; }); server.on("/serverIndex", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html", serverIndex); }); /*handling uploading firmware file */ server.on("/update", 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.printf("Update: %s\n", upload.filename.c_str()); if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size Update.printError(Serial); } } else if (upload.status == UPLOAD_FILE_WRITE) { /* flashing firmware to ESP*/ 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); } } }); server.begin(); } void loop(void) { server.handleClient(); delay(1000); if (!mqttClient.connected()) { reconnect(); // send_mqtt("(re)connected"); } mqttClient.loop(); int buttonState = digitalRead(buttonPin); if (buttonState!=previousState || bForceResend ){ bForceResend=false; if (buttonState == HIGH) { digitalWrite(ledPin, HIGH); Serial.println("Garage Opened"); //send_notification("garagedoor.opened.livorno.address"); send_mqtt("opened"); } else { digitalWrite(ledPin, LOW); Serial.println("Garage Closed"); //send_notification("garagedoor.closed.livorno.address"); send_mqtt("cosed"); } previousState=buttonState; } }