File size: 4,792 Bytes
b555fe1
 
a851214
372b3f3
0cdc019
7a4002e
23fc541
46545a4
0cdc019
618f85b
46545a4
c565f89
27cc353
46545a4
0cdc019
 
 
618f85b
0cdc019
 
46545a4
 
372b3f3
a851214
 
 
 
 
b555fe1
a851214
27cc353
46545a4
b555fe1
46545a4
b555fe1
b0848d8
2d29e28
b0848d8
 
 
46545a4
b0848d8
 
 
46545a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d29e28
5aee751
54c70ee
b555fe1
822b684
b555fe1
46545a4
d36a0d6
46545a4
 
 
e799f84
46545a4
e799f84
46545a4
 
 
 
 
 
 
7a4002e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b555fe1
46545a4
b555fe1
46545a4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import streamlit as st
import pandas as pd
import google.generativeai as genai
import os
from dotenv import load_dotenv
import plotly.graph_objects as go

# Load environment variables from .env file
load_dotenv()

# Set page configuration first
st.set_page_config(page_title="AI-based Solar Project Estimation Tool", layout="centered")

# Initialize Gemini with the API key loaded from the .env file
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.")

# Use better model: gemini-1.5-pro
model = genai.GenerativeModel("gemini-1.5-pro")

# 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()

# UI - Form for user input
st.title("AI-based Solar Project Estimation Tool")
st.write("### Enter Your Details Below:")

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)
    electricity_bill = st.number_input("Enter your monthly electricity bill (₹)", min_value=0)
    
    submitted = st.form_submit_button("Get Estimate")

# Build the clean prompt for Gemini
def build_prompt(location, roof_size, electricity_bill, ghi, solar_cost_per_kw):
    prompt = f"""
You are a solar project estimator tool. Based on the following details, calculate and return only the values without any extra description:

Location: {location}
Roof size: {roof_size} sq meters
Monthly electricity bill: ₹{electricity_bill}
Average GHI: {ghi} kWh/m²/day
Solar system cost per kW: ₹{solar_cost_per_kw}

Respond strictly in this format (do not add anything extra):

Estimated solar system size in kW: <value>
Estimated daily solar output in kWh: <value>
Total system cost in ₹: <value>
Monthly savings in ₹: <value>
Payback period in years: <value>
"""
    return prompt

# Generate the solar project estimate via Gemini
if submitted and location and roof_size > 0 and electricity_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 (₹)']
        
        prompt_text = build_prompt(location, roof_size, electricity_bill, ghi, solar_cost_per_kw)
        
        # Call Gemini API
        with st.spinner("Generating solar estimate with Gemini..."):
            response = model.generate_content(prompt_text)
        
        # Display clean structured output
        st.subheader("Solar Project Estimate")
        
        estimated_data = response.text.strip().split("\n")
        
        for point in estimated_data:
            if ":" in point:
                key, value = point.split(":", 1)
                st.write(f"**{key.strip()}**: {value.strip()}")
        
            # Variables to store extracted values for graph
            system_size_kw = None
            monthly_savings_rs = None

            for point in estimated_data:
                if ":" in point:
                    try:
                        key, value = point.split(":", 1)
                        key = key.strip()
                        value = value.strip()

                        st.write(f"**{key}**: {value}")

                        if "Estimated solar system size" in key:
                            system_size_kw = float(value.split()[0])
                        if "Monthly savings" in key:
                            monthly_savings_rs = float(value.split()[0])
                    except ValueError:
                        st.warning("There was an issue processing the response.")

            # Show Graph if available
            if system_size_kw is not None and monthly_savings_rs is not None:
                st.subheader("📊 Visual Summary")
                
                fig = go.Figure(data=[
                    go.Bar(name='Estimate',
                           x=['Solar System Size (kW)', 'Monthly Savings (₹)'],
                           y=[system_size_kw, monthly_savings_rs],
                           marker_color=['#636EFA', '#00CC96'])
                ])
                fig.update_layout(title="Solar Project Estimates", yaxis_title="Values", xaxis_title="Parameters")
                st.plotly_chart(fig)
            
    else:
        st.error("Sorry, the location entered does not match any available data.")
else:
    st.warning("Please fill out all fields to see your solar project estimate.")