ioBroker / AdapterRequests

This Place is used to track the status of new Adapter-Requests.
248 stars 36 forks source link

Adapter Huawei SUN2000-(3KTL-10KTL)-M1 LUNA2000-(5-30)-S0 DTSU666-H Photovoltaikk - local connection #752

Closed RoHa78 closed 4 months ago

RoHa78 commented 1 year ago

What kind of device or service you would like to see an adapter for? Add name and company of the device, including links to the device and any additional informations[...] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Photovoltaik Anlage inkl. Smart Power Sensor und Akkuspeicher von HUAWEI Wechselrichter SUN2000-(3KTL-10KTL)-M1 https://support.huawei.com/enterprise/de/fusionsolar/sun2000ma-pid-22755755 Akkuspeicher LUNA2000-(5-30)-S0 https://support.huawei.com/enterprise/de/fusionsolar/fusionsolardg-pid-23448309 Smart Power Sensor DTSU666-H https://support.huawei.com/enterprise/en/fusionsolar/sun2000l-pid-22027611?category=operation-maintenance ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Is an official API including documentation is available? If yes please add links and informations[...] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Es handelt sich um eine ModBUS Schnittstelle https://support.huawei.com/enterprise/en/fusionsolar/smartlogger-pid-21294677?category=configuration-commissioning&subcategory=configuration-guide ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Are other libraries for an integration available? Ideally in JavaScript/npm, but also other programming languages are interesting, add Links please ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ https://library.loxone.com/detail/huawei-sun2000-inverter-with-smartdongle-modbus-tcp-332/overview ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Is this device already integrated in other Smart Home systems? Add Links please ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Home Assistant: https://github.com/Emilv2/huawei_solar https://community.home-assistant.io/t/integration-solar-inverter-huawei-2000l/132350/1300 As standalone: https://solaranzeige.de/phpBB3/viewtopic.php?t=170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Is this device already integrated in homebridge? Might the ham adapter together with the homebridge plugin be sufficient? Please try it and add infos ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Hab hierzu leider nichts gefunden (Sorry no founds) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Additional context Add any other context or screenshots about the feature request here. If the topic was discussed in ioBroker forum please include the link too. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Diskussion im IOBroker-Forum https://forum.iobroker.net/topic/53005/huawei-sun2000-iobroker-via-js-script-funktioniert ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Vielen Dank!

After you created the issue vote for yourself in the first post of the issue using the "+1"/"Thumbs up" button

stilicrafter commented 1 year ago

@RoHa78 Der Wechselrichter nutzt ModBus und kann darüber eingebunden werden (Google einmal nach SUN2000 ModBus)

RoHa78 commented 1 year ago

@RoHa78 Der Wechselrichter nutzt ModBus und kann darüber eingebunden werden (Google einmal nach SUN2000 ModBus)

Leider scheint der ModBus-Adaper vom IOBroker damit nicht zu funktionieren siehe https://forum.iobroker.net/topic/46048/huawei-sun2000-mit-modbus-adapter-in-iobroker-einbinden Und Scripting / NoteRed beherrsche ich leider nicht.

Diginix commented 1 year ago

Wäre dennoch interessant ob das ein Problem/Fehler vom Modbus Adapter ist und mit einem zukünftigen Update gelöst werden könnte. Dazu müsste man aber mal mind (Debug)Logs, die Modbus Spec vom WR und die (Register)Einstellungen der Instanz liefern damit es sich ein Entwickler ansehen kann. Das ganze natürlich als Issue des Modbusadapters.

Edit: hier gibt es schon eines zu Huawei WR: https://github.com/ioBroker/ioBroker.modbus/issues/250

KornSW commented 1 year ago

Hi zusammen, nur zur info, falls jemand statt Modbus lieber die Cloud nehmen will (oder in Kombi, zwecks Anreicherung mit zusätzlichen Infos), ich habe gerade einen veröffentlicht:

https://github.com/KornSW/ioBroker.fusionsolar

https://forum.iobroker.net/topic/59422/new-adapter-huawei-fusionsolar-api

bei interesse gerne mal testen ;-)

Grüße, Tobias PS: habs mit Modbus leider auch nicht hinbekommen - würde es allerdings auch bevorzugen!

Icke-de commented 11 months ago

Hallo zusammen, Ich habe mich recht ausführlich mit Modbus auseinander gesetzt. Und bin dabei einen Adapter zu schreiben, der die Interessanten Modbusregister in den ioBroker übernimmt. Aber ebend das Gerät an sich darstellt. Ist hier noch bedarf? Bzw. Bräuchte ich irgendeine Mitwirkung um die Geräte in den Adapter zu integrieren. Frage: Wir reden über Modbus TCP? Oder?

Grüße image

RoHa78 commented 11 months ago

@Icke-de Ja das ist korrekt, beim o.g. Wechselrichter handelt es sich um Modbus TCP. Der Befehlsatz sollte unter https://support.huawei.com/enterprise/en/fusionsolar/smartlogger-pid-21294677?category=configuration-commissioning&subcategory=configuration-guide downloadbar sein. Diverse Links zu diesem Wechselrichter (inkl. Akku) sind von mir im ersten Post vermerkt. Da ich softwaremäßig nicht allzugut bewandert bin kann ich diesbezüglich nur als Tester unterstützen. Eine Möglichkeit die ich aktuell nutze und ebenfalls auf Modbus TCP besteht ist das Projekt auf https://solaranzeige.de/phpBB3/viewtopic.php?t=170, ist aber standalone. IOBroker wäre mir jedoch deutlich sympatischer... Anbei ein "kleiner" Auszug aus der DB von Solaranzeige dieser Anlage: image

