Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Verbesserungen aus meiner V3.2.6: Modbus-serial-Handling, JSON-MQTT-Antwort für livedata, Growatt V1.2.4-File und -Sim, Bugfixing #109

Open
wants to merge 3 commits into
base: development
Choose a base branch
from

Conversation

StefanNouza
Copy link

Verbesserungen aus meiner alten V3.2.6 eingebracht:

  • Problem beim Laden des Filesystems aus PlatformIO behoben
  • verbessertes Modbus-serial-Handling
  • nur eine MQTT-Antwort für alle Daten zusammen (FHEM dankt es)
  • Growatt V1.2.4-Config-File und -Simulation eingebracht
  • einige zufällig entdeckte Bugs gefixt

Aenderungen_V3.3.0g.txt

dbg.begin(115200, SERIAL_8N1, Config->GetSerialRx(), Config->GetSerialTx()); // RX, TX, zb.: 33, 32
dbg.println("");
dbg.println("ready");
//Serial.begin(115200, SERIAL_8N1, Config->GetSerialRx(), Config->GetSerialTx()); // RX, TX, zb.: 33, 32 >>> hier würde "Serial" an "BaseConfig" angepasst werden...
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

den serialport kann man nach belieben umbiegen.
diese definition ist eine advanced option wenn man zb. eine mittels eines 2. ESP eine TransparentBridge anlegt um das echte SerialLog Remote zu lesen wenn der ESP selbst nicht starten will

Copy link
Author

@StefanNouza StefanNouza Dec 30, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, dafür also die Konfigurationsmlöglichkeit.

Bleibt noch das Initialisierproblem:

  • in commonlibs.h definierst Du dbg zu "Serial" oder zu "WebSerial"
  • in main.cpp / setup() wird zuerst ein Objekt der Klasse "BaseConfig" angelegt
  • das ist ja auch nötig, um die Seriell-Konfiguration einzulesen
  • allerdings arbeitet "BaseConfig" selbst schon mit "dbg", d.h. entweder dem default-Serial oder dem noch nicht initialisierten WebSerial
  • nachdem BaseConfig angelegt ist, wird WebSerial initialisiert (setBuffer() und begin()) bzw. Serial parametriert...

Ich habe mich mit WebSerial nicht auseinandergesetzt, vielleicht darf es ja schon vor begin() verwendet werden - zumindest wollte ich Dich auf diese Stelle aufmerksam machen.
Eine saubere Lösung (aus meiner eingeschränkten Sicht) habe ich leider auch nicht, BaseConfig ohne Debug-Ausgaben ist natürlich nicht gut.

@@ -1,4 +1,5 @@
#include "mqtt.h"
#include "modbus.h"
Copy link
Owner

@tobiasfaust tobiasfaust Dec 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

die mqtt klasse muss für sich alleine stehen und darf ausser zur config Klasse keine weiteren abhängigkeiten haben. Die mqtt Klasse wird noch in anderen Projekten benötigt. Die EInbindung der modbus klasse ist auch nicht notwendig, zirkelbeziehungen sollten nicht entstehen.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ja, der include sollte nicht da sein - hatte ich wohl vorübergehend gebraucht und dann vergessen.

dbg.printf("Initializing MQTT (%s:%d)\n", Config->GetMqttServer().c_str(), Config->GetMqttPort());
espClient = WiFiClient();


#ifdef JSON_MQTT
Copy link
Owner

@tobiasfaust tobiasfaust Dec 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

es darf kein grosser buffer aufgebaut werden, jedes topic muss alleine für sich unabhängig gesendet werden. Bei grossen Definitionen wird einfach das json abgeschnitten und ungültiger code wird gesendet. im schlimmeren fall bootet der esp neu.

Wenn wirklich "eine grosse" Message notwendig ist, so kann man per http://IP/getitems alle daten bekommen. Das benutzen einige imho zb. in homeassist.
Ich nutze auch fhem, und fhem kommt sehr gut mit den einzelnen nachrichten klar

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

doch, dafür habe ich in denn modbus-Konstruktor oben

this->mqttJson.reserve(JSON_MSG_BUFFER);

