Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1470,8 +1470,17 @@ def get_all_sensor_graphs(days: int = 7) -> Tuple[Any, Any, Any, Any]:
|
|
| 1470 |
# ==================== MAIN GRADIO INTERFACE ====================
|
| 1471 |
def create_gradio_app():
|
| 1472 |
import gradio as gr
|
| 1473 |
-
|
| 1474 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1475 |
|
| 1476 |
|
| 1477 |
# 讛讙讚专转 诪砖转谞讬 STATE 讜-UI 讙诇讜讘诇讬讬诐
|
|
@@ -1485,7 +1494,7 @@ def create_gradio_app():
|
|
| 1485 |
primary_hue="green",
|
| 1486 |
secondary_hue="slate"
|
| 1487 |
).set(
|
| 1488 |
-
body_background_fill='blue',
|
| 1489 |
block_border_width='1px',
|
| 1490 |
block_border_color='#C7D4E1'
|
| 1491 |
)
|
|
@@ -1501,69 +1510,71 @@ def create_gradio_app():
|
|
| 1501 |
"""
|
| 1502 |
)
|
| 1503 |
with gr.Tabs():
|
| 1504 |
-
# --- Tab 1: Image Analysis ---
|
| 1505 |
with gr.TabItem(" 谞讬转讜讞 转诪讜谞讜转"):
|
| 1506 |
gr.Markdown(" 讛砖转诪砖 讘讟讗讘 讝讛 讻讚讬 诇谞转讞 转诪讜谞讛 讞讚砖讛 讘讗诪爪注讜转 诪注专讻转 讛拽讜谞住谞讝讜住 讛诪砖讜拽诇诇转.")
|
| 1507 |
with gr.Row():
|
| 1508 |
image_input = gr.Image(type="filepath", label="讛注诇讛 转诪讜谞讛 砖诇 讛爪诪讞 砖诇讱")
|
| 1509 |
-
|
| 1510 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1511 |
analysis_output = gr.Textbox(label="转讜爪讗讜转 谞讬转讜讞", interactive=False)
|
| 1512 |
analysis_gallery = gr.Gallery(label="讛砖讜讜讗讛 诇讚讜讙诪讗讜转 诪讛诪讗讙专", columns=5, allow_preview=True)
|
| 1513 |
|
| 1514 |
-
# --- Tab 2: Ultimate Analysis ---
|
| 1515 |
-
with gr.TabItem(" 谞讬转讜讞 讗讜诇讟讬诪讟讬讘讬"):
|
| 1516 |
-
|
| 1517 |
-
|
| 1518 |
-
|
| 1519 |
-
|
| 1520 |
-
|
| 1521 |
-
|
| 1522 |
-
|
| 1523 |
-
)
|
| 1524 |
prophet_btn = gr.Button(" 讛驻注诇 转讞讝讬转")
|
| 1525 |
prophet_output = gr.Textbox(label="转讜爪讗讜转 转讞讝讬转", interactive=False)
|
| 1526 |
prophet_graph = gr.Plot(label="讙专祝 转讞讝讬转")
|
| 1527 |
|
| 1528 |
gr.Markdown("---")
|
| 1529 |
-
gr.Markdown(
|
| 1530 |
-
"""
|
| 1531 |
-
<div style="text-align: center;">
|
| 1532 |
-
<h4>砖诇讬讟讛 诪专讞讜拽 注诇 讛专讜讘讜讟</h4>
|
| 1533 |
-
<p>砖诇讞 驻拽讜讚讜转 诇专讜讘讜讟 砖诇讱 讘讗诪爪注讜转 讛讜讚注讜转 讟诇讙专诐.</p>
|
| 1534 |
-
</div>
|
| 1535 |
-
"""
|
| 1536 |
-
)
|
| 1537 |
with gr.Row():
|
| 1538 |
robot_command_input = gr.Textbox(label="讛拽诇讚 驻拽讜讚讛 诇专讜讘讜讟 (诇讚讜讙诪讛: '讛砖拽讛 驻讟讜谞讬讛', '讛驻注诇 诪砖讗讘讛')")
|
| 1539 |
-
send_robot_command_btn = gr.Button(" 砖诇讞 驻拽讜讚讛")
|
| 1540 |
robot_output = gr.Textbox(label="转讙讜讘转 讛专讜讘讜讟", interactive=False)
|
| 1541 |
|
| 1542 |
# --- Tab 3: Sensor Data & Forecasting ---
|
| 1543 |
with gr.TabItem(" 谞讬讟讜专 讞讬讬砖谞讬诐 讜转讞讝讬讜转"):
|
| 1544 |
gr.Markdown(
|
| 1545 |
-
|
| 1546 |
-
|
| 1547 |
-
|
| 1548 |
-
|
| 1549 |
-
|
| 1550 |
-
|
| 1551 |
-
|
| 1552 |
-
|
| 1553 |
-
|
| 1554 |
-
|
| 1555 |
-
|
| 1556 |
-
|
| 1557 |
-
|
| 1558 |
-
|
| 1559 |
-
|
| 1560 |
-
|
| 1561 |
-
|
| 1562 |
-
|
| 1563 |
-
|
| 1564 |
-
|
| 1565 |
-
|
| 1566 |
-
|
| 1567 |
|
| 1568 |
# --- Tab 4: Tips ---
|
| 1569 |
with gr.TabItem(" 讟讬驻讬诐"):
|
|
@@ -1588,10 +1599,10 @@ def create_gradio_app():
|
|
| 1588 |
<h4>注讜讘讚讜转 注诇 讛诪注专讻转</h4>
|
| 1589 |
</div>
|
| 1590 |
<p>
|
| 1591 |
-
|
| 1592 |
-
|
| 1593 |
-
|
| 1594 |
-
|
| 1595 |
</p>
|
| 1596 |
"""
|
| 1597 |
)
|
|
@@ -1620,23 +1631,29 @@ def create_gradio_app():
|
|
| 1620 |
plant_dropdown = gr.Dropdown(choices=list(PLANT_DATABASE.keys()), label="讘讞专 爪诪讞 讬讚谞讬转")
|
| 1621 |
save_plant_btn = gr.Button(" 砖诪讜专 讛讙讚专转 爪诪讞")
|
| 1622 |
|
| 1623 |
-
# --- Tab 7: Batch Cloudinary Analysis ---
|
| 1624 |
-
|
| 1625 |
-
|
| 1626 |
-
|
| 1627 |
-
|
| 1628 |
-
|
| 1629 |
-
|
| 1630 |
-
|
| 1631 |
-
|
| 1632 |
-
|
| 1633 |
-
|
| 1634 |
-
|
| 1635 |
-
|
| 1636 |
-
|
| 1637 |
-
|
| 1638 |
-
|
| 1639 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1640 |
# --- Event Handlers ---
|
| 1641 |
analysis_button.click(
|
| 1642 |
fn=analyze_plant_image,
|
|
|
|
| 1470 |
# ==================== MAIN GRADIO INTERFACE ====================
|
| 1471 |
def create_gradio_app():
|
| 1472 |
import gradio as gr
|
| 1473 |
+
from datetime import datetime
|
| 1474 |
+
import os
|
| 1475 |
+
# 谞谞讬讞 砖讬讬讘讗转 讗转 PLANT_DATABASE, PLANT_AI_MODELS, REPORTS_DIR, EXPERIMENT_SCHEDULE
|
| 1476 |
+
# 讜讗转 讻诇 讛驻讜谞拽爪讬讜转 讛注讝专 讻诪讜 analyze_plant_image, get_user_location, 讜讻讜'.
|
| 1477 |
+
# 诇讚讜讙诪讛:
|
| 1478 |
+
# from your_modules import (PLANT_DATABASE, PLANT_AI_MODELS, get_user_location,
|
| 1479 |
+
# analyze_plant_image, send_telegram_command,
|
| 1480 |
+
# generate_prophet_forecast, refresh_sensor_data,
|
| 1481 |
+
# get_care_tips, refresh_cloudinary_data,
|
| 1482 |
+
# analyze_cloudinary_image_batch,
|
| 1483 |
+
# generate_academic_summary_report, get_current_experiment_tag)
|
| 1484 |
|
| 1485 |
|
| 1486 |
# 讛讙讚专转 诪砖转谞讬 STATE 讜-UI 讙诇讜讘诇讬讬诐
|
|
|
|
| 1494 |
primary_hue="green",
|
| 1495 |
secondary_hue="slate"
|
| 1496 |
).set(
|
| 1497 |
+
body_background_fill='blue', # 讛砖讗专转讬 讗转 讛-blue 讛诪拽讜专讬, 讻讚讗讬 诇砖拽讜诇 爪讘注 谞讬讟专诇讬 讬讜转专
|
| 1498 |
block_border_width='1px',
|
| 1499 |
block_border_color='#C7D4E1'
|
| 1500 |
)
|
|
|
|
| 1510 |
"""
|
| 1511 |
)
|
| 1512 |
with gr.Tabs():
|
| 1513 |
+
# --- Tab 1: Image Analysis (砖讬驻讜专: 讛讜住驻转 诪讚 讘讬讟讞讜谉) ---
|
| 1514 |
with gr.TabItem(" 谞讬转讜讞 转诪讜谞讜转"):
|
| 1515 |
gr.Markdown(" 讛砖转诪砖 讘讟讗讘 讝讛 讻讚讬 诇谞转讞 转诪讜谞讛 讞讚砖讛 讘讗诪爪注讜转 诪注专讻转 讛拽讜谞住谞讝讜住 讛诪砖讜拽诇诇转.")
|
| 1516 |
with gr.Row():
|
| 1517 |
image_input = gr.Image(type="filepath", label="讛注诇讛 转诪讜谞讛 砖诇 讛爪诪讞 砖诇讱")
|
| 1518 |
+
with gr.Column():
|
| 1519 |
+
analysis_button = gr.Button(" 馃敩 讘爪注 谞讬转讜讞")
|
| 1520 |
+
# 猬咃笍 讛讜住驻转 诪讚 讘讬讟讞讜谉
|
| 1521 |
+
final_confidence_gauge = gr.Gauge(
|
| 1522 |
+
label="爪讬讜谉 讘讬讟讞讜谉 拽讜谞住谞讝讜住 AI (诪-0 注讚 100)",
|
| 1523 |
+
minimum=0,
|
| 1524 |
+
maximum=100,
|
| 1525 |
+
value=0,
|
| 1526 |
+
color="green"
|
| 1527 |
+
)
|
| 1528 |
+
|
| 1529 |
analysis_output = gr.Textbox(label="转讜爪讗讜转 谞讬转讜讞", interactive=False)
|
| 1530 |
analysis_gallery = gr.Gallery(label="讛砖讜讜讗讛 诇讚讜讙诪讗讜转 诪讛诪讗讙专", columns=5, allow_preview=True)
|
| 1531 |
|
| 1532 |
+
# --- Tab 2: Ultimate Analysis (谞讬转讜讞 讗讜诇讟讬诪讟讬讘讬 讜驻拽讜讚讜转) ---
|
| 1533 |
+
with gr.TabItem(" 谞讬转讜讞 讗讜诇讟讬诪讟讬讘讬 讜驻拽讜讚讜转"):
|
| 1534 |
+
# 猬咃笍 诪谞讙谞讜谉 谞讬拽讜讬 诇砖讬驻讜专 UX (诪讛讛爪注讜转 讛拽讜讚诪讜转)
|
| 1535 |
+
with gr.Row():
|
| 1536 |
+
analyze_ultimate_btn = gr.Button(" 馃敩 谞转讞 转诪讜谞讛 讜讛爪讙 转讜爪讗讜转")
|
| 1537 |
+
clear_btn = gr.Button(" 馃Ч 谞拽讛 讗转 讻诇 转讜爪讗讜转 讛谞讬转讜讞")
|
| 1538 |
+
|
| 1539 |
+
gr.Markdown("---")
|
| 1540 |
+
|
| 1541 |
+
gr.Markdown("#### 转讞讝讬讜转 (驻专讜驻'讟)")
|
| 1542 |
prophet_btn = gr.Button(" 讛驻注诇 转讞讝讬转")
|
| 1543 |
prophet_output = gr.Textbox(label="转讜爪讗讜转 转讞讝讬转", interactive=False)
|
| 1544 |
prophet_graph = gr.Plot(label="讙专祝 转讞讝讬转")
|
| 1545 |
|
| 1546 |
gr.Markdown("---")
|
| 1547 |
+
gr.Markdown("#### 砖诇讬讟讛 诪专讞讜拽 注诇 讛专讜讘讜讟")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1548 |
with gr.Row():
|
| 1549 |
robot_command_input = gr.Textbox(label="讛拽诇讚 驻拽讜讚讛 诇专讜讘讜讟 (诇讚讜讙诪讛: '讛砖拽讛 驻讟讜谞讬讛', '讛驻注诇 诪砖讗讘讛')")
|
| 1550 |
+
send_robot_command_btn = gr.Button(" 鉁夛笍 砖诇讞 驻拽讜讚讛")
|
| 1551 |
robot_output = gr.Textbox(label="转讙讜讘转 讛专讜讘讜讟", interactive=False)
|
| 1552 |
|
| 1553 |
# --- Tab 3: Sensor Data & Forecasting ---
|
| 1554 |
with gr.TabItem(" 谞讬讟讜专 讞讬讬砖谞讬诐 讜转讞讝讬讜转"):
|
| 1555 |
gr.Markdown(
|
| 1556 |
+
"""
|
| 1557 |
+
<div style="text-align: center;">
|
| 1558 |
+
<h4>谞转讜谞讬 讞讬讬砖谞讬诐 讜诪讝讙 讗讜讜讬专</h4>
|
| 1559 |
+
<p>注拽讜讘 讗讞专 讛谞转讜谞讬诐 诪讛讞讬讬砖谞讬诐 砖诇讱 讜拽讘诇 谞转讜谞讬 诪讝讙 讗讜讜讬专 注讚讻谞讬讬诐.</p>
|
| 1560 |
+
</div>
|
| 1561 |
+
"""
|
| 1562 |
+
)
|
| 1563 |
+
city_input = gr.Textbox(value=get_user_location(), label="讛讻谞住 诪讬拽讜诐 (注讬专)")
|
| 1564 |
+
days_input = gr.Slider(minimum=1, maximum=30, step=1, value=7, label="讟讜讜讞 讬诪讬诐 诇讙专驻讬诐")
|
| 1565 |
+
sensor_btn = gr.Button(" 馃攧 专注谞谉 谞转讜谞讬 讞讬讬砖谞讬诐 讜讙专驻讬诐")
|
| 1566 |
+
sensor_weather_output = gr.Textbox(label="谞转讜谞讬诐 讗讞专讜谞讬诐 讜诪讝讙 讗讜讜讬专", interactive=False)
|
| 1567 |
+
|
| 1568 |
+
gr.Markdown("---") # 拽讜 诪驻专讬讚
|
| 1569 |
+
gr.Markdown("#### 讙专驻讬诐 讛讬住讟讜专讬讬诐 (7 讬诪讬诐 讻讘专讬专转 诪讞讚诇)")
|
| 1570 |
+
|
| 1571 |
+
# 讬爪讬专转 讗专讘注讛 驻诇讟讬诐 诇讙专驻讬诐
|
| 1572 |
+
with gr.Row():
|
| 1573 |
+
temp_plot = gr.Plot(label="讙专祝 讟诪驻专讟讜专讛")
|
| 1574 |
+
humid_plot = gr.Plot(label="讙专祝 诇讞讜转 讬讞住讬转")
|
| 1575 |
+
with gr.Row():
|
| 1576 |
+
soil_plot = gr.Plot(label="讙专祝 诇讞讜转 拽专拽注")
|
| 1577 |
+
light_plot = gr.Plot(label="讙专祝 注讜爪诪转 讗讜专")
|
| 1578 |
|
| 1579 |
# --- Tab 4: Tips ---
|
| 1580 |
with gr.TabItem(" 讟讬驻讬诐"):
|
|
|
|
| 1599 |
<h4>注讜讘讚讜转 注诇 讛诪注专讻转</h4>
|
| 1600 |
</div>
|
| 1601 |
<p>
|
| 1602 |
+
**诪爪讘 诪讜讚诇讬诐:** {len(PLANT_AI_MODELS)} 诪讜讚诇讬 AI 诪转诪讞讬诐 驻注讬诇讬诐.<br>
|
| 1603 |
+
**诪爪讘 讛诪讗讙专:** {len(PLANT_DATABASE)} 诪讬谞讬 爪诪讞讬诐 讬讚讜注讬诐 讘诪讗讙专.<br>
|
| 1604 |
+
**讬讻讜诇讜转 注讬拽专讬讜转:** 谞讬转讜讞 讘讝诪谉 讗诪转, 诪注专讻转 诇诪讬讚讛 注爪诪讗讬转, 谞讬讟讜专 讞讬讬砖谞讬诐, 砖诇讬讟讛 诪专讞讜拽.<br>
|
| 1605 |
+
**驻专讜讟讜拽讜诇 转拽砖讜专转:** 讛诪注专讻转 诪砖转诪砖转 讘驻专讜讟讜拽讜诇 MQTT 讚专讱 Adafruit IO 讜讘-Telegram API.<br>
|
| 1606 |
</p>
|
| 1607 |
"""
|
| 1608 |
)
|
|
|
|
| 1631 |
plant_dropdown = gr.Dropdown(choices=list(PLANT_DATABASE.keys()), label="讘讞专 爪诪讞 讬讚谞讬转")
|
| 1632 |
save_plant_btn = gr.Button(" 砖诪讜专 讛讙讚专转 爪诪讞")
|
| 1633 |
|
| 1634 |
+
# --- Tab 7: Batch Cloudinary Analysis (砖讬驻讜专: 讟讘诇转 谞转讜谞讬诐 讜-Auto-Tagging) ---
|
| 1635 |
+
with gr.TabItem(" 谞讬转讜讞 专讜讘讟讬 诪诇讗: 转诪讜谞讛 + 讞讬讬砖谞讬诐"):
|
| 1636 |
+
gr.Markdown(
|
| 1637 |
+
"""
|
| 1638 |
+
<div style="text-align: center;">
|
| 1639 |
+
<h4>谞讬转讜讞 诪专讜讻讝 砖诇 转诪讜谞讜转 诪爪诇诪讛 讗讞专讜谞讜转</h4>
|
| 1640 |
+
<p>诪注专讻转 讛拽讜谞住谞讝讜住 转谞转讞 讗转 讛转诪讜谞讜转 诪-Cloudinary 讜转砖诇讘 讗转 谞转讜谞讬 讛讟诪驻'/诇讞讜转.</p>
|
| 1641 |
+
</div>
|
| 1642 |
+
"""
|
| 1643 |
+
)
|
| 1644 |
+
# 猬咃笍 讛爪讙转 讛-Auto-Tag 讛谞讜讻讞讬
|
| 1645 |
+
gr.Markdown(f"**转讙讬转 讛谞讬住讜讬 讛谞讜讻讞讬转 (讗讜讟讜诪讟讬):** `{get_current_experiment_tag()}`")
|
| 1646 |
+
|
| 1647 |
+
with gr.Row():
|
| 1648 |
+
max_images_input = gr.Slider(minimum=1, maximum=50, step=1, value=10, label="诪住驻专 转诪讜谞讜转 诇谞讬转讜讞")
|
| 1649 |
+
batch_analyze_btn = gr.Button(" 馃 讛驻注诇 谞讬转讜讞 专讜讘讜讟讬 诪诇讗")
|
| 1650 |
|
| 1651 |
+
batch_analysis_output = gr.Markdown("讛住讬讻讜诐 讬讜驻讬注 讻讗谉...")
|
| 1652 |
+
# 猬咃笍 讟讘诇转 谞转讜谞讬诐 讙讜诇诪讬讬诐 诇谞讬转讜讞
|
| 1653 |
+
batch_analysis_data_frame = gr.DataFrame(label="谞转讜谞讬 谞讬转讜讞 讙讜诇诪讬讬诐 (AI + 讞讬讬砖谞讬诐)", row_count=5, interactive=False)
|
| 1654 |
+
batch_analysis_gallery = gr.Gallery(label="转诪讜谞讜转 诪谞讜转讞讜转 注诐 驻专讟讬 讞讬讬砖谞讬诐", columns=5, allow_preview=True)
|
| 1655 |
+
download_report_btn = gr.File(label="讛讜专讚 讚讜讞 CSV", interactive=False)
|
| 1656 |
+
|
| 1657 |
# --- Event Handlers ---
|
| 1658 |
analysis_button.click(
|
| 1659 |
fn=analyze_plant_image,
|