MQTT2_Server und Keepalive

Begonnen von kleing, 21 Mai 2020, 17:28:07

Vorheriges Thema - Nächstes Thema

kleing

Hallo zusammen,

ich habe mittel Wemos D1 mini mir ein IOT Device erstellt das mittels MQTT ´Daten an FHEM senden soll.
Das klappt auch, die Werte kommen korrekt an.
Verwendet habe ich den in FHEM integrierten MQTT2_Server und ein MQTT2_DEVICE.
Der Wemos ist Batteriebetrieben und sendet nur alle 15 min seine Daten per MQTT, den Rest der Zeit befindet er sich im Tiefschlaf, hat also keine WLAN Verbindung mehr und kann sich auch am MQTT Server nicht mehr melden. Sprich er wird mir als offline angezeigt.
Nun habe ich es so verstanden, dass der Client bestimmen kann mit welchem Keepalive Inervall er arbeitet, also ab wann der Server denkt er ist offline.
Ich habe dieses Keepalive Interval auf dem Wemos auf 20 min gesetzt (ich verwende dort die Arduino Bibliothek pubsubclient), der MQTT2_SERVER behauptet aber das die keepalive Zeit bei dem Device auf 15 Sekunden steht (Ausgabe von list TYPE=MQTT2_SERVER cid keepalive). Diese 15 Sekunden sind leider auch der Default Wert in der pubsubclient Bibliothek. Nun habe ich auf der Arduino Seite schon mehrere MQTT Versionen probiert (3.1 und 3.1.1) aber ohne Änderung. Leider bin ich jetzt mit meinem Latein am Ende und weiss nicht ob das Problem am MQTT2_Server liegt oder in der pubsubclient Bibliothek.

Gibt es eine Möglichkeit die (Roh-)Daten die die der MQTT Server empfängt zu loggen, um zu erkennen ob beim connect die richtigen Daten ankommen?

Gruß
Gerald


87insane

#1
Normal sollte die LWT Nachricht entscheiden ab wann bzw wwrum der server ein offline erkennt. Dazu kann man auch entscheiden was als LWT gesendet wird.

Geht für deinen Zweck nicht einfach tasmota und du kannst dir die Einstellungen dort mal ansehen.... An sich ist der mqtt Kram eine einfache und gute Geschichte.

Keepalive ist natürlich aber die Zeit...genau. Du kannst mit der LWT aber manipulieren... Wenn also die Zeit nicht einstellbar ist.

Vielleicht hilft dir das hier: https://www.hivemq.com/blog/mqtt-essentials-part-9-last-will-and-testament/

Gesendet von meinem LM-G810 mit Tapatalk

kleing

Hallo zusammen,
danke für den Tip mit Tasmota, aber das ist mir zu "oversized" (ohne mich damit im Detail beschäftigt zu haben, nur der erste Eindruck)

Ich habe zwischenzeitlich die Lösung gefunden, es lag natürlich nicht am MQTT Server  ;D
Es gibt seit 2 Tagen eine neue Version der pubsubclient Bibliothek, die Änderungen bzgl. keepalive hat.
Und siehe da, schon geht es, der MQTT2_SERVER listet korrekt die übergeben Zeit auf .....
Drauf gekommen bin ich durch die FAQ hier im Forum, ich habe den MQTT.fx installiert, da kann mann eine Keepalive Zeit festlegen und die zeigt der MQTT Server richtig an, also musste es am Client liegen.

Viele Grüße
Gerald

87insane

Geil, freut mich und einen schönen Vater Tag noch :)

Gesendet von meinem LM-G810 mit Tapatalk


KNUT345

Hallo Gerald,
ich würde mich hier gerne etwas verspätet einklinken wollen.
Im Prinzip habe ich bei ähnlichem Vorgehen (fast) das gleiche Problem.

Ich wollte mir mit einem ES8266 über MQTT einen Füllstandssensor für meine Zisterne bauen.
Hierzu habe ich mir ein passendes Script auf den ESP8266 geladen,
in FHEM den MQTT2_Server angelegt usw.
Funktioniert soweit alles.
Readings wurden angelegt, dann habe ich auch den LWT
und anhand deiner Hinweise auch keepAlive eingerichtet bekommen.

Aber ich habe da immer noch eine Fehlermeldung kurz nach dem Anmelden des MQTT-Clients
die ich nicht weg bekomme.
Und zwar kommt die Meldung immer kurz nach dem Anmelden.
Zitat
2022.01.20 07:48:49 3: myMTTQ_Server: myMTTQ_Server_xxx/xxxx left us (keepalive check)

Wenn ich attr keepaliveFactor <> 0 einstelle,
dann kommt es zur besagten Fehlermeldung und der ESP läuft ein 2tes Mal durch die Anmeldung.
Wenn ich hingegen keepaliveFactor = 0 einstelle,
dann läuft der ESP nur 1x durch die Anmeldung.

boolean reconnect() {
  if (client.connect("XXX", "/home/XXX/state", 0, true, "offline")) {
    // if not connected publish my last will "offline"
    // once connected, publish an announcement...
    // ... and resubscribe
    // ... and be ready for reset data
    client.setKeepAlive(UpdateIntervall+60);  // set MQTT keep alive according UpdateIntervall
    client.subscribe("/home/XXX/output/ServerDaten");
    client.subscribe("/home/XXX/output/UpdateIntervall");
    // individuelle Daten
    //
    // Ende individuelle Daten
    client.publish("/home/XXX/reboot","2",true);
    client.publish("/home/XXX/reboot","1",true);
    client.publish("/home/XXX/state","online", true);
    Serial.println("MQTT - XXX - online");
    client.publish("/home/XXX/reboot","0",true);
    // }
  }
  return client.connected();
}

Ist das normal?
Was muss/kann ich tun um die letzte "überflüssige" left us Meldung weg zu bekommen?

Danke im Voraus und Grüße
Knut

KNUT345

OK, es scheint meine Probleme haben sich in Luft aufgelöst.
Das einzige was ich wissentlich verändert habe.
keepaliveFactor = 2
Und keine unerklärbare Meldungen mehr,
auch beim Booten läuft der Client nur 1x durch die Anmelderoutine.

Grüße
Knut