LAN-Anbindung für BSB-Bus (Brötje, Elco Thision etc.)

Begonnen von justme1968, 29 November 2014, 19:50:40

Vorheriges Thema - Nächstes Thema

carbonara

Moin Frederik,
/N bei geflashter Vers. 4.2.69 hat leider keinen Erfolg gebracht.

Ich habe das mehrfach ausprobiert mit jeweils "Konfiguration aus EEPROM lesen" > ein und aus

evtl. noch wichtig:
ich bekomme für die SD-Karte bei /D0 ", Fehler beim Erstellen der Datei datalog.txt! "
(mehrere SD-Karten getestet)
Das ist auch bei Vers. 4.2.1 der Fall.

vielleicht ist ja meine Hardware kaputt?

nun wieder zurück auf 4.2.1 > mqtt funktioniert wieder



Heizung: MHG ProCon E25, BSB-LAN: Arduino DUE , Volkszähler, Home Assistant

freetz

Dann mach bitte mal einen Bug Report in GitHub auf, mit allen benötigten Infos.
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/BSB-LAN

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

thetaphi

Stimmt die IP Adresse im Webinterface?

Der Fehler -2 heißt auf jeden Fall dass der TCP Verbindungsaufbau zu dem angegebenen Hostnamen/IP nicht geklappt hat. Das ist noch bevor MQTT Protokoll ausgehandelt wird. Teste mal die IP Adresse übers Webinterface auszutauschen, vielleicht Mal ein Hostname statt dessen.

thetaphi

#7068
Ich glaube ich weiß wo der Fehler ist, im Burgreport kann man das weitergeben:

Dieses free kommt zu früh, dadurch zerschießt sich der Hostname: https://github.com/fredlcore/BSB-LAN/blob/2d07af4b2243298b6aa8c7fe6fc89f0670f82251/BSB_LAN/include/mqtt_handler.h#L213

Das könnte von den Hostnamen je nach hardware "schrotten". Bei der Umstellung letztens wurde das Hostnamen Parsing nach oben geschoben, aber das Free sollte ganz am Ende der Funktion sein. Aber wenn man sich den Code so anschaut, darf das free nie gemacht werden, denn der Zeiger auf den Hostnamen wird ständig benötigt.

thetaphi

Wenn du mal das obige free auskommentierst mit //, und neu baust. Dann sollte es gehen.

freetz

Good call - @carbonara: Bitte verschiebe mal die Zeile "free(tempstr);" hinter die Zeile "MQTTPubSubClient->setServer(mqtt_host, mqtt_port);" ein paar Zeilen weiter unten. Ich hoffe, dass es dann klappt.
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/BSB-LAN

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

thetaphi

#7071
Ich befürchte, dass free muss ganz weg, denn der MQTTClient merkt sich die Adresse für immer (in setServer ird es lokal gespeichert in der Instanz). Der Pointer wird länger gespeichert. Wenn dann später ein Reconnect passiert, dann ist der wieder kaputt. Der PubsubClient legt leider keine Kopie an im setServer().

Das war schon immer kaputt, allerdings in der früherene Version war es nicht so schlimm, weil das Parsing JEDES mal gemacht wurde und jedes Mal der neue Pointer gesetzt wurde. Es wäre besser den MQTT Hostnamen dauerhaft am Leben zu lassen, weil er eben im PubSubClient gespeichert wird.

Ich schaue mir das nochmal an und kann zur not einen Pull Request machen.

thetaphi

Zitat von: freetz am 25 Januar 2025, 10:32:46Good call - @carbonara: Bitte verschiebe mal die Zeile "free(tempstr);" hinter die Zeile "MQTTPubSubClient->setServer(mqtt_host, mqtt_port);" ein paar Zeilen weiter unten. Ich hoffe, dass es dann klappt.

Ja nach dort unten schieben sollte es beheben, aber es bleibt unschön: Der PubSubClient speichert den Hostnamen ohne eine Kopie anzulegen in seiner Instanz. Daher wäre es korrekter den Hostnamen erst zu löschen, wenn man die Instanz des PubSubClient löscht (das delete bei Disconnect).

