# سیستم جدید هشدارهای شرطی ## تغییرات اعمال شده ### 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**: می‌توانید چندین شرط مجزا برای یک دستگاه تعریف کنید