Files
GreenHomeBack/src/ALERT_SYSTEM_UPDATE.md
2025-12-16 16:52:40 +03:30

7.5 KiB

سیستم جدید هشدارهای شرطی

تغییرات اعمال شده

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)

دریافت شرایط یک دستگاه:

GET /api/AlertConditions/device/{deviceId}

دریافت یک شرط با ID:

GET /api/AlertConditions/{id}

ایجاد شرط جدید:

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
    }
  ]
}

به‌روزرسانی شرط:

PUT /api/AlertConditions
Content-Type: application/json

{
  "id": 1,
  "notificationType": 1,
  "timeType": 0,
  "callCooldownMinutes": 60,
  "smsCooldownMinutes": 15,
  "isEnabled": true,
  "rules": [...]
}

حذف شرط:

DELETE /api/AlertConditions/{id}

فعال/غیرفعال کردن شرط:

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: هشدار دمای بالا در روز

{
  "deviceId": 1,
  "notificationType": 1,  // SMS
  "timeType": 0,  // Day only
  "smsCooldownMinutes": 15,
  "rules": [
    {
      "sensorType": 0,  // Temperature
      "comparisonType": 0,  // GreaterThan
      "value1": 35.0
    }
  ]
}

مثال 2: هشدار دما و رطوبت در شب

{
  "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: رطوبت خارج از محدوده

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