Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| from datetime import datetime, timedelta | |
| import os | |
| CSV_LOG = "baby_log.csv" | |
| # Load or initialize log | |
| if os.path.exists(CSV_LOG): | |
| log_df = pd.read_csv(CSV_LOG) | |
| log_df["datetime"] = pd.to_datetime(log_df["datetime"]) | |
| else: | |
| log_df = pd.DataFrame(columns=["datetime", "event"]) | |
| def save_logs(): | |
| log_df.to_csv(CSV_LOG, index=False) | |
| def parse_time(hour, minute, ampm): | |
| hour = int(hour) | |
| minute = int(minute) | |
| if ampm == "PM" and hour < 12: | |
| hour += 12 | |
| if ampm == "AM" and hour == 12: | |
| hour = 0 | |
| now = datetime.now() | |
| return now.replace(hour=hour, minute=minute, second=0, microsecond=0) | |
| def get_next_feeding_time(last_time): | |
| hour = last_time.hour | |
| if 21 <= hour or hour < 10: | |
| return last_time + timedelta(hours=4) | |
| else: | |
| return last_time + timedelta(hours=2) | |
| def summarize_today(df): | |
| today = datetime.now().date() | |
| df_today = df[df["datetime"].dt.date == today] | |
| return f"๐ผ Feedings today: {len(df_today)}" | |
| def avg_feed_gap(df): | |
| df = df.sort_values("datetime") | |
| df_today = df[df["datetime"].dt.date == datetime.now().date()] | |
| times = df_today["datetime"].tolist() | |
| if len(times) < 2: | |
| return "โฑ๏ธ Avg Gap: N/A" | |
| gaps = [(t2 - t1).total_seconds() for t1, t2 in zip(times[:-1], times[1:])] | |
| avg_gap = sum(gaps) / len(gaps) | |
| avg_td = timedelta(seconds=avg_gap) | |
| return f"โฑ๏ธ Avg Gap: {str(avg_td).split('.')[0]}" | |
| def log_feeding(hour_str, minute_str, ampm): | |
| global log_df | |
| try: | |
| hour = int(hour_str) | |
| minute = int(minute_str) | |
| except: | |
| return "Invalid time input", pd.DataFrame(), "", "" | |
| feed_time = parse_time(hour, minute, ampm) | |
| new_entry = pd.DataFrame([{"datetime": feed_time, "event": "Feed"}]) | |
| log_df = pd.concat([log_df, new_entry], ignore_index=True) | |
| save_logs() | |
| summary = summarize_today(log_df) | |
| gap = avg_feed_gap(log_df) | |
| next_feed_time = get_next_feeding_time(feed_time) | |
| return next_feed_time.strftime("%I:%M %p"), log_df.tail(50).reset_index(drop=True), summary, gap | |
| def check_next_feeding(): | |
| if log_df.empty: | |
| return "No previous feeding logged." | |
| last_time = log_df["datetime"].max() | |
| next_time = get_next_feeding_time(last_time) | |
| return f"Next feeding should be around: {next_time.strftime('%I:%M %p')}" | |
| def visualize_log(): | |
| return log_df.tail(50).reset_index(drop=True), summarize_today(log_df), avg_feed_gap(log_df) | |
| with gr.Blocks() as app: | |
| gr.Markdown("## ๐ถ Smart Baby Feed Tracker") | |
| with gr.Row(): | |
| hour_input = gr.Textbox(label="Hour (1-12)", value="10") | |
| minute_input = gr.Textbox(label="Minute (0-59)", value="00") | |
| ampm_dropdown = gr.Dropdown(["AM", "PM"], label="AM/PM", value="AM") | |
| log_btn = gr.Button("โ๏ธ Log Feeding") | |
| next_feed_time = gr.Textbox(label="โญ๏ธ Next Feeding Time") | |
| feed_table = gr.Dataframe(label="Recent Feed Log") | |
| today_summary = gr.Textbox(label="Today's Feed Count") | |
| avg_gap = gr.Textbox(label="Average Feed Gap") | |
| log_btn.click(log_feeding, inputs=[hour_input, minute_input, ampm_dropdown], | |
| outputs=[next_feed_time, feed_table, today_summary, avg_gap]) | |
| gr.Markdown("### ๐ View Log & Stats Anytime") | |
| view_btn = gr.Button("๐ Visualize Log") | |
| view_table = gr.Dataframe(label="Recent Feed Log") | |
| view_summary = gr.Textbox(label="Today's Feed Count") | |
| view_gap = gr.Textbox(label="Average Feed Gap") | |
| view_btn.click(visualize_log, inputs=[], outputs=[view_table, view_summary, view_gap]) | |
| gr.Markdown("### ๐ Check From Last Feeding") | |
| check_btn = gr.Button("โญ๏ธ Predict Next Feeding Time") | |
| next_check = gr.Textbox(label="Predicted Time From Log") | |
| check_btn.click(check_next_feeding, inputs=[], outputs=next_check) | |
| app.launch() |