CropAI / backend /weather_shock.py
bapi143's picture
Deploy CropAI Backend
5fd7795
Raw History Blame Contribute Delete
12.3 kB
# -*- coding: utf-8 -*-
"""
CropAI Extreme Weather Shock & Crop Thermal Protection Engine
Predicts and delivers urgent prophylactic intervention protocols for:
1. Nocturnal Ground Radiation Frost (पाला) - Stefan-Boltzmann radiative cooling (T <= 2.0°C)
2. Terminal Heatwave Shock (लू) - Reproductive & grain-shrivel thermal stress (T >= 38.0°C)
Calibrated to Indian knapsack sprayers (16L tank) with emergency bio-chemical recipes.
"""
from typing import Dict, Any, Optional, List
import logging
import math
logger = logging.getLogger("cropai.weather_shock")
# =========================================================================
# Thermal Vulnerability Crop Stage Matrix
# =========================================================================
THERMAL_VULNERABILITY_MATRIX: Dict[str, Dict[str, Any]] = {
"Potato": {
"crop_name": "Potato (आलू)",
"frost_critical_temp_c": 2.5,
"heat_critical_temp_c": 32.0,
"vulnerable_stage": "Tuber Initiation & Foliar Canopy Growth",
"frost_damage_description": "Frost crystallizes intracellular water, bursting cell walls and turning foliage black overnight.",
"heat_damage_description": "Excess heat halts tuberization and causes internal brown spot and heat necrosis."
},
"Tomato": {
"crop_name": "Tomato (टमाटर)",
"frost_critical_temp_c": 2.0,
"heat_critical_temp_c": 35.0,
"vulnerable_stage": "Flowering & Fruit Setting (फूल एवं फल विकास)",
"frost_damage_description": "Terminal flower drop, fruit blistering, and rapid stem collapse.",
"heat_damage_description": "High temperature causes severe flower drop, blossom end rot, and sunscald."
},
"Wheat": {
"crop_name": "Wheat (गेहूं)",
"frost_critical_temp_c": 0.5,
"heat_critical_temp_c": 36.0,
"vulnerable_stage": "Flowering & Dough/Grain Filling (दुग्ध व दाना भराव)",
"frost_damage_description": "Earhead sterility, floret damage, and tip chlorosis.",
"heat_damage_description": "Terminal heat shock forces premature drying, resulting in shriveled, lightweight grains (दाना सिकुड़ना)."
},
"Mustard": {
"crop_name": "Mustard (सरसों)",
"frost_critical_temp_c": 2.0,
"heat_critical_temp_c": 34.0,
"vulnerable_stage": "Siliqua / Pod Formation (फलियां बनने की अवस्था)",
"frost_damage_description": "Pod freezing, seed abortion, and white blistered pods.",
"heat_damage_description": "Early pod shattering and reduced oil content."
},
"Chickpea": {
"crop_name": "Gram / Chickpea (चना)",
"frost_critical_temp_c": 2.0,
"heat_critical_temp_c": 35.0,
"vulnerable_stage": "Flowering & Pod Filling (फूल एवं दाना भराव)",
"frost_damage_description": "Flower shedding and hollow unfilled pods.",
"heat_damage_description": "Forced maturity and pod borer resurgence."
}
}
def evaluate_thermal_weather_shock(
crop: str = "Potato",
ambient_temp_c: float = 4.0,
min_predicted_temp_c: float = 1.5,
max_predicted_temp_c: float = 24.0,
relative_humidity: float = 55.0,
wind_speed_kmh: float = 3.0,
cloud_cover_pct: float = 5.0,
growth_stage: Optional[str] = None
) -> Dict[str, Any]:
"""
Evaluates microclimate thermal extremes:
1. Ground Radiation Frost (पाला) Risk:
Clear skies (cloud < 20%), calm wind (< 5 km/h), min temp <= 2.5°C.
2. Terminal Heatwave (लू) Risk:
Max temp >= 36.0°C - 38.0°C with low humidity.
"""
crop_info = THERMAL_VULNERABILITY_MATRIX.get(crop, THERMAL_VULNERABILITY_MATRIX["Potato"])
frost_thresh = crop_info["frost_critical_temp_c"]
heat_thresh = crop_info["heat_critical_temp_c"]
# =====================================================================
# 1. Nocturnal Radiation Frost Modeling
# =====================================================================
# Stefan-Boltzmann clear-sky radiative cooling factor
# Clear night with low humidity radiates heat rapidly; canopy is typically 1.5°C to 2.5°C colder than air at 2m!
canopy_night_offset = 0.0
if cloud_cover_pct < 25.0 and wind_speed_kmh < 8.0:
# Radiation inversion condition
canopy_night_offset = 2.0 * (1.0 - (cloud_cover_pct / 100.0)) * max(0.4, 1.0 - (relative_humidity / 100.0))
estimated_canopy_min_c = round(min_predicted_temp_c - canopy_night_offset, 1)
frost_risk = False
frost_severity = "SAFE"
frost_alert_hi = None
frost_alert_en = None
frost_recipe = None
if estimated_canopy_min_c <= frost_thresh:
frost_risk = True
if estimated_canopy_min_c <= 0.5:
frost_severity = "CRITICAL_FREEZE_SIREN"
frost_alert_hi = f"🚨 आपातकालीन पाला सायरन! आज रात खेत की सतह का तापमान {estimated_canopy_min_c}°C तक गिरने की आशंका है। पाले से {crop_info['crop_name']} पूरी तरह काली पड़ सकती है!"
frost_alert_en = f"EMERGENCY FROST SIREN: Nocturnal surface temperature projected to reach {estimated_canopy_min_c}°C. Severe freeze necrosis imminent."
else:
frost_severity = "HIGH_FROST_WARNING"
frost_alert_hi = f"⚠️ पाला चेतावनी: आज रात तापमान {estimated_canopy_min_c}°C तक गिर सकता है। फसल सुरक्षा उपाय तुरंत करें।"
frost_alert_en = f"FROST WARNING: Canopy temp dropping to {estimated_canopy_min_c}°C tonight. Deploy protective measures."
frost_recipe = {
"emergency_actions": [
{
"action_hi": "खेत की मेड़ों पर धुआं करना (Smoke Smudge Barrier)",
"action_en": "Create border smoke smudge blanket",
"details_hi": "रात 2:00 बजे से सुबह 6:00 बजे तक खेत की उत्तर-पश्चिम दिशा में गीली घास व पराली जलाकर धुआं करें। धुआं चादर बनकर तापमान को 2°C तक बढ़ा देता है।"
},
{
"action_hi": "रात्रि हल्की सिंचाई (Light Night Irrigation)",
"action_en": "Light midnight flood irrigation",
"details_hi": "शाम या रात में खेत में हल्का पानी चलाएं। पानी की विशिष्ट ऊष्मा (Specific Heat) अधिक होने से खेत की मिट्टी का तापमान शून्य से नीचे नहीं गिरता।"
},
{
"action_hi": "घुलनशील सल्फर का स्प्रे (Soluble Sulphur Osmoprotectant)",
"action_en": "Foliar soluble sulphur spray",
"details_hi": "16 लीटर के पंप में 16 ग्राम घुलनशील गंधक (Sulphur 80% WDG) या 30 ग्राम ग्लूकोज घोलकर शाम 4 बजे छिड़कें। यह कोशिका रस को जमने से रोकता है।"
}
],
"knapsack_dose": "16g Sulphur 80% WDG per 16L spray tank"
}
# =====================================================================
# 2. Terminal Heatwave Modeling (लू)
# =====================================================================
heat_risk = False
heat_severity = "SAFE"
heat_alert_hi = None
heat_alert_en = None
heat_recipe = None
if max_predicted_temp_c >= heat_thresh:
heat_risk = True
if max_predicted_temp_c >= 40.0:
heat_severity = "CRITICAL_HEATWAVE_SIREN"
heat_alert_hi = f"🔥 प्रचंड लू चेतावनी! तापमान {max_predicted_temp_c}°C तक पहुंचेगा। {crop_info['crop_name']} में फूल और दाना झुलसने (दाना सिकुड़ना) का खतरा है!"
heat_alert_en = f"CRITICAL HEATWAVE SIREN: Peak temperature {max_predicted_temp_c}°C exceeds lethal threshold ({heat_thresh}°C). Severe flower/grain desiccation risk."
else:
heat_severity = "MODERATE_HEAT_STRESS"
heat_alert_hi = f"☀️ गर्मी का तनाव: तापमान {max_predicted_temp_c}°C रहने से परागकण सूखने का खतरा है।"
heat_alert_en = f"HEAT STRESS ALERT: Maximum temp {max_predicted_temp_c}°C approaching critical threshold."
heat_recipe = {
"emergency_actions": [
{
"action_hi": "पोटैशियम नाइट्रेट स्प्रे (Potassium Nitrate 13:0:45)",
"action_en": "1% Potassium Nitrate Osmoprotectant Spray",
"details_hi": "16 लीटर के पंप में 160 ग्राम पोटैशियम नाइट्रेट (KNO3 13:0:45) घोलकर सुबह के समय स्प्रे करें। यह पौधों के रंध्रों (Stomata) को नियंत्रित कर पानी की बर्बादी रोकता है।"
},
{
"action_hi": "दोपहर की हल्की फव्वारा सिंचाई (Micro-Sprinkler Mist)",
"action_en": "Canopy cooling micro-sprinklers",
"details_hi": "दोपहर 12 से 2 बजे के बीच 15 मिनट फव्वारा चलाएं ताकि खेत का तापमान तुरंत 3°C से 4°C ठंडा हो जाए।"
}
],
"knapsack_dose": "160g Potassium Nitrate (13:0:45) in 16L spray tank"
}
# Synthesize unified assessment
primary_threat = "NONE"
if frost_risk and heat_risk:
primary_threat = "DIURNAL_EXTREME_FLUCTUATION"
elif frost_risk:
primary_threat = "FROST_RADIATION_COLD"
elif heat_risk:
primary_threat = "TERMINAL_HEATWAVE_SHOCK"
return {
"status": "success",
"crop": crop_info["crop_name"],
"vulnerable_stage": growth_stage or crop_info["vulnerable_stage"],
"primary_threat": primary_threat,
"microclimate_snapshot": {
"ambient_temp_c": ambient_temp_c,
"min_predicted_temp_c": min_predicted_temp_c,
"estimated_canopy_surface_min_c": estimated_canopy_min_c,
"max_predicted_temp_c": max_predicted_temp_c,
"relative_humidity_pct": relative_humidity,
"wind_speed_kmh": wind_speed_kmh,
"cloud_cover_pct": cloud_cover_pct
},
"frost_assessment": {
"risk_detected": frost_risk,
"severity": frost_severity,
"threshold_critical_c": frost_thresh,
"alert_hi": frost_alert_hi,
"alert_en": frost_alert_en,
"damage_mechanism": crop_info["frost_damage_description"],
"intervention": frost_recipe
},
"heatwave_assessment": {
"risk_detected": heat_risk,
"severity": heat_severity,
"threshold_critical_c": heat_thresh,
"alert_hi": heat_alert_hi,
"alert_en": heat_alert_en,
"damage_mechanism": crop_info["heat_damage_description"],
"intervention": heat_recipe
}
}