Hat schon jemand die Huawei FusionSolar API umgesetzt

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Hat schon jemand die Huawei FusionSolar API umgesetzt

    Hallo Leute,

    ich würde gerne für meine Photovoltaikanlage über die Huawei Fusionsolar API Daten auslesen.

    Leider finde ich keine VB.NET Beispiele dafür.
    Hat das von Euch schon jemand gemacht und hat dafür Beispielcodes oder schon Klassen oder Module dafür geschrieben?

    Die API-Beschreibung habe ich schon gefunden, weiß aber nicht ob diese noch aktuell ist: forum.huawei.com/enterprise/en…ount/thread/591478-100027

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Mittlerweile habe ich einen API-Zugang von Huawei erhalten. Werde das aber später erst ausprobieren und hier berichten (oder jemand anders ;) ).
    Da der Abfrageintervall für Drittanbieter über die API 1 Minute beträgt, ist das wohl nicht so brauchbar.

    Ich wende mich nun der Abfrage des Wechselrichters direkt über Modbus TCP zu, dazu eröffne ich aber einen eigenen Thread um thematisch im richtigen Forum zu bleiben.

    #### NACHTRAG ####
    Erste Versuche mit Postman waren erfolgreich. Huawei hat zu den Zugangsdaten auch gleich eine super API-Anleitung mitgeschickt.
    Nun muss ich das nur noch in VB.NET umsetzen.
    Bilder
    • HuaweiAPIMitPostman.jpg

      292,31 kB, 1.215×865, 1.421 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()

    Ich habe es gewusst, meine erste Frage dazu ist schon da.
    Ich konnte mich schon erfolgreich anmelden und bekam auch den Token.

    Nun möchte ich den Code aber etwas kürzer (und schöner) machen.
    Keine Ahnung was ich weglassen oder verändern kann.


    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Login zur FusionSolar API
    3. ''' Es kommt ein XSFR-Token als Rückgabe, welcher in weiteren Abfragen als HTTP-Header "XSFR-Token" mitgeschickt werden muss
    4. ''' </summary>
    5. ''' <param name="userName">Login von Huawei erhalten</param>
    6. ''' <param name="systemCode">Passwort von Huawei erhalten</param>
    7. Public Sub Huawei_API_Login(userName As String, systemCode As String)
    8. Global_API_Response_XSRFTTOKEN = ""
    9. Global_API_Response_Body = ""
    10. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 'wegen https
    11. Dim body As String =
    12. "{
    13. 'userName':'" + userName + "',
    14. 'systemCode':'" + systemCode + "'
    15. }"
    16. body = body.Replace("'", """")
    17. Dim data = Encoding.UTF8.GetBytes(body)
    18. Dim APIResponse As String
    19. Dim APIRequest = System.Net.HttpWebRequest.Create(API_URL_Login)
    20. APIRequest.ContentLength = data.Length
    21. APIRequest.ContentType = "application/json"
    22. APIRequest.Method = "POST"
    23. Using requestStream = APIRequest.GetRequestStream
    24. requestStream.Write(data, 0, data.Length)
    25. requestStream.Close()
    26. Using responseStream = APIRequest.GetResponse.GetResponseStream
    27. Using reader As New StreamReader(responseStream)
    28. APIResponse = reader.ReadToEnd()
    29. Global_API_Response_XSRFTTOKEN = APIRequest.GetResponse.Headers("XSRF-TOKEN")
    30. End Using
    31. End Using
    32. End Using
    33. Global_API_Response_Body = APIResponse
    34. End Sub
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dive26“ ()

    So, nun habe ich den Dreh raus.
    Die Oberfläche ist einmal funktionell - also um alles auszuprobieren und alle Werte auszulesen.
    Wenn dann in ein bis 2 Wochen mein endgültiger Wechselrichter und die Speicher kommen, dann mache ich das Projekt fertig.
    Also mit einer schönen Oberfläche - ähnlich wie meine Daikin-Steuerung.
    Dann werde ich auch das eine oder andere Codefragment hier posten. Aber die API-Beschreibung von Huawei ist schon recht gut.

    #### NACHTRAG #####
    Erste lauffähige Version fertig.
    Sobald der Akku installiert wurde, wird auch die (derzeit noch dummy-Anzeige) korrekt den Akkuinhalt anzeigen.
    Laden mit einem > und entladen mit einem < grafisch vor der Füllanzeige.
    Bilder
    • technischesKonzept.jpg

      185,8 kB, 1.163×528, 1.329 mal angesehen
    • daikinsteuerung.jpg

      105,66 kB, 354×766, 850 mal angesehen
    • IMG_20220823_133533.jpg

      7,28 MB, 5.120×3.840, 724 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()

    Wollte Euch zeigen was ich bis jetzt schon hinbekommen habe.
    Im Prinzip handelt es sich nur um API-Abfragen und auswerten von übergebenen JSON-Strings.

    Das mit den JSON-Strings ist so eine Sache. Hier arbeite ich mit String-Operationen UND dem Dictionary.
    Bilder
    • bopvinfo_screenshot1.jpg

      24,88 kB, 352×57, 489 mal angesehen
    • bopvinfo_screenshot3.jpg

      765,53 kB, 905×1.414, 386 mal angesehen
    • bopvinfo_screenshot4.jpg

      947,58 kB, 1.556×963, 336 mal angesehen
    • bopvinfo_screenshot11.jpg

      25,88 kB, 352×57, 279 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:


    Das mit den JSON-Strings ist so eine Sache. Hier arbeite ich mit String-Operationen UND dem Dictionary.


    Was ist an JSON denn so eine Sache? Dein JSON repräsentiert ein Datensatz, du (er)kennst offensichtlich nur den Aufbau der Klasse nicht.
    Da gibt es Helferlein, wie ich gehört habe soll es direkt im VS gehen, ansonsten kann man sich das aber auch er-goggle-n: ein Treffer: jsonutils.com/
    @Dksksm
    Vielen Dank für den Hinweis.
    Das werde ich beim nächsten Projekt mal so probieren.
    Habs generell mit Klassen nicht so, kenn mich damit nicht wirklich 100%ig aus.
    Danke für den Link, der ist sehr praktisch.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Ich habe mal wild geggoglet und die verständlichsten Antworten für vb.net kamen von @SpaceyX hier aus diesem Forum.
    Am ehesten dürfte die Antwort aus diesem Thread für sich interessant sein und sehr leicht für dich umsetzbar sein dazu: Zugriff aus JSON via API
    Ansonsten bin ich auf dieses hier gestoßen (auch von SpaceyX), das setzt aber voraus, dass du dich wirklic mit JSON auseinandersetzen willst: Daten speichern und laden mit JSON

    Ich denke ja eher, du machst dir keine Gedanken über Klassen. Jedenfalls verwendest du in jedem Fall Klassen.
    Hint: Deine Formen sind alles Klassen.
    Eine Klasse ist nichts anderes als ein Bauplan, sei es für eine Form oder für Daten.
    @Dksksm
    Das Problem bei den verlinkten Beiträgen ist, dass überall "newtonsoft" verwendet wird. Nix mit .NET Hausmitteln.
    Da hätte ich der standalone .exe eine dll beilegen müssen. Das wollte ich aus diversen Gründen nicht.
    Und man weiß nie, wann eine APi geändert wird. Wenn die Klasse nicht 1:1 mit allen API-Keys übereinstimmen, dann geht die ganze Sache schief.
    Mit den Stringoperationen fische ich mir nur die relevanten Werte raus (brauchte vielleicht 10% des kompletten API Umfanges).

    Aber soll nicht bedeuten, dass ich das mit Klasse und Newtonsoft nicht auch mal probieren werde.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hi

    Die WinRT bietet einen Windows.Data.Json Namespace an: docs.microsoft.com/de-de/uwp/a…ata.json?view=winrt-22621 und dann gibt es noch den System.Text.Json Namespace: docs.microsoft.com/de-de/dotne…em.text.json?view=net-6.0
    Mfg -Franky-
    @-Franky-: Wenn Du den Namesspace System.Text.JSON im .Net Framwork bis 4.8 nutzen willst, holst du dir aber eine ganze Armada von zusärtlichen Programmbibliotheken ins Boot. Bei NET 6.0 ist das dann tatsächlich nicht mehr der Fall, weil es da bereits voll integriert ist. Das ist auch für mich einer der Hauptgründe weiter mit NewtonSoft zu machen, da ist es wenigstens nur eine Programmbibliothek.
    @Dksksm
    Da hast du sicherlich recht. Ich hab schon seit ewigkeiten nichts mehr mit JSON zu tun gehabt. Ich würde aber davon ausgehen das entsprechende Bibliotheken bereits auf dem System vorhanden sind und keine weitere, zusätzliche Bibliothek mit ausgeliefert werden muss.
    Mfg -Franky-
    Meine Werkzeuge werden auch nicht installiert, sondern nur auf die jeweiligen Rechner kopiert. Nein, ohne diese DLLs läuft da gar nichts. Sie sind eben nicht Bestandteil von Standard-Frameworks.

    So die Antwort hat jetzt gedauert, weil ich wollte es sauber nochmals testen.
    Verwendetes Framework: .NET Framwork 4.8
    Installiere NuGet Paket System.Text.JSON, mit installiert wird (siehe Bild):


    Ich habe aus dem Release-Verzeichnis bis auf die
    System.Text.Json.dll
    selbst sämtliche andere DLLs zunächst gelöscht und dann serialisiert und de-serialisiert bis mir das Programm nicht mehr crashte und sie da, ich brauchte alle(!) DLL's sogar auf meinem Entwicklungsrechner:

    Microsoft.Bcl.AsyncInterfaces.dll
    System.Buffers.dll
    System.Memory.dll
    System.Numerics.Vectors.dll
    System.Runtime.CompilerServices.Unsafe.dll
    System.Text.Encodings.Web.dll
    System.Threading.Tasks.Extensions.dll
    System.ValueTuple.dll

    Das ist ein ganzer Haufen DLSs finde ich. Deshalb kommt für mich unter .NET Framwork 4.8 nur NewtonSoft in Frage.
    Gar keine Frage, unter .NET 6.0 sähe meine Entscheidung vermutlich ganz anders aus.
    @Dksksm
    Oha. Ist ja doch ein ganzer Haufen DLLs. Na dann würde ich vllt doch mal den WinRT JSON-Namespace ausprobieren. Der steht allerdings erst ab Win10 zur Verfügung. Dazu müssten mindestens 2 Verweise eigebunden werden.
    C:\Program Files (x86)\Windows Kits\10\References\10.0.22621.0\Windows.Foundation.FoundationContract\4.0.0.0\Windows.Foundation.FoundationContract.winmd
    C:\Program Files (x86)\Windows Kits\10\References\10.0.22621.0\Windows.Foundation.UniversalApiContract\15.0.0.0\Windows.Foundation.UniversalApiContract.winmd

    Wobei man schauen muss welche Windows Kits\10\References\xxxxx und welche Version der FoundationContract / UniversalApiContract vorhanden sind. Ohne Verweise geht es natürlich auch. Sind ja ganz normale COM-Interfaces. ;)
    Mfg -Franky-
    @Dksksm @dive26

    Hab mir nochmal dazu Gedanken gemacht. Benötigt wird die Referenz auf "C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.22621.0\Windows.winmd". Bei "UnionMetadata" muss man halt schauen welche Version vorhanden ist und dann in die höchste Versionsnummer gehen und da die Windows.winmd nutzen. Wie geschrieben, geht das ganze erst ab Win10! Für darunter würde ich sowieso nichts mehr entwickeln.

    Der JSON-String zum testen schaut so aus und ist in einer Datei json.txt abgelegt.

    Quellcode

    1. {
    2. "Name": "Apple",
    3. "Expiry": "2008-12-28T00:00:00",
    4. "Price": 3.99,
    5. "Sizes": [
    6. "Small",
    7. "Medium",
    8. "Large"
    9. ]
    10. }

    und um diesen zu verarbeiten...

    VB.NET-Quellcode

    1. Imports Windows.Data
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim JsonStr As String = System.IO.File.ReadAllText("d:\json.txt")
    5. Dim JsonObj As Json.JsonObject = Nothing
    6. If Json.JsonObject.TryParse(JsonStr, JsonObj) Then
    7. Debug.Print(JsonObj.GetNamedString("Name"))
    8. Debug.Print(JsonObj.GetNamedString("Expiry"))
    9. Debug.Print(JsonObj.GetNamedNumber("Price").ToString)
    10. Dim JsonArr As Json.JsonArray = JsonObj.GetNamedArray("Sizes")
    11. For Each JsonVal In JsonArr
    12. Debug.Print(JsonVal.Stringify)
    13. Next
    14. End If
    15. End Sub
    16. End Class
    Mfg -Franky-
    Wie Ihr schon ganz richtig alle geschrieben habt, ohne externe DLL geht es nicht, wenn man in .NET was JSON-Spezifisches einbinden möchte.
    Daher bleibe ich bei meiner zwar nicht eleganten, aber funktionierenden Stringoperations+Dict Methode.

    Hier ein einfaches Beispie:

    VB.NET-Quellcode

    1. 'JSON Infos auslesen
    2. '[ und ] und alles davor und danach entfernen
    3. Dim Position1 As Integer = InStr(Global_API_Response_Body, "[")
    4. Dim Position2 As Integer = InStr(Global_API_Response_Body, "]")
    5. Dim JSONString As String
    6. If Position1 > 0 And Position2 > 0 Then
    7. JSONString = Mid(Global_API_Response_Body, Position1 + 1, Position2 - Position1 - 1)
    8. Else
    9. Exit Sub
    10. End If
    11. 'dataItemMap": und und alles davor und danach entfernen
    12. Position1 = InStr(JSONString, "dataItemMap")
    13. If Position1 > 0 Then
    14. JSONString = Microsoft.VisualBasic.Right(JSONString, JSONString.Length - Position1 - 12)
    15. JSONString = Microsoft.VisualBasic.Left(JSONString, JSONString.Length - 1)
    16. Else
    17. Exit Sub
    18. End If
    19. Dim dict As Dictionary(Of Object, Object)
    20. Dim jss As New JavaScriptSerializer()
    21. dict = jss.Deserialize(Of Dictionary(Of Object, Object))(JSONString)
    22. Global_RealKPI_total_power = dict("total_power").ToString
    23. Global_RealKPI_day_power = dict("day_power").ToString
    24. Global_RealKPI_month_power = dict("month_power").ToString


    Sobald mehr als ein Datensatz in geschwungenen Klammern in der JSON steht, muss ich diese in Einzelstrings aufteilen, damit die DICT damit was anfangen kann. Ist aber auch keine Hexerei:

    VB.NET-Quellcode

    1. 'Überprüfen, ob mehr als ein Wechselrichter in den Daten ist },{
    2. If InStr(JSONString, "},{") <> 0 Then
    3. 'mehrere Wechselrichterdaten übermittelt
    4. JSONString = JSONString.Replace("},{", "}♀{") 'Alt-12
    5. Dim InverterSingleJSON() As String = JSONString.Split("♀"c)
    6. 'Alle Daten durchgehen
    7. For i As Integer = 0 To InverterSingleJSON.Count - 1


    Das Sonderzeichen verwende ich als Split-Charakter, weil es garantiert nicht als Zeichen in den Datensätzen vorkommt.

    Wie gesagt, alles nicht schön, aber funktioniert hervorragend für meine Ansprüche.
    Sobald es natürlich in weiter verschachtelte JSON-Strings geht, wirds kompliziert. Aber die brauche ich aktuell auch nicht.

    Und ja, ich verwende immer noch den VisualBasic Namespace ;-). Schande über mich, aber ich habe mir die .NET Equivalente bisher nicht wirklich merken können ;-).

    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hallo @-Franky-,

    ich bin da völlig raus, meine Datenverwurstellungsprogramme müssen ohne Datenbank auskommen, also habe ich Model-Klassen und die darauf basierenden Daten speichere ich als JSON. Das läuft lokal auf einer handvoll Rechner im Konzern. Adminrechte hat niemand der Betroffenen, ich auch nicht. Ich habe lediglich VS Prof. 2019 installiert bekommen und kann das nicht mal Updaten, ist also auch schon 3 Jahre alt die Installation. Deine Verzeichnisstruktur habe ich so nicht, ich denke dazu bräuchte ich auch noch die "Entwicklung für die universelle Windows-Plattform" was ich nicht habe. Aber schön zu sehen, dass man mit vielleicht noch weniger Aufwand @dive26 helfen kann von wilden String-Operationen UND dem Dictionary wegzukommen.
    @-Franky-

    Und wie würdest Du sowas auslesen, wenn man nicht weiß wie viele Datensätze da drin sind (in diesem Fall wären es 3)?

    VB.NET-Quellcode

    1. {
    2. {"Name": "Apple","Expiry": "2008-12-28T00:00:00","Price": 3.99,"Sizes": ["Small","Medium","Large"]},
    3. {"Name": "Apple","Expiry": "2008-12-28T00:00:00","Price": 3.99,"Sizes": ["Small","Medium","Large"]},
    4. {"Name": "Apple","Expiry": "2008-12-28T00:00:00","Price": 3.99,"Sizes": ["Small","Medium","Large"]}
    5. }
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Vielen Dank für Eure zahlreichen Tipps rund um JSON und die Huawei API.

    Ich habe mir erlaubt die API-Beschreibung diesem Kommentar beizufügen, falls das jemand von Euch ebenfalls umsetzen möchte.

    Die kostenlose Software für Huawei SUN2000 und LUNA2000 Besitzer:innen ist nun so gut wie fertig.
    Klar, werden immer noch kleine Feinheiten ausgebessert.
    Die App ist zweisprachig (deutsch, englisch).
    Die Oberfläche besteht im Wesentlichen aus Listviews und Panels.
    Die Listviews sind nicht als solche zu erkennen (nur wenn man auf einen Eintrag klickt).
    Die Charts werden direkt im Paint-Event auf die Panels gezeichnet.
    Damit ist man viel individueller als mit dem MS-Chart Control.

    Die Anbindung an die Wallbox, die DAIKIN Klimaanlage und den myStrom Switch wurden ebenfalls mit deren APIs umgesetzt.
    Diese sind um einiges einfacher als die Huawei API.

    Hier zum Schmunzeln nochmals meine Art einfache JSON Dateien ohne externe Komponenten auszulesen:

    VB.NET-Quellcode

    1. ​Public Function MyStrom_status() As String
    2. MyStrom_status = BOComponent.BODownloadGETJSON("http://" + My.Settings.myStromIP + "/report")
    3. Dim dict As Dictionary(Of Object, Object)
    4. Dim jss As New JavaScriptSerializer()
    5. dict = jss.Deserialize(Of Dictionary(Of Object, Object))(MyStrom_status)
    6. 'Hier alle Daten aus dem JSON Konstrukt auslesen
    7. MyStromPower = CDbl(dict("power"))
    8. MyStromTemperatur = CDbl(dict("temperature"))
    9. MyStromEin = CBool(dict("relay"))
    10. MyStromWS = CDbl(dict("Ws"))
    11. '{
    12. ' "power": 1.69,
    13. ' "Ws": 0.81,
    14. ' "relay": true,
    15. ' "temperature": 24.87
    16. '}
    17. 'power: The current power consumed by devices attached to the switch
    18. 'relay: The current state of the relay (wether Or Not the relay Is currently turned on)
    19. 'temperature: The currently measured temperature by the switch. (Might initially be wrong, but will automatically correct itself over the span of a few hours)
    20. 'Ws: The average of energy consumed per second from last call this request.
    21. End Function



    Hier einige Tipps, welche man bei der Umsetzung der API beachten sollte:

    1) versucht so viele BETA-Tester mit ins Boot zu holen, damit Ihr wirklich alle möglichen Anlangenkonstellationen testen könnt.
    Ich hatte 8 BETA-Tester, einer davon ein Solarteur mit über 60 Anlagen. Also konnte ich wirklich sehr vieles durchtesten.

    2) Man muss bei der API-Abfrage beachten, dass einige Parameter immer für jeden Wechselrichter einzeln übermittelt werden.
    Es können aber auch mehrere Wechselrichter im System sein - somit muss man mit einer gewissen Logik alle Daten zusammenführen.

    3) Die API erlaubt Abfragen nicht all zu schnell hintereinander. Man sollte also nicht zu oft und nicht zu schnell hintereinander abfragen.

    4) Ich habe alle Varianten der API-Kommunikation vorher mit dem Programm "Postman" durchgespielt. Das hilft enorm.

    Für Fragen, Kritik, Ideen und Anregung bin ich sehr dankbar.
    Bilder
    • BOPV_all.jpg

      1 MB, 1.919×1.079, 303 mal angesehen
    • BOPV_Kiosk1.jpg

      380,3 kB, 1.920×1.080, 269 mal angesehen
    • BOPV_archive.jpg

      221,67 kB, 947×550, 208 mal angesehen
    • BOPV_Daiking.jpg

      163,7 kB, 796×396, 207 mal angesehen
    • BOPV_go-e.jpg

      153,24 kB, 735×470, 203 mal angesehen
    • BOPV_myStrom.jpg

      125,2 kB, 733×364, 202 mal angesehen
    • bopvinfo_screenshot3.jpg

      765,53 kB, 905×1.414, 1.079 mal angesehen
    Dateien
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at