version 2

This commit is contained in:
2025-12-16 16:52:40 +03:30
parent 61e86b1e96
commit 139924db94
52 changed files with 7350 additions and 321 deletions

230
src/ALERT_SYSTEM_UPDATE.md Normal file
View File

@@ -0,0 +1,230 @@
# سیستم جدید هشدارهای شرطی
## تغییرات اعمال شده
### 1. تغییرات در تنظیمات دستگاه (`DeviceSettings`)
#### فیلدهای حذف شده:
- تمام فیلدهای `Min` و `Max` برای سنسورها حذف شدند:
- `DangerMaxTemperature`, `DangerMinTemperature`
- `MaxTemperature`, `MinTemperature`
- `MaxGasPPM`, `MinGasPPM`
- `MaxLux`, `MinLux`
- `MaxHumidityPercent`, `MinHumidityPercent`
#### فیلدهای جدید:
- `Province` (استان) - نوع: string
- `City` (شهر) - نوع: string
- `Latitude` (عرض جغرافیایی) - نوع: decimal? (اختیاری)
- `Longitude` (طول جغرافیایی) - نوع: decimal? (اختیاری)
### 2. مدل‌های جدید برای شرایط هشدار
#### `AlertCondition` - شرط هشدار
هر شرط هشدار شامل موارد زیر است:
- `DeviceId`: شناسه دستگاه
- `NotificationType`: نوع اعلان (تماس یا پیامک)
- `Call = 0`: تماس صوتی
- `SMS = 1`: پیامک
- `TimeType`: زمان اعمال شرط
- `Day = 0`: فقط روز
- `Night = 1`: فقط شب
- `Always = 2`: همیشه
- `CallCooldownMinutes`: فاصله زمانی بین تماس‌های هشدار (پیش‌فرض: 60 دقیقه)
- `SmsCooldownMinutes`: فاصله زمانی بین پیامک‌های هشدار (پیش‌فرض: 15 دقیقه)
- `IsEnabled`: وضعیت فعال/غیرفعال بودن شرط
- `Rules`: لیست قوانین (با AND به هم متصل می‌شوند)
#### `AlertRule` - قانون شرط
هر قانون شامل:
- `SensorType`: نوع سنسور
- `Temperature = 0`: دما
- `Humidity = 1`: رطوبت
- `Soil = 2`: رطوبت خاک
- `Gas = 3`: گاز
- `Lux = 4`: نور
- `ComparisonType`: نوع مقایسه
- `GreaterThan = 0`: بیشتر از
- `LessThan = 1`: کمتر از
- `Between = 2`: بین دو عدد
- `OutOfRange = 3`: خارج از محدوده
- `Value1`: مقدار عددی اول
- `Value2`: مقدار عددی دوم (برای Between و OutOfRange)
- `Order`: ترتیب نمایش
### 3. API های جدید
#### مدیریت شرایط هشدار (`/api/AlertConditions`)
**دریافت شرایط یک دستگاه:**
```http
GET /api/AlertConditions/device/{deviceId}
```
**دریافت یک شرط با ID:**
```http
GET /api/AlertConditions/{id}
```
**ایجاد شرط جدید:**
```http
POST /api/AlertConditions
Content-Type: application/json
{
"deviceId": 1,
"notificationType": 1, // 0=Call, 1=SMS
"timeType": 0, // 0=Day, 1=Night, 2=Always
"callCooldownMinutes": 60,
"smsCooldownMinutes": 15,
"isEnabled": true,
"rules": [
{
"sensorType": 0, // 0=Temperature, 1=Humidity, 2=Soil, 3=Gas, 4=Lux
"comparisonType": 0, // 0=GreaterThan, 1=LessThan, 2=Between, 3=OutOfRange
"value1": 30.0,
"value2": null, // فقط برای Between و OutOfRange
"order": 0
},
{
"sensorType": 1, // Humidity
"comparisonType": 2, // Between
"value1": 40.0,
"value2": 60.0,
"order": 1
}
]
}
```
**به‌روزرسانی شرط:**
```http
PUT /api/AlertConditions
Content-Type: application/json
{
"id": 1,
"notificationType": 1,
"timeType": 0,
"callCooldownMinutes": 60,
"smsCooldownMinutes": 15,
"isEnabled": true,
"rules": [...]
}
```
**حذف شرط:**
```http
DELETE /api/AlertConditions/{id}
```
**فعال/غیرفعال کردن شرط:**
```http
PATCH /api/AlertConditions/{id}/toggle
Content-Type: application/json
true // یا false
```
### 4. محاسبه روز/شب
سرویس `SunCalculatorService` بر اساس موقعیت جغرافیایی (Latitude/Longitude) و زمان جاری، طلوع و غروب خورشید را محاسبه کرده و مشخص می‌کند که آیا زمان فعلی روز است یا شب.
### 5. نحوه عملکرد سیستم هشدار جدید
1. هنگام دریافت داده از دستگاه (`/api/Telemetry/AddData`)
2. تمام شرایط فعال (`IsEnabled=true`) دستگاه بررسی می‌شوند
3. برای هر شرط:
- اگر `TimeType` تنظیم شده باشد، زمان روز/شب چک می‌شود
- تمام قوانین (`Rules`) با منطق AND چک می‌شوند
- اگر همه قوانین برقرار باشند، هشدار ارسال می‌شود
4. هشدار فقط در صورتی ارسال می‌شود که:
- از آخرین هشدار همان شرط، زمان کافی گذشته باشد (بر اساس `CallCooldownMinutes` یا `SmsCooldownMinutes`)
5. هشدار به صورت پیامک یا تماس صوتی ارسال می‌شود
### 6. مثال‌های کاربردی
#### مثال 1: هشدار دمای بالا در روز
```json
{
"deviceId": 1,
"notificationType": 1, // SMS
"timeType": 0, // Day only
"smsCooldownMinutes": 15,
"rules": [
{
"sensorType": 0, // Temperature
"comparisonType": 0, // GreaterThan
"value1": 35.0
}
]
}
```
#### مثال 2: هشدار دما و رطوبت در شب
```json
{
"deviceId": 1,
"notificationType": 0, // Call
"timeType": 1, // Night only
"callCooldownMinutes": 60,
"rules": [
{
"sensorType": 0, // Temperature
"comparisonType": 1, // LessThan
"value1": 10.0,
"order": 0
},
{
"sensorType": 1, // Humidity
"comparisonType": 0, // GreaterThan
"value1": 80.0,
"order": 1
}
]
}
```
**توضیح**: اگر دما کمتر از 10 درجه AND رطوبت بیشتر از 80 درصد باشد، در شب تماس بگیر.
#### مثال 3: رطوبت خارج از محدوده
```json
{
"deviceId": 1,
"notificationType": 1, // SMS
"timeType": 2, // Always
"smsCooldownMinutes": 15,
"rules": [
{
"sensorType": 1, // Humidity
"comparisonType": 3, // OutOfRange
"value1": 30.0,
"value2": 70.0
}
]
}
```
**توضیح**: اگر رطوبت کمتر از 30 یا بیشتر از 70 باشد، همیشه پیامک بفرست.
### 7. تغییرات در Database
Migration جدید (`UpdateAlertSystemWithConditions`) شامل:
- حذف ستون‌های min/max از `DeviceSettings`
- اضافه کردن ستون‌های `Province`, `City`, `Latitude`, `Longitude` به `DeviceSettings`
- ایجاد جدول `AlertConditions`
- ایجاد جدول `AlertRules`
- به‌روزرسانی جدول `AlertNotifications` برای ارتباط با `AlertCondition`
### 8. سرویس‌های جدید
- `IAlertConditionService` / `AlertConditionService`: مدیریت شرایط هشدار
- `ISunCalculatorService` / `SunCalculatorService`: محاسبه طلوع/غروب و تشخیص روز/شب
- `AlertService`: بازنویسی کامل برای پشتیبانی از سیستم شرطی جدید
### 9. نکات مهم
1. **Migration**: قبل از اجرا، حتماً backup از database بگیرید چون فیلدهای قدیمی حذف می‌شوند
2. **Latitude/Longitude**: برای استفاده از قابلیت روز/شب، حتماً مختصات جغرافیایی را در تنظیمات دستگاه وارد کنید
3. **Cooldown**: فاصله زمانی بین هشدارها قابل تنظیم برای هر شرط است
4. **AND Logic**: تمام قوانین یک شرط با منطق AND به هم متصل می‌شوند
5. **Multiple Conditions**: می‌توانید چندین شرط مجزا برای یک دستگاه تعریف کنید