API за качване на данни и примерни скриптове

Първата стъпка е да получите токен от страницата на платформата за данни .

След като имате свой собствен токен, можете да използвате следния скрипт, за да качите вашите данни. След като качите данните за първата си станция, отидете на aqicn.org/data-feed/verification/, за да конфигурирате станциите си и да проверите качените данни.

Поддържани софтуерни платформи:

Ние предоставяме готовия за използване софтуер за тези 3 платформи:

  • Arduino : Ако имате процесор Arduino, използвайте готовия за използване софтуер, наличен на github.com на aqicn/gaia-a08-arduino .
  • Python: Използвайте кодовия фрагмент по-долу
  • Команден ред (CURL): Използвайте кодовия фрагмент по-долу

Ако нямате станция за мониторинг и бихте искали да получите такава, проверете нашите станции за мониторинг на качеството на въздуха GAIA .

Ако предпочитате станция „направи си сам“, проверете GAIA A08 .


--

Примерен код (python)

import requests  
 
# Sensor parameter   
sensorReadings = [   
	{'specie':'pm25', 'value': 393.3},  
	{'specie':'pm10', 'value': 109.3}  
] 
 
# Station parameter   
station = { 
	'id':		"station-001",  
	'location':  { 
		'latitude': 28.7501,  
		'longitude': 77.1177 
	} 
} 
 
# User parameter - get yours from https://aqicn.org/data-platform/token/ 
userToken = "dummy-token-for-test-purpose-only" 
 
# Then Upload the data  
params = {'station':station,'readings':sensorReadings,'token':userToken}  
request = requests.post( url = "https://aqicn.org/sensor/upload/",  json = params) 
#print(request.text) 
data = request.json()  
 
if data["status"]!="ok": 
	print("Something went wrong: %s" % data) 
else: 
	print("Data successfully posted: %s"%data) 

Примерен код (къдрене)

curl -X POST https://aqicn.org/sensor/upload -H 'Content-Type: application/json' --data '{\ 
"token": "dummy-token-for-test-purpose-only",\ 
"station": { "id": "station-001" },\ 
"readings": [{"specie":"pm2.5", "value": 393.3}]\ 
}'

Примерен код (arduino)

Check github.com/aqicn/gaia-a08-arduino for the full code.
#include <WiFi.h> 
#include <HTTPClient.h> 
#include <ArduinoJson.h> 
 
#define LATITUDE 28.7501 
#define LONGITUDE 77.1177 
 
void upload(float pm25_concentration, float pm10_concentration, const char * token) 
{ 
 
    static char stationID[32]; 
    uint64_t efuseMac = ESP.getEfuseMac(); 
    uint16_t chip = (uint16_t)(efuseMac >> 32); 
    snprintf(stationID, 32, "station-%x", chip); 
 
    doc["token"] = token; 
    doc["station"]["id"] = stationID; 
 
    doc["station"]["location"]["latitude"] = LATITUDE; 
    doc["station"]["location"]["longitude"] = LONGITUDE; 
 
    doc["readings"][0]["specie"] = "pm25"; 
    doc["readings"][0]["value"] = pm25_concentration; 
    doc["readings"][0]["unit"] = "µg/m3"; 
 
    doc["readings"][1]["specie"] = "pm10"; 
    doc["readings"][1]["value"] = pm10_concentration; 
    doc["readings"][1]["unit"] = "µg/m3"; 
 
    static char json_body[1024]; 
    serializeJson(doc, json_body); 
 
    HTTPClient http; 
    http.begin("https://aqicn.org/sensor/upload"); 
    http.addHeader("Content-Type", "application/json"); 
    int httpResponseCode = http.POST(json_body); 
 
    if (httpResponseCode > 0) 
    { 
 
        String response = http.getString(); 
        Serial.println(httpResponseCode); 
        Serial.println(response); 
    } 
    else 
    { 
 
        Serial.print("Error on sending POST: "); 
        Serial.println(httpResponseCode); 
    } 
 
    http.end(); 
}

Опции на API

Parameter Type Optional/Mandatory Explanations
token string mandatory

Вземете свой собствен токен от aqicn.org/data-platform/token .

station
station.id string mandatory

Уникален идентификатор на станция - можете да изберете всяко име с максимум 128 знака.
Това име се използва само вътрешно за вас. Никой друг няма да види този идентификатор

station.name string optional

Име на станцията - може да бъде например името на вашата сграда, името на улица, името на университетски факултет, кода на личната ви метеорологична станция.
Това име ще се използва като суфикс за URL адреса на вашата станция.

station.latitude float optional

Географска дължина на вашата станция

station.longitude float optional

Географска дължина на вашата станция

organization
org.website string optional

Ако имате уебсайт с повече информация за вашата станция/сензор, ние ще добавим тази връзка към нашата карта, когато се използва вижте вашата станция

org.name string optional

Ако посочите уебсайт, това „име на организация“ ще бъде свързано с уебсайта.

readings
readings[*].specie string mandatory

