واجهة برمجة تطبيقات تحميل البيانات والنماذج النصية

الخطوة الأولى هي الحصول على رمز مميز من صفحة منصة البيانات.

بمجرد حصولك على الرمز المميز الخاص بك، يمكنك استخدام البرنامج النصي التالي لتحميل بياناتك. بعد تحميل بيانات محطتك الأولى، انتقل إلى aqicn.org/data-feed/verification/ لتهيئة محطاتك والتحقق من البيانات التي تم تحميلها.

منصات البرامج المدعومة:

نحن نقدم برامج جاهزة للاستخدام لتلك المنصات الثلاثة:

  • Arduino: إذا كان لديك وحدة معالجة مركزية Arduino، فاستخدم البرنامج الجاهز للاستخدام المتوفر على github.com على aqicn/gaia-a08-arduino.
  • Python: استخدم مقتطف التعليمات البرمجية أدناه
  • سطر الأوامر (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}]\
}'

رمز العينة (اردوينو)

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

تاريخ ووقت القراءة بتنسيق 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-18T23:51:40+09:00","specie":"pm2.5", "value": 393.3, "unit":"mg/m3", "min":390.3, "max": 402.3, "stddev": 0.332},
{"time":"2025-02-18T23:51:40+09:00","specie":"pm10", "value": 109.3, "unit":"mg/m3"},
{"time":"2025-02-18T23:51:40+09:00","specie":"co2", "value": 459.3, "unit":"ppb"},
{"time":"2025-02-18T23:51:40+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