Glücklicherweise wird der Hostnamen im PubSubClient nur beim Connect benutzt und wenn man ihn bei jedem Reconnect neu setzt (was wir tun), sollte es passen. Ich habe Bauchschmerzen, aber kann man so lassen. Wahrscheinlich wäre globale Variable hier besser.

Mich wundert nur warum der Fehler früher nicht schon aufgetreten ist, denn vorher war der gleiche Code nur weiter oben in der Funktion. Evtl ist durch weitere Änderungen es dazu gekommen dass die Speicherverwaltung es anderes anders anordnet und daher das "use after free" nun zu Schäden führt.

thetaphi

Hi,
generell würde das ganze wohl "schöner" sein, wenn man in der EEPROM Config und in der config.h-Datei den Hostnamen und den Port des MQTT Servers von vornherein getrennt ablegen würde und nicht als ein String der dann mühevoll zerhackt wird. Wenn also nichts dagegen spricht, nochmal das EEPROM Format zu ändern, würde ich fast vorschlagen das als 2 Eingabefelder zu trennen.
Uwe

carbonara

Das habe ich gemacht, leider ohne Erfolg:

if (token != 0) {
      mqtt_port = atoi(token);
    }
    //free(tempstr);

    char* MQTTUser = NULL;
    if(MQTTUsername[0]) {
      MQTTUser = MQTTUsername;
    }
    const char* MQTTPass = NULL;
    if(MQTTPassword[0]) {
      MQTTPass = MQTTPassword;
    }
    printFmtToDebug("Connecting to MQTT broker %s on port %d...\r\n", mqtt_host, mqtt_port);
    MQTTPubSubClient->setServer(mqtt_host, mqtt_port);
   free(tempstr);
    printFmtToDebug("Client ID: %s\r\n", mqtt_get_client_id());
    printFmtToDebug("Will topic: %s\r\n", mqtt_get_will_topic());

es kommt Fehler -2 im Monitor
Heizung: MHG ProCon E25, BSB-LAN: Arduino DUE , Volkszähler, Home Assistant

carbonara

es kommen ne Menge "Warnings" beim kompilieren, Flashen läuft aber durch
Heizung: MHG ProCon E25, BSB-LAN: Arduino DUE , Volkszähler, Home Assistant

freetz

Ok, dann mach' bitte einen BugReport mit allen "Unterlagen" als GitHub Issue auf. Da lässt sich das dann leserlicher und ausführlicher untersuchen.
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/BSB-LAN

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

carbonara

Heizung: MHG ProCon E25, BSB-LAN: Arduino DUE , Volkszähler, Home Assistant

freetz

Mir ist noch eine Sache aufgefallen: Schiebe bitte mal das "free(tempstr);" hinter "MQTTPubSubClient->connect(mqtt_get_client_id(), MQTTUser, MQTTPass, mqtt_get_will_topic(), 1, true, "offline");"
Wenn @thetaphi recht hat, darf es erst nach dem connect zerstört werden, da bei setHostname nur eine interne Kopie angelegt wird.

Wichtig zu wissen wäre, ob trotz der -2 Rückgabewerts jetzt wenigstens die Textausgabe gestimmt hat, also im SerMo die IP-Adresse korrekt angezeigt wurde? Dann wäre klar, dass das das Problem ist. Das Seltsame ist nur, dass es bei mir dieses Problem nicht gibt, obwohl ich auch über die IP-Adresse den MQTT Server anspreche.
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/BSB-LAN

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

thetaphi

Ich benutze ESP32, du nicht auch @freetz? Im Profil von @carnonara steht Arduino DUE. Vielleicht zerstört das free beim Arduino Devkit alles schneller. Ich erinnere, dass bei Arduino auch schon die Warnings mit dem delete und destructor auftraten.

Wie gesagt, wenn das jetzt wirklich das Problem ist würde ich Host und Port schon von vorneherein getrennt ablegen (auch im EEPROM).