From d54ff019ae2191fa01953bf4db54d6444cec7b4c Mon Sep 17 00:00:00 2001 From: Julian Arndt Date: Tue, 23 Aug 2022 10:30:25 +0200 Subject: [PATCH] Add OTA --- include/main.h | 8 +++ platformio.ini | 12 +++- src/main.cpp | 151 ++++++++++++++++++++++++++++++++++--------------- 3 files changed, 125 insertions(+), 46 deletions(-) diff --git a/include/main.h b/include/main.h index 8365cc2..3b713f9 100644 --- a/include/main.h +++ b/include/main.h @@ -6,6 +6,14 @@ void initWifi(); void initHA(); +void initArduinoOTA(); + +void initWebSerial(); + +void recvMsg(uint8_t *data, size_t len); + +void serialPrint(String message); + void onCoverLeftCommand(HACover::CoverCommand cmd); void onCoverRightCommand(HACover::CoverCommand cmd); diff --git a/platformio.ini b/platformio.ini index f1b64d7..d156726 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,6 +12,16 @@ platform = espressif8266 board = nodemcuv2 framework = arduino +upload_protocol = espota +upload_port = 192.168.1.92 +lib_deps = + ayushsharma82/WebSerial@^1.3.0 + ottowinter/ESPAsyncWebServer-esphome@^2.1.0 + ottowinter/ESPAsyncTCP-esphome@^1.2.3 [env:native] -platform = native \ No newline at end of file +platform = native +lib_deps = + ayushsharma82/WebSerial@^1.3.0 + ottowinter/ESPAsyncWebServer-esphome@^2.1.0 + ottowinter/ESPAsyncTCP-esphome@^1.2.3 diff --git a/src/main.cpp b/src/main.cpp index e96b534..9bfb122 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,18 +1,23 @@ #include #include #include +#include +#include -#define BROKER_ADDR IPAddress(192,168,1,46) +#define MQTT_BROKER_ADDR IPAddress(192,168,1,74) +#define MQTT_BROKER_PORT 1883 +#define MQTT_BROKER_USERNAME "Julian" +#define MQTT_BROKER_PASSWORD "Original_91" #define WIFI_SSID "Heimathafen" #define WIFI_PASSWORD "43762579905371198122" #define COVER_CLOSING_TIME_TOTAL_MILLIS 27500 #define REMOTE_BUTTON_PRESS_LENGTH_MILLIS 1000 #define REMOTE_BUTTON_PRESS_COOLDOWN_MILLIS 500 #define MAX_REMOTE_COMMAND_QUEUE_LENGTH 20 -#define PIN_LEFT_OPEN D5 +#define PIN_LEFT_OPEN D7 #define PIN_LEFT_CLOSE D6 -#define PIN_RIGHT_OPEN D7 -#define PIN_RIGHT_CLOSE D8 +#define PIN_RIGHT_OPEN D8 +#define PIN_RIGHT_CLOSE D5 byte mac[] = {0x00, 0x10, 0xFA, 0x6E, 0x38, 0x4A}; @@ -46,8 +51,8 @@ HACover coverLeft("rolladen-wohnzimmer-links", false, false); HACover coverRight("rolladen-wohnzimmer-rechts", false, false); String lastCommandLeft = ""; String lastCommandRight = ""; -int currentPositionLeft = 0; -int currentPositionRight = 0; +int currentPositionLeft = 100; +int currentPositionRight = 100; int targetPositionLeft = 0; int targetPositionRight = 0; unsigned long startMovingLeftMillis = 0; @@ -56,22 +61,40 @@ CoverState currentStateLeft = CoverState::Stopped; CoverState currentStateRight = CoverState::Stopped; unsigned long startSendRemoteCommandMillis = 0; int remoteState = RemoteState::Idle; +AsyncWebServer server(80); void setup() { Serial.begin(9600); Serial.println("Starting..."); initPins(); initWifi(); + initWebSerial(); + initArduinoOTA(); initHA(); } void loop() { + ArduinoOTA.handle(); mqtt.loop(); processStateLeft(); processStateRight(); sendRemoteCommand(); } +void initWebSerial() { + WebSerial.begin(&server); + WebSerial.msgCallback(recvMsg); + server.begin(); +} + +void recvMsg(uint8_t *data, size_t len){ + String d = ""; + for(int i=0; i < len; i++){ + d += char(data[i]); + } + WebSerial.println(d); +} + void initPins() { pinMode(PIN_LEFT_OPEN, OUTPUT); pinMode(PIN_LEFT_CLOSE, OUTPUT); @@ -104,55 +127,84 @@ void initHA() { device.setName("NodeMCU_Rollladen_Wohnzimmer"); device.setSoftwareVersion("1.0.0"); - mqtt.begin(BROKER_ADDR); + mqtt.begin(MQTT_BROKER_ADDR, MQTT_BROKER_PORT, MQTT_BROKER_USERNAME, MQTT_BROKER_PASSWORD); +} + +void initArduinoOTA() { + ArduinoOTA.onStart([]() { + serialPrint("Start OTA"); + }); + ArduinoOTA.onEnd([]() { + serialPrint("\nEnd OTA"); + }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { + Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + }); + ArduinoOTA.onError([](ota_error_t error) { + Serial.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) serialPrint("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) serialPrint("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) serialPrint("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) serialPrint("Receive Failed"); + else if (error == OTA_END_ERROR) serialPrint("End Failed"); + }); + ArduinoOTA.begin(); + Serial.println("Ready"); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); +} + +void serialPrint(String message) { + WebSerial.println(message); + Serial.println(message); } void onCoverLeftCommand(HACover::CoverCommand cmd) { if (cmd == HACover::CommandOpen) { - Serial.println("Received Command: Open"); + serialPrint("Received Command Left: Open"); if(targetPositionLeft != 100) { sendCoverLeftStop(); targetPositionLeft = 100; } } else if (cmd == HACover::CommandClose) { - Serial.println("Received Command: Close"); + serialPrint("Received Command Left: Close"); if(targetPositionLeft != 0) { sendCoverLeftStop(); targetPositionLeft = 0; } } else if (cmd == HACover::CommandStop) { - Serial.println("Received Command: Stop"); + serialPrint("Received Command Left: Stop"); sendCoverLeftStop(); } } void onCoverRightCommand(HACover::CoverCommand cmd) { if (cmd == HACover::CommandOpen) { - Serial.println("Received Command: Open"); + serialPrint("Received Command Right: Open"); if(targetPositionRight != 100) { sendCoverRightStop(); targetPositionRight = 100; } } else if (cmd == HACover::CommandClose) { - Serial.println("Received Command: Close"); + serialPrint("Received Command Right: Close"); if(targetPositionRight != 0) { sendCoverRightStop(); targetPositionRight = 0; } } else if (cmd == HACover::CommandStop) { - Serial.println("Received Command: Stop"); + serialPrint("Received Command Right: Stop"); sendCoverRightStop(); } } void onCoverLeftSetPositionCommand(uint8_t pos) { - Serial.println("Received Set Position Command: " + String(pos)); + serialPrint("Received Set Position Command Left: " + String(pos)); sendCoverLeftStop(); targetPositionLeft = pos; } void onCoverRightSetPositionCommand(uint8_t pos) { - Serial.println("Received Set Position Command: " + String(pos)); + serialPrint("Received Set Position Command Right: " + String(pos)); sendCoverRightStop(); targetPositionRight = pos; } @@ -195,7 +247,7 @@ void processStateRight() { void sendCoverLeftOpen() { coverLeft.setState(HACover::StateOpening); - Serial.println("Send Cover Left: OPEN."); + serialPrint("Send Cover Left: OPEN."); remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::LeftOpen; remoteCommandQueueLength++; currentStateLeft = CoverState::Opening; @@ -204,17 +256,22 @@ void sendCoverLeftOpen() { void sendCoverLeftStop() { int movementDiff = (millis() - startMovingLeftMillis) * 100 / COVER_CLOSING_TIME_TOTAL_MILLIS; - if(currentStateLeft == CoverState::Opening) { - Serial.println("Send Cover Left: CLOSE TO STOP."); - remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::LeftClose; - remoteCommandQueueLength++; + + if(currentStateLeft == CoverState::Opening) { currentPositionLeft = currentPositionLeft + movementDiff; + if(currentPositionLeft < 98) { + serialPrint("Send Cover Left: CLOSE TO STOP."); + remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::LeftClose; + remoteCommandQueueLength++; + } } - if(currentStateLeft == CoverState::Closing) { - Serial.println("Send Cover Left: OPEN TO STOP."); - remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::LeftOpen; - remoteCommandQueueLength++; + if(currentStateLeft == CoverState::Closing) { currentPositionLeft = currentPositionLeft - movementDiff; + if(targetPositionLeft > 2) { + serialPrint("Send Cover Left: OPEN TO STOP."); + remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::LeftOpen; + remoteCommandQueueLength++; + } } currentStateLeft = CoverState::Stopped; @@ -222,12 +279,12 @@ void sendCoverLeftStop() { coverLeft.setState(HACover::StateStopped); coverLeft.setPosition(currentPositionLeft); - // Serial.println("Current Position: " + String(currentPositionLeft)); + // serialPrint("Current Position: " + String(currentPositionLeft)); } void sendCoverLeftClose() { coverLeft.setState(HACover::StateClosing); - Serial.println("Send Cover Left: CLOSE."); + serialPrint("Send Cover Left: CLOSE."); remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::LeftClose; remoteCommandQueueLength++; currentStateLeft = CoverState::Closing; @@ -236,7 +293,7 @@ void sendCoverLeftClose() { void sendCoverRightOpen() { coverRight.setState(HACover::StateOpening); - Serial.println("Send Cover Right: OPEN."); + serialPrint("Send Cover Right: OPEN."); remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::RightOpen; remoteCommandQueueLength++; currentStateRight = CoverState::Opening; @@ -245,17 +302,21 @@ void sendCoverRightOpen() { void sendCoverRightStop() { int movementDiff = (millis() - startMovingRightMillis) * 100 / COVER_CLOSING_TIME_TOTAL_MILLIS; - if(currentStateRight == CoverState::Opening) { - Serial.println("Send Cover Right: CLOSE TO STOP."); - remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::RightClose; - remoteCommandQueueLength++; + if(currentStateRight == CoverState::Opening) { currentPositionRight = currentPositionRight + movementDiff; + if(currentPositionRight < 98) { + serialPrint("Send Cover Right: CLOSE TO STOP."); + remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::RightClose; + remoteCommandQueueLength++; + } } - if(currentStateRight == CoverState::Closing) { - Serial.println("Send Cover Right: OPEN TO STOP."); - remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::RightOpen; - remoteCommandQueueLength++; + if(currentStateRight == CoverState::Closing) { currentPositionRight = currentPositionRight - movementDiff; + if(currentPositionRight > 2) { + serialPrint("Send Cover Right: OPEN TO STOP."); + remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::RightOpen; + remoteCommandQueueLength++; + } } currentStateRight = CoverState::Stopped; @@ -263,12 +324,12 @@ void sendCoverRightStop() { coverRight.setState(HACover::StateStopped); coverRight.setPosition(currentPositionRight); - // Serial.println("Current Position: " + String(currentPositionRight)); + // serialPrint("Current Position: " + String(currentPositionRight)); } void sendCoverRightClose() { coverRight.setState(HACover::StateClosing); - Serial.println("Send Cover Right: CLOSE."); + serialPrint("Send Cover Right: CLOSE."); remoteCommandQueue[remoteCommandQueueLength] = RemoteCommands::RightClose; remoteCommandQueueLength++; currentStateRight = CoverState::Closing; @@ -278,7 +339,7 @@ void sendCoverRightClose() { void sendRemoteCommand() { // Stop sending remote command if(remoteState == RemoteState::Busy && millis() - REMOTE_BUTTON_PRESS_LENGTH_MILLIS > startSendRemoteCommandMillis) { - Serial.println("RemoteState::Cooldown"); + serialPrint("RemoteState::Cooldown"); remoteState = RemoteState::Cooldown; digitalWrite(PIN_LEFT_OPEN, LOW); digitalWrite(PIN_LEFT_CLOSE, LOW); @@ -288,13 +349,13 @@ void sendRemoteCommand() { // Wait Cooldown before sending next button press if(remoteState == RemoteState::Cooldown && millis() - REMOTE_BUTTON_PRESS_LENGTH_MILLIS - REMOTE_BUTTON_PRESS_COOLDOWN_MILLIS > startSendRemoteCommandMillis) { - Serial.println("RemoteState::Idle"); + serialPrint("RemoteState::Idle"); remoteState = RemoteState::Idle; } // Send next command if (remoteState == RemoteState::Idle && remoteCommandQueueLength > 0) { - // Serial.println("remoteCommandQueueLength: " + String(remoteCommandQueueLength)); + // serialPrint("remoteCommandQueueLength: " + String(remoteCommandQueueLength)); int nextCommand = remoteCommandQueue[0]; remoteCommandQueueLength--; @@ -306,19 +367,19 @@ void sendRemoteCommand() { switch (nextCommand) { case RemoteCommands::LeftOpen: - Serial.println("Remote: Press Button Left Open"); + serialPrint("Remote: Press Button Left Open"); digitalWrite(PIN_LEFT_OPEN, HIGH); break; case RemoteCommands::LeftClose: - Serial.println("Remote: Press Button Left Close"); + serialPrint("Remote: Press Button Left Close"); digitalWrite(PIN_LEFT_CLOSE, HIGH); break; case RemoteCommands::RightOpen: - Serial.println("Remote: Press Button Right Open"); + serialPrint("Remote: Press Button Right Open"); digitalWrite(PIN_RIGHT_OPEN, HIGH); break; case RemoteCommands::RightClose: - Serial.println("Remote: Press Button Right Close"); + serialPrint("Remote: Press Button Right Close"); digitalWrite(PIN_RIGHT_CLOSE, HIGH); break; @@ -326,7 +387,7 @@ void sendRemoteCommand() { break; } - Serial.println("RemoteState::Busy"); + serialPrint("RemoteState::Busy"); remoteState = RemoteState::Busy; startSendRemoteCommandMillis = millis(); }