diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..b6e8ae56bf1971324c18472015d7dfce2cbc16fd --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,28 @@ +FROM python:3.12-slim + +WORKDIR /app + +# Install dependencies first (layer caching) +COPY requirements.txt . +COPY backend/requirements.txt backend/ +RUN pip install --no-cache-dir -r requirements.txt -r backend/requirements.txt + +# Non-root user for security +RUN groupadd -r solarwine && useradd -r -g solarwine solarwine + +# Copy application code and data cache +COPY src/ src/ +COPY config/ config/ +COPY backend/ backend/ +COPY Data/ Data/ + +ENV PYTHONPATH=/app + +# Switch to non-root +USER solarwine + +# HuggingFace Spaces requires port 7860 +EXPOSE 7860 +HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ + CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:7860/api/health')" || exit 1 +CMD ["uvicorn", "backend.api.main:app", "--host", "0.0.0.0", "--port", "7860"] diff --git a/backend/HF_README.md b/backend/HF_README.md new file mode 100644 index 0000000000000000000000000000000000000000..9f6e73db0de8b648cab7071fcd01989a692c35e5 --- /dev/null +++ b/backend/HF_README.md @@ -0,0 +1,26 @@ +--- +title: SolarWine API +emoji: 🌿 +colorFrom: green +colorTo: yellow +sdk: docker +app_port: 7860 +private: true +--- + +# SolarWine API + +FastAPI backend for the SolarWine agrivoltaic vineyard control system. + +## Endpoints + +- `GET /api/health` — health check +- `GET /api/weather/current` — current weather (IMS station 43) +- `GET /api/sensors/snapshot` — vine sensor readings (ThingsBoard) +- `GET /api/energy/current` — current power output +- `GET /api/photosynthesis/current` — photosynthesis rate (FvCB/ML) +- `GET /api/control/status` — last control loop tick +- `POST /api/chatbot/message` — AI vineyard advisor +- `GET /api/biology/rules` — biology rules + +Interactive docs at `/docs`. diff --git a/backend/__pycache__/__init__.cpython-312.pyc b/backend/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e7b57beaba9d332fdce706bf694b6c8f9e75968 Binary files /dev/null and b/backend/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/__pycache__/__init__.cpython-39.pyc b/backend/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..216f29a24267daab7df9440e71f5e72e6edd4642 Binary files /dev/null and b/backend/__pycache__/__init__.cpython-39.pyc differ diff --git a/backend/api/__pycache__/__init__.cpython-312.pyc b/backend/api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83cf1c57a687e55367c6b881c8635e4216a11109 Binary files /dev/null and b/backend/api/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/api/__pycache__/__init__.cpython-39.pyc b/backend/api/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c706c9717366bee01d97bb145778a929c87370b5 Binary files /dev/null and b/backend/api/__pycache__/__init__.cpython-39.pyc differ diff --git a/backend/api/__pycache__/auth.cpython-312.pyc b/backend/api/__pycache__/auth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e148238ff470cd92083690d895023161e35641bf Binary files /dev/null and b/backend/api/__pycache__/auth.cpython-312.pyc differ diff --git a/backend/api/__pycache__/deps.cpython-312.pyc b/backend/api/__pycache__/deps.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa0ba6a737f8061b600fc4b9fd0fb6b7573cde48 Binary files /dev/null and b/backend/api/__pycache__/deps.cpython-312.pyc differ diff --git a/backend/api/__pycache__/events.cpython-312.pyc b/backend/api/__pycache__/events.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9538a900457aa0d916b424ac8c3b4f3b05064967 Binary files /dev/null and b/backend/api/__pycache__/events.cpython-312.pyc differ diff --git a/backend/api/__pycache__/events.cpython-39.pyc b/backend/api/__pycache__/events.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d090381efaf0eec47bc9e9cf2d2a9a4a4a97bff8 Binary files /dev/null and b/backend/api/__pycache__/events.cpython-39.pyc differ diff --git a/backend/api/__pycache__/main.cpython-312.pyc b/backend/api/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d40abd0ea65c51eae23149eb8038b2594bd2436 Binary files /dev/null and b/backend/api/__pycache__/main.cpython-312.pyc differ diff --git a/backend/api/main.py b/backend/api/main.py index 8f8eb1cb87892de8b951b82882fb80dbe946d41d..28e8153188905c94b92f0b2c0766a2b8318c752e 100644 --- a/backend/api/main.py +++ b/backend/api/main.py @@ -74,12 +74,12 @@ def _check_data_paths(): log.warning("Missing %s — %s", rel_path, msg) -async def _ims_refresh_loop(interval_sec: int = 6 * 3600): - """Background loop: refresh the IMS weather cache every `interval_sec` seconds. +async def _ims_refresh_loop(interval_sec: int = 2 * 3600): + """Background loop: refresh the IMS weather cache every 2 hours. - Fetches the last 14 days of IMS data, overwrites the local CSV cache, - and invalidates the in-memory WeatherService cache so the next request - picks up fresh data. + Fetches the last 7 days of IMS data in 3-day chunks (IMS API is + unreliable with large ranges), overwrites the local CSV cache, + and invalidates the in-memory WeatherService cache. """ import asyncio from backend.api.events import event_bus @@ -89,17 +89,19 @@ async def _ims_refresh_loop(interval_sec: int = 6 * 3600): from datetime import date, timedelta from src.data.ims_client import IMSClient end = date.today() - start = end - timedelta(days=14) + start = end - timedelta(days=7) client = IMSClient() loop = asyncio.get_event_loop() df = await loop.run_in_executor( None, lambda: client.fetch_and_cache( - str(start), str(end), chunk_days=14 + str(start), str(end), chunk_days=3 ), ) rows = len(df) if df is not None and not df.empty else 0 log.info("IMS cache refreshed: %d rows (%s → %s)", rows, start, end) + if rows == 0: + log.warning("IMS refresh returned 0 rows — API may be down") # Invalidate WeatherService in-memory cache so next request uses fresh data try: from backend.api.deps import get_datahub @@ -107,9 +109,10 @@ async def _ims_refresh_loop(interval_sec: int = 6 * 3600): hub.weather._df_cache._store.clear() except Exception: pass - await event_bus.notify("weather") + if rows > 0: + await event_bus.notify("weather") except Exception as exc: - log.error("IMS refresh failed: %s", exc) + log.error("IMS refresh failed: %s", exc, exc_info=True) await asyncio.sleep(interval_sec) diff --git a/backend/api/routes/__pycache__/__init__.cpython-312.pyc b/backend/api/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3707cdf193f11920d156b8eafd55689f019ee3a Binary files /dev/null and b/backend/api/routes/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/__init__.cpython-39.pyc b/backend/api/routes/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a8d3a122874cddf6ee517698719a705b03a7a19 Binary files /dev/null and b/backend/api/routes/__pycache__/__init__.cpython-39.pyc differ diff --git a/backend/api/routes/__pycache__/biology.cpython-312.pyc b/backend/api/routes/__pycache__/biology.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdf996610e30ad8cbf56e30a40ee23e94bfe43c1 Binary files /dev/null and b/backend/api/routes/__pycache__/biology.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/chatbot.cpython-312.pyc b/backend/api/routes/__pycache__/chatbot.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8864d56dd13bd8f2e83d22a9097115f9ee9934d Binary files /dev/null and b/backend/api/routes/__pycache__/chatbot.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/control.cpython-312.pyc b/backend/api/routes/__pycache__/control.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21958fc4ca536c452b50465394c4122429c19dd1 Binary files /dev/null and b/backend/api/routes/__pycache__/control.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/energy.cpython-312.pyc b/backend/api/routes/__pycache__/energy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..797ad1fdd8c6c8760a0dfb71d3db9027d4edd848 Binary files /dev/null and b/backend/api/routes/__pycache__/energy.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/events.cpython-312.pyc b/backend/api/routes/__pycache__/events.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d1ee63ca313a9bd72c42ea775b7f4f473d89f40 Binary files /dev/null and b/backend/api/routes/__pycache__/events.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/events.cpython-39.pyc b/backend/api/routes/__pycache__/events.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..059878aeb8e830629c6994c9a0963d23d9b145ae Binary files /dev/null and b/backend/api/routes/__pycache__/events.cpython-39.pyc differ diff --git a/backend/api/routes/__pycache__/health.cpython-312.pyc b/backend/api/routes/__pycache__/health.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12db33828348e977e751a4b1621e0f278e396451 Binary files /dev/null and b/backend/api/routes/__pycache__/health.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/health.cpython-39.pyc b/backend/api/routes/__pycache__/health.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdf934b3dca676bc5fe3cd3416fd8fc173456fd3 Binary files /dev/null and b/backend/api/routes/__pycache__/health.cpython-39.pyc differ diff --git a/backend/api/routes/__pycache__/login.cpython-312.pyc b/backend/api/routes/__pycache__/login.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03e726416cbfb35c3937c9a52abf41667478c50d Binary files /dev/null and b/backend/api/routes/__pycache__/login.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/photosynthesis.cpython-312.pyc b/backend/api/routes/__pycache__/photosynthesis.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7560f5e0855561542c053ebdd545aec8564e9c4 Binary files /dev/null and b/backend/api/routes/__pycache__/photosynthesis.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/sensors.cpython-312.pyc b/backend/api/routes/__pycache__/sensors.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcc01183c08361a4e2c20008787200058d328e04 Binary files /dev/null and b/backend/api/routes/__pycache__/sensors.cpython-312.pyc differ diff --git a/backend/api/routes/__pycache__/sensors.cpython-39.pyc b/backend/api/routes/__pycache__/sensors.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1a3b4e35cabee47b0f69c08eaeb7f594458d4ce Binary files /dev/null and b/backend/api/routes/__pycache__/sensors.cpython-39.pyc differ diff --git a/backend/api/routes/__pycache__/weather.cpython-312.pyc b/backend/api/routes/__pycache__/weather.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8c3a626822993027f66a7bb162d165597176b25 Binary files /dev/null and b/backend/api/routes/__pycache__/weather.cpython-312.pyc differ diff --git a/backend/api/routes/health.py b/backend/api/routes/health.py index b32553d7db890d1d564cca7ed22c7357c2c380c8..1e5fb841ac817787be24212bb340404235d9527e 100644 --- a/backend/api/routes/health.py +++ b/backend/api/routes/health.py @@ -1,13 +1,14 @@ -"""Health check endpoint.""" +"""Health check endpoints.""" from __future__ import annotations import asyncio import os -from fastapi import APIRouter +from fastapi import APIRouter, Depends -from backend.api.deps import get_redis_client +from backend.api.deps import get_datahub, get_redis_client +from src.data.data_providers import DataHub router = APIRouter() @@ -47,3 +48,50 @@ async def health(): "ims_configured": bool(os.environ.get("IMS_API_TOKEN")), "gemini_configured": bool(os.environ.get("GOOGLE_API_KEY")), } + + +@router.get("/health/data") +async def health_data(hub: DataHub = Depends(get_datahub)): + """Data freshness check — shows age of each cached data source.""" + sources = {} + + # Weather + try: + wx = hub.weather.get_current() + if wx and "error" not in wx: + sources["weather"] = { + "age_minutes": round(float(wx.get("age_minutes", -1)), 1), + "last_reading": wx.get("timestamp_local"), + "ok": float(wx.get("age_minutes", 9999)) < 120, + } + else: + sources["weather"] = {"ok": False, "error": wx.get("error", "unavailable")} + except Exception as exc: + sources["weather"] = {"ok": False, "error": str(exc)} + + # Sensors + try: + snap = hub.vine_sensors.get_snapshot(light=True) + if snap and "error" not in snap: + stale = snap.get("staleness_minutes", -1) + sources["sensors"] = { + "age_minutes": round(float(stale), 1) if stale is not None else None, + "ok": stale is not None and float(stale) < 30, + } + else: + sources["sensors"] = {"ok": False, "error": snap.get("error", "unavailable")} + except Exception as exc: + sources["sensors"] = {"ok": False, "error": str(exc)} + + # Energy + try: + en = hub.energy.get_current() + if en and "error" not in en: + sources["energy"] = {"ok": True, "power_kw": en.get("power_kw")} + else: + sources["energy"] = {"ok": False, "error": en.get("error", "unavailable")} + except Exception as exc: + sources["energy"] = {"ok": False, "error": str(exc)} + + all_ok = all(s.get("ok", False) for s in sources.values()) + return {"status": "ok" if all_ok else "degraded", "sources": sources} diff --git a/backend/requirements.txt b/backend/requirements.txt index c6159a5a9c87c5a0150c1777512b6dd6f871d141..6f59344561855a8841793f1572483d38a2ba106d 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,7 +1,7 @@ -# Backend-specific dependencies +# Backend-specific dependencies (on top of root requirements.txt) fastapi>=0.115.0 uvicorn[standard]>=0.34.0 pydantic>=2.0 slowapi>=0.1.9 PyJWT>=2.8.0 -sentry-sdk[fastapi]>=2.0 +sentry-sdk[fastapi]>=2.0 # optional: set SENTRY_DSN to enable diff --git a/backend/workers/__pycache__/__init__.cpython-312.pyc b/backend/workers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..577855b034f5c9959389414f8230767ea76c242e Binary files /dev/null and b/backend/workers/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/workers/__pycache__/__init__.cpython-39.pyc b/backend/workers/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..156270b36552546bf10ef2e03a6a7ea45a8bd27a Binary files /dev/null and b/backend/workers/__pycache__/__init__.cpython-39.pyc differ diff --git a/backend/workers/__pycache__/control_tick.cpython-312.pyc b/backend/workers/__pycache__/control_tick.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd66e4489360c9593c6b0003b8e056079b1afe31 Binary files /dev/null and b/backend/workers/__pycache__/control_tick.cpython-312.pyc differ diff --git a/backend/workers/__pycache__/daily_planner.cpython-312.pyc b/backend/workers/__pycache__/daily_planner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fb590708b6f11ee9089ab6c129f757b40375b8f Binary files /dev/null and b/backend/workers/__pycache__/daily_planner.cpython-312.pyc differ diff --git a/backend/workers/__pycache__/daily_planner.cpython-39.pyc b/backend/workers/__pycache__/daily_planner.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78f859b212836174b79ac80255a6ef64e71835a6 Binary files /dev/null and b/backend/workers/__pycache__/daily_planner.cpython-39.pyc differ diff --git a/config/__pycache__/settings.cpython-312.pyc b/config/__pycache__/settings.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..488728dda16a8c0fc1274c1b6469cf418d666ee3 Binary files /dev/null and b/config/__pycache__/settings.cpython-312.pyc differ diff --git a/config/__pycache__/settings.cpython-39.pyc b/config/__pycache__/settings.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..718b3b6430ea4e314f8bb6a758032322cf54f640 Binary files /dev/null and b/config/__pycache__/settings.cpython-39.pyc differ diff --git a/requirements.txt b/requirements.txt index 5e47147111ffd4b35fb32f029f24c7b62cd2417c..25164c5ace7237dbb243dd96cfad51f4a7da83f4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,18 @@ -# API-only dependencies (slim — no torch/chronos/streamlit) -pandas>=2.0 -numpy>=1.26 -scikit-learn>=1.3 -requests>=2.31 -python-dotenv>=1.0 +# Photosynthesis Prediction Model - dependencies +# Install: pip install -r requirements.txt + +pandas==2.3.3 +numpy==2.4.2 +scikit-learn==1.8.0 +matplotlib==3.10.8 +seaborn==0.13.2 +requests==2.32.5 +python-dotenv==1.2.1 +streamlit==1.54.0 +plotly==6.5.2 xgboost>=2.0 pvlib>=0.10.0 astral>=3.2 +chronos-forecasting>=2.0 +torch>=2.0 google-genai>=1.0 diff --git a/src/__pycache__/__init__.cpython-312.pyc b/src/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b323e2f92a56a911be0038675823fa603daa7e5a Binary files /dev/null and b/src/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/__pycache__/__init__.cpython-39.pyc b/src/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd67888058394377157d0a9b635b6f04a021bc86 Binary files /dev/null and b/src/__pycache__/__init__.cpython-39.pyc differ diff --git a/src/__pycache__/baseline_predictor.cpython-39.pyc b/src/__pycache__/baseline_predictor.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd65c79156826eee078be2157e70207590c6a89f Binary files /dev/null and b/src/__pycache__/baseline_predictor.cpython-39.pyc differ diff --git a/src/__pycache__/canopy_photosynthesis.cpython-312.pyc b/src/__pycache__/canopy_photosynthesis.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55fbae0f119a2701606f0b9548af2c979590e9fa Binary files /dev/null and b/src/__pycache__/canopy_photosynthesis.cpython-312.pyc differ diff --git a/src/__pycache__/canopy_photosynthesis.cpython-39.pyc b/src/__pycache__/canopy_photosynthesis.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17c31eb90824b295f5bd50eab2ab8996284cf397 Binary files /dev/null and b/src/__pycache__/canopy_photosynthesis.cpython-39.pyc differ diff --git a/src/__pycache__/chronos_forecaster.cpython-312.pyc b/src/__pycache__/chronos_forecaster.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d43bb422c2b6db533e74afe83387761582cd7bbb Binary files /dev/null and b/src/__pycache__/chronos_forecaster.cpython-312.pyc differ diff --git a/src/__pycache__/chronos_forecaster.cpython-39.pyc b/src/__pycache__/chronos_forecaster.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd000b25bc7e348b24ad0d63892c9f59ba906453 Binary files /dev/null and b/src/__pycache__/chronos_forecaster.cpython-39.pyc differ diff --git a/src/__pycache__/command_arbiter.cpython-312.pyc b/src/__pycache__/command_arbiter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7273e40bccb9952bab240c794e6c9b8daef1a284 Binary files /dev/null and b/src/__pycache__/command_arbiter.cpython-312.pyc differ diff --git a/src/__pycache__/command_arbiter.cpython-39.pyc b/src/__pycache__/command_arbiter.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd8fbdfc75c44e7a8bd15d29abc176d4cfc88910 Binary files /dev/null and b/src/__pycache__/command_arbiter.cpython-39.pyc differ diff --git a/src/__pycache__/control_loop.cpython-312.pyc b/src/__pycache__/control_loop.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3b1f4205dde94000236d8f4dac25efd00f0b635 Binary files /dev/null and b/src/__pycache__/control_loop.cpython-312.pyc differ diff --git a/src/__pycache__/control_loop.cpython-39.pyc b/src/__pycache__/control_loop.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e74465e44564650fb8572b1c4e2fdb0ce2e45d22 Binary files /dev/null and b/src/__pycache__/control_loop.cpython-39.pyc differ diff --git a/src/__pycache__/data_providers.cpython-312.pyc b/src/__pycache__/data_providers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..607df099f0c19aba7004acef91c1ea3f85f2938b Binary files /dev/null and b/src/__pycache__/data_providers.cpython-312.pyc differ diff --git a/src/__pycache__/data_providers.cpython-39.pyc b/src/__pycache__/data_providers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7228dd50db8e8b88e7068d59beb4a4e9c274bcfb Binary files /dev/null and b/src/__pycache__/data_providers.cpython-39.pyc differ diff --git a/src/__pycache__/data_schema.cpython-312.pyc b/src/__pycache__/data_schema.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..240b058be1ea743851a271c52b3827d438e91f1c Binary files /dev/null and b/src/__pycache__/data_schema.cpython-312.pyc differ diff --git a/src/__pycache__/day_ahead_advisor.cpython-312.pyc b/src/__pycache__/day_ahead_advisor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4f0c09a368ab0061dc736450a62ab3c7240fdbc Binary files /dev/null and b/src/__pycache__/day_ahead_advisor.cpython-312.pyc differ diff --git a/src/__pycache__/day_ahead_advisor.cpython-39.pyc b/src/__pycache__/day_ahead_advisor.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..794f23409dfcfc569f83e8c2a5a717ace4ef8707 Binary files /dev/null and b/src/__pycache__/day_ahead_advisor.cpython-39.pyc differ diff --git a/src/__pycache__/day_ahead_planner.cpython-312.pyc b/src/__pycache__/day_ahead_planner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29444aafbd50897a781ec33bd8e85c9b81b513d9 Binary files /dev/null and b/src/__pycache__/day_ahead_planner.cpython-312.pyc differ diff --git a/src/__pycache__/day_ahead_planner.cpython-39.pyc b/src/__pycache__/day_ahead_planner.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d94df6afcb7d9476624f0ccfdc3d6f1b14192140 Binary files /dev/null and b/src/__pycache__/day_ahead_planner.cpython-39.pyc differ diff --git a/src/__pycache__/energy_budget.cpython-312.pyc b/src/__pycache__/energy_budget.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a7100d470a8c84607fb73662e3d62dba0bba15e Binary files /dev/null and b/src/__pycache__/energy_budget.cpython-312.pyc differ diff --git a/src/__pycache__/energy_budget.cpython-39.pyc b/src/__pycache__/energy_budget.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22b7a73902c95db1b113ad5c29fe006b87a4ff2c Binary files /dev/null and b/src/__pycache__/energy_budget.cpython-39.pyc differ diff --git a/src/__pycache__/energy_predictor.cpython-312.pyc b/src/__pycache__/energy_predictor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcc955ce612b28eb5e6ef0e3ceed5cb4cc3125ab Binary files /dev/null and b/src/__pycache__/energy_predictor.cpython-312.pyc differ diff --git a/src/__pycache__/energy_predictor.cpython-39.pyc b/src/__pycache__/energy_predictor.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1cf5c823d494d0191739d03d7d25f3ec90d2a7f Binary files /dev/null and b/src/__pycache__/energy_predictor.cpython-39.pyc differ diff --git a/src/__pycache__/farquhar_model.cpython-312.pyc b/src/__pycache__/farquhar_model.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a4fd426ef3dfaaeab6dfd13f818879c15129c63 Binary files /dev/null and b/src/__pycache__/farquhar_model.cpython-312.pyc differ diff --git a/src/__pycache__/farquhar_model.cpython-39.pyc b/src/__pycache__/farquhar_model.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f93df08762fc895e444001d6f26a424f69e8114d Binary files /dev/null and b/src/__pycache__/farquhar_model.cpython-39.pyc differ diff --git a/src/__pycache__/genai_utils.cpython-312.pyc b/src/__pycache__/genai_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfcf67b1731acd8932ac14264b9e4cc97eb95e0d Binary files /dev/null and b/src/__pycache__/genai_utils.cpython-312.pyc differ diff --git a/src/__pycache__/genai_utils.cpython-39.pyc b/src/__pycache__/genai_utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d238f05f721e471714555cb15c90280add1801bf Binary files /dev/null and b/src/__pycache__/genai_utils.cpython-39.pyc differ diff --git a/src/__pycache__/ims_client.cpython-312.pyc b/src/__pycache__/ims_client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a4e2e347eac32b247331b3f1003b22c7f2e55b2 Binary files /dev/null and b/src/__pycache__/ims_client.cpython-312.pyc differ diff --git a/src/__pycache__/ims_client.cpython-39.pyc b/src/__pycache__/ims_client.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f32e3d6d9713f31df32745ac0971699217b4ae48 Binary files /dev/null and b/src/__pycache__/ims_client.cpython-39.pyc differ diff --git a/src/__pycache__/llm_data_engineer.cpython-312.pyc b/src/__pycache__/llm_data_engineer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..739141de1bf773b6b63f49043872af715df66427 Binary files /dev/null and b/src/__pycache__/llm_data_engineer.cpython-312.pyc differ diff --git a/src/__pycache__/llm_data_engineer.cpython-39.pyc b/src/__pycache__/llm_data_engineer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..baab1c497a2794fd69fe2eeea833cf9289dec6e8 Binary files /dev/null and b/src/__pycache__/llm_data_engineer.cpython-39.pyc differ diff --git a/src/__pycache__/operational_modes.cpython-312.pyc b/src/__pycache__/operational_modes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ce2f5d8f0db398b6851d933ca476b6cb467ee36 Binary files /dev/null and b/src/__pycache__/operational_modes.cpython-312.pyc differ diff --git a/src/__pycache__/operational_modes.cpython-39.pyc b/src/__pycache__/operational_modes.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a28cb22bbb012bd7b7c55adc9ff8aa59d04c5b2 Binary files /dev/null and b/src/__pycache__/operational_modes.cpython-39.pyc differ diff --git a/src/__pycache__/phenology.cpython-312.pyc b/src/__pycache__/phenology.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1ce7f873800557d1ae83ef6a7eb8b6546d03297 Binary files /dev/null and b/src/__pycache__/phenology.cpython-312.pyc differ diff --git a/src/__pycache__/phenology.cpython-39.pyc b/src/__pycache__/phenology.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20ac35fa41d32c9044fb23a70574e516306eacb7 Binary files /dev/null and b/src/__pycache__/phenology.cpython-39.pyc differ diff --git a/src/__pycache__/predictor.cpython-312.pyc b/src/__pycache__/predictor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b41861c7ec43766906bffa59778b377b9ae584f0 Binary files /dev/null and b/src/__pycache__/predictor.cpython-312.pyc differ diff --git a/src/__pycache__/predictor.cpython-39.pyc b/src/__pycache__/predictor.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eda53ee0917a5b3d45cc48ad70bedf7e86b5f86d Binary files /dev/null and b/src/__pycache__/predictor.cpython-39.pyc differ diff --git a/src/__pycache__/preprocessor.cpython-312.pyc b/src/__pycache__/preprocessor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8858de6482d4636b70436627dcd66cddf92275da Binary files /dev/null and b/src/__pycache__/preprocessor.cpython-312.pyc differ diff --git a/src/__pycache__/preprocessor.cpython-39.pyc b/src/__pycache__/preprocessor.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf03e0eef0e2f83990f6405a5d17c4060d1f6c26 Binary files /dev/null and b/src/__pycache__/preprocessor.cpython-39.pyc differ diff --git a/src/__pycache__/pvlib_tracker.cpython-39.pyc b/src/__pycache__/pvlib_tracker.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a67304e3aae42275b8da3cd0426f3b9d0596161 Binary files /dev/null and b/src/__pycache__/pvlib_tracker.cpython-39.pyc differ diff --git a/src/__pycache__/roi_service.cpython-39.pyc b/src/__pycache__/roi_service.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5773937935af2d4316bb4a72dda72c55fb947e26 Binary files /dev/null and b/src/__pycache__/roi_service.cpython-39.pyc differ diff --git a/src/__pycache__/routing_agent.cpython-312.pyc b/src/__pycache__/routing_agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1d9d3bb9f438fe21cd21774851c88146e5752fe Binary files /dev/null and b/src/__pycache__/routing_agent.cpython-312.pyc differ diff --git a/src/__pycache__/safety_rails.cpython-312.pyc b/src/__pycache__/safety_rails.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..671d99ae90bb2b4bcd14a634565e68f9be5abd85 Binary files /dev/null and b/src/__pycache__/safety_rails.cpython-312.pyc differ diff --git a/src/__pycache__/sensor_data_loader.cpython-312.pyc b/src/__pycache__/sensor_data_loader.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38cc57f3cd48a7c0ec41b5bc535a37ba24f948c4 Binary files /dev/null and b/src/__pycache__/sensor_data_loader.cpython-312.pyc differ diff --git a/src/__pycache__/sensor_data_loader.cpython-39.pyc b/src/__pycache__/sensor_data_loader.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15cb019d4ff0184edb1299495a771d8414c76214 Binary files /dev/null and b/src/__pycache__/sensor_data_loader.cpython-39.pyc differ diff --git a/src/__pycache__/solar_geometry.cpython-312.pyc b/src/__pycache__/solar_geometry.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96b040ab8673c663846b58058e536280dad2fa6d Binary files /dev/null and b/src/__pycache__/solar_geometry.cpython-312.pyc differ diff --git a/src/__pycache__/solar_geometry.cpython-39.pyc b/src/__pycache__/solar_geometry.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5483fa0b9a62588e35a1b6927f7765bfd6c66dd Binary files /dev/null and b/src/__pycache__/solar_geometry.cpython-39.pyc differ diff --git a/src/__pycache__/spectral_aggregator.cpython-39.pyc b/src/__pycache__/spectral_aggregator.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d2999b788c9034744f17d869505eb460f82fcb9 Binary files /dev/null and b/src/__pycache__/spectral_aggregator.cpython-39.pyc differ diff --git a/src/__pycache__/thingsboard_client.cpython-312.pyc b/src/__pycache__/thingsboard_client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0ae4de6af7e04379a76783306709f834634fbc0 Binary files /dev/null and b/src/__pycache__/thingsboard_client.cpython-312.pyc differ diff --git a/src/__pycache__/thingsboard_client.cpython-39.pyc b/src/__pycache__/thingsboard_client.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23c343b5211102ae86bf9b561d9fc22df9123f8c Binary files /dev/null and b/src/__pycache__/thingsboard_client.cpython-39.pyc differ diff --git a/src/__pycache__/time_features.cpython-39.pyc b/src/__pycache__/time_features.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1cadf248366fb5138a779696bb84aab733124002 Binary files /dev/null and b/src/__pycache__/time_features.cpython-39.pyc differ diff --git a/src/__pycache__/tracker_dispatcher.cpython-312.pyc b/src/__pycache__/tracker_dispatcher.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8782db4c7407bb6b209d4625dc1dd3efa6658d5 Binary files /dev/null and b/src/__pycache__/tracker_dispatcher.cpython-312.pyc differ diff --git a/src/__pycache__/tracker_dispatcher.cpython-39.pyc b/src/__pycache__/tracker_dispatcher.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..155ebe1879bd81e408c65e68ed2ed6a7f215917b Binary files /dev/null and b/src/__pycache__/tracker_dispatcher.cpython-39.pyc differ diff --git a/src/__pycache__/tracker_fleet.cpython-312.pyc b/src/__pycache__/tracker_fleet.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92638cc7b664223500d75d0a71841d602f2be586 Binary files /dev/null and b/src/__pycache__/tracker_fleet.cpython-312.pyc differ diff --git a/src/__pycache__/tracker_fleet.cpython-39.pyc b/src/__pycache__/tracker_fleet.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..049df7f18cd59ed6f58c5d64c7613ac682b8767f Binary files /dev/null and b/src/__pycache__/tracker_fleet.cpython-39.pyc differ diff --git a/src/__pycache__/tracker_optimizer.cpython-312.pyc b/src/__pycache__/tracker_optimizer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..146e04e217cd05291ddb7728c2ee4afa464b0c9d Binary files /dev/null and b/src/__pycache__/tracker_optimizer.cpython-312.pyc differ diff --git a/src/__pycache__/tracker_optimizer.cpython-39.pyc b/src/__pycache__/tracker_optimizer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..039bfd03e3927dcd13a5ec495ebbb30f9ea7fb7a Binary files /dev/null and b/src/__pycache__/tracker_optimizer.cpython-39.pyc differ diff --git a/src/__pycache__/tracker_scheduler.cpython-312.pyc b/src/__pycache__/tracker_scheduler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4de571a4a22420c50e9c5f145b6d189f6f536a06 Binary files /dev/null and b/src/__pycache__/tracker_scheduler.cpython-312.pyc differ diff --git a/src/__pycache__/tracker_scheduler.cpython-39.pyc b/src/__pycache__/tracker_scheduler.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7bf8504e896fb888ee0eaee888c4f0654d2921c Binary files /dev/null and b/src/__pycache__/tracker_scheduler.cpython-39.pyc differ diff --git a/src/__pycache__/tradeoff_engine.cpython-312.pyc b/src/__pycache__/tradeoff_engine.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2d5c92f5c0c79f370b5069db351662d996830ae Binary files /dev/null and b/src/__pycache__/tradeoff_engine.cpython-312.pyc differ diff --git a/src/__pycache__/ts_predictor.cpython-312.pyc b/src/__pycache__/ts_predictor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..105ef2af53cda79c37eaa0b12395cc1e9e0fcf07 Binary files /dev/null and b/src/__pycache__/ts_predictor.cpython-312.pyc differ diff --git a/src/__pycache__/ts_predictor.cpython-39.pyc b/src/__pycache__/ts_predictor.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ebcc0fa824ef7109417f48d29ae2301fc24ec93 Binary files /dev/null and b/src/__pycache__/ts_predictor.cpython-39.pyc differ diff --git a/src/__pycache__/utils.cpython-39.pyc b/src/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bafa1a4369105d8a63680e1e3dede529491ca66 Binary files /dev/null and b/src/__pycache__/utils.cpython-39.pyc differ diff --git a/src/__pycache__/vine_3d_scene.cpython-39.pyc b/src/__pycache__/vine_3d_scene.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acb02bdf7c45062199bf257920b83ef9df530e80 Binary files /dev/null and b/src/__pycache__/vine_3d_scene.cpython-39.pyc differ diff --git a/src/__pycache__/vineyard_chatbot.cpython-312.pyc b/src/__pycache__/vineyard_chatbot.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c2843817577a95bbf2f92599d991bc02bb86128 Binary files /dev/null and b/src/__pycache__/vineyard_chatbot.cpython-312.pyc differ diff --git a/src/__pycache__/vineyard_chatbot.cpython-39.pyc b/src/__pycache__/vineyard_chatbot.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c2d9b44fe1be298ea03f398bb798bcdf717a9d6 Binary files /dev/null and b/src/__pycache__/vineyard_chatbot.cpython-39.pyc differ diff --git a/src/advisor/__pycache__/__init__.cpython-312.pyc b/src/advisor/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df54f9040cca1efc4dae63151d86fca2bdf8d900 Binary files /dev/null and b/src/advisor/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/advisor/__pycache__/__init__.cpython-39.pyc b/src/advisor/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5410721b63a1c5a502f393b61b37df83443a9929 Binary files /dev/null and b/src/advisor/__pycache__/__init__.cpython-39.pyc differ diff --git a/src/advisor/__pycache__/day_ahead_advisor.cpython-312.pyc b/src/advisor/__pycache__/day_ahead_advisor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a24d7be090b8de925f5aa678336f4e9fd2ef7068 Binary files /dev/null and b/src/advisor/__pycache__/day_ahead_advisor.cpython-312.pyc differ diff --git a/src/advisor/__pycache__/day_ahead_advisor.cpython-39.pyc b/src/advisor/__pycache__/day_ahead_advisor.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a16d83954fb87d3d0a3e6d444c9437389ddc720f Binary files /dev/null and b/src/advisor/__pycache__/day_ahead_advisor.cpython-39.pyc differ diff --git a/src/chatbot/__pycache__/__init__.cpython-312.pyc b/src/chatbot/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..248014ff4c4f1f020b17c08b3db3352bc9ad4c3d Binary files /dev/null and b/src/chatbot/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/chatbot/__pycache__/__init__.cpython-39.pyc b/src/chatbot/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc8ee368657fe0793c0096797ffcbd9d725d4d6b Binary files /dev/null and b/src/chatbot/__pycache__/__init__.cpython-39.pyc differ diff --git a/src/chatbot/__pycache__/feedback.cpython-312.pyc b/src/chatbot/__pycache__/feedback.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d9ee7d35a77ced4f03758357f4e7ffeef673d05 Binary files /dev/null and b/src/chatbot/__pycache__/feedback.cpython-312.pyc differ diff --git a/src/chatbot/__pycache__/guardrails.cpython-312.pyc b/src/chatbot/__pycache__/guardrails.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4e3dd4a0857f58568885ef5f33fbaa4bbafe43e Binary files /dev/null and b/src/chatbot/__pycache__/guardrails.cpython-312.pyc differ diff --git a/src/chatbot/__pycache__/guardrails.cpython-39.pyc b/src/chatbot/__pycache__/guardrails.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26070944e7282a365d85bd7d92c6f87cb7bb3f78 Binary files /dev/null and b/src/chatbot/__pycache__/guardrails.cpython-39.pyc differ diff --git a/src/chatbot/__pycache__/llm_data_engineer.cpython-39.pyc b/src/chatbot/__pycache__/llm_data_engineer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c1c59a9ee511247ce2ad9a66c1a1c316575591a Binary files /dev/null and b/src/chatbot/__pycache__/llm_data_engineer.cpython-39.pyc differ diff --git a/src/chatbot/__pycache__/routing_agent.cpython-312.pyc b/src/chatbot/__pycache__/routing_agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56ac0fcc3862028dd71735d24020f4694cd60ba2 Binary files /dev/null and b/src/chatbot/__pycache__/routing_agent.cpython-312.pyc differ diff --git a/src/chatbot/__pycache__/routing_agent.cpython-39.pyc b/src/chatbot/__pycache__/routing_agent.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fcc888b05bef7c74d3d1a6a1888a33c5f723e63 Binary files /dev/null and b/src/chatbot/__pycache__/routing_agent.cpython-39.pyc differ diff --git a/src/chatbot/__pycache__/vineyard_chatbot.cpython-312.pyc b/src/chatbot/__pycache__/vineyard_chatbot.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40fa2a4f1cfa990a92f084d921a88d0fcae4136f Binary files /dev/null and b/src/chatbot/__pycache__/vineyard_chatbot.cpython-312.pyc differ diff --git a/src/chatbot/__pycache__/vineyard_chatbot.cpython-39.pyc b/src/chatbot/__pycache__/vineyard_chatbot.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98e4cca567ca9a7fd50925d65ec42cd28b20537f Binary files /dev/null and b/src/chatbot/__pycache__/vineyard_chatbot.cpython-39.pyc differ diff --git a/src/data/__pycache__/__init__.cpython-312.pyc b/src/data/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c030c3bd45c0fcd7eae3c5b925936095d2d548a Binary files /dev/null and b/src/data/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/data/__pycache__/__init__.cpython-39.pyc b/src/data/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90cb02937f0a03c7aba8d13fd063a11c1721845e Binary files /dev/null and b/src/data/__pycache__/__init__.cpython-39.pyc differ diff --git a/src/data/__pycache__/data_providers.cpython-312.pyc b/src/data/__pycache__/data_providers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9816f0f50fc8598bccbc7ec1f97a32c5fe89bfc4 Binary files /dev/null and b/src/data/__pycache__/data_providers.cpython-312.pyc differ diff --git a/src/data/__pycache__/data_providers.cpython-39.pyc b/src/data/__pycache__/data_providers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40c7b1fe1d0d16aaadcd82f66466ec409798435a Binary files /dev/null and b/src/data/__pycache__/data_providers.cpython-39.pyc differ diff --git a/src/data/__pycache__/data_schema.cpython-39.pyc b/src/data/__pycache__/data_schema.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3d74469c1635a913b4716dd38094528a13c8de2 Binary files /dev/null and b/src/data/__pycache__/data_schema.cpython-39.pyc differ diff --git a/src/data/__pycache__/ims_client.cpython-312.pyc b/src/data/__pycache__/ims_client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a2ff0e22b37ad3d06297e50c441a766eb04a4a5 Binary files /dev/null and b/src/data/__pycache__/ims_client.cpython-312.pyc differ diff --git a/src/data/__pycache__/ims_client.cpython-39.pyc b/src/data/__pycache__/ims_client.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8051fdc2724296dc479bbf443d726925303c8628 Binary files /dev/null and b/src/data/__pycache__/ims_client.cpython-39.pyc differ diff --git a/src/data/__pycache__/redis_cache.cpython-312.pyc b/src/data/__pycache__/redis_cache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4278e09e7e3c1dd6dbb475a0efe4b02357120b6 Binary files /dev/null and b/src/data/__pycache__/redis_cache.cpython-312.pyc differ diff --git a/src/data/__pycache__/sensor_data_loader.cpython-312.pyc b/src/data/__pycache__/sensor_data_loader.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aeee83cf9be4593dccb89ac09ff2a7c9d5752589 Binary files /dev/null and b/src/data/__pycache__/sensor_data_loader.cpython-312.pyc differ diff --git a/src/data/__pycache__/sensor_data_loader.cpython-39.pyc b/src/data/__pycache__/sensor_data_loader.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f14c97a2ccbe438e07930b07535adb0cd141b0a Binary files /dev/null and b/src/data/__pycache__/sensor_data_loader.cpython-39.pyc differ diff --git a/src/data/__pycache__/thingsboard_client.cpython-312.pyc b/src/data/__pycache__/thingsboard_client.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de1bdbb78338793578be35252553fa7a928bf8cf Binary files /dev/null and b/src/data/__pycache__/thingsboard_client.cpython-312.pyc differ diff --git a/src/data/__pycache__/thingsboard_client.cpython-39.pyc b/src/data/__pycache__/thingsboard_client.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f8e9bedf6d1bc4c0ed47645521c5eeb41a9ffcb Binary files /dev/null and b/src/data/__pycache__/thingsboard_client.cpython-39.pyc differ diff --git a/src/forecasting/__pycache__/__init__.cpython-39.pyc b/src/forecasting/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c8efad3b4fda66479395cef605866bd6bf53248 Binary files /dev/null and b/src/forecasting/__pycache__/__init__.cpython-39.pyc differ diff --git a/src/forecasting/__pycache__/chronos_forecaster.cpython-39.pyc b/src/forecasting/__pycache__/chronos_forecaster.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bcf8de0e581512be0d6ffaff7ea29aaf75c0c7f Binary files /dev/null and b/src/forecasting/__pycache__/chronos_forecaster.cpython-39.pyc differ diff --git a/src/forecasting/__pycache__/preprocessor.cpython-39.pyc b/src/forecasting/__pycache__/preprocessor.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..834efd94840dd9e402216827091f7fb9b0d87948 Binary files /dev/null and b/src/forecasting/__pycache__/preprocessor.cpython-39.pyc differ diff --git a/src/forecasting/__pycache__/time_features.cpython-39.pyc b/src/forecasting/__pycache__/time_features.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..959bb70dcadf385f05b686ddc5efabd87defc2de Binary files /dev/null and b/src/forecasting/__pycache__/time_features.cpython-39.pyc differ diff --git a/src/genai/__pycache__/__init__.cpython-312.pyc b/src/genai/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b74d5e0e704224d6a0790bbc969941c7e9b2db2e Binary files /dev/null and b/src/genai/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/__pycache__/__init__.cpython-39.pyc b/src/genai/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09d7b9a4ea7f1e36a67d05800a02ae6c637a537d Binary files /dev/null and b/src/genai/__pycache__/__init__.cpython-39.pyc differ diff --git a/src/genai/__pycache__/utils.cpython-312.pyc b/src/genai/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5e5e2d58ad6c1f1cafa6383a5d679fbb9a3322c Binary files /dev/null and b/src/genai/__pycache__/utils.cpython-312.pyc differ diff --git a/src/genai/__pycache__/utils.cpython-39.pyc b/src/genai/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..479c73d1aaddac42a903c1becd3b03da90eea9ab Binary files /dev/null and b/src/genai/__pycache__/utils.cpython-39.pyc differ diff --git a/src/models/__pycache__/__init__.cpython-312.pyc b/src/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d804d6d07ccdf7f70f919e54515a5254e3dac316 Binary files /dev/null and b/src/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/models/__pycache__/__init__.cpython-39.pyc b/src/models/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02801938cea480369c2ebe01345a0407945d1b86 Binary files /dev/null and b/src/models/__pycache__/__init__.cpython-39.pyc differ diff --git a/src/models/__pycache__/canopy_photosynthesis.cpython-312.pyc b/src/models/__pycache__/canopy_photosynthesis.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9024897032371f675e46e82e54c0dbc5c71f8ee Binary files /dev/null and b/src/models/__pycache__/canopy_photosynthesis.cpython-312.pyc differ diff --git a/src/models/__pycache__/canopy_photosynthesis.cpython-39.pyc b/src/models/__pycache__/canopy_photosynthesis.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d137ca7012471dd3619fe38d7db800d2a33888c Binary files /dev/null and b/src/models/__pycache__/canopy_photosynthesis.cpython-39.pyc differ diff --git a/src/models/__pycache__/farquhar_model.cpython-312.pyc b/src/models/__pycache__/farquhar_model.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2282dcaa7a12d3ebfa6c5389bb1d7e778a797f54 Binary files /dev/null and b/src/models/__pycache__/farquhar_model.cpython-312.pyc differ diff --git a/src/models/__pycache__/farquhar_model.cpython-39.pyc b/src/models/__pycache__/farquhar_model.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2309ebfbd252454fe8b2c4bb7accd2eb25764c9 Binary files /dev/null and b/src/models/__pycache__/farquhar_model.cpython-39.pyc differ diff --git a/src/models/__pycache__/phenology.cpython-312.pyc b/src/models/__pycache__/phenology.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..199b1d7812d23644ae14910cab99928b2a647708 Binary files /dev/null and b/src/models/__pycache__/phenology.cpython-312.pyc differ diff --git a/src/models/__pycache__/phenology.cpython-39.pyc b/src/models/__pycache__/phenology.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd9e2062d9892e471f20ccdde40c2e71e7f9a43f Binary files /dev/null and b/src/models/__pycache__/phenology.cpython-39.pyc differ diff --git a/src/shading/__pycache__/__init__.cpython-312.pyc b/src/shading/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e52ef481df597b5509d298d1ceb3641ebad34fa Binary files /dev/null and b/src/shading/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/shading/__pycache__/__init__.cpython-39.pyc b/src/shading/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53ded97dfb4cbb7cd7a37e8dc8a8e14d7b1bdd14 Binary files /dev/null and b/src/shading/__pycache__/__init__.cpython-39.pyc differ diff --git a/src/shading/__pycache__/solar_geometry.cpython-312.pyc b/src/shading/__pycache__/solar_geometry.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b26803d2148ddc75b44b58275074acabd34d56be Binary files /dev/null and b/src/shading/__pycache__/solar_geometry.cpython-312.pyc differ diff --git a/src/shading/__pycache__/solar_geometry.cpython-39.pyc b/src/shading/__pycache__/solar_geometry.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1301b5bc016161b09458b8d5adb26aaccb99a79 Binary files /dev/null and b/src/shading/__pycache__/solar_geometry.cpython-39.pyc differ diff --git a/src/shading/__pycache__/tracker_optimizer.cpython-312.pyc b/src/shading/__pycache__/tracker_optimizer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4343dfc7ad7924ecdb8a7ef62be5c3fd6e8d1e4 Binary files /dev/null and b/src/shading/__pycache__/tracker_optimizer.cpython-312.pyc differ diff --git a/src/shading/__pycache__/tracker_optimizer.cpython-39.pyc b/src/shading/__pycache__/tracker_optimizer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d53e1c4d07368b59c58fe96541ff4c43eae6662 Binary files /dev/null and b/src/shading/__pycache__/tracker_optimizer.cpython-39.pyc differ