File size: 6,874 Bytes
b555fe1
 
a851214
372b3f3
0cdc019
7a4002e
23fc541
1854cda
46545a4
0cdc019
618f85b
eaee169
fec7bb9
27cc353
eaee169
0cdc019
 
 
618f85b
0cdc019
 
eaee169
46545a4
372b3f3
a851214
 
 
 
 
b555fe1
a851214
27cc353
eaee169
 
 
 
46545a4
eaee169
46545a4
 
 
 
 
 
 
 
 
 
 
eaee169
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46545a4
 
 
eaee169
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46545a4
eaee169
2d29e28
5aee751
54c70ee
b555fe1
822b684
eaee169
 
d36a0d6
46545a4
 
 
e799f84
eaee169
 
46545a4
 
 
1854cda
 
 
233f1db
1854cda
46545a4
 
1854cda
 
 
 
 
 
 
eaee169
1854cda
 
 
 
 
233f1db
 
1854cda
 
eaee169
1854cda
 
233f1db
1854cda
233f1db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1854cda
 
b555fe1
46545a4
b555fe1
eaee169
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
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
st.set_page_config(page_title="☀️AI-based Solar Project Estimation Tool", layout="centered")

# Initialize Gemini with the API key
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 Gemini-1.5-Pro model
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()

# Build prompt for Gemini
def build_prompt(location, project_type, roof_size=None, desired_kwh=None, electricity_bill=None, ghi=None, solar_cost_per_kw=None):
    if project_type == "Rooftop Solar":
        prompt = f"""
You are a solar project estimator tool. Based on the following details, calculate and return only the values without any extra description:
Project Type: Rooftop Solar
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>
"""
    else:  # Ground Mount Solar
        prompt = f"""
You are a solar project estimator tool. Based on the following details, calculate and return only the values without any extra description:
Project Type: Ground Mount Solar
Location: {location}
Desired monthly solar production: {desired_kwh} kWh
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):
Required 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

# 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))
    
    project_type = st.radio(
        "Select Solar Project Type",
        options=["Rooftop Solar", "Ground Mount Solar"]
    )

    if project_type == "Rooftop Solar":
        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)
        desired_kwh = None
    else:
        desired_kwh = st.number_input("Enter desired monthly solar electricity production (kWh)", min_value=1)
        electricity_bill = st.number_input("Enter your monthly electricity bill (₹)", min_value=0)
        roof_size = None

    submitted = st.form_submit_button("Get Estimate")

# Generate the solar project estimate via Gemini
if submitted and location:
    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, project_type, roof_size=roof_size, desired_kwh=desired_kwh, electricity_bill=electricity_bill, ghi=ghi, solar_cost_per_kw=solar_cost_per_kw)
        
        # Call Gemini API
        with st.spinner("Generating solar estimate with Gemini..."):
            response = model.generate_content(prompt_text)
        
        # Display structured output
        st.subheader("🔹 Solar Project Estimate")
        
        estimated_data = response.text.strip().split("\n")
        
        system_size_kw = None
        monthly_savings_rs = None
        total_system_cost = None
        payback_period_years = 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 or "Required solar system size" in key:
                        system_size_kw = float(value.split()[0])
                    if "Monthly savings" in key:
                        monthly_savings_rs = float(value.split()[0])
                    if "Total system cost" in key:
                        total_system_cost = float(value.split()[0])
                    if "Payback period" in key:
                        payback_period_years = float(value.split()[0])

                except ValueError:
                    st.warning("There was an issue processing the response. Please try again.")

        # Show Graph if values are available
        if total_system_cost is not None and monthly_savings_rs is not None and payback_period_years is not None:
            st.subheader("📊 Visual Summary")

            # Prepare data for Area Chart
            months = int(payback_period_years * 12)
            savings_cumulative = [monthly_savings_rs * month for month in range(1, months + 1)]

            fig = go.Figure()

            # Area plot
            fig.add_trace(go.Scatter(
                x=list(range(1, months + 1)),
                y=savings_cumulative,
                mode='lines',
                fill='tozeroy',
                name='Cumulative Savings (₹)',
                line=dict(color='#00CC96')
            ))

            # Line for Total Cost
            fig.add_trace(go.Scatter(
                x=[1, months],
                y=[total_system_cost, total_system_cost],
                mode='lines',
                name='Total System Cost (₹)',
                line=dict(color='red', dash='dash')
            ))

            fig.update_layout(
                title="Cumulative Savings vs Total System Cost Over Time",
                xaxis_title="Months",
                yaxis_title="Amount (₹)",
                legend_title="Legend",
                template="plotly_white"
            )

            st.plotly_chart(fig, use_container_width=True, key="solar_graph")

    else:
        st.error("Sorry, the location entered does not match any available data.")
else:
    st.info("Please fill out all fields to get your solar project estimate.")