-
-
Notifications
You must be signed in to change notification settings - Fork 226
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
Information about Inverter communication #734
Comments
Vorsicht, bei mir hängen 2 Inverter dran 😲 Da ich den Code nicht selber backen kann, wird’s wohl mit einem Test schlecht aussehen 🙁 |
Bitte entschuldige, dass ich deine Werte hier zitiert habe. Sie waren mir nur als sehr gut aufgefallen und sollten hier eigentlich nicht zum direkten Vergleich herhalten. Natürlich hängen die RX Werte von der Verbindungsqualität eines jeden Inverters ab, da sie die Summenwerte über alle Inverter anzeigen. Der Vergleich ist ausschließlich bei meinen Werten zu sehen. Hier ein zip mit den modifizierten ESP8266 und ESP32 .bin Dateien zum OTA Update. |
Bitte bedenke, dass während der Schlafenszeit der Inverter TX count und RX no answer weitergezählt werden (solange das Polling aktiv ist). Das hat Einfluss auf die Trefferquote. Daher habe ich meine Tests nur am Tag gemacht solange der Inverter Online war. |
Was mir noch auffällt, der Haufenspeicher ist bei mir jetzt um 8000 weniger 😵 |
Habe ich auch im Vergleich zur kompilierten dev. Version. Liegt am benutzten Compiler. Wenn ich die dev. unmodifiziert selbst kompiliere, ist der heap schon besagte 8000 Byte kleiner, also kein Unterschied zur modifizierten Version. 😅 |
@beegee3 vielen Dank, ich werde es testen =) |
@knickohr vielen Dank fürs Testen 👍 |
Es sind nicht nur leichte Verbesserungen, sondern gravierende. Neben den weniger Retransmits und den recht schnellen Melden der Inverter, gibt es auch das Problem mit den fehlenden SSIDs nicht mehr. |
Das mit den SSIDs ist natürlich unabhängig von der Inverter Kommunikation. Aber ich bin da ganz bei dir! |
das kann ich auch nicht, ich habe nur die Basis dafür geschaffen und @rejoe2 oä befüllt es mit Leben, siehe PRs |
Ich werd's bei Gelegenheit testen, wobei das Problem sein wird, dass die Statistik so oder so noch einen review wegen der MI braucht und ich vermutlich auch noch nicht komplett verstanden habe, wie es funktioniert. Von daher wird das erst mal eher eine "Bauchgefühl"-Rückmeldung werden - allerdings dann eben mit der Info, ob der MI-600 damit klarkommt oder nicht. Bestimmt würden auch die anderen aktuellen MI-Tester (auch nur 300/600) eine Rückmeldung geben, ob das passen würde. Mit dem aktuellen Code bis 0.5.93 waren die Treffer bei mir auch ziemlich gut, was ich dahingehend interpretiert hätte, dass die MI (bzw. alle Inverter) sehen, ob überhaupt eine Kommunikation stattfindet und ihr timing entsprechend anpassen (ich habe neben dem MI noch 6 3rd gen MI-1500, die wie normale HM-1500 kommunizieren). (Mit 0.5.95 bzw. dem Vorgänger hatte ich teilweise das Problem, dass die Kommunikation mit den Invertern irgendwann abgebrochen ist. Im Moment gehe ich da aber eher von einem Hardwareproblem aus (ist teilweise noch ein breadboard-Aufbau), es könnte aber auch sein, dass irgendwie insgesamt das timing verrutscht). Generelle Anmerkung zu der MI-Geschichte noch: vermutlich sind die MI im Antwortverhalten für die eigentlichen Produktionsdaten deutlich langsamer als die 3rd Gen. Modelle, eigentlich erfolgt im Moment die Folgeanfrage m.E. zu früh. (nur, falls jemand eine Idee hat, wie man das verbessern kann. Vielleicht versuche ich es mal mit einem Zähler, der bei jedem "process()"-Aufruf hochzählt und nur jeden 5. Aufruf abarbeitet?) |
@rejoe2 👍 danke, dass du das testen willst!
Habe ich das richtig verstanden? |
Thx. |
Ah, ok. Also nach 100ms ohne Empfang werden die Kanäle angepasst und erneut gesendet. Und Misserfolg ist erst, wenn 5x keine Rückmeldung. Das könnte die hohe Trefferquote erklären. Na, ich schau mal, ob ich das nachbilden kann 😁 |
eher nach 1100ms... Und ob sich das nachbilden läßt für eine firmware, die mehr wie einen Inverter abfragt? M.E. spricht einiges für den sehr schnellen Wechsel des Empfangskanals, weil die nRF ja auch hardwaremäßig ein paar Wiederholungen machen, wenn kein Ack kommt (aber angefordert ist). Vollständig "durch" bin ich aber gedanklich mit dem ganzen auch noch nicht. Ich fand nur das "spammige" Verhalten der DTU (wie von ZiyatT geschildert) ziemlich merkwürdig für das, was die nRF eigentlich an Optionen bieten... |
Die Anzahl der Inverter ist egal. Es werden nie mehrere Inverter gleichzeitig abgefragt. |
@beegee3 leider verbindet sich deine Version nicht mit einem einzelnen AP. Ich verwende einen ESP8266 Log
Hier ein Buidl mit deinen Änderungen von oben, basierend auf der |
@lumapu 🤔 Habe keinen ESP8266, kann daher deinen Build nicht ausprobieren. Ist vielleicht besser, wenn wir das in #652 weiter diskutieren (auch wenn das schon geschlossen ist). Hatte es doch dort angefangen, in diesem issue geht es ja um die Inverter Kommunikation. |
Meine Kurz-Eindrücke zu der modifizierten hmRadio.h - Basis sind jeweils ein paar Minuten nach dem Start des ESP32 (weil ich parallel noch etwas in Richtung firmware-Infos und "Aussetzen bei process" gemacht habe):
|
@rejoe2 herzlichen Dank für die Rückmeldung. D.h. prinzipiell senden auch die MI Inverter nach den im ersten Beitrag genannten Punkten 1. bis 3. Das ist eine Info mit der ich versuchen kann, meine Modifikation zu verbessern ("Gazelle" o.ä.). Würden die MI fast nicht (oder gar nicht) reagieren, würde das keinen Sinn machen. |
Das könnte hinhauen. Wollte erst widersprechen mit den 100ms, hatte aber auch Versuche gemacht mit "-2". Tatsächlich war die Teilantwort 0x88 (bzw. 0x92) auch auf diesem Kanal zu erhalten, und zwar zeitlich etwas früher wie auf "-1". Das könnte man auch so interpretieren, dass der Wechsel bei den MI (für denen Antwort-rx-Kanal) sogar noch etwas schneller erfolgt wie die 100ms, denn die "Hauptantwort" kam ca. 150ms später auf dem Kanal, auf dem die Anfrage gelegen hatte. Das mit der Ack-Anforderung durch den WR macht m.E. übrigens Sinn, denn dann weiß er, dass er (diese Info) nicht mehr (weiter) senden muss. Das gilt bei den MI nach meinem Eindruck auch für die beiden Teilmessages, Man könnte daraus auch schließen, dass das (hardware-) Ack auch darüber entscheidet, auf welchem Kanal der WR (wann) das nächste Mal sendet. |
Das 'wann' ist sehr wahrscheinlich vom ACK beeinflusst. Und indirekt dadurch auch ein Kanalwechsel. Aber im eigentlichen Sinne geschieht das m.E. nur nach dem 100ms Zeitschema. Die Laufzeit zwischen Frame senden und ACK empfangen ist mitentscheidend. Sonst wäre nicht zu erklären, dass manchmal nach einem Frame gewechselt wird, manchmal gar nicht. |
Ja, das mit dem (relativ) starren Zeitschema paßt schon. Vermutlich machen die WR irgendeine Korrektur, wenn sie mehrere Versuche brauchen, damit die Funktion hinter der Beschreibung "share the same pipeline" paßt, aber das dürfte es gewesen sein. Was ich auf alle Fälle aber mal testen würde wäre der Versuch, ohne stopListening und startListening auszukommen. Eventuell bringt alleine das schon was. Muss aber auch erst mal wieder meinen Code aufräumen... |
ist schon umgesetzt. |
Oh, ok, sorry. Habe die changes im allgemeinen Code nicht alle im Detail angeschaut, mir ist im Moment v.a. daran gelegen, dass "mein" MI-Code das ganze nicht aus dem Tritt bringt und halbwegs funktioniert... |
in der dev. Version ist's noch drin, nur bei meiner Modifikation ist's raus. Hatte es auch bei der dev. mal rausgenommen. Funktioniert genauso, wird nicht schlechter, aber auch nicht wesentlich besser. Die Zeit zwischen stopListening und startListening ist zu kurz um viele Frames zu verpassen. |
denke wir können hier zumachen, ist schon lange integriert und mit der neuen Heuristik von @oberfritze wird das Verhalten ja nochmals optimiert. Wir diskutieren in #1080 weiter |
wie hier angekündigt ein paar Informationen zur Inverter Kommunikation.
Das ist mit Absicht kein Feature Request, die Erkenntnisse beruhen alleine auf einer Reihe von Tests, die ich mit meinem Inverter durchgeführt habe und daher nicht notwendig allgemeingültig sind.
zum Inverter:
zur Kommunikation:
Bisher werden die RX Kanäle in aufsteigender Frequenz alle 4ms gewechselt. Dabei läuft man dem gerade aktuellen TX Kanal des Inverters entgegen, wodurch man eine gute Trefferquote beim Empfang erhält.
Allerdings wird beim Kanalwechsel zuerst ein
stopListening
und nach dem Wechsel einstartListening
aufgerufen. Das ist unnötig (der NRF kann ohne Stopp den Kanal wechseln) und kostet Zeit, in der nicht gelauscht wird.Wenn man den 'richtigen' Kanal gerade verpasst hat, dauerst es bis zum Empfang 16ms, wenn der Inverter zwischenzeitlich den Kanal wechselt, bzw. 20ms, wenn der Inverter nicht wechselt. Dadurch kann es zu 'missing Frames' oder auch 'no answer' kommen.
Beim Senden wird auf ein
ACK
gewartet, was aber nie kommt. Auch das kostet unnötig Zeit, in der der Inverter bereits antwortet, aber nicht gelauscht wird.Habe nun versucht, all dies in eine neue Programmierung umzusetzen. Die sehr guten Werte von @knickohr waren mein Maßstab, wobei meine bisherigen Werte deutlich schlechter waren. Mit der neuen Methode sieht es allerdings anders aus:
Die Konstellation für meine Werte:
1 Inverter mit 2 Panels, 2 Sekunden Intervall, max. 5 Wiederholungen pro Payload,
ohne zusätzliche Features, d.h. kein MQTT, kein Display.
Das Problem beim Lauschen ist, dass man nicht weiß, wann der Inverter seinen Kanal wechselt.
Daher genügt es nicht, 100ms lang auf nur einem Kanal zu lauschen. Stattdessen wird innerhalb der 100ms in einem 3ms Wechsel auf dem erwarteten und dem nächsten Kanal gelauscht, was die Trefferquote deutlich verbessert.
Stellt sich die Frage, ob die neue Methode auch für andere Inverter funktioniert, sprich HM mit weniger/mehr Panels sowie die MI Varianten. Wäre schön, wenn sich Leute finden, die das testen.
Für Interessierte, hier die Änderungen in
hmRadio
(switchRxCh()
löschen!):The text was updated successfully, but these errors were encountered: