Diesmal mit einen JSON Problem
Über ein Nodemcu werden Daten eines Feinstaubsensors and die Website luftdaten.info übertragen und können dort mittels request wieder abgeholt werden. Die Daten werden als Json String bereitgestellt. Für die Daten gibt es zwei unterschiedliche Adressen. (siehe Skript).
Die Abfrage stammt aus dem Netz und wurde von mir angepasst.
Nachdem mein Skript seit ca. 3 Wochen permanent in einer 10 Min Schleife läuft, habe ich festgestellt, dass es öfter unregelmässig zu Falschauswertungen im Json.load kommt. Hier werden Werte vertauscht so daß der String nicht mehr sauber aufgelöst werden kann. Am Ende sind die Positionen von Temperatur und Humidity vertauscht. :/ Laut Betreiber der Website wäre der Json String immer gleich.
Gibt es eine Möglichkeit die Werte direkt aus den Json-String bzw. dem JSON Dictionary auszulesen und sich die Sucherrei im geparsten String zu ersparen ? Gestern lief es ohne Probleme, heute sind wieder die letzten Positionen vertauscht, damit kommt nur Müll raus :/.
Gibt es vielleicht so etwas wie einen Pointer o.ä. den man bei json.loads auf Anfang stellen muss ?
Hier der lauffähige Code Auszug mit den URL's.
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
# depends: python-requests
import time
import requests
import json
def pick_luftdaten_values(sensor):
# Sensordaten für SDS011 und DHT11 abfragen
# dazu die api von luftdaten.info nutzen
r = requests.get(sensor)
json_string = r.text
parsed_json = json.loads(json_string)
# print( json.dumps(parsed_json, sort_keys=True, indent=4, separators=(',',':')))
l = len(parsed_json)-1
a = len(parsed_json[l]['sensordatavalues'])
if a == 1:
result=(parsed_json[l]['sensordatavalues'][0]['value_type'])+": "+(parsed_json[l]['sensordatavalues'][0]['value'])
if a == 2:
result=(parsed_json[l]['sensordatavalues'][0]['value_type'])+": "+(parsed_json[l]['sensordatavalues'][0]['value'])
result=result+" "+(parsed_json[l]['sensordatavalues'][1]['value_type'])+": "+(parsed_json[l]['sensordatavalues'][1]['value'])
return(result)
# Sensor Nummer 22451 und 22452
def luftdatenabfrage():
try:
url = 'http://api.luftdaten.info/static/v1/sensor/22451/'
tweet = pick_luftdaten_values(url)
#print(tweet)
url = 'http://api.luftdaten.info/static/v1/sensor/22452/'
tweet = tweet + " " + pick_luftdaten_values(url)
#print(tweet)
p1 = float(tweet[tweet.find('P1:') +3 : tweet.find("P2:")-1])
p2 = float(tweet[tweet.find('P2:') +3 : tweet.find("humidity")-1])
h1 = float(tweet[tweet.find('humidity:') + 10 : tweet.find("temperature")-1])
t1 = float(tweet[tweet.find('temperature:') +13 : len(tweet)])
except:
p1 = 0
p2 = 0
h1 = 0
t1 = 0
tweet = "no data available"
finally:
return(tweet, p1, p2, h1, t1)
tweet, p1, p2, h1, t1 = luftdatenabfrage()
print(tweet)
print(p1)
print(p2)
print(h1)
print(t1)