Daten per python-skript an API von opensensemap übertragen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
backi
User
Beiträge: 5
Registriert: Sonntag 22. Juli 2018, 08:26

Hallo zusammen,
vielleicht könnt ihr mich mit euren Python-Wissen unterstützen (das ich nicht habe). Worum gehts. Ich haben einen Pi am laufen, der mit einem Skript die Messwerte ausliest und an luftdaten.info überträgt. Nun möchte ich ich die gewonnene Daten über die API von opensensemap auch dorthin senden, habe aber keinerlei Plan wie ich das machen soll (ich habe nahzu keine Pyhton Kentnisse, kann mit etwas try/error ein vorhandenes Skript anpassen, aber mehr auch nicht)

mit dem folgenden Code-Stückckchen werden derzeit die gewonnenen Messdaten an luftdaten.info übermittelt - das skript läuft per cronjob alle 5 minuten:

def sendLuftdaten(self):
if not config['luftdaten']['enabled']:
return

self.__pushLuftdaten('https://api-rrd.madavi.de/data.php', 0, {
"SDS_P1": self.pm10_value,
"SDS_P2": self.pm25_value,
"BME280_temperature": self.temperature,
"BME280_pressure": self.pressure,
"BME280_humidity": self.humidity,
})
self.__pushLuftdaten('https://api.luftdaten.info/v1/push-sensor-data/', 1, {
"P1": self.pm10_value,
"P2": self.pm25_value,
})
self.__pushLuftdaten('https://api.luftdaten.info/v1/push-sensor-data/', 11, {
"temperature": self.temperature,
"pressure": self.pressure,
"humidity": self.humidity,
})


def __pushLuftdaten(self, url, pin, values):
requests.post(url,
json={
"software_version": "python-dusty 0.0.1",
"sensordatavalues": [{"value_type": key, "value": val} for key, val in values.items()],
},
headers={
"X-PIN": str(pin),
"X-Sensor": sensorID,
}
)

Ich benötige jetzt einen Python-Code, der mit den open gewonnenen Sensorendaten auch die opensensemap-api ansteuert:
https://api.opensensemap.org/
https://docs.opensensemap.org/#api-Meas ... asurements

Ich denke das ist nicht so komplex, bekomme es aber leider selber nicht hin. Könnt ihr da irgendwas zusammenbasteln ich bekomme es alleine nicht hin
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Ich selbst sitze gerade an einer Restful API. Das ganze kann man mit request lösen. Ist aber nicht in 5 Minuten gemacht und deswegen doch leicht Komplex. Was sollen wir da basteln?
Ein kurzes Googleln hat mich hierzu gebracht.

https://pypi.org/project/osmapi/
https://github.com/mvexel/overpass-api-python-wrapper
https://github.com/mocnik-science/osm-python-tools

Vielleicht is da etwas bei
backi
User
Beiträge: 5
Registriert: Sonntag 22. Juli 2018, 08:26

ich hatte nicht gedacht, das das so komplex ist. Meine Annahme war, das die API von opensensemap ähnlich funktioniert wie die von Luftdaten.info, und dann dementsprechend nur etwas code angepasst werden muss. Ich will Daten hochladen, nicht mir Daten von dort ziehen. Es geht auch nur um einen Datensatz pro Sensor, da ich das Skript regelmässig alle 5 Minuten anstoße, und auch nur die Daten der aktuellen Messung übertragen werden sollen. Also kein Array von Daten, sondern nur sensor A, Messwert A, Sensor B, Messerwert B usw.

So richtig verständlich ist die Doku der API für mich nicht:

post
https://api.opensensemap.org/boxes/:senseBoxId/data

{
"sensordatavalues": [
{
"value_type": "SDS_P1",
"value": "5.38"
},
{
"value_type": "SDS_P2",
"value": "4.98"
}
]
}

Nachzulesen hier: https://docs.opensensemap.org/#api-Meas ... asurements
backi
User
Beiträge: 5
Registriert: Sonntag 22. Juli 2018, 08:26

ich habs jetzt mal wie folgt mit testdaten probiert, aber selbst da scheitere ich - ich erhalten den Statuscode 422

import requests
import json

headers = {'content-type': 'application/json'}
url = 'https://api.opensensemap.org/boxes/:mei ... boxID/data'

data = {"sensordatavalues": [
{
"value_type": "SDS_P1",
"value": "5.38"
},
{
"value_type": "SDS_P2",
"value": "4.98"
}
]
}
params = {'luftdaten': 1}

r = requests.post(url, params=params, json=data, headers=headers)

print(r.status_code)
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Versuche mal bitte mir dem "Code Syntax" hier im Forum zu arbeiten. Wenn du den vollständigen Editor nutzt kannst du mit

Code: Alles auswählen

[Python] Hier der Code[/Python]
deinen Code posten. Damit bleiben die Einrückungen etc erhalten und es ist für uns besser lesbar. Oder überhaupt erst dann lesbar...

So macht er keinen Spaß/Sinn weil ich mir erstmal nen Kopf machen muss wann die Einrückung sein sollte und nicht weiß wann du sie erdacht hast
backi
User
Beiträge: 5
Registriert: Sonntag 22. Juli 2018, 08:26

kein Problem - die Altbeiträge kann ich leider nicht mehr editieren, deshalb hier ordentlich formatiert. Danke schonmal für deine Mühe. Das ist der Code, den ich mir nach der Anleitung/Doki der API zusammengestrickt habe. Natürlich noch nicht mit Echtdaten, sondern mit Dummywerten, aber auch das funktioniert nicht und generiert die Fehlermeldung 422
https://docs.opensensemap.org/#api-Meas ... asurements

Code: Alles auswählen

[Python]
import requests
import json

headers = {'content-type': 'application/json'}
url = 'https://api.opensensemap.org/boxes/:hierstehtmeinesenseboxID/data'

data = {"sensordatavalues": [
          {
            "value_type": "SDS_P1",
            "value": "5.38"
          },
          {
            "value_type": "SDS_P2",
            "value": "4.98"
          }
        ]
       }
params = {'luftdaten': 1}

r = requests.post(url, params=params, json=data, headers=headers)

print(r.status_code)
[/Python]
backi
User
Beiträge: 5
Registriert: Sonntag 22. Juli 2018, 08:26

... hat sich erledigt. Das Skript an sich funktioniert prima, ich hatte nur einen Fehler bei der URL
Antworten