Files
Backend/SENSOR_APIS_FRONTEND_GUIDE.md
T
2026-04-11 03:54:15 +03:30

382 lines
10 KiB
Markdown

# راهنمای API فرانت برای سنسورها
این فایل برای تحویل به فرانت نوشته شده و دو app را به‌صورت جداگانه توضیح می‌دهد:
1. `sensor_external_api`
2. `sensor_7_in_1`
---
# صفحه 1 - `sensor_external_api`
## اطلاعات app
- فایل app: `sensor_external_api/apps.py`
- AppConfig: `SensorExternalApiConfig`
- Django app name: `sensor_external_api`
- Base URL: `/api/sensor-external-api/`
## کاربرد این app
این app برای دریافت payload خام از سنسور خارجی و همچنین مشاهده لاگ‌های ثبت‌شده آن استفاده می‌شود.
نکته مهم:
- endpoint ثبت payload بیشتر برای **خود سنسور / gateway / backend integration** است.
- endpoint لاگ‌ها برای **فرانت** مناسب است تا آخرین داده‌های خام دریافت‌شده را ببیند.
## API 1 - ثبت payload از سنسور خارجی
- Method: `POST`
- URL: `/api/sensor-external-api/`
- Auth: هدر `X-API-Key`
- Permission: عمومی است، ولی فقط با API key معتبر
### Header
```http
X-API-Key: 12345
Content-Type: application/json
```
### Body
```json
{
"uuid": "33333333-3333-3333-3333-333333333333",
"payload": {
"soil_moisture": 48.5,
"soil_temperature": 23.2,
"soil_ph": 6.8,
"electrical_conductivity": 1.4,
"nitrogen": 31,
"phosphorus": 16,
"potassium": 24
}
}
```
### توضیح فیلدها
- `uuid`: شناسه فیزیکی دستگاه سنسور
- `payload`: داده خام ارسال‌شده توسط دستگاه
### پاسخ موفق
```json
{
"code": 201,
"msg": "success",
"data": {
"id": 1,
"title": "Sensor external API request",
"message": "Payload received from device 33333333-3333-3333-3333-333333333333."
}
}
```
### خطاهای مهم
- `401`: API key نامعتبر یا ارسال نشده
- `404`: سنسور با این `uuid` پیدا نشده
- `503`: سرویس مقصد یا جداول موردنیاز آماده نیستند
## API 2 - دریافت لاگ‌های سنسور خارجی
- Method: `GET`
- URL: `/api/sensor-external-api/logs/?farm_uuid=<uuid>`
- Auth: JWT کاربر
- Permission: `IsAuthenticated`
### Query Params
- `farm_uuid` اجباری
- `page` اختیاری
- `page_size` اختیاری
### نمونه درخواست
```http
GET /api/sensor-external-api/logs/?farm_uuid=11111111-1111-1111-1111-111111111111&page=1&page_size=20
Authorization: Bearer <token>
```
### پاسخ موفق
```json
{
"code": 200,
"msg": "success",
"count": 2,
"next": null,
"previous": null,
"data": [
{
"id": 10,
"farm_uuid": "11111111-1111-1111-1111-111111111111",
"sensor_catalog_uuid": "22222222-2222-2222-2222-222222222222",
"physical_device_uuid": "33333333-3333-3333-3333-333333333333",
"farm_sensor": {
"uuid": "aaaa1111-1111-1111-1111-111111111111",
"sensor_catalog_uuid": "22222222-2222-2222-2222-222222222222",
"physical_device_uuid": "33333333-3333-3333-3333-333333333333",
"name": "Soil Sensor 7-in-1",
"sensor_type": "soil_7_in_1",
"is_active": true,
"specifications": {},
"power_source": {},
"created_at": "2025-03-24T10:00:00Z",
"updated_at": "2025-03-24T10:00:00Z"
},
"sensor_catalog": {
"uuid": "22222222-2222-2222-2222-222222222222",
"code": "sensor-7-in-1",
"name": "7 in 1 Soil Sensor",
"description": "",
"customizable_fields": [],
"supported_power_sources": [],
"returned_data_fields": [
"soil_moisture",
"soil_temperature",
"soil_ph",
"electrical_conductivity",
"nitrogen",
"phosphorus",
"potassium"
],
"sample_payload": {},
"is_active": true,
"created_at": "2025-03-24T10:00:00Z",
"updated_at": "2025-03-24T10:00:00Z"
},
"payload": {
"soil_moisture": 48.5,
"soil_temperature": 23.2,
"soil_ph": 6.8,
"electrical_conductivity": 1.4,
"nitrogen": 31,
"phosphorus": 16,
"potassium": 24
},
"created_at": "2025-03-24T10:00:00Z"
}
]
}
```
## کاربرد فرانت
- برای صفحه history / logs سنسور
- برای نمایش raw payload دریافتی از دستگاه
- برای debug و بررسی آخرین داده‌های ثبت‌شده
## نکته فرانت
برای نمایش کارت‌های نهایی و تمیزشده سنسور 7 در 1 بهتر است از app بعدی یعنی `sensor_7_in_1` استفاده شود، نه از payload خام این app.
---
# صفحه 2 - `sensor_7_in_1`
## اطلاعات app
- فایل app: `sensor_7_in_1/apps.py`
- AppConfig: `Sensor7In1Config`
- Django app name: `sensor_7_in_1`
- Base URL: `/api/sensor-7-in-1/`
- Feature code: `sensor-7-in-1`
## کاربرد این app
این app داده‌های خام ثبت‌شده در `sensor_external_api` را می‌خواند و فقط اطلاعات مربوط به **یک سنسور خاص** یعنی سنسور خاک 7-in-1 را به فرم قابل‌استفاده برای UI برمی‌گرداند.
به‌جای اینکه فرانت خودش از payload خام `soil_moisture`, `soil_ph`, `nitrogen` و ... کارت بسازد، این app خروجی نهایی UI-ready می‌دهد.
## API اصلی
- Method: `GET`
- URL: `/api/sensor-7-in-1/summary/?farm_uuid=<uuid>`
- Auth: JWT کاربر
- Permission: `IsAuthenticated`
### Query Params
- `farm_uuid` اجباری
### نمونه درخواست
```http
GET /api/sensor-7-in-1/summary/?farm_uuid=11111111-1111-1111-1111-111111111111
Authorization: Bearer <token>
```
### پاسخ موفق
```json
{
"code": 200,
"msg": "OK",
"data": {
"sensor": {
"name": "Soil Sensor 7-in-1",
"physicalDeviceUuid": "33333333-3333-3333-3333-333333333333",
"sensorCatalogCode": "sensor-7-in-1",
"updatedAt": "2025-03-24T10:00:00Z"
},
"sensorValuesList": {
"sensor": {
"name": "Soil Sensor 7-in-1",
"physicalDeviceUuid": "33333333-3333-3333-3333-333333333333",
"sensorCatalogCode": "sensor-7-in-1",
"updatedAt": "2025-03-24T10:00:00Z"
},
"sensors": [
{
"id": "soil_moisture",
"title": "48.5%",
"subtitle": "رطوبت خاک",
"trendNumber": 7.5,
"trend": "positive",
"unit": "%"
},
{
"id": "soil_temperature",
"title": "23.2°C",
"subtitle": "دمای خاک",
"trendNumber": 2.2,
"trend": "positive",
"unit": "°C"
},
{
"id": "soil_ph",
"title": "6.8",
"subtitle": "pH خاک",
"trendNumber": 0.3,
"trend": "positive",
"unit": "pH"
}
]
},
"avgSoilMoisture": {
"id": "avg_soil_moisture",
"title": "میانگین رطوبت خاک",
"subtitle": "سنسور 7 در 1 خاک",
"stats": "48.5%",
"avatarColor": "warning",
"avatarIcon": "tabler-droplet",
"chipText": "متوسط",
"chipColor": "warning"
},
"sensorRadarChart": {
"labels": ["رطوبت", "دما", "pH", "EC", "نیتروژن", "فسفر", "پتاسیم"],
"series": [
{
"name": "اکنون",
"data": [87, 90, 95, 88, 90, 85, 92]
},
{
"name": "هدف",
"data": [100, 100, 100, 100, 100, 100, 100]
}
]
},
"sensorComparisonChart": {
"currentValue": 48.5,
"vsLastWeek": "+18.3%",
"vsLastWeekValue": 18.3,
"categories": ["03/24 09:00", "03/24 10:00"],
"series": [
{
"name": "رطوبت خاک",
"data": [41, 48.5]
},
{
"name": "بازه هدف",
"data": [55, 55]
}
]
},
"anomalyDetectionCard": {
"anomalies": [
{
"sensor": "هدایت الکتریکی",
"value": "1.4 dS/m",
"expected": "0.8-1.8 dS/m",
"deviation": "0",
"severity": "success"
}
]
},
"soilMoistureHeatmap": {
"zones": ["Soil Sensor 7-in-1"],
"hours": ["09:00", "10:00"],
"series": [
{
"name": "Soil Sensor 7-in-1",
"data": [
{ "x": "09:00", "y": 41 },
{ "x": "10:00", "y": 48.5 }
]
}
]
}
}
}
```
## فیلدهای مهم برای فرانت
### `sensor`
اطلاعات شناسایی سنسور:
- `name`
- `physicalDeviceUuid`
- `sensorCatalogCode`
- `updatedAt`
### `sensorValuesList`
برای لیست کارت‌های عددی سنسور:
- رطوبت خاک
- دمای خاک
- pH خاک
- هدایت الکتریکی
- نیتروژن
- فسفر
- پتاسیم
### `avgSoilMoisture`
برای KPI رطوبت خاک در dashboard
### `sensorRadarChart`
برای نمودار radar وضعیت شاخص‌های سنسور
### `sensorComparisonChart`
برای نمودار روند رطوبت خاک نسبت به داده‌های قبلی
### `anomalyDetectionCard`
برای نمایش مقادیر خارج از بازه نرمال
### `soilMoistureHeatmap`
برای heatmap یا نمودار تاریخچه رطوبت خاک
## رفتار این app
- فقط داده سنسوری را که مشخصات 7-in-1 داشته باشد برمی‌گرداند
- داده‌ها را از لاگ‌های `sensor_external_api` می‌خواند
- اگر داده واقعی پیدا نشود، fallback mock برمی‌گرداند
- این app همان منبعی است که dashboard برای کارت‌های سنسوری از آن استفاده می‌کند
## پیشنهاد استفاده در فرانت
- اگر هدف نمایش **کارت‌های نهایی سنسور** است، از `sensor_7_in_1` استفاده کنید
- اگر هدف نمایش **لاگ خام payload** یا history ورودی دستگاه است، از `sensor_external_api/logs/` استفاده کنید