import os, requests, joblib, logging, pandas as pd from fastapi import FastAPI, HTTPException from pydantic import BaseModel from dotenv import load_dotenv load_dotenv() logging.basicConfig(level=logging.INFO) logger = logging.getLogger("WaterAPI") app = FastAPI(title="Water Requirement API") CROP_MAP = {"BANANA": 0, "BEAN": 1, "CABBAGE": 2, "CITRUS": 3, "COTTON": 4, "MAIZE": 5, "MELON": 6, "MUSTARD": 7, "ONION": 8, "OTHER": 9, "POTATO": 10, "RICE": 11, "SOYABEAN": 12, "SUGARCANE": 13, "TOMATO": 14, "WHEAT": 15} SOIL_MAP = {"DRY": 0, "HUMID": 1, "WET": 2} WEATHER_MAP = {"SUNNY": 0, "RAINY": 1, "WINDY": 2, "NORMAL": 3} MODEL = None try: MODEL = joblib.load("svm_poly_model.pkl") logger.info("✅ SVM Model Loaded") except Exception as e: logger.error(f"❌ Model load fail: {e}") class WaterRequest(BaseModel): crop_type: str soil_type: str city: str capacity: float = 10.0 # m³/hour farm_size_hectares: float = 1.0 # hectares @app.post("/predict") def predict(req: WaterRequest): key = os.getenv("OPENWEATHERMAP_API_KEY") w = {"temp": 25, "cond": "NORMAL"} if key: try: r = requests.get(f"https://api.openweathermap.org/data/2.5/weather?q={req.city}&appid={key}&units=metric").json() w["temp"] = r['main']['temp'] main = r['weather'][0]['main'].lower() w["cond"] = "SUNNY" if 'clear' in main else "RAINY" if 'rain' in main else "WINDY" if 'wind' in main else "NORMAL" except: pass crop, soil = req.crop_type.upper(), req.soil_type.upper() if crop not in CROP_MAP: crop = "OTHER" if soil not in SOIL_MAP: soil = "DRY" if not MODEL: raise HTTPException(503, "Model unavailable") df = pd.DataFrame([{"CROP TYPE": CROP_MAP[crop], "SOIL TYPE": SOIL_MAP[soil], "TEMPERATURE": w["temp"], "WEATHER CONDITION": WEATHER_MAP[w["cond"]]}]) water_mm = float(MODEL.predict(df)[0]) # Model outputs in millimeters water_m3_per_sqm = water_mm / 1000 # Convert mm to m³/m² # Calculate total water volume: m³/m² × 10,000 m²/ha × farm_size_ha = total m³ total_water_m3 = water_m3_per_sqm * 10000 * req.farm_size_hectares # Calculate irrigation duration: m³ ÷ (m³/hour) × 60 minutes/hour irrigation_minutes = (total_water_m3 / req.capacity) * 60 return { "water_mm": round(water_mm, 2), "water_m3_sqm": round(water_m3_per_sqm, 4), "total_water_m3": round(total_water_m3, 2), "irrigation_minutes": round(irrigation_minutes, 2), "weather": w } if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8002)