Icke-de commented 11 months ago

Testen reicht mir da völlig aus. Wenn du Lust und Zeit hast. Die Modbusintegration bei meinem Adapter kann zum Testen über ein NodeJS Projekt laufen, Um erst einmal zu schauen, ob die Werte richtig ankommen. So habe ich das mit meinem SMA TP 8 zumindest gemacht, bevor ich das Ganze im ioBroker eingebunden habe. Kannst du bitte einen direkten Link auf die Modbusbeschreibung setzen ? Ich habe oben bei Huawai geschaut, weiß aber nicht genau welches Dokument genau gemeint ist.

RoHa78 commented 11 months ago

Habe folgende direkte URL für die Beschreibung: https://support.huawei.com/enterprise/en/doc/EDOC1100050690?idPath=9452479%7C21439560%7C7921563%7C21102414%7C21294677 Sollte dann fogendes Dokument angezeigt werden, das dann runtergeladen werden kann: image Hab auch mal angefangen in NodeRed das Ganze umzusetzen, funktioniert zwar, bin aber hier noch nicht sehr weit: image

Icke-de commented 11 months ago

Ja, das habe ich auch gefunden. Was allerdings die Frage aufwirft willst du den Sun2000 oder den Smartlogger per Modus ansprechen? Das sind wenn ich das richtig geblickt habe, 2 verschiedene Geräte. Sorry, ich muss das für mich nur erst einmal rund haben. Zur Erklärung bei mir ist auch ein Smartmeter zusätzlich verbaut, was die Kommunikation zum SMA Portal (Sunny Portal) übernimmt, was grundsätzlich auch per Modbus abgefragt werden kann, habe aber den WR implementiert. Also spreche den direkt an. Bei Huawei gibt es in dem PDF (2.5) einen Verweis auf eine eigene Modbus Beschreibung für den Sun2000.

RoHa78 commented 11 months ago

So wie ich das verstehe, sammelt der Wechselrichter die Daten vom Smartlogger. Dieser wiederum ist mit einem sog. SDongle mit dem Netzwerk verbunden. Über diese Schnittstelle können dann die Daten allesamt sowohl von Wechselrichter, Akku und Smartmeter abgefragt werden. Habe hierzu noch folgenden Link gefunden https://photomate.zendesk.com/hc/en-gb/article_attachments/8560845348253/SDongle_V100R001C00SPC133_Release_Documents.zip Hierin enthalten ist ein kompletter Dokumentensatz von diesem SDongle. Darin befindet sich auch das Dokument SDongleA V100R001C00 MODBUS Interface Definitions.pdf. Mit diesen Angaben sollte man dann über diesen SDongle die kompletten Daten abfragen können. Wenn ich die wenigen Adressen, die ich in NodeRed verwendet habe, mit denen vergleiche, die in o.g. Doku stehen, stimmen die miteinander überein, und das scheint ja zu funktionieren ;)

Icke-de commented 11 months ago

Ok, dein NodeRed Script (nennt man das Script?) wirft auch Daten aus? Du hast also eine valide Datenausgabe, mit der du dann die Adapterwerte prüfen kannst?

Dann bau ich das was du brauchst in den Adapter ein. 😉

Zur Erläuterung: der Adapter bzw. Die Modbus Integration ist nicht fix, kann also auch erweitert werden, nur nicht so wie im Modbusadapter, dass man einzelne Register selber hinzufügen kann, dass passiert alles in dem NodeJS Modul (also im Java Script). Ich wollte keinen Adapter parallel zum Modbus Adapter. Meine Idee galt es die Modbusgeräte wie oben gezeigt in eine Struktur zu bringen die das Gerät an sich wieder spiegelt. Der Typ ist in der Config einzustellen.

RoHa78 commented 11 months ago

Super, das hört sich gut an. Habe mal die Daten zusammengestellt, die ich bisher über "www.Solaranzeige.de" geliefert bekomme. Huawei MEASUREMENTS.pdf

Icke-de commented 11 months ago

@RoHa78 : kennst du dich en bisschen mit NodeJS aus? Bitte teste mal folgendes: (installierte NodeJS 18.16.0 LTS vorausgesetzt) Clone dir bitte folgendes Repro mit: https://github.com/Icke-de/modbus_inverter.git git clone https://github.com/Icke-de/modbus_inverter.git Wechsle in das Verzeichnis: [dein Verzeichnis]\modbus_inverter npm install (Abhängigkeiten werden installiert) Wechsle in das Unterverzeichnis "examples". Öffne die Datei "test_modbusregister.ts" mit einem Editor deiner Wahl. Passe folgende Werte entsprechend deiner Konfiguration an: let ipAddress = ""; let modbusPort = 502; let unitId = 1; (Achtung: ipAddress ist ein string daher bitte in "", Port und unitId ist vom typ number) Datei speichern und in die Konsole wechseln: cmd oder powershell in einem Windows system Gehe wieder in das Verzeichnis cd [dein Verzeichnis]\modbus_inverter\examples führe ts-node test_modbusregister.ts aus.

Ich habe das Modul in TypeSript umgesetzt bzw. Erweitert (ist eine Implementierung für SMA Devices gewesen, das habe ich als Grundlage verwendet) In meinem Jugendlichem Leichtsinn würde ich meinen die Ausgabe zeigt dir die Werte an, die in deinem Node Red Script vorhanden sind. Ich bin gespannt was passiert.

RoHa78 commented 11 months ago

Bin gerade noch unterwegs, melde mich aber umgehend, wenn ich am testen bin.

