Value nach String auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JayJay_86
User
Beiträge: 8
Registriert: Sonntag 4. September 2022, 06:58

Hallo liebes Forum,

wahrscheinlich ein einfacher Fall für euch. Ich möchte aus meiner PV Anlagensteuerung ein paar Werte auslesen. Dafür kann ich im LAN eine URL öffnen und erhalte eine sehr lange Seite mit Text.
Irgendwo in dem Text steht die Information die ich gerne hätte. Wonach ich suchen muss weiß ich schon.

Wie bekomme ich es hin, auf der Seite nach dem relevanten String zu suchen und den Wert auszulesen. Dieser kann 0 bis 5 stellig oder null sein.

Hier die Zeile die ich benötige/suche, in dem Fall möchte ich den Wert 286 in eine Variable schreiben:
{"tagName":"PowerConsumed","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":286}

Die Zeichenkette steht irgendwo auf der Webseite die ich mit einer URL aufrufe. Hier für euch zum Testen nur mal ein kleiner Auszug davon.

.....
{"tagName":"WorkOutFromStorage","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":57513.42330227361},"IdDevicesMap":{"tagName":"IdDevicesMap","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":{"INNER_BUFFER":["cda2a0cb-8094-4ac5-a5b4-b523cf56204b"],"INNER_CONSUMER":["urn:keba:evstation:21827223"],"POWERMETER_CONSUMPTION":["fe76fbdd-697a-4250-abd6-f7021cd8c78a"],"OUTER_CONSUMER":[],"OUTER_BUFFER":[],"POWERMETER_PRODUCTION":["fe76fbdd-697a-4250-abd6-f7021cd8c78a"],"OUTER_PRODUCER":[],"INNER_PRODUCER":["e76d46d4-0980-4c44-b39d-e3dd960f6732"]}},"StateVisibleIsSet":{"tagName":"StateVisibleIsSet","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":true},"DatePowerConsumptionForecastStart":{"tagName":"DatePowerConsumptionForecastStart","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":1666454820094},"PowerBuffered":{"tagName":"PowerBuffered","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":0},"PowerConsumed":{"tagName":"PowerConsumed","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":286},"IdInterfaceList":{"tagName":"IdInterfaceList","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":[]},"PowerBufferedFromGrid":{"tagName":"PowerBufferedFromGrid","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":0},"WorkReleased":{"tagName":"WorkReleased","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":1338287.3842312463},"PowerOut":{"tagName":"PowerOut","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":0},"WorkIn":{"tagName":"WorkIn","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":4826058.484853873},"WorkProduced":{"tagName":"WorkProduced","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":8973977.060285876},"IdName":{"tagName":"IdName","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":"Standort 1"},"WorkBufferedFromGrid":{"tagName":"WorkBufferedFromGrid","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":49148.84767118086},"StateLockedIsSet":{"tagName":"StateLockedIsSet","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":false},"WorkConsumedFromProducers":{"tagName":"WorkConsumedFromProducers","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":2007021.1032013502},"WorkOut":{"tagName":"WorkOut","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":5989648.354085953},"IdFingerPrintVersion":{"tagName":"IdFingerPrintVersion","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":0},"PowerIn":{"tagName":"PowerIn","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":272},"PowerConsumedFromStorage":{"tagName":"PowerConsumedFromStorage","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value":0},"PowerProductionForecastValues":{"tagName":"PowerProductionForecastValues","guid":"b670f751-e160-4310-918e-f32f9f3d925d","value": ......

Ich sage schon einmal vielen Dank und viele Grüße!
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist kein einfacher Text, sondern JSON. Json kann man mit Python einfach in Wörterbücher, Listen, Zahlen und Strings umwandeln lassen, und dann ist das Problem nur noch ein einfacher Wörterbuchzugriff.
JayJay_86
User
Beiträge: 8
Registriert: Sonntag 4. September 2022, 06:58

Hallo Sirius,

danke für die Info. Ich bin bei der Programmierung noch ein Neuling, könntest du mir noch etwas weiter helfen?
Ich habe die URL und erhalte als Ausgabe den Text, wie mache ich daraus ein JSON und suche über den Wörterbuchzugriff?

Sorry, wie gesagt ich fange gerade erst an mit Programmierung.
Danke und Gruß
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Das ist bereits json. Du musst daraus Python Datenstrukturen machen. Das funktionier mit dem Modul "json".
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du Den Code, den Du bisher hast, zeigen würdest, könnte man da anknüpfen, so erwartest Du, dass wir Dir das ganze Programm freihaus liefern:

Code: Alles auswählen

import requests
URL = "..."

def main():
    response = requests.get(URL)
    response.raise_for_status()
    data = response.json()
    print(data["PowerConsumed"]["value"])

if __name__ == "__main__":
    main()
JayJay_86
User
Beiträge: 8
Registriert: Sonntag 4. September 2022, 06:58

Hallo Sirius,

da hast du natürlich recht, ich habe die ersten Schritte ähnlich wie du gemacht:

Code: Alles auswählen

import requests

response = requests.get("http://192.168.1.28/rest/kiwigrid/wizard/devices/PowerOutput")
Ausgabe = response.content
print(Ausgabe)
Und ab dem Punkt kam ich nicht weiter. Ich wollte dann in "Ausgabe" nach dem String aus meinem Thread suchen. Dann habt ihr mich aufgeklärt, dass es im JSON Format ist.
Dein Code ist natürlich noch ein bisschen cleaner. :)

