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

    • Official Post

    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 ().

  • 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

    🎧 Mein Herz pumpt nur Adrenalin, ein Feuer tobt tief in mir drin und du, du löscht es mit Benzin 🎧

  • hyle: Ernsthaft? Hör auf so etwas zu empfehlen, am Ende macht das noch jemand. Das führt beliebigen Python-Code aus. In diesem Falle dann sogar noch irgendwas aus dem Netz.

    “Es ist schon über so viele Dinge Gras gewachsen, dass man bald keiner Wiese mehr trauen kann.”

    • Official Post

    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

    🎧 Mein Herz pumpt nur Adrenalin, ein Feuer tobt tief in mir drin und du, du löscht es mit Benzin 🎧