Tasmota bähhh, dabei lernt er doch nichts.
Die einfachste und auch elegannteste Variante bei der man auch was lernt führt allerdings tatsächlich über MQTT.
An der ESP Seite wäre da PubSubClient.h dein Freund.
Wenn man es etwas rustikaler haben will dann über TCP Client/Server Socket. Du überlegts dir dabei einfach einen String den du an den ESP schickst, am ESP parst du das empfangene und führts dann halt irgendwas aus.
oder … gibt 1101 Möglichkeiten zu kommunizieren.
Für TCP Socket kann es bspw. so aussehen (ist halt für einen 8266 NodeMCU, aber der Code ist ja der selbe:
#include <ESP8266WiFi.h>
#define Relais1 4
#define Relais2 2
#define Relais3 12
#define Relais4 13
//WLAN ESP8266
const char* ssid = "xxxx";
const char* password = "xxxxxx";
const char* host = "10.0.0.1";
IPAddress ip(10, 0, 0, 55);
IPAddress gateway(10, 0, 0, 138);
IPAddress subnet(255, 255, 255, 0);
int IPSPort = 1108;
long WatchdogCounter;
unsigned char reconnectCount = 0;
String IPSMsg = "";
boolean MSGstartFlag = false;
boolean MSGstopFlag = false;
WiFiClient client;
void setup() {
Serial.begin(9600);
Serial.println("Set all Output to OFF State");
pinMode(Relais1, OUTPUT);
pinMode(Relais2, OUTPUT);
pinMode(Relais3, OUTPUT);
pinMode(Relais4, OUTPUT);
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, LOW);
digitalWrite(Relais3, LOW);
digitalWrite(Relais4, LOW);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
if (reconnectCount >= 60) {
ESP.restart();
}
Serial.print(".");
reconnectCount++;
}
reconnectCount = 0;
Serial.println("");
Serial.print("WiFi connected ");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
connectToServer();
client.println("ESP8266 Connected");
}
void loop() {
if (client.connected()) {
readCharfromPort(); // Receive data from IPS port:
if (MSGstopFlag) {
IPSMsg=IPSMsg.substring(1,(IPSMsg.length())-1);
Serial.println(IPSMsg);
if (IPSMsg == "R1_ON") {
digitalWrite(Relais1, HIGH);
delay(500);
digitalWrite(Relais1, LOW);
}
if (IPSMsg == "R2_ON") {
digitalWrite(Relais2, HIGH);
delay(500);
digitalWrite(Relais2, LOW);
}
if (IPSMsg == "R3_ON") {
digitalWrite(Relais3, HIGH);
delay(500);
digitalWrite(Relais3, LOW);
}
if (IPSMsg == "R4_ON") {
digitalWrite(Relais4, HIGH);
delay(500);
digitalWrite(Relais4, LOW);
}
client.write("OK");
if (IPSMsg == "Watchdog") WatchdogCounter = 0;
if (WatchdogCounter > 60) {
WatchdogCounter = 0;
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, LOW);
digitalWrite(Relais3, LOW);
digitalWrite(Relais4, LOW);
client.write("Watchdog");
}
IPSMsg = "";
MSGstopFlag = false;
MSGstartFlag = false;
yield();
}
}
else {
delay(500);
if (reconnectCount >= 60) {
ESP.restart();
}
Serial.println("Connection lost!");
Serial.println("Try to reconnect...");
connectToServer();
reconnectCount++;
}
}
// Process each char from Port and build Data String
void readCharfromPort() {
char inChar = client.read();
// Serial.print(inChar);
if (inChar == '<') { //start character
MSGstartFlag = true;
}
if (inChar == '>') { //end character
MSGstopFlag = true;
}
if (MSGstartFlag) {
IPSMsg = IPSMsg + inChar;
}
}
void timerCallback(void *pArg) {
WatchdogCounter = WatchdogCounter + 1;
} // End of timerCallback
void connectToServer() {
Serial.print("connecting to ");
Serial.println(host);
if (!client.connect(host, IPSPort)) {
Serial.println("connection failed");
return;
}
Serial.print("Connected to IPS Server at Port:");
Serial.println(IPSPort);
}
Das meißte hab ich aber über MQTT mit der PubSubClient Library gemacht. Das ist aber mit VSCode und nicht der Arduino Library, weiß nicht ob du damit was anfangen kannst.
schöne Grüße
Bernhard