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 -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}]\
}'

کد نمونه (اردوینو)

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":"2025-02-18T06:19:52+09:00","specie":"pm2.5", "value": 393.3, "unit":"mg/m3", "min":390.3, "max": 402.3, "stddev": 0.332},
{"time":"2025-02-18T06:19:52+09:00","specie":"pm10", "value": 109.3, "unit":"mg/m3"},
{"time":"2025-02-18T06:19:52+09:00","specie":"co2", "value": 459.3, "unit":"ppb"},
{"time":"2025-02-18T06:19:52+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+ خطرناک هشدار سلامت: هرکس ممکن است اثرات جدی سلامتی را تجربه کند

برای اطلاعات بیشتر در مورد کیفیت هوا و آلودگی، موضوع کیفیت هوا در ویکی‌پدیا یا راهنمای airnow برای کیفیت هوا و سلامت شما را بررسی کنید.

برای توصیه های بهداشتی بسیار مفید دکتر پکن ریچارد سنت سیر، وبلاگ www.myhealthbeijing.com را بررسی کنید.


اطلاعیه درمورد شرایط استفاده: تمام اطلاعات کیفیت هوا در زمان انتشار تایید نشده است و با توجه به عدم اطمینان از کیفیت این اطلاعات ممکن است بدون اطلاع قبلی در هر زمانی اصلاح شود. پروژه شاخص کیفیت جهانی هوا با استفاده از تمام مهارت ها و مراقبت های معقول در انتشار محتویات این اطلاعات، تحت هیچ شرایطی شاخص کیفیت جهانی هوا تیم پروژه یا نمایندگان آن برای هر گونه از دست دادن، آسیب یا آسیب ناشی از عرضه اطلاعات مسئولیتی را قبول نمی‌کنند.



Settings


Language Settings:


Temperature unit:
Celcius