""" Streamlit app: SolarWine โ€” Smart Shading for Vineyard Solar Panels. 5 tabs: Overview, Photosynthesis & Data, Forecasting, Shading Simulator, Documentation. """ from __future__ import annotations import sys from pathlib import Path PROJECT_ROOT = Path(__file__).resolve().parent if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) try: from dotenv import load_dotenv load_dotenv(PROJECT_ROOT / ".env") except ImportError: pass import os import streamlit as st # Copy Streamlit secrets into os.environ so downstream clients (ThingsBoard, # IMS, etc.) can read them via os.environ without any code changes. for key, value in st.secrets.items(): if isinstance(value, str) and key not in os.environ: os.environ[key] = value from ui.bootstrap import img_to_base64, now_israel # --------------------------------------------------------------------------- # Page config # --------------------------------------------------------------------------- st.set_page_config(page_title="SolarWine - Smart Shading for Vineyards", layout="wide") # --------------------------------------------------------------------------- # Migration banner (shows only when new frontend URL is configured) # --------------------------------------------------------------------------- _NEW_FRONTEND_URL = os.environ.get("SOLARWINE_FRONTEND_URL", "") if _NEW_FRONTEND_URL: st.info( f"A new version of the SolarWine dashboard is available at " f"[{_NEW_FRONTEND_URL}]({_NEW_FRONTEND_URL}). " f"This Streamlit app will be retired soon.", icon="๐Ÿ”„", ) # --------------------------------------------------------------------------- # Brand CSS # --------------------------------------------------------------------------- _BRAND_GREEN = "#00BD3E" _BRAND_DARK = "#1A1A1A" st.markdown(f""" """, unsafe_allow_html=True) # --------------------------------------------------------------------------- # Hero banner with logo # --------------------------------------------------------------------------- _ASSETS = PROJECT_ROOT / "assets" _logo_path = _ASSETS / "logo.png" if _logo_path.exists(): _logo_b64 = img_to_base64(_logo_path) st.markdown(f"""
SolarWine logo

Smart Shading for Vineyard Solar Panels

Empowering growers ยท Harvesting sunshine

""", unsafe_allow_html=True) else: st.title("SolarWine โ€” Smart Shading for Vineyard Solar Panels") # --------------------------------------------------------------------------- # Sidebar # --------------------------------------------------------------------------- sidebar = st.sidebar if _logo_path.exists(): sidebar.image(str(_logo_path), width=180) _now = now_israel() sidebar.caption("**Site:** Yeruham, Israel") sidebar.markdown(f"**Date:** {_now.strftime('%Y-%m-%d')}") sidebar.markdown(f"**Time (local):** {_now.strftime('%H:%M')}") st.session_state.current_time_israel = _now # --------------------------------------------------------------------------- # Navigation โ€” only the selected page renders (avoids running all 6 tabs) # --------------------------------------------------------------------------- _PAGES = [ "System Status", "Overview", "Photosynthesis & Data", "Forecasting", "Shading Simulator", "Documentation", ] _selected = sidebar.radio("Navigate", _PAGES, label_visibility="collapsed") if _selected == "System Status": from ui.tab_system_status import render_tab_system_status render_tab_system_status() elif _selected == "Overview": from ui.tab_overview import render_tab_overview render_tab_overview() elif _selected == "Photosynthesis & Data": from ui.tab_data import render_tab_data render_tab_data() elif _selected == "Forecasting": from ui.tab_forecast import render_tab_forecast render_tab_forecast() elif _selected == "Shading Simulator": from ui.tab_shading import render_tab_shading render_tab_shading() elif _selected == "Documentation": from ui.tab_docs import render_tab_docs render_tab_docs()