Growatt Wechselrichter mit Python Script auslesen

  • Hallo zusammen,

    Ich versuche gerade mit dem Raspberry 3 die Daten von meinem Wechselrichter auszulesen. Ich benutze zum testen folgendes einfaches Python Script.

    Code
    Import growattServer
    
    api = growattServer.GrowattApi()
    login_response = api.login('user','pass')
    #Get a list of growatt plants.
    print(api.plant_list(login_response['user']['id']))

    Auf meinem PC funktioniert das und Ich bekomme die Daten angezeigt. Beim Raspberry hingegen bekomme Ich folgende Fehlermeldungen:

    Auf beiden Rechnern sind die gleichen benötigten Python Module installiert.

    Hat von euch jemand eine Idee wo Ich den fehler finden kann?

    Viele Grüße

    Wolfgang

  • haidao Glaube ich nicht so ganz weil ``import`` so einen SyntaxError ergibt wenn man es mit einem grossen I schreibt. 🙂

    Wie sieht es denn mit den Versionen der beteiligten Software aus. Das sieht so aus als wenn der `growattServer` Code da ein POST absetzt was die Web-API anscheinend nicht mag.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Daran habe Ich auch schon gedacht. Ich benutze aber das gleiche Script mit den gleichen Zugangsdaten. Ich habe auch schon mehrere Varianten ausprobiert die Zugangsdaten zu übergeben

    Was mich stört ist das hier:

    File "/home/user/.local/lib/python3.9/site-packages/growattServer/__init__.py", line 131, in login

    response = self.session.post(self.get_url('newTwoLoginAPI.do'), data={

    Hinter der geschweiften Klammer folgen in der Datei noch die Zugangsdaten, hier fehlen sie.

    Da werde Ich morgen noch mal weiter suchen.

  • haidao Die Zugangsdaten werden sehr wahrscheinlich nicht in der gleichen Zeile stehen, darum sind sie nicht im Traceback enthalten. Das soll ja nur zur Orientierung dienen, damit man das leichter im Quelltext findet. Nicht das gesamte Programm auflisten.

    Das Problem ist das hier eine POST-Abfrage abgesetzt wird, der Webserver aber lieber was anderes haben möchte. Denn das bedeutet die 405er HTTP-Fehlermeldung. Macht auch irgendwie Sinn, denn bei einem Login wird ja nichts an den Webserver zum Speichern übertragen. Das wäre ja der Sinn von einem POST. Das irgendeine Ressource auf dem Server verändert wird.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Das Problem ist das hier eine POST-Abfrage abgesetzt wird,

    POST wird ueblicherweise fuer Loginrequests genutzt. Die Frage ist warum das unter Windows funktioniert und unter Linux/Raspi nicht :conf: Typischer Unterschied zwischen Windows und Linux ist die leidige CR/LF vs LF Sache. Kann ich mir aber eigentlich nicht vorstellen.

    Wenn man die o.g. URL im Browser aufruft bekommt man

    Klar - ein HTTP GET ist kein POST - und dann fehlen noch die Credentials. Aber was das zeigt ist dass die sehr auf Security bedacht sind - was auch gut ist.

  • framp POST wird auf *Webseiten* üblicherweise für Anmeldungen verwendet, damit die Anmeldedaten nicht in der URL stehen.

    Aber die Meldung auf der Webseite deutet ja eher darauf hin das *alle* Methoden gesperrt sind, weil die Seite denkt man ist ein Angreifer.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Wenn das obige Script auf einen Windows Rechner funktioniert und ein Ergebniss liefert , auf einen Raspi aber nicht , kann es nur am Unterschied Windows - Linux liegen.

    Vorausgesetzt es sind wirklich alle benötigten Module in den richtgen Verzeichnissen mit den richtgen Rechten vorhanden wie in #1 geschrieben.

  • hyle Naja der Client hat einen Fehler gemacht wenn er die falsche Methode zum Abfragen verwendet.

    Wobei sich der Server nicht an die Regeln hält. Bei einem 405 müsste in der Antwort im Header eigentlich ein Allowed:-Header sein, der einem sagt was die erlaubten Methoden sind. Wenn man die URL einfach so mit GET abfragt, schweigt sich der Server darüber aber aus:

    Code
    HTTP/1.1 405 Not Allowed
    Server: Tengine
    Date: Mon, 13 Nov 2023 10:04:54 GMT
    Content-Type: text/html; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    cache-control: no-cache, no-store
    Pragma: no-cache

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Wenn das Skript auf Windows laut Aussage des TO funktioniert, dann wird es vermutlich nicht an der Methode des Aufrufs liegen. Client klingt für mich (auf eine Webserverantwort bezogen) jedenfalls in erster Linie nach Clientsoftware, also Browser.

    Keine Ahnung was da in dem Modul im Hintergrund abläuft, weil ich mir das hier am Telefon nicht antuen möchte. Vielleicht wird da ja ein Browser gespooft oder sowas. :stumm:

  • Hatte Ich vergessen,auf dem PC läuft auch ein Ubuntu.Den einzigsten Unterschied den ich bisher gefunden habe, ist die Python Version.

    3.9 auf dem Raspberry und 3.10 auf dem PC.

  • Dann müßte man wissen was das Modul 'growattServer' macht ,..

    Have a look:

    PyPi_GrowattServer/growattServer/__init__.py at master · indykoning/PyPi_GrowattServer
    Contribute to indykoning/PyPi_GrowattServer development by creating an account on GitHub.
    github.com

    All zu besondere Sachen sind da nicht drin. Aber die Mühe jede Abhängigkeit auf Versionsunterschiede zu untersuchen, habe ich mir nicht gemacht.

    Sonderlich toll ist der Code auch nicht geschrieben :no_sad:

    Grüße

    Dennis

    Edit: Oh wow, wie langsam. Aber immerhin noch auf Platz 3, Podium ^^

    🎧 Strahlend soll die Zukunft sein, gut wir werden seh'n, ob wir wie ein Strahlemann lächelnd untergeh'n.  🎧

  • Ja xD

    Code
    agent_identifier = "Dalvik/2.1.0 (Linux; U; Android 12; https://github.com/indykoning/PyPi_GrowattServer)"

    Meine Vermutung ist, dass die API nichts Offizielles ist und interessant finde ich auch, dass der Betreiber Tengine nutzt, dass ein Drop-In-Replacement für Nginx ist. Man kann beim Nginx sowie beim Apache2 und auch anderen Webservern abhängig von User-Agent unterschiedliche Inhalte bzw. Status-Codes ausliefern.

    Ganz ganz früher, als man seine Gameserver noch selber hosten musste, gab es z.B. für CS:S jede Menge Custom-Maps. Da der Download vom Gameserver direkt sehr langsam war, gab es die Möglichkeit des Fastdownloads. Es wurde einfach nur eine URL in der Konfiguration des Servers angegeben und dann haben sich die Clients automatisch die Custom-Maps von einem Webserver geholt.

    Da man für den Traffic bezahlen musste, wollte man nicht, dass andere den Fastdownload für sich nutzen. Also hat man den Referer untersucht und wenn der String des Clients nicht den IPs der Gameserver entsprach, wurde der Request geblockt.

    Anbieter nutzen den User-Agent oft, um unerwünschten Traffic zu blockieren. Der User-Agent deutet darauf hin, dass sich der Autor der Python-Moduls an einer Android-Anwendung orientiert hat, die höchstwahrscheinlich vom Anbieter selbst stammt.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!