डेटा अपलोड एपीआई और नमूने स्क्रिप्ट

पहला कदम डेटा-प्लेटफ़ॉर्म पेज से टोकन प्राप्त करना है।

एक बार जब आपके पास अपना टोकन हो जाए, तो आप अपना डेटा अपलोड करने के लिए निम्न स्क्रिप्ट का उपयोग कर सकते हैं। अपना पहला स्टेशन डेटा अपलोड करने के बाद, अपने स्टेशनों को कॉन्फ़िगर करने और अपलोड किए गए डेटा को सत्यापित करने के लिए aqicn.org/data-feed/verification/ पर जाएँ।

समर्थित सॉफ्टवेयर प्लेटफॉर्म:

हम इन 3 प्लेटफार्मों के लिए उपयोग हेतु तैयार सॉफ्टवेयर उपलब्ध कराते हैं:

  • Arduino : यदि आपके पास Arduino CPU है, तो github.com पर aqicn/gaia-a08-arduino पर उपलब्ध रेडी-टू-यूज़ सॉफ़्टवेयर का उपयोग करें।
  • पायथन: नीचे दिए गए कोड-स्निपेट का उपयोग करें
  • कमांड लाइन (CURL): नीचे दिए गए कोड-स्निपेट का उपयोग करें

यदि आपके पास कोई निगरानी स्टेशन नहीं है, और आप इसे लगवाना चाहते हैं, तो हमारे GAIA वायु गुणवत्ता निगरानी स्टेशनों की जांच करें।

यदि आप DIY स्टेशन पसंद करते हैं, तो GAIA A08 देखें।


--

नमूना कोड (पायथन)

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(); 
}

एपीआई विकल्प

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

आईएसओ 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-12-21T21:04:34+09:00","specie":"pm2.5", "value": 393.3, "unit":"mg/m3", "min":390.3, "max": 402.3, "stddev": 0.332},  
		{"time":"2024-12-21T21:04:34+09:00","specie":"pm10", "value": 109.3, "unit":"mg/m3"}, 
		{"time":"2024-12-21T21:04:34+09:00","specie":"co2", "value": 459.3, "unit":"ppb"}, 
		{"time":"2024-12-21T21:04:34+09:00","specie":"temp", "value": 26.8, "unit":"C"}, 
	] 
}

उदाहरण 2

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

पूर्ण कोड उदाहरण

आप एसडीएस सेंसर से लगातार पढ़ने और हर मिनट अपलोड करने के लिए इस कोड का उपयोग कर सकते हैं: (स्क्रिप्ट 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 वायु गुणवत्ता मॉनिटरों को स्थापित करना बहुत आसान है: आपको केवल एक वाईफ़ाई एक्सेस पॉइंट और एक यूएसबी संगत बिजली आपूर्ति की आवश्यकता है।

एक बार कनेक्ट होने के बाद, आपके वास्तविक समय के वायु प्रदूषण का स्तर तुरंत मानचित्रों पर और एपीआई के माध्यम से उपलब्ध हो जाएगा।

यह स्टेशन 10 मीटर जलरोधी विद्युत केबल, एक यूएसबी विद्युत आपूर्ति, माउंटिंग उपकरण और एक वैकल्पिक सौर पैनल के साथ आता है।

वायु गुणवत्ता और प्रदूषण मापन के बारे में:

वायु गुणवत्ता स्तर के बारे में

- वायु गुणवत्ता सूचकांक (एक्यूआई) मानस्वास्थ्य संबंधी चिंता का स्तर
0 - 50 अच्छा वायु गुणवत्ता को संतोषजनक माना जाता है, और वायु प्रदूषण कम या कोई जोखिम नहीं बनता है
51 -100 मध्यम वायु गुणवत्ता स्वीकार्य है; हालांकि, कुछ प्रदूषकों के लिए बहुत कम संख्या में लोगों के लिए एक मामूली स्वास्थ्य चिंता हो सकती है जो वायु प्रदूषण के लिए असामान्य रूप से संवेदनशील हैं।
101-150 अस्वास्थ्यकर संवेदनशील समूहों के लिए संवेदनशील समूहों के सदस्यों को स्वास्थ्य प्रभाव का अनुभव हो सकता है। आम जनता को प्रभावित होने की संभावना नहीं है।
151-200 अस्वस्थ हर किसी को स्वास्थ्य प्रभाव का अनुभव करना शुरू हो सकता है; संवेदनशील समूहों के सदस्यों को अधिक गंभीर स्वास्थ्य प्रभाव का अनुभव हो सकता है
201-300 बहुत अस्वस्थ आपातकालीन स्थितियों की स्वास्थ्य चेतावनियां। पूरी आबादी प्रभावित होने की अधिक संभावना है।
300+ खतरनाक स्वास्थ्य चेतावनी: हर किसी को अधिक गंभीर स्वास्थ्य प्रभाव का अनुभव हो सकता है

वायु गुणवत्ता और प्रदूषण के बारे में अधिक जानने के लिए, विकिपीडिया वायु गुणवत्ता विषय या वायु गुणवत्ता और आपके स्वास्थ्य के लिए एयरनाउ गाइड देखें।

बीजिंग डॉक्टर रिचर्ड सेंट साइर एमडी की बहुत उपयोगी स्वास्थ्य सलाह के लिए, www.myhealthbeijing.com ब्लॉग देखें।


उपयोग नोटिस: सभी वायु गुणवत्ता डेटा प्रकाशन के समय अनियमित हैं, और गुणवत्ता आश्वासन के कारण इन आंकड़ों को बिना किसी सूचना के संशोधित किया जा सकता है। विश्व वायु गुणवत्ता सूचकांक प्रोजेक्ट ने इस जानकारी की सामग्री को संकलित करने में सभी उचित कौशल और देखभाल का उपयोग किया है और किसी भी परिस्थिति में विश्व वायु गुणवत्ता सूचकांक परियोजना दल या उसके एजेंट इस डेटा की आपूर्ति से सीधे या परोक्ष रूप से उत्पन्न होने वाली किसी भी हानि, चोट या क्षति के लिए अनुबंध, टोर्ट या अन्यथा उत्तरदायी होंगे।



Settings


Language Settings:


Temperature unit:
Celcius