Seite 1 von 1

Daten per python-skript an API von opensensemap übertragen

Verfasst: Sonntag 22. Juli 2018, 09:01
von backi
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

Re: Daten per python-skript an API von opensensemap übertragen

Verfasst: Sonntag 22. Juli 2018, 14:47
von Tholo
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

Re: Daten per python-skript an API von opensensemap übertragen

Verfasst: Sonntag 22. Juli 2018, 16:44
von backi
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

Re: Daten per python-skript an API von opensensemap übertragen

Verfasst: Sonntag 22. Juli 2018, 18:53
von backi
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)

Re: Daten per python-skript an API von opensensemap übertragen

Verfasst: Sonntag 22. Juli 2018, 21:23
von Tholo
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

Re: Daten per python-skript an API von opensensemap übertragen

Verfasst: Sonntag 22. Juli 2018, 21:48
von backi
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]

Re: Daten per python-skript an API von opensensemap übertragen

Verfasst: Dienstag 24. Juli 2018, 21:50
von backi
... hat sich erledigt. Das Skript an sich funktioniert prima, ich hatte nur einen Fehler bei der URL