import streamlit as st import pandas as pd import numpy as np from datetime import datetime, timedelta import faiss from groq import Groq import os from dotenv import load_dotenv # Import dotenv # Load environment variables from .env file load_dotenv() # Fetch the API key from the environment variable api_key = os.getenv("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") # Debugging line to verify the API key is loaded st.write("Loaded API Key:", api_key) if api_key: st.success("Groq API key loaded successfully.") client = Groq(api_key=api_key) else: st.warning("Groq API key is not set. Features requiring Groq API will be disabled.") client = None # App title st.title("Optimized EV Charging Scheduling in Microgrids") # Upload Excel file st.sidebar.header("Upload Data File") uploaded_file = st.sidebar.file_uploader("Upload Excel File", type=["xlsx", "xls"]) if uploaded_file: data = pd.ExcelFile(uploaded_file) try: # Load data from sheets historical_data = data.parse("Historical Data") renewable_forecast = data.parse("Renewable Energy Forecast") ev_profiles = data.parse("EV Charging Profiles") # Standardize column names historical_data.columns = historical_data.columns.str.strip() renewable_forecast.columns = renewable_forecast.columns.str.strip() ev_profiles.columns = ev_profiles.columns.str.strip() # Rename specific columns if necessary historical_data.rename(columns={"DATE": "Date", "date": "Date"}, inplace=True) renewable_forecast.rename(columns={"DATE": "Date", "date": "Date"}, inplace=True) ev_profiles.rename(columns={"DATE": "Date", "date": "Date"}, inplace=True) # Parameters rated_grid_capacity = 3500 # kW disconnect_threshold = 3200 # kW # Generate optimized schedule def optimize_schedule(historical, renewable, profiles): combined_data = pd.merge( historical, renewable, on=["Date", "Time"], how="inner" ) combined_data = pd.merge( combined_data, profiles, on=["Date"], how="inner" ) # Initialize schedule schedule = [] total_load = 0 for _, row in combined_data.iterrows(): ev_load = row["State of Charge (kWh)"] solar_load = row["Solar Load (kW)"] total_load += ev_load - solar_load if total_load > disconnect_threshold: schedule.append("DISCONNECT") elif total_load > rated_grid_capacity: schedule.append("V2G ENABLED") else: schedule.append("ALLOW") combined_data["Charging Action"] = schedule return combined_data # Generate schedule st.subheader("Optimized EV Charging Schedule") schedule_df = optimize_schedule(historical_data, renewable_forecast, ev_profiles) st.write(schedule_df) # Download optimized schedule st.download_button( "Download Schedule", data=schedule_df.to_csv(index=False), file_name="optimized_schedule.csv", mime="text/csv", ) # Simulate Groq API if client: st.subheader("Groq AI Insights") prompt = st.text_input("Ask Groq for insights (e.g., grid stability)") if prompt: try: response = client.chat.completions.create( messages=[{"role": "user", "content": prompt}], model="llama-3.3-70b-versatile", ) st.write(response.choices[0].message.content) except Exception as e: st.error(f"Error communicating with Groq API: {e}") else: st.warning("Groq API key is missing. Insights feature is disabled.") except Exception as e: st.error(f"Error parsing file: {e}") else: st.warning("Please upload a file to proceed.")