Spaces:
Sleeping
Sleeping
# app.py | |
import gradio as gr | |
from datetime import datetime | |
import pytz | |
import os | |
from dotenv import load_dotenv | |
from simple_salesforce import Salesforce | |
from risk_model import predict_risk | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
# Load environment variables | |
load_dotenv() | |
# In-memory prediction history | |
history = [] | |
# Convert IST to UTC for Salesforce | |
def format_timestamp_ist_to_utc(timestamp_ist): | |
ist = pytz.timezone("Asia/Kolkata") | |
dt_ist = datetime.strptime(timestamp_ist, "%Y-%m-%d %H:%M:%S") | |
dt_ist = ist.localize(dt_ist) | |
dt_utc = dt_ist.astimezone(pytz.utc) | |
return dt_utc.strftime("%Y-%m-%dT%H:%M:%SZ") | |
# Insert prediction into Salesforce | |
def insert_to_salesforce(temp, duration, risk, timestamp_ist): | |
try: | |
sf = Salesforce( | |
username=os.getenv('SF_USERNAME'), | |
password=os.getenv('SF_PASSWORD'), | |
security_token=os.getenv('SF_SECURITY_TOKEN'), | |
domain='login' | |
) | |
formatted_timestamp = format_timestamp_ist_to_utc(timestamp_ist) | |
sf.Heating_Mantle_Log__c.create({ | |
'Max_Temperature__c': temp, | |
'Duration_Minutes__c': duration, | |
'Risk_Level__c': risk, | |
'Risk_Timestamp__c': formatted_timestamp | |
}) | |
print("β Salesforce record created.") | |
except Exception as e: | |
print(f"β Salesforce error: {e}") | |
# Main classification logic | |
def classify(temp, duration): | |
if temp <= 0 or duration <= 0: | |
return "β Invalid", "", "", "", pd.DataFrame(), plt.figure(), "" | |
risk_level, risk_score, alert_msg = predict_risk(temp, duration) | |
timestamp_ist = datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S") | |
# Log in Salesforce | |
insert_to_salesforce(temp, duration, risk_level, timestamp_ist) | |
# Save to history | |
history.append({ | |
"Temperature": temp, | |
"Duration": duration, | |
"Risk": risk_level, | |
"Score": risk_score, | |
"Timestamp": timestamp_ist | |
}) | |
df = pd.DataFrame(history) | |
# Risk trend plot | |
risk_map = {'Low': 1, 'Moderate': 2, 'High': 3} | |
df["Risk_Num"] = df["Risk"].map(risk_map) | |
fig, ax = plt.subplots(figsize=(6, 3)) | |
ax.plot(df["Timestamp"], df["Risk_Num"], marker="o", linestyle="-", color="crimson") | |
ax.set_ylim(0.5, 3.5) | |
ax.set_yticks([1, 2, 3]) | |
ax.set_yticklabels(['Low', 'Moderate', 'High']) | |
ax.set_title("Risk Trend Over Time") | |
ax.set_xlabel("Timestamp") | |
ax.set_ylabel("Risk Level") | |
ax.tick_params(axis='x', rotation=45) | |
plt.tight_layout() | |
df_display = df[["Temperature", "Duration", "Risk", "Score", "Timestamp"]] | |
summary_md = f""" | |
### π Prediction Summary | |
- **Temperature**: {temp} Β°C | |
- **Duration**: {duration} min | |
- **Risk Level**: {risk_level} | |
- **Risk Score**: {risk_score}% | |
- **Alert**: {alert_msg} | |
- **Timestamp**: {timestamp_ist} IST | |
""" | |
return risk_level, f"{risk_score}%", alert_msg, timestamp_ist + " IST", df_display, fig, summary_md | |
# Reset function | |
def reset(): | |
return 100, 30, "", "", "", "", pd.DataFrame(), plt.figure(), "" | |
# Gradio UI | |
with gr.Blocks() as demo: | |
gr.Markdown("## π₯ Heating Mantle Safety Risk Predictor") | |
reset_btn = gr.Button("π Reset Inputs") | |
with gr.Row(): | |
temp = gr.Number(label="Max Temperature (Β°C)", value=100) | |
duration = gr.Number(label="Duration (min)", value=30) | |
predict_btn = gr.Button("π Predict") | |
with gr.Row(): | |
risk_out = gr.Textbox(label="Risk Level") | |
score_out = gr.Textbox(label="Risk Score") | |
alert_out = gr.Textbox(label="π¨ Alert Message") | |
time_out = gr.Textbox(label="Timestamp (IST)") | |
df_display = gr.Dataframe(headers=["Temperature", "Duration", "Risk", "Score", "Timestamp"], | |
label="π Prediction History") | |
chart = gr.Plot(label="π Risk Trend Chart") | |
summary = gr.Markdown() | |
# Button bindings | |
predict_btn.click(fn=classify, | |
inputs=[temp, duration], | |
outputs=[risk_out, score_out, alert_out, time_out, df_display, chart, summary]) | |
reset_btn.click(fn=reset, | |
outputs=[temp, duration, risk_out, score_out, alert_out, time_out, df_display, chart, summary]) | |
demo.launch() | |