Yoyo-9877 commited on
Commit
ee5a882
verified
1 Parent(s): abbece7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -67
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
- # ... 讻讙讜谉 讟注讬谞转 PLANT_DATABASE 讜讻讜' ...
 
 
 
 
 
 
 
 
 
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
- analysis_button = gr.Button(" 讘爪注 谞讬转讜讞")
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
- gr.Markdown(
1517
- """
1518
- <div style="text-align: center;">
1519
- <h4>讞讬讝讜讬讬诐 (驻专讜驻'讟)</h4>
1520
- <p>讛驻注诇 转讞讝讬转 诪讘讜住住转 AI 注诇 谞转讜谞讬 讛讟诪驻专讟讜专讛 讛讛讬住讟讜专讬讬诐.</p>
1521
- </div>
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
- <div style="text-align: center;">
1547
- <h4>谞转讜谞讬 讞讬讬砖谞讬诐 讜诪讝讙 讗讜讜讬专</h4>
1548
- <p>注拽讜讘 讗讞专 讛谞转讜谞讬诐 诪讛讞讬讬砖谞讬诐 砖诇讱 讜拽讘诇 谞转讜谞讬 诪讝讙 讗讜讜讬专 注讚讻谞讬讬诐.</p>
1549
- </div>
1550
- """
1551
- )
1552
- city_input = gr.Textbox(value=get_user_location(), label="讛讻谞住 诪讬拽讜诐 (注讬专)")
1553
- days_input = gr.Slider(minimum=1, maximum=30, step=1, value=7, label="讟讜讜讞 讬诪讬诐 诇讙专驻讬诐")
1554
- sensor_btn = gr.Button(" 馃攧 专注谞谉 谞转讜谞讬 讞讬讬砖谞讬诐 讜讙专驻讬诐")
1555
- sensor_weather_output = gr.Textbox(label="谞转讜谞讬诐 讗讞专讜谞讬诐 讜诪讝讙 讗讜讜讬专", interactive=False)
1556
-
1557
- gr.Markdown("---") # 拽讜 诪驻专讬讚
1558
- gr.Markdown("#### 讙专驻讬诐 讛讬住讟讜专讬讬诐 (7 讬诪讬诐 讻讘专讬专转 诪讞讚诇)")
1559
-
1560
- # 讬爪讬专转 讗专讘注讛 驻诇讟讬诐 诇讙专驻讬诐
1561
- with gr.Row():
1562
- temp_plot = gr.Plot(label="讙专祝 讟诪驻专讟讜专讛")
1563
- humid_plot = gr.Plot(label="讙专祝 诇讞讜转 讬讞住讬转")
1564
- with gr.Row():
1565
- soil_plot = gr.Plot(label="讙专祝 诇讞讜转 拽专拽注")
1566
- light_plot = gr.Plot(label="讙专祝 注讜爪诪转 讗讜专")
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
- **诪爪讘 诪讜讚诇讬诐:** {len(PLANT_AI_MODELS)} 诪讜讚诇讬 AI 诪转诪讞讬诐 驻注讬诇讬诐.<br>
1592
- **诪爪讘 讛诪讗讙专:** {len(PLANT_DATABASE)} 诪讬谞讬 爪诪讞讬诐 讬讚讜注讬诐 讘诪讗讙专.<br>
1593
- **讬讻讜诇讜转 注讬拽专讬讜转:** 谞讬转讜讞 讘讝诪谉 讗诪转, 诪注专讻转 诇诪讬讚讛 注爪诪讗讬转, 谞讬讟讜专 讞讬讬砖谞讬诐, 砖诇讬讟讛 诪专讞讜拽.<br>
1594
- **驻专讜讟讜拽讜诇 转拽砖讜专转:** 讛诪注专讻转 诪砖转诪砖转 讘驻专讜讟讜拽讜诇 MQTT 讚专讱 Adafruit IO 讜讘-Telegram API.<br>
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
- with gr.TabItem(" 谞讬转讜讞 专讜讘讟讬 诪诇讗: 转诪讜谞讛 + 讞讬讬砖谞讬诐"):
1625
- gr.Markdown(
1626
- """
1627
- <div style="text-align: center;">
1628
- <h4>谞讬转讜讞 诪专讜讻讝 砖诇 转诪讜谞讜转 诪爪诇诪讛 讗讞专讜谞讜转</h4>
1629
- <p>诪注专讻转 讛拽讜谞住谞讝讜住 转谞转锟斤拷 讗转 讛转诪讜谞讜转 诪-Cloudinary 讜转砖诇讘 讗转 谞转讜谞讬 讛讟诪驻'/诇讞讜转 诪讛讞讬讬砖谞讬诐 砖谞诪讚讚讜 讘讝诪谉 讛爪讬诇讜诐.</p>
1630
- </div>
1631
- """
1632
- )
1633
- with gr.Row():
1634
- max_images_input = gr.Slider(minimum=1, maximum=50, step=1, value=10, label="诪住驻专 转诪讜谞讜转 诇谞讬转讜讞")
1635
- batch_analyze_btn = gr.Button(" 讛驻注诇 谞讬转讜讞 专讜讘讜讟讬 诪诇讗")
1636
-
1637
- batch_analysis_output = gr.Markdown("讛住讬讻讜诐 讬讜驻讬注 讻讗谉...")
1638
- batch_analysis_gallery = gr.Gallery(label="转诪讜谞讜转 诪谞讜转讞讜转 注诐 驻专讟讬 讞讬讬砖谞讬诐", columns=5, allow_preview=True)
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,