engralimalik's picture
Update app.py
18de9e7 verified
import streamlit as st
import numpy as np
from io import BytesIO
# Function to calculate load and solar panel requirement
def calculate_requirements(equipment, system_type):
total_load = 0
# Calculate total load based on counts and wattage
for item, values in equipment.items():
total_load += values['wattage'] * values['count'] # Total load in watts
total_load_kw = total_load / 1000 # Convert watts to kilowatts
# Solar panel estimation (assume 300W per panel for On-Grid)
panel_wattage = 550 # Wattage of a single solar panel
panels_required = np.ceil(total_load_kw / (panel_wattage / 1000)) # Number of panels required
# Battery capacity estimation (for Off-Grid and Hybrid)
if system_type in ["Off-Grid", "Hybrid"]:
battery_capacity = total_load_kw * 6 # Assuming 6 hours of backup for Off-Grid/Hybrid
else:
battery_capacity = 0 # No battery needed for On-Grid
# Inverter sizing (assumed 1.2 times the total load for safety)
inverter_capacity = total_load_kw * 1.2
# DC cable sizing (estimate based on total load and distance)
dc_cable_size = 10 # Dummy value, in meters
# Average daily electricity production from solar panels
avg_daily_production = panels_required * panel_wattage * 5 / 1000 # Assuming 5 hours of sunlight per day
return panels_required, battery_capacity, inverter_capacity, dc_cable_size, avg_daily_production
# App UI
st.title("Solar System Installation Estimator")
st.markdown("""
**Welcome to the Solar System Estimator!**
Use this app to estimate the requirements for your solar system based on your home appliances and preferences.
""")
# Collecting user input
st.sidebar.header("Enter your details")
num_stories = st.sidebar.selectbox("Number of Stories", ["Single Story", "Two Story"])
system_type = st.sidebar.selectbox("System Type", ["On-Grid", "Off-Grid", "Hybrid"])
# Default wattage values and adjustable wattage inputs
equipment = {
"Fan": {'wattage': 80, 'count': st.sidebar.number_input("Number of Fans", min_value=0, value=2), 'adjustable_wattage': st.sidebar.slider("Fan Wattage (W)", 40, 150, 80)},
"AC": {'wattage': 1500, 'count': st.sidebar.number_input("Number of ACs", min_value=0, value=1), 'adjustable_wattage': st.sidebar.slider("AC Wattage (W)", 1000, 2500, 1500)},
"Fridge": {'wattage': 200, 'count': st.sidebar.number_input("Number of Fridges", min_value=0, value=1), 'adjustable_wattage': st.sidebar.slider("Fridge Wattage (W)", 100, 400, 200)},
"Tube Lights": {'wattage': 40, 'count': st.sidebar.number_input("Number of Tube Lights", min_value=0, value=5), 'adjustable_wattage': st.sidebar.slider("Tube Light Wattage (W)", 20, 100, 40)},
"Iron": {'wattage': 1200, 'count': st.sidebar.number_input("Number of Irons", min_value=0, value=1), 'adjustable_wattage': st.sidebar.slider("Iron Wattage (W)", 800, 2000, 1200)},
"Electric Motor Pump": {'wattage': 500, 'count': st.sidebar.number_input("Number of Electric Motor Pumps", min_value=0, value=1), 'adjustable_wattage': st.sidebar.slider("Motor Pump Wattage (W)", 100, 1000, 500)},
"Energy Saver": {'wattage': 15, 'count': st.sidebar.number_input("Number of Energy Savers", min_value=0, value=5), 'adjustable_wattage': st.sidebar.slider("Energy Saver Wattage (W)", 10, 40, 15)},
"Electric Geyser": {'wattage': 3000, 'count': st.sidebar.number_input("Number of Electric Geysers", min_value=0, value=1), 'adjustable_wattage': st.sidebar.slider("Geyser Wattage (W)", 1000, 5000, 3000)},
}
# Adjust wattage of each appliance based on user input
for appliance, values in equipment.items():
values['wattage'] = values['adjustable_wattage']
# Button to calculate
if st.sidebar.button("Estimate Solar Requirements"):
panels, battery, inverter, cable, avg_daily_production = calculate_requirements(equipment, system_type)
# Display results
st.subheader(f"Estimated Solar System Requirements ({system_type} Solution)")
# Display load summary
st.write(f"Total Load: {sum([values['wattage'] * values['count'] for values in equipment.values()])} W")
# List the components required for installation
st.write("### Required Components for Solar Installation:")
st.write(f"- **Solar Panels**: {panels} panels (Each panel is 300W)")
if system_type != "On-Grid":
st.write(f"- **Battery Capacity**: {battery} kWh (for {system_type} system)")
else:
st.write("- **Battery**: No battery required for On-Grid system")
st.write(f"- **Inverter Capacity**: {inverter:.2f} kW")
st.write(f"- **DC Cable**: {cable} meters (estimated length)")
# Average daily electricity production (kWh)
st.write(f"**Average Daily Electricity Production**: {avg_daily_production:.2f} kWh")
# Display appliance summary
st.write("### Appliance Summary:")
for appliance, values in equipment.items():
st.write(f"- {values['count']} {appliance}(s) with {values['wattage']}W each")
# Prepare a quotation string
quotation = f"""
Solar System Quotation
------------------------
System Type: {system_type}
Number of Stories: {num_stories}
Total Load: {sum([values['wattage'] * values['count'] for values in equipment.values()])} W
Solar Panels Required: {panels} panels (550W each)
Battery Capacity: {battery} kWh (if Off-Grid/Hybrid)
Inverter Capacity: {inverter:.2f} kW
DC Cable Length: {cable} meters
Average Daily Production: {avg_daily_production:.2f} kWh
Appliance Details:
-------------------
"""
for appliance, values in equipment.items():
quotation += f"{values['count']} {appliance}(s) with {values['wattage']}W each\n"
# Convert the string quotation to bytes
quotation_bytes = quotation.encode('utf-8')
# Provide the download button
st.download_button(
label="Download Quotation",
data=quotation_bytes,
file_name="solar_quotation.txt",
mime="text/plain"
)
# About Section
st.sidebar.markdown("""
## How This App Works:
- The app asks for the number of each device (Fans, ACs, Lights, etc.) and their wattage to estimate load.
- Based on your inputs, it suggests the number of solar panels, battery capacity, inverter, and DC cable requirement.
- Three system types are available: **On-Grid**, **Off-Grid**, and **Hybrid**.
- The app takes into account whether your building is a single-story or two-story structure for more accurate recommendations.
""")