poohnet Geschrieben March 19, 2022 at 18:52 Geschrieben March 19, 2022 at 18:52 Guten Abend zusammen, ich wĂŒrde gerne ein ConfigRoot-Objekt per MQTT setzen und habe dies wie folgt implementiert: ConfigRoot values; values = Config::Object({ {"power", Config::Float(0.0)}, {"energy_rel", Config::Float(0.0)}, {"energy_abs", Config::Float(0.0)} }); ... api.addCommand("meter/set_values", &values, {}, [this]() {}, true);  Allerdings erhalte ich im Log des ESP32-Ethernet-Bricks folgende Fehlermeldung, wenn ich das Topic per Node-RED sende: 2022-03-19 19:31:54,741 MQTT: Ignoring message with payload length 51 for topic warp2/XSS/meter/set_values. Maximum length allowed is 48. Anscheinend spielt hier die Anzahl der ĂŒbertragenen Nachkommastellen eine Rolle, denn wenn ich diese verĂ€ndere, dann verĂ€ndert sich auch die Payload-Length in der Meldung entsprechend und mit lediglich einer Nachkommastelle funktioniert das Ganze dann richtig. Als Workaround habe ich jetzt erstmal einen Dummywert in das Objekt aufgenommen, dann klappt's auch mit der gewĂŒnschten Anzahl Nachkommastellen. Vielleicht könnt ihr das bei Gelegenheit ja mal prĂŒfen... Besten Dank und GruĂ Thomas Zitieren
rtrbt Geschrieben March 21, 2022 at 11:14 Geschrieben March 21, 2022 at 11:14 Das Problem scheint zu sein, dass die maximal erlaubte PayloadlĂ€nge anhand des JSON-Objekts berechnet wird, in das geparst werden soll. Das ergibt aber keinen Sinn, weil die GröĂe der geparsten Struktur im Speicher etwas anderes ist als die LĂ€nge des Strings, der geparst werden soll. Einfachstes Beispiel sind in der Tat Nachkommastellen bei Float: 123.456789 ist geparst ja nur sizeof(float) == 4 groĂ, als String aber 10 Byte. Der Bug ist bisher nicht aufgetreten, aber seit https://github.com/Tinkerforge/esp32-firmware/commit/2bbae07c68bb581b06edf182765926984b97e639 ist die GröĂenberechnung aggressiver, deshalb fĂ€llt das jetzt auf. Ich muss im MQTT-Modul also konsequenter unterscheiden, was String-LĂ€ngen und was JSON-StrukturgröĂen sind. Ich gebe Bescheid, wenn es wieder funktionieren sollte. 1 Zitieren
rtrbt Geschrieben March 21, 2022 at 16:01 Geschrieben March 21, 2022 at 16:01 https://github.com/Tinkerforge/esp32-firmware/commit/b063b3bab67e54b956b93907a327126a9997b633 sollte das Problem fixen. Ich komme heute nicht mehr dazu die nÀchste Beta zu veröffentlichen, aber du baust ja eh aus Source ;) Zitieren
poohnet Geschrieben March 22, 2022 at 07:12 Autor Geschrieben March 22, 2022 at 07:12 Moin @rtrbt, besten Dank. Ja, das Problem ist tatsĂ€chlich gelöst, d. h. die drei Floats kommen jetzt korrekt an. DafĂŒr gibt es aber einen neuen Bug đ MQTT: Recv buf is 2048 bytes. meter/set_all_values requires 3656. Bump MQTT_RECV_BUFFER_SIZE! Not subscribing!  Zitieren
rtrbt Geschrieben March 22, 2022 at 09:23 Geschrieben March 22, 2022 at 09:23 Hm das ergibt Sinn. In dem Commit habe ich ja einen neuen Config-Visitor eingebaut, der abschĂ€tzt wie lang bei einem API-Aufruf der Payload (in String-LĂ€nge) werden kann. Das brauche ich um zu prĂŒfen, ob der MQTT-Empfangsbuffer groĂ genug fĂŒr alle registrierten APIs ist. Wenn das nicht der Fall ist kommt genau die Fehlermeldung die du hast. Floats können sehr lang werden (JSON limitiert das ĂŒbrigens nicht, aber sinnvollerweise nimmt man nur Gleitkommazahlen die in den Zieltyp passen an). FLT_MAX liegt bei ~ 3*10^38, deshalb habe ich das mit 42 abgeschĂ€tzt (fĂŒr noch das - den . usw.). Ich wĂŒrde bei nĂ€herer Betrachtung aber nicht erwarten, dass jemals jemand absichtlich einen Float mit mehr als ~20 Zeichen LĂ€nge ĂŒbertrĂ€gt. Das ist nur gefĂ€hrlich wenn irgendwo nicht darstellbare floats erzeugt werden, z.B: 0.1 + 0.2 ergibt auf vielen Plattformen 0.30000000000000004 und das sind schon 19 Zeichen. meter/set_all_values mĂŒsste ja ein Array aus 85 Floats ĂŒbertragen, 85*42 = 3570, dazu kommen noch die Kommata usw.. Ich werde die SchĂ€tzung mal aggressiver machen, z.B. auf 20 statt 42 Zeichen. Das dĂŒrfte ein Anwender kaum bei allen 85 Floats ausreizen. https://github.com/Tinkerforge/esp32-firmware/commit/2139d012a06f04854b80d3a99d19be771d71f3b3 Du bekommst nach der Ănderung vermutlich noch folgende Warnung: MQTT: Recv buf is 2048 bytes. meter/set_all_values requires 1871. Maybe bump MQTT_RECV_BUFFER_SIZE? Das ist aber nur die abgeschwĂ€chte Form, die API funktioniert trotzdem. Du solltest es dann nur nicht mit dem Whitespace ĂŒbertreiben ;) Langfristig sollte das MQTT-Modul mit fragmentierten Nachrichten umgehen können (https://github.com/Tinkerforge/esp32-firmware/issues/117), dann löst sich das Problem von alleine. Zitieren
poohnet Geschrieben March 22, 2022 at 12:29 Autor Geschrieben March 22, 2022 at 12:29 Danke @rtrbt, das sieht jetzt in der Tat sehr gut aus đ Ich erhalte zwar die von dir genannte Warnung, da sich die meisten ĂŒbertragenen Werte aber eher im ein- bis dreistelligen Bereich bewegen (und ich die Anzahl der Nachkommastellen in Node-RED ja ggf. auch noch begrenzen kann), passt das m. E. so... GruĂ Thomas P. S. Soll ich mich bei solchen Themen weiterhin im Forum melden oder lieber per GitHub-Issue? Zitieren
rtrbt Geschrieben March 22, 2022 at 13:10 Geschrieben March 22, 2022 at 13:10 Gut zu hören :) 39 minutes ago, poohnet said: Soll ich mich bei solchen Themen weiterhin im Forum melden oder lieber per GitHub-Issue? Wie es dir passt. Im Forum kann man eher mal eine Textwand schreiben, dafĂŒr kann man Issues sinnvoll in den Commit-Messages verlinken. Ich habe da erstmal keine starke PrĂ€ferenz. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.