Име на замърсителя, който докладвате. За сензори за газ използвайте: "pm2.5", "pm10", "pm1.0", ... За сензор за газ използвайте: "co2", "no2", "o3", ... За сензор за времето, използвайте: "температура", "влажност", "налягане", "скорост на вятъра", "порив на вятъра", "посока на вятъра", ..
Всъщност можете да използвате всяко име на вид, което искате. Когато вашата станция бъде валидирана, имената ще бъдат нормализирани в нашата система.

readings[*].value float mandatory

Ако вашият сензор генерира стойности всяка секунда и вие качвате само всяка минута, тази стойност трябва да бъде средната от всички стойности, отчетени през последната минута.

readings[*].unit string optional

Единица на стойността. Например "mg/m3" за сензор за прах, ppb за сензори за газ, C за сензор за температура.

readings[*].time string optional

Дата и час на четенето във формат ISO 8601

readings[*].min float optional

Ако отчетените стойности се основават на осредняване на няколко стойности, тогава това съответства на минималната стойност на всички стойности, използвани за осредняването.

readings[*].max float optional

Ако отчетените стойности се базират на осредняване на няколко стойности, тогава това съответства на максималната стойност на всички стойности, използвани за осредняването.

readings[*].median float optional

Ако отчетените стойности се основават на осредняване на няколко стойности, тогава това съответства на средната стойност на всички стойности, използвани за осредняването.

readings[*].stddev float optional

Ако отчетените стойности се базират на осредняване на няколко стойности, тогава това съответства на стандартното отклонение на всички стойности, използвани за осредняването.

readings[*].averaging float optional

Ако горните стойности се базират на осредняване на няколко стойности, тогава това съответства на продължителността в секунди на периода на осредняване.
Например, използвайте 60 за средни данни за минута и 3600 за средни за час.

Пример 1

{ 
	"token": "......", 
	"station": { 
		"id": "station-001", 
		"name": "HCPA Santa Cecília", 
		"latitude": 103.37893, 
		"longitude": 43.17108, 
	}, 
	"org": { 
		"website":"https://pacto.upsensor.com/", 
		"name":"Porto Ar Alegre", 
	}, 
	"readings": [ 
		{"time":"2024-05-09T00:52:03+09:00","specie":"pm2.5", "value": 393.3, "unit":"mg/m3", "min":390.3, "max": 402.3, "stddev": 0.332},  
		{"time":"2024-05-09T00:52:03+09:00","specie":"pm10", "value": 109.3, "unit":"mg/m3"}, 
		{"time":"2024-05-09T00:52:03+09:00","specie":"co2", "value": 459.3, "unit":"ppb"}, 
		{"time":"2024-05-09T00:52:03+09:00","specie":"temp", "value": 26.8, "unit":"C"}, 
	] 
}

Пример 2

{ 
	"token": "......", 
	"station": { 
		"id": "station-001", 
	}, 
	"readings": [ 
		{"specie":"pm2.5", "value": 393.3} 
	] 
}

Пълен пример за код

