-
Notifications
You must be signed in to change notification settings - Fork 25
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
base: development
Are you sure you want to change the base?
Conversation
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... |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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" |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
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()); |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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()); |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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...
There was a problem hiding this comment.
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()); |
There was a problem hiding this comment.
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()); |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
haben wir zeitgleich gefunden...
hi @StefanNouza 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? |
Verbesserungen aus meiner alten V3.2.6 eingebracht:
Aenderungen_V3.3.0g.txt