Powerfox mit API auslesen

  • Hallo zusammen,

    ich stehe mal wieder auf dem Schlauch. Ich habe seit gestern Nacht meinen Powerfox Stromzähler angeschlossen. Dieser ist per API auslesbar. Mein requests.get liefert mir folgende Ausgabe:

    Code
    {"Outdated":false,"Watt":743.0,"Timestamp":1621611170,"A_Plus":93539.0,"A_Plus_HT":53290.0,"A_Plus_NT":40249.0,"A_Minus":0.0}

    laut "type" handelt es sich um einen String:

    Code
    <class 'str'>

    Aber das sieht doch für mich eindeutig nach einem Dictionary aus, oder bin ich total bescheuert...? Kann ich den String in ein Dictionary "wandeln"?

    Danke und Gruß

    Christian

  • Kann ich den String in ein Dictionary "wandeln"?

    Ja, z.B. mit eval() sollte das möglich sein, sollte man aber nicht machen!!! (Siehe Beiträge #6 und #7!)

    Python
    test_dict = eval(string)
    
    # Zum Test
    print(test_dict['Watt'])
  • > {"Outdated":false,"Watt":743.0,"Timestamp":1621611170,"A_Plus":93539.0,"A_Plus_HT":53290.0,"A_Plus_NT":40249.0,"A_Minus":0.0}

    Das ist JSON, und es wuerde mich doch schwer wundern wenn Python dafuer keine Funktionen haette.

    Bei Stackoverflow findet man zum Beispiel das:

    Code
    >>> import requests
    >>> r = requests.get('https://github.com/timeline.json')
    >>> r.json()
    [{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

    Das Beispiel bei Stackoverflow ist veraltet, so sieht das jetzt aus:

    Code
    >>> import requests
    >>>
    >>> r = requests.get("https://api.github.com/events")
    >>> r.json()
    [{'id': '16464594056', 'type': 'PushEvent', 'actor': {'id': 60533497,...

    Edited once, last by Tell (May 22, 2021 at 8:20 AM).

  • Hallo,

    laut "type" handelt es sich um einen String:

    was hast du den 'type' übergeben?

    Code
    >>> datastructur = {"Watt":743.0,"Timestamp":1621611170,"A_Plus":93539.0,"A_Plus_HT":53290.0,"A_Plus_NT":40249.0,"A_Minus":0.0}
    >>> print(type(datastructur))
    <class 'dict'>
    >>> print(datastructur["Watt"])
    743.0

    Grüße

    Dennis

    🎧 We are living in a world that's full of fakes,
         we are living in a world that's full of rumors,
         we are living in a world that's full of evil,
         we are living in a world that's full of hate 🎧

  • Ok, ich gebe zu das war ein Schnellschuss und unüberlegt. :blush:

    Wenn es kein JSON (bei dem ich mir nicht sicher war) ist, dann wäre ast.literal_eval dazu besser geeignet und sicherer als das oben von mir vorgeschlagene Beispiel.

    Python
    import ast
    
    test_dict = ast.literal_eval(string)
    
    # Zum Test
    print(type(test_dict))

    //Edit Warnung wurde in #2 hinzugefügt.

  • Danke für eure Hilfe! Ich habe versucht ein kleines "Workaround" zu bauen um das Problem zu beheben. Ich habe aber Probleme mit der Ergänzung der geschweiften Klammern...

    Hier der Code:


    Mein Problem ist das wieder einbauen der geschweiften Klammern (siehe "# geschweifte Klammer wieder ergänzen"):

    Grundsätzlich werden die Einträge in der Liste auch wunderbar durchsucht, es wird jedoch die geschweifte Klammer nicht eingefügt.

    Ziel ist folgendes: Ich möchte, egal wieviel Geräte bei Powerfox angemeldet sind, immer zunächst die Gerätegrunddaten auslesen. Bei zwei Einträgen fehlen nur die beiden geschweiften Klammern "in der mitte" nach dem Trennen. Bei mehreren Einträgen fehlen diese dann dementsprechend öfter. Anschließend möchte ich die "aufbereiteten" Listen in Listen mit Dictionaries umwandelt. Damit die als Dict erkannt werden, müssen jedoch noch die geschweiften Klammern angefügt werden.

    Die Ausgabe sieht im übrigen wie folgt aus:

  • Hi,


    ich nutze die API in Verbindung mit google Sheets/Script.


    Leider bekomme ich seit kurzem die Rückmeldung, dass ich nur eine Abfrage innerhalb von 5 Minuten machen darf. Da ich mehrere Optis habe und verschiedene Abfragen dazu machen möchte, ist das ein Worst Case für mich. Oder mache ich etwas falsch?


    Danke für die Rückantwort!


    VG,


    Ede

  • Hallo,

    ich glaube es macht mehr Sinn, wenn du für dein Problem ein eigenes Thema aufmachst. Das hier ist ja schon fast ein Jahr alt und das Problem wurde gelöst.

    Oder mache ich etwas falsch?

    Um das zu beantworten musst du so detailliert wie möglich beschrieben was du machst/gemacht hast ink. Code und Fehlermeldung.

    Grüße

    Dennis

    🎧 We are living in a world that's full of fakes,
         we are living in a world that's full of rumors,
         we are living in a world that's full of evil,
         we are living in a world that's full of hate 🎧

Participate now!

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