27 lines
1.2 KiB
Python
27 lines
1.2 KiB
Python
|
|
from datetime import date, timedelta
|
||
|
|
|
||
|
|
from dashboard_data.card_utils import average, safe_number
|
||
|
|
|
||
|
|
|
||
|
|
def build_harvest_prediction_card(sensor_id: str, context: dict | None = None, ai_bundle: dict | None = None) -> dict:
|
||
|
|
context = context or {}
|
||
|
|
forecasts = context.get("forecasts", [])
|
||
|
|
plants = context.get("plants", [])
|
||
|
|
|
||
|
|
avg_temp = average([forecast.temperature_mean for forecast in forecasts], default=24)
|
||
|
|
moisture_factor = safe_number(getattr(context.get("sensor"), "soil_moisture", None), 50)
|
||
|
|
days_until = max(10, int(90 - avg_temp - (moisture_factor / 5)))
|
||
|
|
target_date = date.today() + timedelta(days=days_until)
|
||
|
|
window_start = target_date - timedelta(days=3)
|
||
|
|
window_end = target_date + timedelta(days=3)
|
||
|
|
plant_name = plants[0].name if plants else "محصول"
|
||
|
|
|
||
|
|
return {
|
||
|
|
"date": str(target_date),
|
||
|
|
"dateFormatted": f"{target_date.day} {target_date.strftime('%B')} {target_date.year}",
|
||
|
|
"daysUntil": days_until,
|
||
|
|
"description": f"بر اساس دمای فعلی، رطوبت خاک و اطلاعات {plant_name}. بازه بهینه برداشت محاسبه شده است.",
|
||
|
|
"optimalWindowStart": str(window_start),
|
||
|
|
"optimalWindowEnd": str(window_end),
|
||
|
|
}
|