aufgenommen, um einen 4,1k-Buffer zu haben. Das beseitigt abgeschnittene JSONs und beseitigt Abstürze (habe ich selbst schmerzhaft erarbeitet... :). Wenn man über meinen Weg gnadenlos alles ausgibt, treten die Probleme natürlich irgendwann wieder auf, wenn 4k Nutzdaten erreicht sind.

Und mein 2019er FHEM auf einem rasPi2 fraß sich mit einzeln gesendeten Topics nach 2-3Tagen zuverlässig fest - ein Verhalten, das mit der großen JSON-Antwort nie auftrat. Aber vielleicht ist das System ja auch etwas aus der Zeit gefallen...

//#define DEBUGMODE
#define DEBUGMODE

#define JSON_MQTT // define to get MQTT-data in one big JSON-answer (good for FHEM-based systems)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

genau das soll vermieden werden. FHEM kommt mit den einzelnen topics gut klar. So läuft es bei mir auch

@@ -235,7 +243,7 @@ void modbus::LoadInverterConfigFromJson() {

File regfile = LittleFS.open("/regs/"+this->InverterType.filename);
if (!regfile) {
dbg.println("failed to open ModbusConfig.json file for writing");
dbg.printf("failed to open /regs/%s file\n", this->InverterType.filename.c_str());
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ist schon in der aktuellen dev-branch behoben

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, haben wir zeitgleich gefunden...

File regfile = LittleFS.open("/regs/"+this->InverterType.filename);
if (!regfile) {
dbg.println("failed to open ModbusConfig.json file for writing");
dbg.printf("failed to open /regs/%s file\n", this->InverterType.filename.c_str());
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ist schon in der aktuellen dev-branch behoben

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, haben wir zeitgleich gefunden...

@@ -765,21 +799,21 @@ void modbus::ParseData() {
} else if (datatype == "string") {
//********** handle Datatype String ***********//
if (!posArray.isNull()) {
char buffer[posArray.size()];
char buf[posArray.size()+1]; // set up c-string to hold all bytes and the trailing 0x00-char
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warum buf und nicht buffer?
ist aber schon in der aktuellen dev-branch behoben

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ich habe mal gelernt, daß unterschiedliche Variablen auch verschiedene Namen haben sollten, um die Übersicht zu behalten; und je kleiner der Lebensbereich, desto kürzer darf der Name sein - also buf.

Da hat aber jeder seine Philosophie, ich hatte wohl auch hier zeitgleich mit Dir die Lösung eingebracht...

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haben wir zeitgleich gefunden...

@@ -989,7 +1049,7 @@ void modbus::GetRegisterAsJson(AsyncResponseStream *response) {

File regfile = LittleFS.open("/regs/"+this->InverterType.filename);
if (!regfile) {
dbg.println("failed to open ModbusConfig.json file for writing");
dbg.printf("failed to open /regs/%s file\n", this->InverterType.filename.c_str());
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ist schon in der aktuellen dev-branch behoben

@@ -1081,7 +1144,7 @@ void modbus::LoadRegItems(std::vector<reg_t>* vector, String type) {

File regfile = LittleFS.open("/regs/"+this->InverterType.filename);
if (!regfile) {
dbg.println("failed to open ModbusConfig.json file for writing");
dbg.printf("failed to open /regs/%s file\n", this->InverterType.filename.c_str());
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ist schon in der aktuellen dev-branch behoben

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haben wir zeitgleich gefunden...

@tobiasfaust
Copy link
Owner

hi @StefanNouza
ich habe mal dein json vom Growatt übernommen. Da ich jetzt nicht alles mit dem bestehenden Growatt-SPH file abgleichen konnte, gibt es Register Abweichungen innerhalb der beiden Files? Oder macht es Sinn beide zusammenzuführen?
Das Originale SPH File ist von @thomas-99
Es funktionieren auch "Set" Commands, falls du welche hast könntest du diese hier auch noch integrieren. Eine gute Vorlage gibt es im Solax-X3.json.

Ansonsten habe ich erstmal keine weiteren Anpassungen hier im PR gefunden die zu übernehmen sind.

@thomas-99, könntest du das neue SPH File auch bei dir mal testen?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants