import streamlit as st import pandas as pd import google.generativeai as genai import os from dotenv import load_dotenv # Load environment variables load_dotenv() # Set page configuration st.set_page_config(page_title="AI-based Solar Project Estimation Tool", layout="centered") # Initialize Gemini api_key = os.getenv("GOOGLE_API_KEY") if api_key: genai.configure(api_key=api_key) else: st.error("API key is missing. Please set the GOOGLE_API_KEY environment variable.") model = genai.GenerativeModel("gemini-1.5-flash") # Load solar data @st.cache_data def load_data(): df = pd.read_csv('https://huggingface.co/spaces/MLDeveloper/AI_based_Solar_Project_Estimation_Tool/resolve/main/solar_data_india_2024.csv') return df df = load_data() # Solar Calculation Function (not relying on Gemini for calculation) def calculate_solar_estimate(roof_size, monthly_bill, electricity_price, ghi, cost_per_kw): daily_consumption_inr = monthly_bill / 30 daily_consumption_kwh = daily_consumption_inr / electricity_price # Assume system size based on consumption estimated_system_size_kw = 3 # Fixed for now as realistic estimate peak_sun_hours = ghi # Use GHI as sun hours (approximation) daily_solar_output_kwh = estimated_system_size_kw * peak_sun_hours * 0.75 # considering derating factor total_system_cost = estimated_system_size_kw * cost_per_kw monthly_generation_kwh = daily_solar_output_kwh * 30 monthly_savings_inr = monthly_generation_kwh * electricity_price annual_savings_inr = monthly_savings_inr * 12 payback_period_years = total_system_cost / annual_savings_inr return { "Estimated solar system size in kW": round(estimated_system_size_kw, 2), "Estimated daily solar output in kWh": round(daily_solar_output_kwh, 2), "Total system cost in ₹": int(total_system_cost), "Monthly savings in ₹": int(monthly_savings_inr), "Payback period in years": round(payback_period_years, 2) } # UI - Form st.title("AI-based Solar Project Estimation Tool") st.write("### Enter Your Details:") with st.form("solar_form"): state_options = df['State'].dropna().unique() location = st.selectbox("Select your State", options=sorted(state_options)) roof_size = st.number_input("Enter your roof size (in sq meters)", min_value=1) monthly_bill = st.number_input("Enter your monthly electricity bill (₹)", min_value=0) submitted = st.form_submit_button("Get Estimate") if submitted and location and roof_size > 0 and monthly_bill >= 0: state_data = df[df['State'].str.contains(location, case=False)].iloc[0] if state_data is not None: ghi = state_data['Avg_GHI (kWh/m²/day)'] solar_cost_per_kw = state_data['Solar_Cost_per_kW (₹)'] electricity_price = 8 # Assume ₹8/kWh # Calculate estimates estimates = calculate_solar_estimate(roof_size, monthly_bill, electricity_price, ghi, solar_cost_per_kw) # Build clean prompt for Gemini to verify the calculation prompt = f""" ONLY output these 5 points based on inputs: 1. Estimated solar system size in kW 2. Estimated daily solar output in kWh 3. Total system cost in ₹ 4. Monthly savings in ₹ 5. Payback period in years Roof size = {roof_size} sq meters Monthly bill = ₹{monthly_bill} GHI = {ghi} kWh/m²/day Solar system cost per kW = ₹{solar_cost_per_kw} Use no description. Only numeric values clearly. """ # Call Gemini API (just to double-check/validate if you want) with st.spinner("Generating final estimate..."): gemini_response = model.generate_content(prompt) final_response = gemini_response.text.strip() # Display calculated values directly (without trusting Gemini text output) st.subheader("Solar Project Estimate") for key, value in estimates.items(): st.write(f"{key}: {value}") else: st.error("Location data not found. Please select a valid state.") else: st.warning("Please fill all the fields.")