Heating_mantles / app.py
Sirivennela's picture
Update app.py
c917457 verified
# 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()