RoHa78 commented 11 months ago

Habe nun versucht, das Ganze zum Laufen zu bringen, leider nur mit mäßigem Erfolg: Bereits bei npm install sind etliche Fehler angezeigt worden (installierte NodeJS 18.16.0 sollte passen, siehe hierzu das angefügte LOG) habe mich hier nicht beirren lassen und weiter gemacht. Bei Punkt ts-node test_modbusregister.ts hat er die ts-node nicht gefunden: image

2023-06-04T17_15_27_422Z-debug-0.log

Hast Du eine Ahnung an was das liegen kann oder was ich hier falsch mache (mein IOBroker läuft auf einem Raspi, dort habe ich das Ganze auch getestet)?

Icke-de commented 11 months ago

Muss ich mir genauer anschauen. Wichtig ist, dass die DEV-dependencies mit installiert werden, da ts-Node ebenfalls ein Modul ist. Anderen falls könntest du ts-node auch separat installieren. npm install ts-node. Könnte aber auch sein, dass ich das bei mir (Windows) global mit -g installiert habe. Gleiches gilt für TypeScript. Das habe ich auch global installiert.

Icke-de commented 11 months ago

Moin, ich habe gerade kurz das mit Node und npm auf einer leeren Ubuntu Maschine probiert. Was ich dabei gemerkt habe, ist das anscheinend ts-node nicht mit installiert wurde. Das dann bitte noch , wenn du im root Verzeichnis ([dein Verzeichnis]\modbus_inverter) bist mit npm install ts-node installieren. Das sollte soweit funktionieren. Alternativ kannst du schauen, mit tsc -v ob TypeScript installiert ist. Dann im Verzeichnis Examples tsc test_modbusregister.ts ausführen. Dadurch wird die .ts in eine .js konvertiert. die kannst du dann mit node test_modbusregister.js starten.

RoHa78 commented 11 months ago

Hallo @Icke-de, habe nun versucht ts-node w.o. zu installieren. Hat diesbezüglich keine Fehler angezeigt. Aufruf von tsc -v ist leider fehlgeschlagen. image Hab das Gefühl, das da was verbogen ist ...

Icke-de commented 11 months ago

Dann fehlt da noch TypeScript. Ich würde allerdings nicht deinen ioBroker nehmen, nicht da was kaputt geht ;-). Theoretisch sollte das funktionieren, aber zum Testen habe ich meinen Windows Rechner genommen. Und aber auch eine VM mit Ubuntu. Ich würde schau mal, dass ich einen Rechner nehme wo noch nichts weiter mit Node gemacht wurde. Das muss funktionieren. NodeJS und NPM verhalten sich ja erst einmal nicht unterschiedlich. Die genaue Reihenfolge bzw. Befehle schicke ich dann.

RoHa78 commented 11 months ago

Habe nun mittlerweile ein jungfräuliches Ubuntu 22.04 in einer VM. Wie soll ich weiter vorgehen?

Icke-de commented 11 months ago

OK, dann mal los:

  1. apt update
  2. apt upgrade
  3. apt install nodejs
  4. node -v (output: v18.7.0)
  5. apt install npm
  6. npm -v (output: 8.18.0)
  7. git -v (output: git version 2.37.2)
  8. cd /opt
  9. git clone https://github.com/Icke-de/modbus_inverter.git
  10. ls (output: root@test-node:/opt# ls modbus_inverter)
  11. cd modbus_inverter/
  12. npm install
  13. apt install ts-node
  14. ts-node -v (output: v10.9.1)
  15. cd examples
  16. ls (output: sunny_island6-0.ts sunny_tripower-8.ts test_modbusregster.ts)
  17. nano test_modbusregister.ts (IP Adresse eintragen in die "") mit Strg-o (speichern) Strg-x (beenden)
  18. ts-node test_modbusregister.ts

Ich habe das bei mir mit ts-node sunny_tripower-8.ts getestet, das kam dann raus. root@test-node:/opt/modbus_inverter/examples# ts-node sunny_tripower-8.ts Seriennummer wird ausgelesen! 3014711683 DeviceClass wird ausgelesen! Solar-Wechselrichter 2840.236 46.462 0 0 OK (ok)

Icke-de commented 11 months ago

Achso wichtig ist vielleicht noch. Ich habe mit root gearbeitet. Daher brauchte ich sudo nicht immer vorschreiben. Möglicherweise musst du das machen. Bei dir funktioniert auch nur test_modbusregister.ts. Das sunny...ts Script ist natürlich auf meinen WR konfiguriert. Viel Erfolg.

RoHa78 commented 11 months ago

Sorry, dass ich mich jetzt erst wieder melde. Habe o.g. Schritte bis einschließlich Punkt 12 durchführen können, musste aber noch nodejs von Standardversion 12.22.9 auf die 18.7.0 updaten müssen. hat soweit ohne Fehler geklappt. Bei der Installation von ts-node hat er dann gestreikt weil anscheinend irgendwelche Pakete kaputt waren. ein apt update und apt upgrade haben hier aber keine neuen Dateien installiert. Ausgabe von apt install ts-node image Kann man das irgendwie beheben?

Icke-de commented 11 months ago

Weiß nicht so 100% ob das was hilft. Aber ein boot tut immer gut. Starte die Maschine einmal neu. Dann könntest du npm auf die latest version update. npm install -g npm@latest (bei mir hat er allerdings auch erst nach einem reboot die aktuelle Version angezeigt. node -v sollte dann 9.6.7 auswerfen. Schau mal ob du dann ts-node installieren kannst. Ist schon komisch bei meinem Ubuntu wurde npm in 8.18.0 installiert, bei dir 8.15.0. Dabei ist 9.6.7 aktuell. Ich komme eigentlich aus der Windows Welt, Hab mich auch nicht wirklich mit den ganzen Paketmanager und Repertoires befasst. (Was im übrigen bedeutet, dass ich mich noch damit befassen muss, wie man einen Adapter, wenn er funktional und fertig ist veröffentlicht, dass auch andere was davon haben ;-).) Aber alles zu seiner Zeit :) Probiere das mal bitte

