File size: 4,765 Bytes
0507081
 
 
 
1d1e3da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a481416
0507081
 
1d1e3da
 
0507081
1d1e3da
0507081
1d1e3da
770a6ee
0c65757
1d1e3da
 
 
0c65757
1d1e3da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
06308c8
0507081
 
1d1e3da
06308c8
0507081
 
 
06308c8
0507081
 
 
06308c8
1d1e3da
 
 
 
0507081
1d1e3da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0c65757
1d1e3da
06308c8
0507081
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import gradio as gr
from datetime import datetime
import pytz
from ocr_engine import extract_weight_from_image
from PIL import Image
import io
import base64
from simple_salesforce import Salesforce
import logging

# Set up logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Salesforce configuration (replace with your credentials)
SF_USERNAME = "your_salesforce_username"
SF_PASSWORD = "your_salesforce_password"
SF_SECURITY_TOKEN = "your_salesforce_security_token"
SF_DOMAIN = "login"  # or "test" for sandbox

def connect_to_salesforce():
    try:
        sf = Salesforce(username=SF_USERNAME, password=SF_PASSWORD, security_token=SF_SECURITY_TOKEN, domain=SF_DOMAIN)
        logging.info("Connected to Salesforce successfully")
        return sf
    except Exception as e:
        logging.error(f"Salesforce connection failed: {str(e)}")
        return None

def resize_image(img, max_size_mb=5):
    """Resize image to ensure size < 5MB while preserving quality."""
    try:
        img_bytes = io.BytesIO()
        img.save(img_bytes, format="PNG")
        size_mb = len(img_bytes.getvalue()) / (1024 * 1024)
        if size_mb <= max_size_mb:
            return img, img_bytes.getvalue()
        
        scale = 0.9
        while size_mb > max_size_mb:
            w, h = img.size
            img = img.resize((int(w * scale), int(h * scale)), Image.Resampling.LANCZOS)
            img_bytes = io.BytesIO()
            img.save(img_bytes, format="PNG")
            size_mb = len(img_bytes.getvalue()) / (1024 * 1024)
            scale *= 0.9
        logging.info(f"Resized image to {size_mb:.2f} MB")
        return img, img_bytes.getvalue()
    except Exception as e:
        logging.error(f"Image resizing failed: {str(e)}")
        return img, None

def process_image(img):
    if img is None:
        return "No image uploaded", None, None, None, gr.update(visible=False), gr.update(visible=False)
    
    ist_time = datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%d-%m-%Y %I:%M:%S %p")
    img, img_bytes = resize_image(img)
    weight, confidence = extract_weight_from_image(img)
    
    if weight == "Not detected" or confidence < 70:
        return f"{weight} (Confidence: {confidence:.2f}%)", ist_time, img, None, gr.update(visible=True), gr.update(visible=False)
    
    img_buffer = io.BytesIO(img_bytes)
    img_base64 = base64.b64encode(img_buffer.getvalue()).decode()
    return f"{weight} kg (Confidence: {confidence:.2f}%)", ist_time, img, img_base64, gr.update(visible=True), gr.update(visible=True)

def save_to_salesforce(weight_text, img_base64):
    try:
        sf = connect_to_salesforce()
        if sf is None:
            return "Failed to connect to Salesforce"
        
        weight = float(weight_text.split(" ")[0])
        ist_time = datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S")
        
        record = {
            "Name": f"Weight_Log_{ist_time}",
            "Weight__c": weight,
            "Timestamp__c": ist_time,
            "Image__c": img_base64
        }
        result = sf.Weight_Log__c.create(record)
        logging.info(f"Salesforce record created: {result}")
        return "Successfully saved to Salesforce"
    except Exception as e:
        logging.error(f"Salesforce save failed: {str(e)}")
        return f"Failed to save to Salesforce: {str(e)}"

with gr.Blocks(title="โš–๏ธ Auto Weight Logger") as demo:
    gr.Markdown("## โš–๏ธ Auto Weight Logger")
    gr.Markdown("๐Ÿ“ท Upload or capture an image of a digital weight scale (max 5MB).")

    with gr.Row():
        image_input = gr.Image(type="pil", label="Upload / Capture Image")
        output_weight = gr.Textbox(label="โš–๏ธ Detected Weight (in kg)")

    with gr.Row():
        timestamp = gr.Textbox(label="๐Ÿ•’ Captured At (IST)")
        snapshot = gr.Image(label="๐Ÿ“ธ Snapshot Image")

    with gr.Row():
        confirm_button = gr.Button("โœ… Confirm and Save to Salesforce", visible=False)
        status = gr.Textbox(label="Save Status", visible=False)

    submit = gr.Button("๐Ÿ” Detect Weight")
    submit.click(
        fn=process_image,
        inputs=image_input,
        outputs=[output_weight, timestamp, snapshot, gr.State(), confirm_button, status]
    )
    confirm_button.click(
        fn=save_to_salesforce,
        inputs=[output_weight, gr.State()],
        outputs=status
    )

    gr.Markdown("""
    ### Instructions
    - Upload a clear, well-lit image of a digital weight scale display.
    - Ensure the image is < 5MB (automatically resized if larger).
    - Review the detected weight and click 'Confirm and Save to Salesforce' to log the data.
    - Works on desktop and mobile browsers.
    """)

demo.launch()