ڈیٹا اپ لوڈ API اور نمونے اسکرپٹس

پہلا قدم ڈیٹا پلیٹ فارم پیج سے ٹوکن حاصل کرنا ہے۔

ایک بار جب آپ کے پاس اپنا ٹوکن ہو جائے تو، آپ اپنا ڈیٹا اپ لوڈ کرنے کے لیے درج ذیل اسکرپٹ کا استعمال کر سکتے ہیں۔ اپنے پہلے اسٹیشن کا ڈیٹا اپ لوڈ کرنے کے بعد، اپنے اسٹیشنوں کو ترتیب دینے اور اپ لوڈ کردہ ڈیٹا کی تصدیق کرنے کے لیے aqicn.org/data-feed/verification/ پر جائیں۔

تعاون یافتہ سافٹ ویئر پلیٹ فارم:

ہم ان 3 پلیٹ فارمز کے لیے استعمال کے لیے تیار سافٹ ویئر فراہم کرتے ہیں:

  • Arduino: If you have an Arduino CPU, use the ready-to-use software available on github.com at aqicn/gaia-a08-arduino.
  • Python: Use the code-snippet below
  • Command line (CURL): Use the code-snippet below

اگر آپ کے پاس کوئی مانیٹرنگ سٹیشن نہیں ہے، اور وہ حاصل کرنا چاہتے ہیں، تو ہمارے 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)

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

منفرد سٹیشن ID - آپ زیادہ سے زیادہ 128 حروف کے ساتھ کوئی بھی نام منتخب کر سکتے ہیں۔
یہ نام صرف آپ کے لیے اندرونی طور پر استعمال ہوتا ہے۔ اس آئی ڈی کو کوئی اور نہیں دیکھے گا۔

station.name string optional

اسٹیشن کا نام - مثال کے طور پر آپ کی عمارت کا نام، کسی گلی کا نام، یونیورسٹی کے ڈپارٹمنٹ کا نام، آپ کے ذاتی موسمی اسٹیشن کا کوڈ ہو سکتا ہے۔
یہ نام آپ کے اسٹیشن یو آر ایل کے لیے بطور لاحقہ استعمال ہوگا۔

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", ... gaz sensor کے لیے, استعمال کریں: "co2", "no2", "o3", ... موسم کے سینسر کے لیے, استعمال کریں: "حرارت"، "نمی"، "دباؤ"، "ہوا کی رفتار"، "ہوا کا جھونکا"، "ہوا کی سمت"، ..
آپ اصل میں کسی بھی قسم کا نام استعمال کرسکتے ہیں جو آپ چاہتے ہیں۔ جب آپ کے سٹیشن کی توثیق ہو جائے گی، ہمارے سسٹم میں ناموں کو معمول پر لایا جائے گا۔

readings[*].value float mandatory

اگر آپ کا سینسر ہر سیکنڈ میں قدریں تیار کر رہا ہے، اور آپ صرف ہر منٹ میں اپ لوڈ کرتے ہیں، تو یہ قدر پچھلے منٹ کے دوران پڑھی گئی تمام اقدار کی اوسط ہونی چاہیے۔

readings[*].unit string optional

قدر کی اکائی۔ مثال کے طور پر ڈسٹ سینسر کے لیے "mg/m3"، گیس سینسر کے لیے ppb، temp سینسر کے لیے 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-12-25T04:55:29+09:00","specie":"pm2.5", "value": 393.3, "unit":"mg/m3", "min":390.3, "max": 402.3, "stddev": 0.332},  
		{"time":"2024-12-25T04:55:29+09:00","specie":"pm10", "value": 109.3, "unit":"mg/m3"}, 
		{"time":"2024-12-25T04:55:29+09:00","specie":"co2", "value": 459.3, "unit":"ppb"}, 
		{"time":"2024-12-25T04:55:29+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 ایئر کوالٹی مانیٹر ترتیب دینے میں بہت آسان ہیں: آپ کو صرف ایک WIFI ایکسیس پوائنٹ اور USB کے موافق پاور سپلائی کی ضرورت ہے۔

ایک بار منسلک ہونے کے بعد، آپ کی اصل وقت میں فضائی آلودگی کی سطح نقشے اور API کے ذریعے فوری طور پر دستیاب ہو جاتی ہے۔

اسٹیشن 10 میٹر واٹر پروف پاور کیبل، ایک USB پاور سپلائی، بڑھتے ہوئے آلات اور ایک اختیاری سولر پینل کے ساتھ آتا ہے۔

ہوا کے معیار اور آلودگی کی پیمائش کے بارے میں:

ہوا کے معیار کی سطح کے بارے میں

- ایئر کوالٹی انڈیکس (AQI) اقدارصحت کی تشویش کی سطح
0 - 50 اچھی ہوا کے معیار کو تسلی بخش سمجھا جاتا ہے، اور ہوا آلودگی سے کم یا کوئی خطرہ ہوتا ہے
51 -100 معتدل فضائی معیار قابل قبول ہے؛ تاہم، بعض آلودگیوں کے لئے وہاں بہت کم تعداد میں لوگوں کے لئے اعتدال پسند صحت کی تشویش ہو سکتی ہے جو فضائی آلودگی سے غیر معمولی حساس ہیں.
101-150 حساس افراد کیلئے غیر صحتمند حساس گروپوں کے ارکان صحت کے اثرات کا تجربہ کرسکتے ہیں. عام عوام کو متاثر نہیں ہونے کا امکان ہے.
151-200 مضر صحت ہر کوئی صحت کے اثرات کا سامنا کرنا شروع کر سکتا ہے؛ حساس گروہوں کے ارکان زیادہ سنجیدہ صحت کے اثرات کا تجربہ کرسکتے ہیں
201-300 انتہائی مضر صحت انتباہ صحت برائے ہنگامی حالات. پوری آبادی متاثر ہونے کا امکان ہے
300+ خطرناک صحت کی انتباہ: ہر ایک کی صحت کو زیادہ سنگین اثرات کا سامنا کر نا پڑ سکتا ہے

ہوا کے معیار اور آلودگی کے بارے میں مزید جاننے کے لیے، ویکیپیڈیا ایئر کوالٹی کا موضوع یا ایئر کوالٹی اور آپ کی صحت کے لیے ایئرنو گائیڈ دیکھیں۔

بیجنگ کے ڈاکٹر رچرڈ سینٹ سائر ایم ڈی کے صحت سے متعلق بہت مفید مشوروں کے لیے، www.myhealthbeijing.com بلاگ دیکھیں۔


استعمال کی اطلاع: اشاعت کے وقت تمام ایئر کوالٹی کے اعداد وشمار غیرتصدیق شدہ ھیں ، اور معیار کی یقین دہانی کے باعث ان اعداد و شمار کو بغیراطلاع ترمیم کیا جا سکتا ہے، کسی نوٹس کے بغیر. ورلڈ ایئر کوالٹی انڈیکس نے اس معلومات کے مضامین کو مرتب کرنے میں تمام معقول مہارت اور دیکھ بھال کا استعمال کیا ہے اور کسی بھی حالت میں نہیں ورلڈ ایئر کوالٹی انڈیکس پروجیکٹ ٹیم یا اس کے ایجنٹوں کو اس ڈیٹا کی فراہمی سے براہ راست یا غیر مستقیم طور پر پیدا کسی بھی نقصان، چوٹ یا نقصان کے لئے معاہدے، تشدد یا دوسری صورت میں ذمہ دار ہوسکتا ہے.



Settings


Language Settings:


Temperature unit:
Celcius