Можете да използвате този код за непрекъснато четене от SDS сензор и качване всяка минута: (скрипт също достъпен от https://github.com/aqicn/sds-sensor-reader ).

import requests 
import random 
import time 
import math 
import json 
import sys 
from serial import Serial 
 
LOCATION = {'latitude': 28.7501, 'longitude': 77.1177} 
TOKEN    = "dummy-token-for-test-purpose-only" 
SENSORID = "station-001" 
USBPORT  = "/dev/ttyUSB0" 
 
class SensorDataUploader: 
 
    def __init__(self, station, token): 
        self.token = token 
        self.station = station 
 
 
    def send(self,readings): 
 
        params = {'station':self.station,'readings':readings,'token':self.token}  
        print("Uploading: %s"%json.dumps(params, indent=4)) 
 
        request = requests.post( url = "https://aqicn.org/sensor/upload/",  json = params) 
        data = request.json()  
        if data["status"]!="ok": 
            print("Something went wrong: %s" % data) 
        else: 
            print("Data successfully posted: %s"%data) 
 
 
 
 
class Accumulator: 
 
    def __init__(self, name): 
        self.name = name 
        self.values = [] 
 
    def add(self,val): 
        self.values.append(val) 
 
    def count(self): 
        return len(self.values) 
 
    def reset(self): 
        self.values=[] 
 
    def min(self): 
        return self.values[0] 
 
    def max(self): 
        return self.values[len(self.values)-1] 
 
    def median(self): 
        return self.values[len(self.values)/2] 
 
    def mean(self): 
        return float(sum(self.values)) / len(self.values) 
 
    def stddev(self): 
        l = len(self.values) 
        mean = self.mean() 
        return math.sqrt(float(reduce(lambda x, y: x + y, map(lambda x: (x - mean) ** 2, self.values))) / l) 
 
 
    def summary(self): 
        self.values.sort() 
        return {"specie":self.name,'value':self.mean(),'min':self.min(),'max':self.max(),'median':self.median(), 'stddev':self.stddev()}  
 
 
 
class DummyReader: 
 
    def read( self ): 
 
        time.sleep(1.1) 
        return {"pm2.5":random.random()*10,"pm10":random.random()*10} 
 
 
class SDS011Reader: 
 
    def __init__(self, inport): 
        self.serial = Serial(port=inport,baudrate=9600) 
        self.values = [] 
        self.step = 0 
 
    def read( self ): 
 
        # time.sleep(1) 
        # return {"pm2.5":random.random()*100,"pm10":random.random()*100} 
 
        while self.serial.inWaiting()!=0: 
            v=ord(self.serial.read()) 
 
            if self.step ==0: 
                if v==170: 
                    self.step=1 
 
            elif self.step==1: 
                if v==192: 
                    self.values = [0,0,0,0,0,0,0] 
                    self.step=2 
                else: 
                    self.step=0 
 
            elif self.step>8: 
                self.step =0 
                pm25 = (self.values[0]+self.values[1]*256)/10 
                pm10 = (self.values[2]+self.values[3]*256)/10 
                return {"pm2.5":pm25,"pm10":pm10} 
 
            elif self.step>=2: 
                self.values[self.step-2]=v 
                self.step= self.step+1 
 
        return None 
 
 
 
def readAndUpload(sensor, uploader): 
 
    try: 
 
        while True: 
            accumulators = {} 
            startTime = time.time() 
 
            while time.time() < startTime+60: 
                values = sensor.read() 
                if values==None: 
                    continue 
 
                print("Reading [%2d]: %s"%(int(time.time()-startTime),values)) 
                for specie, value in values.items(): 
                    if not (specie in accumulators): 
                        accumulators[specie]=Accumulator(specie) 
                    accumulators[specie].add(value) 
 
 
            readings = [] 
            for specie, accumulator in accumulators.items(): 
                readings.append(accumulator.summary()) 
 
            if len(readings)>0: 
                uploader.send(readings) 
            else: 
                print("No value read from the sensor...") 
 
 
    except KeyboardInterrupt: 
        print "Bye" 
        sys.exit() 
 
 
 
print("Starting reading sensor "+SENSORID+" on port "+USBPORT) 
 
# Station parameter   
station = {'id':SENSORID, 'location':LOCATION} 
uploader = SensorDataUploader(station, TOKEN) 
 
sensor = SDS011Reader(USBPORT) 
# sensor = DummyReader() 
readAndUpload(sensor,uploader) 
 

Измерете качеството на въздуха във вашия квартал
Участвайте със собствена станция за мониторинг на качеството на въздуха

Мониторът за качество на въздуха GAIA използва лазерни сензори за частици, за да измерва в реално време замърсяването с частици PM2,5 и PM10, което е един от най-вредните замърсители на въздуха.

Настройва се много лесно: изисква само WIFI точка за достъп и USB съвместимо захранване. След като се свържете, вашите нива на замърсяване на въздуха в реално време са незабавно достъпни на нашите карти.

Станцията се предлага заедно с 10-метрови водоустойчиви захранващи кабели, захранване, монтажно оборудване и допълнителен слънчев панел.

Относно качеството на въздуха и измерването на замърсяването:

Относно нивата на качеството на въздуха

- Стойности на индекса за качество на въздуха (AQI).Нива на загриженост за здравето
0 - 50 добре Качеството на въздуха се счита за задоволително и замърсяването на въздуха представлява малък или никакъв риск
51 -100 умерен Качеството на въздуха е приемливо; въпреки това за някои замърсители може да има умерена опасност за здравето на много малък брой хора, които са необичайно чувствителни към замърсяването на въздуха.
101-150 Нездравословна за чувствителни групи Членовете на чувствителните групи могат да имат здравни ефекти. Обществеността не е вероятно да бъде засегната.
151-200 нездравословен Всеки може да започне да изпитва здравни ефекти; членовете на чувствителните групи могат да имат по-сериозни последици за здравето
201-300 Много Нездравословното Здравни предупреждения за аварийни условия. Цялото население е по-вероятно да бъде засегнато.
300+ опасен Сигнал за здравето: всеки може да има по-сериозни последици за здравето

За да научите повече за качеството на въздуха и замърсяването, вижте темата за качеството на въздуха в wikipedia или ръководството на airnow за качеството на въздуха и вашето здраве .

За много полезни здравни съвети на д-р Ричард Сейнт Сир от Пекин проверете блога на www.myhealthbeijing.com .


Известие за използване: Всички данни за качеството на атмосферния въздух не са валидни към момента на публикуването и поради осигуряване на качеството, тези данни могат да бъдат променяни без предизвестие по всяко време. Проектът Световен индекс на качеството на въздуха е упражнил всички разумни умения и внимание при съставянето на съдържанието на тази информация и при никакви обстоятелства Проектният екип на Световния Индекс на Качеството на Въздуха или неговите агенти са отговорни по договор, нередовност или по друг начин за всяка загуба, нараняване или щета, възникващи пряко или косвено от предоставянето на тези данни.



Settings


Language Settings:


Temperature unit:
Celcius