NEWS
MQTT Server akzeptiert Update nicht ?
-
Hallo Zusammen,
ich hab hier ein merkwürdiges Problem, bei dem ich einfach nicht weiter komme :
Ich habe einen ESP8266 der Daten von einem Sensor ließt, und einmal pro Stunde an den MQTT-Server sendet. Zwischenzeitlich geht er immer für eine Stunde in den Deepsleep. Das funktioniert leider sehr unzuverlässig. Ich sehe im Log, dass der ESP stündlich aufwacht und sich beim MQTT-Server anmeldet.
mqtt.0 2019-03-03 15:03:50.339 info Client [ESP8266Client] connection closed: disconnected mqtt.0 2019-03-03 15:03:49.829 info Client [ESP8266Client] connected with secret 1551621829827_2
Nur die Daten werden leider nicht aktualisiert. Das funktioniert solange nicht, bis ich den Wert im ioBroker unter "Objekte" manuell überschreibe (z.B. einfach eine Null reinschreibe). Danach kann der ESP den Wert genau einmal erfolgreich aktualisieren. Dann kommen wieder keine Aktualisierungen....
Woran könnte das liegen ?
Danke schonmal vorab !
Gruß,
André
-
wie immer:
- das prg des ESP und bilder deiner einstellungen bei MQTT
was ist bei einem DS von 10 - 15 sekunden
( mein esp-mqtt daten werden erkannt ... wenn sie langsam kommen )
-
Hallo,
was meinst Du genau mit langsam kommen ? Den DS zu verkürzen könnte ich mal probieren. Mich macht es halt stutzig, dass es immer klappt, wenn ich den Wert manuell (unter Objekte) überschreibe...
Hier mal der Code vom ESP :
dtostrf(prozent, 2, 0, feuchtigkeitProzent); Serial.println(feuchtigkeitProzent); if (prozent > 35) { // Pflanze okay analogWrite(ledPIN, 64); client.publish(topic_feuchtigkeit, feuchtigkeitProzent, true); delay(250); digitalWrite(ledPIN, LOW); delay(250); client.disconnect(); delay(1000); WiFi.disconnect(); delay(1000); ESP.deepSleep(3600e6, WAKE_RF_DEFAULT);
Und hier die Einstellungen vom MQTT:
-
bitte das gesamte programm anhängen......
ggf kann man das dann an andere stelle testen. -
bei bekanntgeben des eigenen ..... mal einen harken machen.
-
Okay, here we go
#include <ESP8266WiFi.h> #include <PubSubClient.h> #define wifi_ssid "---" #define wifi_password "---" #define mqtt_server "---" #define mqtt_user "" #define mqtt_password "" #define topic_feuchtigkeit "sensor/pflanzewohnzimmer/feuchtigkeit" #define FPM_SLEEP_MAX_TIME 0xFFFFFFF WiFiClient espClient; PubSubClient client(espClient); const int moistSensor = A0; const int ledPIN = 13; char feuchtigkeitProzent[2]; void setup_wifi() { WiFi.softAPdisconnect(); WiFi.disconnect(); WiFi.mode(WIFI_STA); delay(100); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(wifi_ssid); WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { analogWrite(ledPIN, 64); Serial.print("Attempting MQTT connection..."); // Attempt to connect // If you do not want to use a username and password, change next line to // if (client.connect("ESP8266Client")) { if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } digitalWrite(ledPIN, LOW); } void setup() { Serial.begin(9600); setup_wifi(); delay(2000); client.setServer(mqtt_server, 1883); delay(2000); pinMode(ledPIN, OUTPUT); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); int value = analogRead(moistSensor); float prozent = (100 - (value * (100.0/1023.0))); dtostrf(prozent, 2, 0, feuchtigkeitProzent); Serial.println(feuchtigkeitProzent); if (prozent > 35) { // Pflanze okay analogWrite(ledPIN, 64); client.publish(topic_feuchtigkeit, feuchtigkeitProzent, true); delay(250); digitalWrite(ledPIN, LOW); client.loop(); delay(250); client.disconnect(); delay(1000); WiFi.disconnect(); delay(1000); ESP.deepSleep(3600e6, WAKE_RF_DEFAULT); //ESP.deepSleep(60 * 1000, WAKE_RF_DEFAULT); } else { // Pflanze braucht Wasser analogWrite(ledPIN, 64); delay(1000); digitalWrite(ledPIN, LOW); client.publish(topic_feuchtigkeit, feuchtigkeitProzent, true); } delay(2000); }
-
mein loop ()
// quick und dirty
void loop()
{
//
// holezeit() ;
// bauezeit() ;
//
if (!client.connected())
{
reconnect();
}
// daten holen
// si7021();
messen_bme280() ;
delay(100);
Luxsensor();
//
#if defined DEBUG
Debug_Anzeige();
#endif
//
// daten sendendatensenden(); // mit sendebedingung
// Zeitsend ();
// ----
// pause
// nur bei system_deep_sleep() ////////
Serial.println("...Delay enabled!");
// void disconnect (); ---------------------------------- > ????
delay(interval * 1000);// Serial.println("...DeepSleep enabled!");
// system_deep_sleep(interval1000000); //sleep time in usecs. 10000000 = 10 secs.
///////////////////////////////////////
// delay(interval1000); // Interval für Publish - wenn nicht system_deep_sleep()
} -
Ich weiß jetzt nicht so wirklich wie ich das verwerten soll... den Haken hab ich mal gesetzt.
-
in deinem programm brauchst du den else zweig nicht .. da bei > 35 der wert gesendet wird und dann der esp schläft und dann neu startet...
selbst das ganze nach dem senden kannst du dir schenken...
also
loop()
{- messen
- senden oder nicht senden
- schlafen
}
reicht
so für mich auf die schnelle, der rest ist ähnlich dem hier.
-
Ja, okay. Da kann ich ein paar Zeilen Code einsparen. Danke Dir soweit. Mal schauen ob das mit dem Haken evtl. geholfen hat.
-
Hat es leider nicht. Sonst vielleicht noch jemand eine Idee woran das liegen könnte ? Wieso wird der Wert korrekt aktualisiert, nachdem ich den Wert im mqtt.0 händisch überschrieben habe ? Sonst nicht...
Danke + Gruß
-
@sloglban
Stimmen die Datenformate überein?Also Datenpunkt = Number und Wert wird als Zahl gesendet?
-
Der pubsubclient auf dem Arduino kann nur Chars senden. Auf der Serverseite ist der Datentyp Zeichenkette. Hab den jetzt mal testweise auf Nummer geändert. Mal sehen ob das hilft.
-
in iobroke brauchst du nur den "datenpunkt" komplett löschen - beim nächsten senden vom esp wird alles angelegt .... ggf mal alles aktualiesieren ( ging hier aber auch so )
hier liegen gerade fünf esp auf dem tisch ..... doch keiner mag mqtt + zeitserver -
Hab ich jetzt alles probiert. Datentyp geändert, Datenpunkt gelöscht. Bleibt leider alles wie gehabt. Eine Aktualisierung läuft durch. Danach meldet sich der ESP weiter zuverlässig im Stundentakt beim ioBroker. Aber es werden keine Daten aktualisiert. Solange bis ich den Wert händisch überschreibe. Dann wird wieder einmal aktualisiert.
Ich werde jetzt mal einen anderen MQTT-Broker testen.
-
@sloglban
wenn es diese lib ist:#include <PubSubClient.h>
muss es funktionieren
sehe gerade:
bei mir in setup()
.
.
.
client.setServer(mqtt_server, mqtt_port);
client.setClient(espClient);und reconnect() sieht so aus ...
void reconnect()
{
// Loop until we're reconnected
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(mqtt_client_id,mqtt_username,mqtt_key))
{
Serial.println("connected");
// IP-Adresse umwandeln und publish
IPAddress localAddr = WiFi.localIP();
char s[16];
sprintf(s, "%d.%d.%d.%d", localAddr[0], localAddr[1], localAddr[2], localAddr[3]);
client.publish(mqtt_topics_ip,s, true);
Serial.println(WiFi.localIP());
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}ach: und in der testphase ist ein gesetztes passwort ggf hinderlich .... ... habe keines.
und da: char feuchtigkeitProzent[2]; setzte man eine 5 ein -
Ich empfehle zum debuggen von solchen Ansätzen immer gerne mosquitto. Wenn du den mosquitto "server/broker" mit -v (verbose) startest, siehst du oft deine möglichen Fehler wenn du dich mit deinem Client darauf verbindest. So habe ich bei mir die fehlende Einstellung zum Benutzernamen und Kennwort beim connect gefunden...
-
das soll auch ganz gut sein ....
http://workswithweb.com/mqttbox.html -
wie das thema jetzt gelöst wurde wurd ich doch gerne erfahren
ggf tritt das problem ja mal hier auch auf . -
Hallo Zusammen,
erstmal Danke für Eure Hilfe ! Ich denke ich habe den "Fehler" jetzt wohl gefunden.
Ich habe zwischenzeitlich mal Mosquitto installiert, um zu sehen, ob der Fehler dort auch auftritt. Hab dann meinen MQTT.0 deaktiviert, und einen MQTT.1 als Client angelegt. Das Verhalten war exakt das gleiche. Also der Publisher schickt pünktlich seine Aktualisierung (retained), und im ioBroker kam nichts an (nur eine Aktualisierung). Außer, ich hatte den Wert im MQTT-Adapter wieder händisch überschrieben.
Und dann ist wohl der Groschen gefallen (wenn es denn der Richtige war
Ich lasse den Wert sowie den Zeitpunkt der letzten Aktualisierung bei mir im VIS anzeigen. Dabei war ich davon ausgegangen, dass der Zeitpunkt der letzten Aktualisierung jedes Mal aktualisiert wird, wenn der Publisher etwas sendet. Dem scheint aber nicht so zu sein. Stattdessen wird die Zeitangabe wohl nur aktualisiert, wenn ein abweichender Wert gesendet wird - was immer dann der Fall ist, wenn jemand den gespeicherten Wert vorher händisch mit einem abweichendem Wert überschrieben hat
Kann das jemand so bestätigen ? Tatsächlich ändern sich die von meinem Publisher gesendeten Werte nur selten....
Ich dachte ich könnte damit die Zuverlässigkeit meines Publishers (ggf. leere Batterie) überwachen. Aber da muss ich mir dann wohl etwas Anderes ausdenken.
Dazu kam auch noch die zwischenzeitliche Verwendung einer Powerbank als Stromversorgung am ESP. Wie ich mittlerweile erfahren hab, schaltet die sich aber aus, sobald nicht mehr genug Strom entnommen wird. Was dann spätestens beim ersten Deep Sleep wohl der Fall war. Dann kamen tatsächlich keine Daten mehr. Aber das konnte ich zu dem Zeitpunkt noch nicht auseinander halten.
You live you learn
Gruß,
Andre