RoHa78 commented 11 months ago

Hat leider nicht funktioniert, habe auch noch mal die Abhängigkeiten fixen lassen und sowohl nodejs als auch npm auf die aktuellsten stabilen Versionen aktualisiert, ts-node ließ sich dann leider immer noch nicht installieren. Werde morgen mal googlen oder vielleicht das Ganze mit einem Raspi ö.ä. aufsetzen. Melde mich wieder wenn ich da weitergekommen bin. Erstmal aber vielen Dank für Deine Unterstützung!

RoHa78 commented 11 months ago

Mittlerweile bin ich etwas weiter, nachdem ich nun statt Ubuntu Debian in der VM habe (liegt auch näher am Raspbian ;)) Die Ganzen Pakete laufen soweit, ts-node "Hello world" läuft ebenfalls. IP vom Wechselrichter (DongleA) ist eingetragen, Parameter stimmen mit meinem funktionierenden NodeRed überein, sämtliche sonstigen Master sind deaktiviert.

image Bei test_modbusregister.ts fehlt noch das "i" im Name. Da nach ca. 5min Wartezeit noch keine Reaktion erfolgt ist, hab ich das Script abgebrochen. Entweder es kommen keine Daten oder irgendwas mit der Initialisierung ist noch nicht ganz i.O.

Viele Grüße

Icke-de commented 11 months ago

Hi, Das mit dem I habe ich gesehen, dachte aber ich hab das oben in der Beschreibung falsch geschrieben und da auch korrigiert. Jetzt sehe ich das ich die Datei schon falsch benannt habe. Pass ich dann auch mal an. Eigentlich ist es so, das zumindest eine response kommt 'kann keine Verbindung aufbauen' und das dann in einer Schleife. Ich schau nachher nochmal drauf, ob ich da einen groben Fehler gemacht habe. Was ich damit sagen will ist, dass eigentlich eine Reaktion kommen muss. Gleiches würde passieren, wenn du sunny_tripower8.ts starten würdest, außer auf der IP 192.168.178.123 antwortet ein Gerät auf Port 502. ;-). Wie gesagt ich schau nochmal und Push ggf. noch was in das Repro. So Remote Support ist echt schwierig ;-). Aber das passt schon. Ich brauch ne einfachere Art Geräte zu testen. Welche IP hat dein Gerät? Ich hab für meine Test einen Modbus Slave eingesetzt, dann würde ich das gleich so einstellen. Achso die UnitID / SlaveID müsste ggf. angepasst werden.

RoHa78 commented 11 months ago

Hallo, Unit-ID sollte passen, siehe Rückmeldung von NodeRed: "Client -> fsm connected after state init Get More About It By Logging TCP@192.168.178.26:502 default Unit-Id: 1" Was nimmst Du als Modbus Slave, ist das eine separate Hardware oder nur Software?

Icke-de commented 11 months ago

eine Software, EasyModbusTCP Server Simulator. Aber das Script sollte etwas ausgeben, Garnichts ist falsch. Wenn du beispielsweise die IP änderst kommt sowas hier.

PS C:\Work\node_projects\testHuawei\modbus_inverter\examples> ts-node .\test_modbusregister.ts Connect to: 192.168.178.90 Couldnt connect to 192.168.178.90:502 Couldnt connect to 192.168.178.90:502 Couldnt connect to 192.168.178.90:502 Couldnt connect to 192.168.178.90:502 PS C:\Work\node_projects\testHuawei\modbus_inverter\examples>

Ich hab das "Connect to:" hinzugefügt, ist eine Consolen Ausgabe in der Funktion die aufgerufen wird. Und das i im Dateinamen habe ich hinzugefügt ;-) bitte beachten.

RoHa78 commented 11 months ago

Hab's nun nochmals getestet, Connection kommt zustande, jedoch nach längerer Wartezeit (3-4min) hab ich abgebrochen (Script ist 2x gestartet worden -> siehe Screenshot). image Jetzt wäre interessant, ob überhaupt was kommt oder der Wechselrichter gar nicht reagiert.

Icke-de commented 11 months ago

Also Fehlermeldungen Wie Register wird nicht unterstützt oder ähnlich kommen wenn sie zutreffend sind. Was gibt dir denn dein NodeRed Script aus? der erste Register ist 30000 der Abgefragt wird.

RoHa78 commented 11 months ago

Aktuell kommt, außer "Connect to..." keine weitere Meldung mehr. Anbei nun die Konfiguration in NodeRed (inkl. der Rückmeldung vom Wechselrichter -> siehe rechts Ausgabe debug 1) image

Als Ergebnis nach der "Aufbereitung" sollte hier dann folgendes stehen: image

Die Rückmeldewerte werden als short integer (2Byte) in einem 15er Array gespeichert. D.h. die Zahl im ersten Index 21333 oder Hex &x5355 entspricht als ASCII den ersten beiden Buchstaben der Modellbezeichnung, nämlich "SU" Hoffe dies hilft etwas weiter.

Icke-de commented 11 months ago