Und wie man ein JSON ausliest, wusste ich bislang nicht. Also das man es wie folgt schreiben kann.

Code: Alles auswählen

print(data["PowerConsumed"]["value"])

Jetzt habe ich aber noch ein weiteres Problem. Als Ausgabe von deinem Code erhalte ich KeyError: 'PowerConsumed'

So ist der aktuelle Stand des Codes:

Code: Alles auswählen

import requests


URL = "http://192.168.1.28/rest/kiwigrid/wizard/devices/PowerOutput"

def main():
    response = requests.get(URL)
    response.raise_for_status()
    data = response.json()
    print(data["PowerConsumed"]["value"])

if __name__ == "__main__":
    main()
Habt ihr noch einen Tipp für mich?
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, dann ist halt die Struktur, die Du gezeigt hast, nicht die ganze Wahrheit. Da mußt Du den Zugriff noch auf die realen Daten anpassen.
JayJay_86
User
Beiträge: 8
Registriert: Sonntag 4. September 2022, 06:58

Hallo Sirius,

du hattest Recht, die Struktur der Datei war umfangreicher als in meinem Beispiel zu sehen. Aber so konnte ich mich ein bisschen mit json auseinandersetzten.
Ich habe die Struktur nun angepasst und erhalte das gewünschte Ergebnis! Vielen Dank für eure Unterstützung!

Code: Alles auswählen

import requests

URL = "http://192.168.1.28/rest/kiwigrid/wizard/devices/PowerOutput"

def main():
    response = requests.get(URL)
    response.raise_for_status()
    data = response.json()
    print(data["result"]["items"][2]["tagValues"]["PowerConsumed"]["value"])

if __name__ == "__main__":
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JayJay_86: Ich würde da noch schauen ob das dritte Element von "items" irgendwie überprüfbar ist, ob das tatsächlich das gesuchte ist. Nicht das man da den Wert von einem falschen Element ausliest wenn sich da die Reihenfolge mal ändern sollte.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
DeaD_EyE
User
Beiträge: 1243
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

JSON ist nicht für Menschen gedacht.

Lass dir die Ausgabe einmal formatiert ausgeben, dann hast du einen besseren Überblick:

Code: Alles auswählen

import pprint
import requests

URL = "http://192.168.1.28/rest/kiwigrid/wizard/devices/PowerOutput"


def main():
    response = requests.get(URL)
    pprint.pprint(response.json())


if __name__ == "__main__":
    main()
Dann hangelst du dich von dict zu dict. Nicht zu viele Schritte aufeinmal.

PS: pprint sortiert die keys der dicts, kann man aber auch ausschalten.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
JayJay_86
User
Beiträge: 8
Registriert: Sonntag 4. September 2022, 06:58

Hallo BlackJack,

genau der Fall den du beschreibst ist eingetreten. Die json Datei ist aus meiner SIcht wie folgt aufgebaut:

Ebene 1: dict
Ebene 2: dict
Ebene 3: list
Ebene 4: dict
Ebene 5: dict
Ebene 6: dict

Vorher habe ich einen Wert auf Ebene 3 (list) mit Listenindex 11 gefunden, nun ist aber Listenindex 0 richtig.
In dem folgenden Auszug aus der Datei sieht man noch das Merkmal "guid", dies ist eindeutig und somit würde ich zum gewünschten Wert kommen. Kann ich auch ohne den Listindex die Abfrage machen. Also quasi in allen Listen suchen. (Statt 11 oder 2 einzugeben quasi *)
Oder kann ich vorher über die "guid" rausfinden, in welcher Liste ich suchen muss? Ich hoffe ich konnte Problem beschrieben.

{
"result":{
"items":[
{
"tagValues":{
"StateLockedIsSet":{
"tagName":"StateLockedIsSet",
"guid":"urn:keba:evstation:21827223",
"value":false

Viele Grüße
Antworten