tele_bot / water.py
PRC142004's picture
Upload 20 files
6a6337e verified
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)