/* Generic ESP8266 Modul sketch_MAIN8266.ino aus BasicHTTPClient.ino Created on: 27.03.2024 liest den Status aus Shelly 3EM, filtert nach "POWER",ermittelt den Strom eines Moduls, schaltet die notwendige/zulässige Anzahl Module zu oder ab, und gibt das Ergebnis serial an einen ESP01 zum funken an einen Monitor. */ //************* OTA -> #include #include #include const char* ssid = "XXXXXX"; const char* password = ""; //************* <- OTA #include #include #include #include ESP8266WiFiMulti WiFiMulti; //01 11 21 22 String Verteil[11] = { "0000", "1000", "0100", "0010", "1010", "0110", "1110", "1011", "0111", "1111", "1111" }; // 00 10 11 21 22 23 123 133 233 1233 1233 // 0 1 2 3 4 5 6 7 8 9 9 unsigned long lastTime = 0; unsigned long timerDelay = 1000; // send readings timer String payload = ""; String x1; int Strom = 554; int Phase[]={-458,47,224}; int Summe = -187; int Sumalt; int Laststufe = 10; float Ampere = 12.34; int s; //int inputString; WiFiClient client; HTTPClient http; //*************** Setup **************** void setup() { WiFi.mode(WIFI_STA); WiFiMulti.addAP("shellyem3-3494547B8D61", ""); Serial.begin(115200); // Init Serial Monitor Serial.println(""); Serial.println(WiFi.macAddress()); pinMode(12, OUTPUT); pinMode(13, OUTPUT); pinMode(14, OUTPUT); pinMode(16, OUTPUT); //************* OTA -> Serial.println("Booting"); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(1000); ESP.restart(); } ArduinoOTA.setHostname("MAIN8266"); ArduinoOTA.setPassword(""); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); //************* <- OTA } //************** Loop ***************** void loop() { ArduinoOTA.handle(); //OTA if ((millis() - lastTime) > timerDelay) { LeseShelly(); Auswertung(); Ausgabe(); lastTime = millis(); } } //***************** LeseShelly ******************** void LeseShelly() { if ((WiFiMulti.run() == WL_CONNECTED)) { if (http.begin(client, "http://192.168.33.1/status")) {Serial.println("begin ok"); int httpCode = http.GET(); // start connection and send HTTP header //if (httpCode > 0) //{ if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { String payload = http.getString(); Summe = 0; int i = 0; for (s = 400; s < 750; s++) // zwischen Stelle 400 und 750 stehen die Werte für die 3 Phasen { String A = payload.substring(s, s + 5); if (A == "power") { s = s + 7; //************************** x1 = payload.substring(s, s + 10); Phase[i] = x1.toInt(); i++; s = s + 10; //************************** } } Summe = Phase[0] + Phase[1] + Phase[2]; //} } } } } //**************** Auswertung *********************** void Auswertung() { Strom = analogRead(A0); Ampere = ((Strom - 512) / 512.000 * 60); // ADC-Ausgabe umgerechnet in Ampere if (Ampere < .01) { Ampere = .01; } int DL = (Summe - Sumalt)/50; Sumalt = Summe; if (Summe <= -100 and Laststufe > 0) { Laststufe -= DL; } if (Laststufe < 0) { Laststufe = 0; } if (Summe >= 0 and Laststufe < 10) { Laststufe += DL; } if (Laststufe > 10) { Laststufe = 10; } //Schalten: (LOW: MODUL abgeklemmt, HIGH: MODUL zugeschaltet) if (Verteil[Laststufe].substring(0, 1) == "0") { digitalWrite(12, LOW); } if (Verteil[Laststufe].substring(1, 2) == "0") { digitalWrite(13, LOW); } if (Verteil[Laststufe].substring(2, 3) == "0") { digitalWrite(14, LOW); } if (Verteil[Laststufe].substring(3, 4) == "0") { digitalWrite(16, LOW); } if (Verteil[Laststufe].substring(0, 1) != "0") { digitalWrite(12, HIGH); } if (Verteil[Laststufe].substring(1, 2) != "0") { digitalWrite(13, HIGH); } if (Verteil[Laststufe].substring(2, 3) != "0") { digitalWrite(14, HIGH); } if (Verteil[Laststufe].substring(3, 4) != "0") { digitalWrite(16, HIGH); } } //***************** Serial Ausgabe ************************ void Ausgabe() { Serial.print("L"); Serial.println(Laststufe); Serial.print("A"); Serial.println(Ampere); Serial.print("S"); Serial.println(Summe); Serial.print("N"); Serial.println(Phase[0]); Serial.print("E"); Serial.println(Phase[1]); Serial.print("Z"); Serial.println(Phase[2]); }