|
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 |
|
|
|
|
|
st.set_page_config(page_title="βοΈ Auto Weight Logger", layout="centered") |
|
st.title("βοΈ Auto Weight Logger") |
|
|
|
|
|
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 |
|
|
|
|
|
def get_current_ist_time(): |
|
ist = pytz.timezone("Asia/Kolkata") |
|
return datetime.now(ist).strftime("%Y-%m-%d %I:%M:%S %p") |
|
|
|
|
|
input_mode = st.radio("πΈ Select Input Method", ["Camera", "Upload"], horizontal=True) |
|
|
|
|
|
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() |
|
|
|
|
|
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() |
|
|
|
|
|
if st.session_state.image_bytes: |
|
try: |
|
image = Image.open(io.BytesIO(st.session_state.image_bytes)) |
|
|
|
|
|
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)}%`") |
|
|
|
|
|
device_id = "BAL-001" |
|
image_url = "" |
|
|
|
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) |
|
|