42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
|
|
from dashboard_data.card_utils import average, safe_number
|
||
|
|
|
||
|
|
|
||
|
|
def build_farm_alerts_tracker(sensor_id: str, context: dict | None = None, ai_bundle: dict | None = None) -> dict:
|
||
|
|
context = context or {}
|
||
|
|
sensor = context.get("sensor")
|
||
|
|
forecasts = context.get("forecasts", [])
|
||
|
|
if sensor is None:
|
||
|
|
return {"totalAlerts": 0, "radialBarValue": 0, "alertStats": []}
|
||
|
|
|
||
|
|
moisture = safe_number(sensor.soil_moisture, 0)
|
||
|
|
humidity = average([forecast.humidity_mean for forecast in forecasts[:3]], default=0)
|
||
|
|
frost_count = sum(1 for forecast in forecasts[:3] if safe_number(forecast.temperature_min, 10) <= 0)
|
||
|
|
low_water_count = 2 if moisture < 45 else 0
|
||
|
|
fungal_count = 1 if humidity > 70 and moisture > 60 else 0
|
||
|
|
total = low_water_count + fungal_count + frost_count
|
||
|
|
|
||
|
|
return {
|
||
|
|
"totalAlerts": total,
|
||
|
|
"radialBarValue": min(100, total * 10),
|
||
|
|
"alertStats": [
|
||
|
|
{
|
||
|
|
"title": "کمبود آب",
|
||
|
|
"count": str(low_water_count),
|
||
|
|
"avatarColor": "error",
|
||
|
|
"avatarIcon": "tabler-droplet-half-2",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"title": "ریسک قارچی",
|
||
|
|
"count": str(fungal_count),
|
||
|
|
"avatarColor": "warning",
|
||
|
|
"avatarIcon": "tabler-mushroom",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"title": "هشدار یخبندان",
|
||
|
|
"count": str(frost_count),
|
||
|
|
"avatarColor": "info",
|
||
|
|
"avatarIcon": "tabler-snowflake",
|
||
|
|
},
|
||
|
|
],
|
||
|
|
}
|