// WebServerModule.cpp #include "WebServerModule.h" WebServerModule::WebServerModule(INA219Module& inaModule, int relayPin, int secondRelayPin, int thirdRelayPin, int fourthRelayPin) : _inaModule(inaModule), _server(80), _relayPin(relayPin), _secondRelayPin(secondRelayPin), _thirdRelayPin(thirdRelayPin), _fourthRelayPin(fourthRelayPin), relayState(false), secondRelayState(false), thirdrelayState(false), fourthRelayState(false) {} void WebServerModule::begin() { // Configure pins for relays as outputs pinMode(_relayPin, OUTPUT); pinMode(_secondRelayPin, OUTPUT); pinMode(_thirdRelayPin, OUTPUT); pinMode(_fourthRelayPin, OUTPUT); // Configure server endpoints _server.on("/", HTTP_GET, std::bind(&WebServerModule::handleRoot, this, std::placeholders::_1)); _server.on("/values", HTTP_GET, std::bind(&WebServerModule::handleValues, this, std::placeholders::_1)); _server.on("/toggle1", HTTP_GET, std::bind(&WebServerModule::handleToggle, this, std::placeholders::_1)); _server.on("/toggle2", HTTP_GET, std::bind(&WebServerModule::handleSecondToggle, this, std::placeholders::_1)); _server.on("/toggle3", HTTP_GET, std::bind(&WebServerModule::handleThirdToggle, this, std::placeholders::_1)); _server.on("/toggle4", HTTP_GET, std::bind(&WebServerModule::handleFourthToggle, this, std::placeholders::_1)); _server.begin(); } void WebServerModule::handleRoot(AsyncWebServerRequest *request) { String html = ""; html += "
"; html += "

Energieverbrauchsmonitor

"; // Anzeige der Werte (unchanged) html += "

Strom: A

"; html += "

Spannung: V

"; html += "

Leistung: W

"; html += "

Durchschnittliche Leistung: W

"; html += "

Gesamtenergie: Wh

"; // JavaScript-Code für die Werteaktualisierung und Schaltersteuerung html += ""; // Schalter 1 (K1) html += "
"; html += ""; html += ""; html += "
"; // Schalter 2 (K2) html += "
"; html += ""; html += ""; html += "
"; // Schalter 3 (K3) html += "
"; html += ""; html += ""; html += "
"; // Schalter 4 (K4) html += "
"; html += ""; html += ""; html += "
"; // JavaScript-Code für die Schaltersteuerung (unchanged) html += ""; html += "
"; request->send(200, "text/html", html); } void WebServerModule::handleValues(AsyncWebServerRequest *request) { String values = "{\"current_A\":" + String(_inaModule.getCurrent()) + ","; values += "\"busVoltage_V\":" + String(_inaModule.getBusVoltage()) + ","; values += "\"power_W\":" + String(_inaModule.getPower()) + ","; values += "\"avgPower_W\":" + String(_inaModule.calculateAveragePower()) + ","; values += "\"totalEnergy\":" + String(_inaModule.getTotalEnergy()) + ","; values += "\"relay1State\":" + String(getRelayState() ? 1 : 0) + ","; values += "\"relay2State\":" + String(getSecondRelayState() ? 1 : 0) + ","; values += "\"relay3State\":" + String(getThirdRelayState() ? 1 : 0) + ","; values += "\"relay4State\":" + String(getFourthRelayState() ? 1 : 0) + "}"; request->send(200, "application/json", values); } void WebServerModule::handleToggle(AsyncWebServerRequest *request) { if (request->hasParam("state")) { int state = request->getParam("state")->value().toInt(); relayState = state; digitalWrite(_relayPin, relayState ? LOW : HIGH); Serial.print("Relay 1 state set to: "); Serial.println(relayState); request->send(200, "text/plain", relayState ? "Relay 1 turned on" : "Relay 1 turned off"); } else { request->send(400); // Fehler, keine Zustandsinformation } } void WebServerModule::handleSecondToggle(AsyncWebServerRequest *request) { if (request->hasParam("state")) { int state = request->getParam("state")->value().toInt(); secondRelayState = state; digitalWrite(_secondRelayPin, secondRelayState ? LOW : HIGH); Serial.print("Relay 2 state set to: "); Serial.println(secondRelayState); request->send(200, "text/plain", secondRelayState ? "Relay 2 turned on" : "Relay 2 turned off"); } else { request->send(400); // Fehler, keine Zustandsinformation } } void WebServerModule::handleThirdToggle(AsyncWebServerRequest *request) { if (request->hasParam("state")) { int state = request->getParam("state")->value().toInt(); thirdrelayState = state; digitalWrite(_thirdRelayPin, thirdrelayState ? LOW : HIGH); Serial.print("Relay 3 state set to: "); Serial.println(thirdrelayState); request->send(200, "text/plain", thirdrelayState ? "Relay 3 turned on" : "Relay 3 turned off"); } else { request->send(400); // Error, no state information } } void WebServerModule::handleFourthToggle(AsyncWebServerRequest *request) { if (request->hasParam("state")) { int state = request->getParam("state")->value().toInt(); fourthRelayState = state; digitalWrite(_fourthRelayPin, fourthRelayState ? LOW : HIGH); Serial.print("Relay 4 state set to: "); Serial.println(fourthRelayState); request->send(200, "text/plain", fourthRelayState ? "Relay 4 turned on" : "Relay 4 turned off"); } else { request->send(400); // Error, no state information } } void WebServerModule::handleToggleState(bool state) { relayState = state; digitalWrite(_relayPin, relayState ? LOW : HIGH); // Inverted logic for active LOW relay } void WebServerModule::handleSecondToggleState(bool state) { secondRelayState = state; digitalWrite(_secondRelayPin, secondRelayState ? LOW : HIGH); // Inverted logic for active LOW relay } void WebServerModule::handleThirdToggleState(bool state) { thirdrelayState = state; digitalWrite(_thirdRelayPin, thirdrelayState ? LOW : HIGH); // Inverted logic for active LOW relay } void WebServerModule::handleFourthToggleState(bool state) { fourthRelayState = state; digitalWrite(_fourthRelayPin, fourthRelayState ? LOW : HIGH); // Inverted logic for active LOW relay } bool WebServerModule::getRelayState() const { return relayState; } bool WebServerModule::getSecondRelayState() const { return secondRelayState; } bool WebServerModule::getThirdRelayState() const { return thirdrelayState; } bool WebServerModule::getFourthRelayState() const { return fourthRelayState; }