Auto-weight-logger2 / src /streamlit_app.py
Sanjayraju30's picture
Update src/streamlit_app.py
e7f3d63 verified
import streamlit as st
from PIL import Image, UnidentifiedImageError
import io
import uuid
import urllib.parse
from datetime import datetime
import pytz
from ocr_engine import extract_weight_from_image # This must return (weight, confidence)
# Setup
st.set_page_config(page_title="βš–οΈ Auto Weight Logger", layout="centered")
st.title("βš–οΈ Auto Weight Logger")
# Session state
if "camera_key" not in st.session_state:
st.session_state.camera_key = str(uuid.uuid4())
if "captured_time" not in st.session_state:
st.session_state.captured_time = ""
if "image_bytes" not in st.session_state:
st.session_state.image_bytes = None
# Function to get IST time
def get_current_ist_time():
ist = pytz.timezone("Asia/Kolkata")
return datetime.now(ist).strftime("%Y-%m-%d %I:%M:%S %p")
# Input selection
input_mode = st.radio("πŸ“Έ Select Input Method", ["Camera", "Upload"], horizontal=True)
# Retake button
if st.button("πŸ” Clear / Retake"):
st.session_state.camera_key = str(uuid.uuid4())
st.session_state.captured_time = ""
st.session_state.image_bytes = None
st.rerun()
# Capture or Upload
if input_mode == "Camera":
cam_photo = st.camera_input("πŸ“· Capture Weight Display", key=st.session_state.camera_key)
if cam_photo:
st.session_state.image_bytes = cam_photo.getvalue()
st.session_state.captured_time = get_current_ist_time()
elif input_mode == "Upload":
uploaded_file = st.file_uploader("πŸ“ Upload an image (JPG/PNG)", type=["jpg", "jpeg", "png"])
if uploaded_file:
st.session_state.image_bytes = uploaded_file.read()
st.session_state.captured_time = get_current_ist_time()
# Process image
if st.session_state.image_bytes:
try:
image = Image.open(io.BytesIO(st.session_state.image_bytes))
# Display bullet-point summary
st.markdown("### πŸ“‹ Captured Information")
st.markdown(f"""
- πŸ•’ **Captured At (IST):** `{st.session_state.captured_time}`
- πŸ–ΌοΈ **Snapshot Image:**
""")
st.image(image, use_column_width=True)
if len(st.session_state.image_bytes) > 5 * 1024 * 1024:
st.error("❌ Image too large (>5MB). Please upload a smaller image.")
st.stop()
with st.spinner("πŸ” Extracting weight using OCR..."):
weight, confidence = extract_weight_from_image(image)
if not weight or confidence < 80:
st.markdown(f"- ⚠️ **Low OCR Confidence:** `{int(confidence)}%` β€” Please retake or upload a clearer image.")
st.markdown("- βš–οΈ **Detected Weight:** Not reliable")
else:
st.markdown(f"- βš–οΈ **Detected Weight:** `{weight} g`")
st.markdown(f"- πŸ“Š **OCR Confidence:** `{int(confidence)}%`")
# Salesforce link
device_id = "BAL-001"
image_url = "" # Optional
salesforce_url = (
"https://autoweightlogger-dev-ed.my.salesforce-sites.com/"
f"weight_logger_page?WeightInput={urllib.parse.quote(str(weight))}"
f"&DeviceID={urllib.parse.quote(device_id)}&ImageURL={urllib.parse.quote(image_url)}"
)
st.markdown("### βœ… Send to Salesforce")
st.markdown(
f"""
<a href="{salesforce_url}" target="_blank">
<button style="
background-color: #4CAF50;
border: none;
color: white;
padding: 12px 24px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
border-radius: 8px;
cursor: pointer;
">πŸ“€ Log to Salesforce</button>
</a>
""", unsafe_allow_html=True
)
except UnidentifiedImageError:
st.error("❌ Unable to process image. Please upload a valid JPG or PNG.")
except Exception as e:
st.error("❌ Unexpected error occurred.")
st.exception(e)