17 KiB
Device Hub API Guide
این فایل مستند API های تعریفشده در device_hub/urls.py را توضیح میدهد. مسیر پایه این API ها طبق config/urls.py برابر است با:
api/device-hub/
بیشتر endpointها نیاز به احراز هویت کاربر دارند و معمولاً با ساختار زیر پاسخ میدهند:
{
"code": 200,
"msg": "success",
"data": {}
}
نحوه ارتباط با API ها
1) احراز هویت
- برای بیشتر endpointها باید کاربر لاگین باشد.
- معمولاً توکن را در هدر
Authorizationارسال میکنید. - نمونه:
Authorization: Bearer <token>
Content-Type: application/json
2) آدرس پایه
اگر دامنه پروژه مثلاً https://example.com باشد، آدرس کامل endpointها به این صورت است:
https://example.com/api/device-hub/catalog/https://example.com/api/device-hub/devices/<physical_device_uuid>/latest/?device_code=<code>
3) پارامترهای مهم
physical_device_uuid: شناسه فیزیکی دستگاهdevice_code: کد نوع device داخل catalogrange: بازه زمانی (1h,24h,7d,30d,todayبسته به endpoint)pageوpage_size: برای صفحهبندی لاگها
1. دریافت لیست کاتالوگ دستگاهها
Endpoint
GET /api/device-hub/catalog/GET /api/device-hub/
کاربرد
برای گرفتن لیست همه device catalogها استفاده میشود.
درخواست نمونه
curl -X GET "https://example.com/api/device-hub/catalog/" \
-H "Authorization: Bearer <token>"
پاسخ نمونه
{
"code": 200,
"msg": "success",
"data": [
{
"uuid": "11111111-1111-1111-1111-111111111111",
"code": "soil_sensor_v2",
"name": "Soil Sensor V2",
"description": "",
"device_communication_type": "output_only",
"customizable_fields": [],
"supported_power_sources": [],
"returned_data_fields": ["soil_moisture", "soil_temperature"],
"payload_mapping": {
"soil_moisture": ["moisture", "soil_moisture"],
"soil_temperature": ["temperature", "soil_temperature"]
},
"display_schema": {},
"supported_widgets": ["values_list", "comparison_chart", "radar_chart"],
"commands_schema": [],
"capabilities": [],
"sample_payload": {},
"is_active": true
}
]
}
فیلدهای مهم پاسخ
device_communication_type: نوع ارتباط دستگاه (output_onlyیاinput_only)returned_data_fields: دادههایی که device برمیگرداندpayload_mapping: نگاشت کلیدهای payload خام به فیلدهای نرمالsupported_widgets: ویجتهایی که فرانت میتواند نمایش دهدcommands_schema: لیست commandهای قابل ارسال برای deviceهای commandable
2. جزئیات یک دستگاه
Endpoint
GET /api/device-hub/devices/<physical_device_uuid>/?device_code=<device_code>
کاربرد
اطلاعات کلی دستگاه ثبتشده در فارم را برمیگرداند.
Query Params
device_codeاجباری
درخواست نمونه
curl -X GET "https://example.com/api/device-hub/devices/22222222-2222-2222-2222-222222222222/?device_code=soil_sensor_v2" \
-H "Authorization: Bearer <token>"
پاسخ نمونه
{
"code": 200,
"msg": "success",
"data": {
"uuid": "33333333-3333-3333-3333-333333333333",
"physical_device_uuid": "22222222-2222-2222-2222-222222222222",
"name": "Soil Device 1",
"sensor_type": "soil",
"is_active": true,
"specifications": {},
"power_source": {},
"device_catalog": {
"uuid": "11111111-1111-1111-1111-111111111111",
"code": "soil_sensor_v2",
"name": "Soil Sensor V2",
"description": "",
"device_communication_type": "output_only",
"customizable_fields": [],
"supported_power_sources": [],
"returned_data_fields": ["soil_moisture", "soil_temperature"],
"payload_mapping": {},
"display_schema": {},
"supported_widgets": ["values_list", "comparison_chart", "radar_chart"],
"commands_schema": [],
"capabilities": [],
"sample_payload": {},
"is_active": true
},
"device_catalogs": [],
"last_payload_at": "2025-01-01T10:00:00Z",
"created_at": "2025-01-01T09:00:00Z",
"updated_at": "2025-01-01T09:00:00Z"
}
}
نکته
- اگر
physical_device_uuidمتعلق به کاربر نباشد، خطای 400 با متنDevice not found.برمیگردد. - اگر
device_codeبه این دستگاه attach نشده باشد، خطای validation دریافت میکنید.
3. آخرین payload دستگاه
Endpoint
GET /api/device-hub/devices/<physical_device_uuid>/latest/?device_code=<device_code>
کاربرد
آخرین payload خام و نرمالشده دستگاه را میدهد.
Query Params
device_codeاجباری
پاسخ نمونه
{
"code": 200,
"msg": "success",
"data": {
"physical_device_uuid": "22222222-2222-2222-2222-222222222222",
"device_code": "soil_sensor_v2",
"device_catalog_code": "soil_sensor_v2",
"raw_payload": {
"moisture": 52.4,
"temperature": 23.1
},
"normalized_payload": {
"soil_moisture": 52.4,
"soil_temperature": 23.1
},
"readings": {
"soil_moisture": 52.4,
"soil_temperature": 23.1
},
"created_at": "2025-01-01T10:00:00Z"
}
}
معنی فیلدها
raw_payload: داده خامی که از لاگ ذخیرهشده آمدهnormalized_payload: داده تبدیلشده بر اساسpayload_mappingreadings: مقادیر قابل نمایش برای UI
4. خلاصه دستگاه
Endpoint
GET /api/device-hub/devices/<physical_device_uuid>/summary/?device_code=<device_code>
کاربرد
یک summary مناسب UI برمیگرداند؛ مثلاً ویجتهای قابل نمایش، values list، chartها و commandها.
Query Params
device_codeاجباری
پاسخ نمونه
{
"code": 200,
"msg": "success",
"data": {
"sensor": {
"name": "Soil Device 1",
"physicalDeviceUuid": "22222222-2222-2222-2222-222222222222",
"sensorCatalogCode": "soil_sensor_v2",
"updatedAt": "2025-01-01T10:00:00Z"
},
"supportedWidgets": ["values_list", "comparison_chart", "radar_chart"],
"sensorValuesList": {
"sensor": {
"name": "Soil Device 1",
"physicalDeviceUuid": "22222222-2222-2222-2222-222222222222",
"sensorCatalogCode": "soil_sensor_v2",
"updatedAt": "2025-01-01T10:00:00Z"
},
"sensors": [
{
"id": "soil_moisture",
"title": "رطوبت خاک",
"subtitle": "45-65%",
"trendNumber": 52.4,
"trend": "normal",
"unit": "%"
}
]
},
"commands": []
}
}
نکته
- شکل دقیق
dataبسته بهsupported_widgetsو نوع catalog تغییر میکند. - اگر history وجود نداشته باشد، معمولاً خطای 400 برمیگردد.
5. نمودار مقایسهای دستگاه
Endpoint
GET /api/device-hub/devices/<physical_device_uuid>/comparison-chart/?device_code=<device_code>&range=7d
Query Params
device_codeاجباریrangeاختیاری:7dیا30d
پاسخ نمونه
{
"series": [
{
"name": "Moisture",
"data": [50.0, 51.2, 52.4]
},
{
"name": "Temperature",
"data": [22.0, 22.4, 23.1]
}
],
"categories": ["شنبه", "یکشنبه", "دوشنبه"],
"currentValue": 52.4,
"vsLastWeek": "+3.1%"
}
نکته
- این endpoint برخلاف بعضی endpointهای دیگر wrapper
code/msgندارد و مستقیم data chart را برمیگرداند.
6. لیست مقادیر دستگاه
Endpoint
GET /api/device-hub/devices/<physical_device_uuid>/values-list/?device_code=<device_code>&range=7d
Query Params
device_codeاجباریrangeاختیاری:1h،24h،7d
پاسخ نمونه
{
"sensors": [
{
"title": "Moisture",
"subtitle": "45-65%",
"trendNumber": 52.4,
"trend": "positive",
"unit": "%"
},
{
"title": "Temperature",
"subtitle": "18-28°C",
"trendNumber": 23.1,
"trend": "positive",
"unit": "°C"
}
]
}
نکته
- این endpoint هم مستقیم JSON داده را برمیگرداند و wrapper
code/msgندارد.
7. رادار چارت دستگاه
Endpoint
GET /api/device-hub/devices/<physical_device_uuid>/radar-chart/?device_code=<device_code>&range=7d
Query Params
device_codeاجباریrangeاختیاری:today،7d،30d
پاسخ نمونه
{
"labels": ["Moisture", "Temperature", "PH", "EC"],
"series": [
{
"name": "Current",
"data": [52.4, 23.1, 6.7, 1.1]
}
]
}
نکته
- این endpoint هم مستقیم data را برمیگرداند.
8. لاگهای دستگاه
Endpoint
GET /api/device-hub/devices/<physical_device_uuid>/logs/?device_code=<device_code>&page=1&page_size=20
Query Params
device_codeاجباریpageاختیاری، پیشفرض1page_sizeاختیاری، پیشفرض20، حداکثر100
پاسخ نمونه
{
"code": 200,
"msg": "success",
"count": 1,
"next": null,
"previous": null,
"data": [
{
"id": 10,
"farm_uuid": "44444444-4444-4444-4444-444444444444",
"sensor_catalog_uuid": "11111111-1111-1111-1111-111111111111",
"physical_device_uuid": "22222222-2222-2222-2222-222222222222",
"farm_device": {
"uuid": "33333333-3333-3333-3333-333333333333",
"sensor_catalog_uuid": "11111111-1111-1111-1111-111111111111",
"device_catalogs": [],
"physical_device_uuid": "22222222-2222-2222-2222-222222222222",
"name": "Soil Device 1",
"sensor_type": "soil",
"is_active": true,
"specifications": {},
"power_source": {},
"created_at": "2025-01-01T09:00:00Z",
"updated_at": "2025-01-01T09:00:00Z"
},
"sensor_catalog": {
"uuid": "11111111-1111-1111-1111-111111111111",
"code": "soil_sensor_v2",
"name": "Soil Sensor V2",
"description": "",
"device_communication_type": "output_only",
"customizable_fields": [],
"supported_power_sources": [],
"returned_data_fields": [],
"payload_mapping": {},
"display_schema": {},
"supported_widgets": [],
"commands_schema": [],
"capabilities": [],
"sample_payload": {},
"is_active": true,
"created_at": "2025-01-01T09:00:00Z",
"updated_at": "2025-01-01T09:00:00Z"
},
"payload": {
"moisture": 52.4,
"temperature": 23.1
},
"created_at": "2025-01-01T10:00:00Z"
}
]
}
کاربرد
- برای history دستگاه
- برای نمایش payloadهای دریافتشده از device
- برای debug یا audit
9. ارسال command به دستگاه
Endpoint
POST /api/device-hub/devices/<physical_device_uuid>/commands/
کاربرد
برای deviceهایی که input_only یا commandable هستند، command ارسال میکند.
Body
{
"device_code": "valve_v1",
"command": "open",
"payload": {
"duration_seconds": 120
}
}
درخواست نمونه
curl -X POST "https://example.com/api/device-hub/devices/22222222-2222-2222-2222-222222222222/commands/" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"device_code": "valve_v1",
"command": "open",
"payload": {
"duration_seconds": 120
}
}'
پاسخ نمونه
{
"code": 200,
"msg": "command accepted",
"data": {
"physical_device_uuid": "22222222-2222-2222-2222-222222222222",
"command": "open",
"status": "accepted"
}
}
نکات
device_codeباید جزو catalogهای متصل به آن device باشد.- اگر command یا device code معتبر نباشد، خطای 400 برمیگردد.
10. خلاصه سنسور 7in1
Endpoint
GET /api/device-hub/summary/?farm_uuid=<farm_uuid>
کاربرد
خلاصهای از سنسور اصلی مزرعه برای UI برمیگرداند.
Query Params
farm_uuidاجباری
پاسخ نمونه
{
"code": 200,
"msg": "OK",
"data": {
"sensor": {
"name": "Main Soil Sensor",
"physicalDeviceUuid": "22222222-2222-2222-2222-222222222222",
"sensorCatalogCode": "sensor-7-in-1",
"updatedAt": "2025-01-01T10:00:00Z"
},
"sensorValuesList": {},
"avgSoilMoisture": {},
"sensorRadarChart": {},
"sensorComparisonChart": {},
"anomalyDetectionCard": {},
"soilMoistureHeatmap": {}
}
}
11. ثبت payload خارجی دستگاه
Endpoint
POST /api/device-hub/external/
کاربرد
این endpoint برای سیستم یا دستگاه خارجی است تا payload را به backend ارسال کند.
این endpoint با API key اختصاصی کار میکند، نه با توکن کاربر.
Header
X-API-Key: <api_key>
Content-Type: application/json
Body
{
"uuid": "22222222-2222-2222-2222-222222222222",
"payload": {
"moisture_percent": 32.5,
"temperature_c": 21.3,
"ph": 6.7,
"ec_ds_m": 1.1,
"nitrogen_mg_kg": 42,
"phosphorus_mg_kg": 18,
"potassium_mg_kg": 210
}
}
رفتار endpoint
- payload را در
SensorExternalRequestLogذخیره میکند - notification میسازد
- payload را به farm-data service فوروارد میکند
پاسخ موفق نمونه
{
"code": 201,
"msg": "success",
"data": {
"id": 1,
"title": "Sensor external API request"
}
}
خطاهای مهم
401: اگرX-API-Keyاشتباه یا خالی باشد404: اگرphysical deviceپیدا نشود503: اگر migrationها آماده نباشند یا سرویس farm-data در دسترس نباشد
12. لیست لاگهای ورودی خارجی
Endpoint
GET /api/device-hub/external/logs/?farm_uuid=<farm_uuid>&page=1&page_size=20
Query Params
farm_uuidاجباریpageاجباری در داکیومنت، ولی در عمل اگر نفرستید پیشفرض1دارد در paginatorpage_sizeاجباری در داکیومنتphysical_device_uuidاختیاریsensor_typeاختیاریdate_fromاختیاریdate_toاختیاری
پاسخ نمونه
{
"code": 200,
"msg": "success",
"count": 25,
"next": "https://example.com/api/device-hub/external/logs/?page=2",
"previous": null,
"data": [
{
"id": 10,
"farm_uuid": "44444444-4444-4444-4444-444444444444",
"sensor_catalog_uuid": "11111111-1111-1111-1111-111111111111",
"physical_device_uuid": "22222222-2222-2222-2222-222222222222",
"farm_device": null,
"sensor_catalog": null,
"payload": {
"moisture": 52.4
},
"created_at": "2025-01-01T10:00:00Z"
}
]
}
الگوی خطاها
Validation Error
در بیشتر خطاهای اعتبارسنجی، پاسخ شبیه این است:
{
"device_code": [
"Device code is not attached to this farm device."
]
}
یا:
{
"physical_device_uuid": [
"Device not found."
]
}
Unauthorized
اگر توکن کاربر یا API key درست نباشد، پاسخ 401 دریافت میکنید.
Service Unavailable
در endpointهای external اگر migration یا سرویس وابسته آماده نباشد:
{
"code": 503,
"msg": "Required tables are not ready. Run migrations."
}
ترتیب پیشنهادی استفاده در فرانت
برای صفحه جزئیات device معمولاً این ترتیب مناسب است:
- گرفتن catalogها از
GET /api/device-hub/catalog/ - گرفتن جزئیات device از
GET /api/device-hub/devices/<uuid>/?device_code=... - گرفتن summary از
GET /api/device-hub/devices/<uuid>/summary/?device_code=... - در صورت نیاز گرفتن:
- latest payload
- comparison chart
- radar chart
- values list
- logs
برای deviceهای commandable:
- از
commands_schemaدر catalog commandهای مجاز را بخوانید - سپس به
POST /api/device-hub/devices/<uuid>/commands/درخواست بزنید
محل فایلهای مرتبط در کد
- مسیرها:
device_hub/urls.py - ویوها:
device_hub/views.py - serializerها:
device_hub/serializers.py - serializerهای summary/chart:
device_hub/sensor_serializers.py - مسیر پایه پروژه:
config/urls.py