Mein neues Projekt, Data von .json auslesen und weiter verwenden

  • Hallo,

    Habe ein neues Projekt und möchte folgendes machen:

    Ich habe einige Raumthermometer installiert ( von alter ERR Controme Steuerung) und möchte nun den Sensor Temparatur vom Raum Whz west auslesen und weiter verarbeiten.

    Die Daten aller Werte der Steuerung bekomme ich schon als .json mit diesem script.

    Code
    #!/usr/bin/env python3
    
    import requests
    
    # get data from location as JSON
    
    r = requests.get("http://192.168.0.23/get/json/v1/1/temps/")
    data = r.json()
    print (data)
    r.close()

    Die Daten sehen dann als print, so aus:

    Code


    Wie bekomme ich jetzt nur den Wert, Whz west mit der Temparaturanzeige heraus?

    Wie kann ich dann in Python programmieren dass,

    Code
    if temparatur >= 21:
        mach irgendwas
  • Mein neues Projekt, Data von .json auslesen und weiter verwenden? Schau mal ob du hier fündig wirst!

  • Zur hilfreichsten Antwort springen
  • Das ist ziemlich viel Kram und dann noch als Bild.

    Mach daraus Mal das:

    Ungetestet und mit dem Telefon zusammen geklöppelt.

    Und poste die Ausgabe aber bitte nicht als Bild.

  • Das kommt dabei raus:

    pi@raspberrypi:~/th $ /home/pi/th/testapi.py

    Traceback (most recent call last):

    File "/home/pi/th/testapi.py", line 9, in <module>

    obj = json.loads(json_data)

    File "/usr/lib/python3.7/json/__init__.py", line 341, in loads

    raise TypeError(f'the JSON object must be str, bytes or bytearray, '

    TypeError: the JSON object must be str, bytes or bytearray, not Response

  • Ansonsten wirst du warten müssen bis sich wer anderes meldet.

  • Habe es jetzt etwas umgeschrieben:

    Jetzt kommt das raus:

  • Hallo Tell,

    Danke, das funktioniert. Es zeigt 23.439999999999998 an.


    Um die aktuelle Raumtemperatur zu erhalten, habe ich sensoren, geaendert in, temperatur.

    Jetzt kommt folgendes:

    Code
    pi@raspberrypi:~/th $ /home/pi/th/testapi.py
    Traceback (most recent call last):
    File "/home/pi/th/testapi.py", line 13, in <module>
    print( raum["temperatur"][0]["wert"] )
    TypeError: 'float' object is not subscriptable
  • Script von Tell funktioniert zwar, aber es zeigt mir den falschen Wert an.


    Ich brauche diesen Wert:

    Code
    "name": "7" 
    
    "wert": 20.600000381469727,

    Die aktuelle Raumtemperatur fuer Wohnen west wird 2 x Angezeigt im .json,

    1x als temperatur, ueber name "Wohnen west"

    1x als wert unter name "7"

    Der Wert aus dem script ist nicht die aktuelle Raumtemperatur.

    2 Mal editiert, zuletzt von gwaag (7. November 2022 um 08:20)

  • gwaag Die Fehlermeldung ist doch recht erwartbar. Wenn man nur bis zum `raum` runter filtert und den komplett ausgibt:

    Und nun statt auf "sensoren" auf "temperatur" zugreift:

    Python
    In [63]: for raum in obj[0]["raeume"]:
        ...:     if raum["name"] == "Wohnen west":
        ...:         pprint(raum["temperatur"])
        ...: 
    20.600000381469727

    Und jetzt steht bei dir aber als nächstes noch ein Indexzugriff, der auf diesem Wert durchgeführt werden soll:

    Was hättest Du an der Stelle denn erwartet was das an Index 0 bei einer Gleitkommazahl als Ergebnis kommen sollte?

    Entweder ist das schon der Wert den Du suchst, oder aber Du willst offenbar nicht einfach den ersten Sensorwert, sondern den zweiten. Wobei das wahrscheinlich nicht so wirklich robust ist, und man das eher als „Du willst den Sensorwert mit dem Namen "7"“ formulieren sollte. Oder vielleicht ist auch das "raumtemperatursensor"-Flag als Kriterium, oder gar beides:

    Python
    In [65]: for raum in obj[0]["raeume"]:
        ...:     if raum["name"] == "Wohnen west":
        ...:         for sensor in raum["sensoren"]:
        ...:             if sensor["raumtemperatursensor"] and sensor["name"] == "7":
        ...:                 print(sensor["wert"])
        ...: 
    20.600000381469727

    Es würde vielleicht auch Sinn machen die Schleifen in Erfolgsfall mit ``break`` zu verlassen, oder das ganze in eine Funktion heraus zu ziehen die man dann mit *einem* ``return`` verlassen kann.

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

  • Danke fuer die Erklaerung.

    Als naechster Schritt brauchte ich jetzt, dass der ausgelesene "wert", weiter verarbeitet werden kann.

    Wie mach ich dass?

    Code
    print(sensor["wert"])

    if "wert" >= 20.5:

    mach etwas

    Einmal editiert, zuletzt von gwaag (7. November 2022 um 13:10)

  • Danke fuer die Hilfe, leider bin ich ja Anfaenger und weiss jetzt auch nichts mit dem anzufangen:

    Code
    if sensor ["wert"] >= 20.5:
        send_command(ZONE1_ON, IP, PORT)
    
    pi@raspberrypi:~/th $ /home/pi/th/testapi.py
    20.90999984741211
    Traceback (most recent call last):
    File "/home/pi/th/testapi.py", line 28, in <module>
    if sensor ["wert"] >= 20.5:
    NameError: name 'sensor' is not defined
  • Python
    if raum["sensoren"][1]["wert"] >= 20.5:

    Du musst das gezeigte aber auch manchmal als Beispiel sehen und so richtig Anfänger bist du in meinen Augen auch nicht mehr.

    Dir wurde ja schon erklärt wie man sich die Werte ausgeben lassen kann und das kannst du nutzen um irgendwas mit Bedingungen zu machen.

    Edit:

    Bzw. nimm das Beispiel von Tell:

    2 Mal editiert, zuletzt von keepfear (7. November 2022 um 13:54)

  • Mach dir erst mal eine Funktion, um die Werte zu bekommen.

    data sind die von dir zur Verfügung gestellten Daten bereits als Python-Typen umgewandelt. Den Text habe ich die Datei data.json gepackt.

  • Danke, jetzt funktioniert es, habe das mit einer wifi LED Lampe getestet, später werde ich das script fuer meine Wärmepumpe brauchen.

    (SG_Ready Signal) Wenn Raumtemparatur < 20° anhebung, wenn > 21.5° absenkung

    @DeaD_EyE

    Deine Funktion schaue ich mir spaeter noch genauer an

    Danke

    testapi.py

Jetzt mitmachen!

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