Hallo Community,
ich bin noch wackeliger Anfänger und mein erstes Projekt soll ein ESP8266 Modul sein, welches Temperatur und Luftfeuchte mit dem DHT11 misst und die Werte an meinen lokalen ioBroker, welcher auf einem Pi4 läuft, übermitteln.
Läuft auch soweit, nur zickt der ESP manchmal rum und möchte sich einfach nicht mit dem MQTT Server auf dem Pi verbinden, "failed with -2".
Am Anfang hatte ich parallel noch etwas am MQTT auf dem ioBroker gespielt oder bereits übermittelte Werte einfach gelöscht, das fand der wohl nicht so gut (hatte ich irgendwo gelesen). Irgendwann ging es dann wieder.
Seit Sonntag lief mein Prototyp nun über Batterie und übermittelte brav alle 2 Minuten die Werte, als ich ihn zur Verbesserung des Codes gestern Abend aus dem Bad in die Küche holte und er von jetzt auf gleich wieder rumzickte.
Auf meinem Smartphone habe ich ein MQTTtool laufen und von dort verbindet er sich wunderbar mit dem lokalen MQTT und ich kann Werte veröffentlichen - sprich, der MQTT Server sollte in Ordnung sein?
Sind die ESP8266 (von AZDelivery) vielleicht für Zicken bekannt?
Das hier ist mein Code, ich komme bis
Serial.print("failed with state ");
Serial.println(client.state());
und dann bleibt er in der Schleife und zeigt nur Code -2 an.
WLAN ist währenddessen aber immer aktiv und verbunden.
#include "ESP8266WiFi.h"
#include "PubSubClient.h"
#include "DHT.h"
#define DHTPIN 5 //Der Sensor wird an PIN D1 angeschlossen, wird aber in der Arduino Software als "5" bezeichnet. Siehe AZ Datasheet
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// WiFi
const char *ssid = "XXXX"; // Enter your Wi-Fi name
const char *password = "XXXXXXX"; // Enter Wi-Fi password
// MQTT Broker
const char *mqtt_broker = "192.168.178.19";
const char *mqtt_username = "muser";
const char *mqtt_password = "XXXXXX";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
dht.begin(); //DHT11 Sensor starten
Serial.begin(115200);
client.setServer(mqtt_broker, mqtt_port);
WiFi.mode( WIFI_OFF );
WiFi.forceSleepBegin();
delay( 1 );
WiFi.begin(ssid, password);
}
void loop() {
float hum = dht.readHumidity();
float tem = dht.readTemperature();
WiFi.forceSleepWake();
delay( 1 );
WiFi.mode( WIFI_STA );
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the Wi-Fi network");
while (!client.connected()) {
String client_id = "ESP32-Bad";
Serial.println("connecting to IObroker");
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("IObroker connected");
}
else {
Serial.print("failed with state ");
Serial.println(client.state());
Serial.print("WiFi Status: ");
Serial.println(WiFi.status());
delay(1000);
}
}
Serial.print("Luftfeuchtigkeit: "); //Im seriellen Monitor den Text und
Serial.print(hum); //die Dazugehörigen Werte anzeigen
Serial.println(" %");
Serial.print("Temperatur: ");
Serial.print(tem);
Serial.println(" Grad Celsius");
Serial.print("WiFi Status: ");
Serial.println(WiFi.status());
Serial.print("MQTT Status: ");
Serial.println(client.connected());
String topic1 = "Klima/Bad/Temperatur"; //Topic wird oben definiert aber als Char!
String payload1 = String(tem);
client.publish(topic1.c_str(), payload1.c_str());
String topic2 = "Klima/Bad/Luftfeuchte"; //Topic wird oben definiert aber als Char!
String payload2 = String(hum);
client.publish(topic2.c_str(), payload2.c_str());
client.disconnect();
WiFi.mode( WIFI_OFF );
WiFi.forceSleepBegin();
delay( 1 );
delay(30000); //Sekunden Vorlaufzeit bis zur Messung (der Sensor ist etwas träge)
}