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

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • 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.

    Who is General Failure and why is he reading my hard disk?

    • 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: