Powerfox mit API auslesen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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

    • Offizieller Beitrag

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

    Einmal editiert, zuletzt von Tell (22. Mai 2021 um 08:20)

  • 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

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

    • Offizieller Beitrag

    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

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!