Ja das hilft weiter. Ich pass das mal an. Und gebe Bescheid. Ich glaube ich Weiß woran es liegt. Allerdings, das hat mich etwas gewundert ist der Datentyp in der Modbusbeschreibung "String". Ich mach da mal was und melde mich.

Icke-de commented 11 months ago

Nabend, ich habe nochmal was hochgeladen. Ich weiß nicht recht, müsstest du einmal Testen. Ich habe folgendes gemacht. Erst einmal beschränkt auf 1 Abfrage. (Modell) Das habe ich dann mit dem Slave Server getestet. image Dazu habe ich die Werte einmal eingetragen, die dein NodeRed Script ausgibt. In dem Bild siehst du, dass die Modbusregister um -1 verschoben sind. Ich kann gerade nicht sagen, ob das am Slave oder der Modbusintegration liegt. Bei meinem WR musste ich die exakten Register ansprechen. Jetzt ist es so eingestellt, dass das 1 Register was abgefragt wird 29999 ist. Wie gesagt es müsste eine Fehlermeldung kommen, wenn die Register nicht unterstützt werden, daher wundert mich das ein bisschen. Um Sicher zu gehen, dass hier vielleicht was anderes erwartet wird als gedacht. (angepasst: in /lib/devices/huawei_SDongleA.ts) Falz du das wieder ändern möchtest nimm die "-1" hinter der 30000 wieder weg. Das Ergebnis ist folgendes: PS C:\Work\node_projects\testHuawei\modbus_inverter\examples> ts-node .\test_modbusregister.ts Connect to: 127.0.0.1 Modell: SUN2000-8KTL-M101074300-00202 Der Datentyp ist mit string auch richtig. Wenn dein NodeRed Script einen "permanenten" Request auf den WR macht, schalte das bitte einmal ab. Ich habe bei mir gemerkt, dass wenn ich die Modbusschnittstelle zu oft abfrage bzw. Das Intervall zu kurz ist, Das Modbus da streikt bzw. die Schnittstelle nicht antwortet. Du kannst auch die Auskommentierung in der test_modbusregister.ts verändern um z.B. die Modellnummer abzufragen. Damit eventuell mal irgendwas zurück kommt. (oder wie gesagt auch mal bewusst eine falsche IP eintragen, ob die entsprechende Fehlermeldung kommt) Würde mich wundern wenn nicht, das könnte ich dann nicht wirklich nachvollziehen. Bin auch hier wieder gespannt ob das was bringt.

grüße und viel Erfolg ;-)

RoHa78 commented 11 months ago

Hi, folgendes Ergebnis:

Ich habe deshalb mal alle Registerzugriffe auskommentiert, um zu sehen, ob das Script sich beendet, was es dann auch tat. image Als nächstes habe ich die Registeradresse für die Modellbezeichnung wieder auf 30000 gesetzt. Zusätzlich habe ich mal spaßeshalber den Datentyp im huawei_SDongleA.ts von String auf int16 gesetzt. image Dies hat dann folgendes Ergebnis geliefert: image hier scheint es sich um den Integerwert der ersten beiden Buchstaben "SU" zu handeln Folgerung: Strings sind normalerweise eine eine Aneinanderkettung von Bytes (8Bit), die Werte im WR sind jedoch als 16Bit-Integer abgelegt. Möglicherweise gibt es dann hier eine Art "Überlauf" der Variable, wenn ich eine integer-Zahl in ein Byte einlesen möchte, d.h. man müsste erst die integer einlesen und danach die High- und Low-Byte getrennt in 2 Einzelne Stringzeichen umwandeln.

Icke-de commented 11 months ago

Na vielleicht sollten wir die Codierung von utf-8 auf utf-16 umstellen. Ich meine im Nodemodul die utf-8 Codierung bei String gesehen zu haben. In dem Fall müssten wir den Datentyp noch hinzufügen sodass utf-8 oder utf-16 ausgewählt werden kann. (Das ist jetzt so ins Blaue gesprochen ohne lange drüber nachgedacht zu haben) Heute habe ich keine Zeit mehr. Komme erst morgen dazu was zu verändern.

RoHa78 commented 11 months ago

Kein Problem, das Ganze eilt ja nicht. Ich befürchte dass eine Umstellung von UTF-8 auf UTF-16 nichts bringen wird. In dem Integer Wert vom WR sind ja zwei ASCII kodiert, UTF-16 heißt ja in diesem Fall nur dass ich in einem 16Bit Wert noch weitere Sonderzeichen kodieren könnte, z.B. die Japanischen Schriftzeichen, heißt dass alles >8 Bit sind alternative Zeichensätze siehe https://www.fileformat.info/info/charset/UTF-16/list.htm Gibt es die Möglichkeit, dass ich den Ablauf des Scripts mit einem Breakpoint stoppen und mir den Rückgabewert von z.B. 'return await super.readModbusHR(30000, ModbusDatatype.int16, 15);' anzeigen lassen kann? Sollte doch nach meiner Interpretation ein Array von 0-14 sein, in dem sich somit 15 verschiedene Integerwerte befinden. Nun müsste man die 2 Bytes des Integer von jedem Index-Wert im Array in zwei einzelne Bytes trennen und diese nacheinander in einen String schreiben (jedes Byte entspricht dann dem ASCII Wert). Dieser String wird dann von der Funktion zurückgegeben. Möglicherweise existiert hier auch bereits eine fertige Funktion...

Icke-de commented 11 months ago

Du willst dir den Buffer ausgeben lassen? Schau doch mal in die lib/modbus_typings.ts Was funktionieren würde, wenn du dir einen Pseudo Datentyp erstellst. Z.B. json. Anstelle eines return fügst du ein console.log ein. So wird kein Wert zurückgegeben, aber eine Konsolenausgabe erzeugt. Ausgabe aus dem Test:

PS C:\Work\node_projects\testHuawei\modbus_inverter\examples> ts-node .\test_modbusregister.ts Connect to: 127.0.0.1 { type: 'Buffer', data: [ 83, 85, 78, 50, 48, 48, 48, 45, 56, 75, 84, 76, 45, 77, 49, 0, 48, 49, 48, 55, 52, 51, 48, 48, 45, 48, 48, 50, 0, 0 ] }

Ich Push das mal ins Git. Dann kannst du dir anschauen, was ich meine. Das mit den Breakpoints geht eventuell im VisualStudio (Da verwende ich dies in Verbindung mit C#) bei VS Code allerdings habe ich mich damit noch nicht beschäftigt.) In den Datentypen kannst du schauen, was am Besten passt. Nimmst du das toJson() weg, wird der Buffer direkt ausgegeben. Das Json fand ich aber gar nicht so schlecht, Wenn man sich die ASCII Tabelle anschaut und die Werte die im JSON stehen. (Vorausgesetzt, dein WR gibt da auch was Sinnvolles aus)

RoHa78 commented 11 months ago

Hallo, sorry hatte gestern leider keine Zeit... Habe nun aktuell nochmal mit der aktuellen Version getestet, leider ohne Erfolg. Was dabei auffällig ist, nachdem die Connection hergestellt wurde, blinkt der Cursor etwa 2-3 Sekunden, dann bleibt er schwarz, als ob sich das Ganze aufhängt, nur über CTRL+C komme ich wieder in die Konsole. image Sämtliche andere Abfragequellen sind beim Versuch komplett deaktiviert, so dass diese nicht dazwischenfunken können. Hab das Ganze dann auch mal unter Android mit Modbus Monitor versucht auszulesen: image dies scheint so zu funktionieren, aktuell habe ich leider keine Idee, wie wir hier weiterkommen können...

Icke-de commented 11 months ago

na liest du da die Inputregister oder die Holdingregister? Du könntest readModbusHR gegen readModbusIR tauschen, dann würdest du die Inputregister auslesen. Ansonsten würde ich mich damit nochmal genauer befassen und mich da belesen. Ein bisschen reizt mich das ja schon. Kannst du mir dein NodeRed Script irgendwie zukommen lassen? Geht das? Ich kenne zwar NodeRed wenn es komplexer wird muss man sich aber ganz schön anstrengen da durchzusehen.

stilicrafter commented 11 months ago

@RoHa78 Wenn du den Flow mit ModBus öffnest: Oben Rechts auf das Hamburger Menü. Dort Export wählen. Aktueller Flow anklicken. Dann JSON Alles kopieren. Im GitHub Editor auf "addCode" oder den Text in eine Datei speichern und hier hochladen, falls es zu viele Zeichen sind.


Falls die Werte in der Konfigurationsnode wichtig sind:

Unter dem Hamburger Menü den Pfeil nach unten klicken Konfigurations-Node auswählen die Modbus Node suchen hier reichen als erstes ein Screenshot

Icke-de commented 11 months ago

@stilicrafter 👍 @RoHa78 : ich habe da nochmal was ins GIT gelegt. Von der Theorie her gibt er nur den Buffer aus. Da wird sonst nichts weiter gemacht. Alternativ könntest du auch nochmal auf uint16 umstellen (das hat zumindest funktioniert) dort sollte ebenfalls der Buffer auf der Konsole ausgegeben werden. Und ändere mal bitte die länge von 15 auf 8 (vorher) und lies das als string aus. Möglicher Weise fragen wir mit einer Länge von 15 zu viele Register ab und bekommen daher nichts richtiges raus. Ausgabe Länge 15 : Connect to: 127.0.0.1 <Buffer 53 55 4e 32 30 30 30 2d 38 4b 54 4c 2d 4d 31 00 30 31 30 37 34 33 30 30 2d 30 30 32 00 00> Ausgabe Länge 8 : Connect to: 127.0.0.1 <Buffer 53 55 4e 32 30 30 30 2d 38 4b 54 4c 2d 4d 31 00> das entspricht : SUN2000-8KTL-M1

RoHa78 commented 11 months ago

Habe nun mal mit der aktuellen Version sämtliche Varianten ausprobiert (wie immer, sonstige Zugriffe auf den Wechselrichter-Modbus deaktiviert):

Hier wie gewünscht den NodeRed-Flow als Grafik (auf der Debugseite sieht man die korrekten Werte die ausgelesen werden): image

als Export: [ { "id": "cae4a37bf579427a", "type": "tab", "label": "Huawei Wechselrichter", "disabled": false, "info": "", "env": [] }, { "id": "132209fe2c51adfa", "type": "inject", "z": "cae4a37bf579427a", "name": "24 Std. Intervall", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "86400", "crontab": "", "once": true, "onceDelay": "60", "topic": "", "payload": "", "payloadType": "date", "x": 136.9999771118164, "y": 63.9999942779541, "wires": [ [ "fbb0aa0a6afb6470" ] ] }, { "id": "fbb0aa0a6afb6470", "type": "modbus-getter", "z": "cae4a37bf579427a", "name": "Modell [30000]", "showStatusActivities": false, "showErrors": false, "logIOActivities": false, "unitid": "1", "dataType": "HoldingRegister", "adr": "30000", "quantity": "15", "server": "70220ecd.1ca1e", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "x": 186.9999771118164, "y": 123.9999942779541, "wires": [ [ "bf7c3f42dbbd3560", "b790e417b2cf36de" ], [ "4d9af070056bb1cd" ] ] }, { "id": "bf7c3f42dbbd3560", "type": "buffer-parser", "z": "cae4a37bf579427a", "name": "", "data": "payload", "dataType": "msg", "specification": "spec", "specificationType": "ui", "items": [ { "type": "string", "name": "Model", "offset": 0, "length": 15, "offsetbit": 0, "scale": "0.1", "mask": "" } ], "swap1": "", "swap2": "", "swap3": "", "swap1Type": "swap", "swap2Type": "swap", "swap3Type": "swap", "msgProperty": "payload", "msgPropertyType": "str", "resultType": "value", "resultTypeType": "output", "multipleResult": false, "fanOutMultipleResult": false, "setTopic": true, "outputs": 1, "x": 410, "y": 120, "wires": [ [ "174efb1a3c2f371c", "3105fd673238e831" ] ] }, { "id": "174efb1a3c2f371c", "type": "ioBroker out", "z": "cae4a37bf579427a", "name": "Model", "topic": "0_userdata.0.Huawei.Inverter.Model", "ack": "true", "autoCreate": "true", "stateName": "Huawei", "role": "name", "payloadType": "string", "readonly": "false", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 590, "y": 120, "wires": [] }, { "id": "3105fd673238e831", "type": "debug", "z": "cae4a37bf579427a", "name": "Ausgabe1", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 840, "y": 80, "wires": [] }, { "id": "4d9af070056bb1cd", "type": "modbus-getter", "z": "cae4a37bf579427a", "name": "Modell-ID [30070]", "showStatusActivities": false, "showErrors": false, "logIOActivities": false, "unitid": "1", "dataType": "HoldingRegister", "adr": "30070", "quantity": "1", "server": "70220ecd.1ca1e", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "x": 196.9999771118164, "y": 183.9999942779541, "wires": [ [ "321d3e31928530ce" ], [ "65ef3c45d7cdd4fb" ] ] }, { "id": "321d3e31928530ce", "type": "buffer-parser", "z": "cae4a37bf579427a", "name": "", "data": "payload", "dataType": "msg", "specification": "spec", "specificationType": "ui", "items": [ { "type": "uint16be", "name": "Model ID", "offset": 0, "length": 1, "offsetbit": 0, "scale": "1", "mask": "" } ], "swap1": "", "swap2": "", "swap3": "", "swap1Type": "swap", "swap2Type": "swap", "swap3Type": "swap", "msgProperty": "payload", "msgPropertyType": "str", "resultType": "value", "resultTypeType": "output", "multipleResult": false, "fanOutMultipleResult": false, "setTopic": true, "outputs": 1, "x": 410, "y": 180, "wires": [ [ "80436b4096368fdf", "066bdf8c2867e6cb" ] ] }, { "id": "80436b4096368fdf", "type": "ioBroker out", "z": "cae4a37bf579427a", "name": "Model ID", "topic": "0_userdata.0.Huawei.Inverter.Model_ID", "ack": "true", "autoCreate": "true", "stateName": "Huawei", "role": "", "payloadType": "number", "readonly": "false", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 600, "y": 180, "wires": [] }, { "id": "65ef3c45d7cdd4fb", "type": "modbus-getter", "z": "cae4a37bf579427a", "name": "Seriennummer [30015]", "showStatusActivities": false, "showErrors": false, "logIOActivities": false, "unitid": "1", "dataType": "HoldingRegister", "adr": "30015", "quantity": "19", "server": "70220ecd.1ca1e", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "x": 206.9999771118164, "y": 243.9999942779541, "wires": [ [ "4fa6470a18221c51" ], [ "c133f76ca9b21187" ] ] }, { "id": "4fa6470a18221c51", "type": "buffer-parser", "z": "cae4a37bf579427a", "name": "", "data": "payload", "dataType": "msg", "specification": "spec", "specificationType": "ui", "items": [ { "type": "string", "name": "Seril", "offset": 0, "length": 19, "offsetbit": 0, "scale": "0.1", "mask": "" } ], "swap1": "", "swap2": "", "swap3": "", "swap1Type": "swap", "swap2Type": "swap", "swap3Type": "swap", "msgProperty": "payload", "msgPropertyType": "str", "resultType": "value", "resultTypeType": "output", "multipleResult": false, "fanOutMultipleResult": false, "setTopic": true, "outputs": 1, "x": 410, "y": 240, "wires": [ [ "3f0423191d1298d2", "cfc3220d699d7ca3" ] ] }, { "id": "c133f76ca9b21187", "type": "modbus-getter", "z": "cae4a37bf579427a", "name": "30055", "showStatusActivities": false, "showErrors": false, "logIOActivities": false, "unitid": "1", "dataType": "HoldingRegister", "adr": "30035", "quantity": "19", "server": "70220ecd.1ca1e", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "x": 156.9999771118164, "y": 303.9999942779541, "wires": [ [ "6e893d31c298faa4" ], [] ] }, { "id": "6e893d31c298faa4", "type": "buffer-parser", "z": "cae4a37bf579427a", "name": "", "data": "payload", "dataType": "msg", "specification": "spec", "specificationType": "ui", "items": [ { "type": "string", "name": "Seril", "offset": 0, "length": 19, "offsetbit": 0, "scale": "0.1", "mask": "" } ], "swap1": "", "swap2": "", "swap3": "", "swap1Type": "swap", "swap2Type": "swap", "swap3Type": "swap", "msgProperty": "payload", "msgPropertyType": "str", "resultType": "value", "resultTypeType": "output", "multipleResult": false, "fanOutMultipleResult": false, "setTopic": true, "outputs": 1, "x": 396.9999771118164, "y": 303.9999942779541, "wires": [ [ "ee79d48046e51d3a" ] ] }, { "id": "066bdf8c2867e6cb", "type": "debug", "z": "cae4a37bf579427a", "name": "Ausgabe2", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 840, "y": 140, "wires": [] }, { "id": "3f0423191d1298d2", "type": "ioBroker out", "z": "cae4a37bf579427a", "name": "SerialNumber", "topic": "0_userdata.0.Huawei.Inverter.SerialNumber", "ack": "true", "autoCreate": "true", "stateName": "Huawei", "role": "name", "payloadType": "string", "readonly": "false", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 620, "y": 240, "wires": [] }, { "id": "b790e417b2cf36de", "type": "debug", "z": "cae4a37bf579427a", "name": "debug 1", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 366.9999771118164, "y": 83.9999942779541, "wires": [] }, { "id": "cfc3220d699d7ca3", "type": "debug", "z": "cae4a37bf579427a", "name": "Ausgabe 3", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 850, "y": 200, "wires": [] }, { "id": "ee79d48046e51d3a", "type": "debug", "z": "cae4a37bf579427a", "name": "Ausgabe 4", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 850, "y": 260, "wires": [] }, { "id": "70220ecd.1ca1e", "type": "modbus-client", "name": "WLAN-FE", "clienttype": "tcp", "bufferCommands": true, "stateLogEnabled": true, "queueLogEnabled": true, "failureLogEnabled": true, "tcpHost": "192.168.178.26", "tcpPort": "502", "tcpType": "DEFAULT", "serialPort": "/dev/ttyUSB", "serialType": "RTU-BUFFERD", "serialBaudrate": "9600", "serialDatabits": "8", "serialStopbits": "1", "serialParity": "none", "serialConnectionDelay": "100", "serialAsciiResponseStartDelimiter": "", "unit_id": "1", "commandDelay": "1", "clientTimeout": "5000", "reconnectOnTimeout": false, "reconnectTimeout": "2000", "parallelUnitIdsAllowed": true } ]

und einen Screenshot des Modbus-Nodes beispielhaft am "Modell" Node image

sowie die Konfiguration: image

christi-ko commented 10 months ago

Nachdem ich nun auch endlich meinen Wechselrichter in Betrieb habe wollte ich mich zum Status des Adapters informieren, ob es hier noch weiter geht. Wenn ihr irgendwelche Tester / INFO's Hilfe etc. benötigt dann kann ich mich gerne versuchen. Java ist jetzt nicht das was ich am besten kann, aber ein paar Skripte hab ich schon mal im iobroker (Blockly) geschrieben. Gruß chrisko

mcm1957 commented 10 months ago

Nach meiner Kentnis ist derzeit kein ADAPTER in Entwicklung da sich noch kein Dev dafür gefunden hat.

Der Inverter ist via Modbus ansprechbar.

RoHa78 commented 10 months ago

Aktuell "pausiert" das Projekt. Icke-de hat hier mal begonnen eine Art Universal-Modbus Adapter zu machen, bei dem per Konfiguration das entsprechende Gerät angesprochen werden kann. Der Standard Modbus-Adapter im IOBroker funktioniert mit dem Huawei Wechselrichter offenbar nicht. Mit NodeRED bekommt man es zum Laufen, hatten jedoch wie man im Verlauf oben sehen kann, hier auch Probleme eine Antwort zum WR zu bekommen. Das Problem scheint hier, das etwas störrische Verhalten des WR zu sein. Solange hier das Kommunikationsproblem nicht gelöst ist, liegt das Ganze auf Eis. Vielleicht hilft es Icke-de hier weiter, wenn sich hier weitere Tester mit einklinken, die hier zur Lösung beitragen können.

mcm1957 commented 10 months ago

Wenn es Probleme mit dem Modbus Adapter gibt wär ein issue dort angebracht - falls keines existiert.

RoHa78 commented 10 months ago

Issue beim Modbus-Adapter in Verbindung mit dem Huawei WR gibt es, liegt glaube aber nicht am Adapter 🤔

christi-ko commented 10 months ago

Danke euch. Ich habe es mit NodeRed ans laufen gebracht. War kein großes Thema da ja schon gut beschrieben. War mir nur nicht sicher ob Ihr noch Tester braucht. Wäre ja für den nicht so versierten Anwender eine nette Erleichterung gewesen.

==> Also ich kann gerne unterstützen wenn es ums testen geht ...

Icke-de commented 9 months ago

Hallo zusammen, ich bin gerade in meinem Bauprojekt am Haus etwas eingespannt. Daher bin ich noch nicht wirklich dazu gekommen etwas neues zu testen. Der Ehrgeiz das bei euch zum laufen zu bekommen ist auf jeden Fall da ;-). Ich glaube aber das wird erst zum ende des Jahres wieder was, wenn man draußen nicht mehr so viel machen kann. Dann bin ich wieder dabei. Ich habe einen Ansatz gefunden, der gut aussieht. Den möchte ich mir dann genauer anschauen. Bin noch am Überlegen, wie ich das in einem Test aufbauen kann, sodass ich den Huawai Sun2000 Nachstellen kann, da bei meinen Tests erst einmal soweit alles funktioniert, der WR nur nicht so mitspielt. Aber wie gesagt, obwohl das Wetter zur Zeit auch doof ist, in der kälteren Jahreszeit geht es weiter. (von meiner Seite aus)

Grüße