{"id":49579350,"url":"https://github.com/zakusworo/solara-optima-platform","last_synced_at":"2026-05-03T18:36:35.628Z","repository":{"id":352444496,"uuid":"1215160747","full_name":"zakusworo/solara-optima-platform","owner":"zakusworo","description":"Unit Commitment \u0026 Economic Dispatch Optimization with Solar PV, Battery Storage, and AI Forecasting for Indonesian Energy Markets | Bandung, Indonesia","archived":false,"fork":false,"pushed_at":"2026-04-19T16:38:00.000Z","size":257,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-19T17:29:31.621Z","etag":null,"topics":["bandung","economic-dispatch","energy-storage","fastapi","indonesia","milp","ollama","optimization","pvlib","renewable-energy","solar-pv","unit-commitment"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zakusworo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-19T15:03:33.000Z","updated_at":"2026-04-19T16:38:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zakusworo/solara-optima-platform","commit_stats":null,"previous_names":["zakusworo/solara-optima-platform"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/zakusworo/solara-optima-platform","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakusworo%2Fsolara-optima-platform","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakusworo%2Fsolara-optima-platform/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakusworo%2Fsolara-optima-platform/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakusworo%2Fsolara-optima-platform/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zakusworo","download_url":"https://codeload.github.com/zakusworo/solara-optima-platform/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zakusworo%2Fsolara-optima-platform/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32580243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bandung","economic-dispatch","energy-storage","fastapi","indonesia","milp","ollama","optimization","pvlib","renewable-energy","solar-pv","unit-commitment"],"created_at":"2026-05-03T18:36:29.963Z","updated_at":"2026-05-03T18:36:35.618Z","avatar_url":"https://github.com/zakusworo.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Solara Optima Platform\n\n**AI-Enhanced Unit Commitment \u0026 Economic Dispatch for Renewable-Integrated Power Systems**\n\n[![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/)\n[![FastAPI](https://img.shields.io/badge/FastAPI-0.109+-009688.svg)](https://fastapi.tiangolo.com/)\n[![React](https://img.shields.io/badge/React-18+-61DAFB.svg)](https://react.dev/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.19653510.svg)](https://doi.org/10.5281/zenodo.19653510)\n\nA modern platform for **Unit Commitment \u0026 Economic Dispatch (UC/ED)** optimization with deep integration of **solar PV forecasting**, **battery storage scheduling**, and **multi-agent AI forecasting**. Built specifically for Indonesian energy markets with real-time pvlib physics-based generation modeling and Ollama-powered LLM agents.\n\n**Live Demo**: https://github.com/zakusworo/solara-optima-platform\n\n---\n\n## Highlights\n\n- **MILP Solver** (PuLP) for mixed-integer optimal dispatch with generator constraints, ramp rates, min uptime/downtime\n- **pvlib Integration** for physics-based solar generation forecasting using real meteorological data\n- **PV Module Database** with 10,000+ CEC modules — search, filter, and auto-scale plant capacity by module selection\n- **Battery Storage (BESS)** with binary charge/discharge mode, SOC tracking, and efficiency losses\n- **Multi-Agent AI Forecasting** via Ollama LLMs for load and solar prediction\n- **Auto Geolocation** — browser GPS → OpenStreetMap reverse geocoding → fallback to backend config\n- **Hourly Load Profile Editor** with live totals, peak/average stats, and interactive visual feedback\n- **Indonesian Market Mode** with IDR currency, PLN tariff structures, and carbon pricing\n\n---\n\n## Features\n\n### Core Optimization (MILP)\n\n| Feature | Description |\n|---------|-------------|\n| **UC/ED Solver** | MILP formulation via PuLP — schedules generator on/off and dispatch levels |\n| **Generator Constraints** | Min/max output, ramp-up/down limits, min uptime/downtime, startup/shutdown costs |\n| **Solar PV Dispatch** | Forecasted solar generation injected as negative load into UC/ED |\n| **BESS Scheduling** | Binary mode charge/discharge with SOC dynamics and round-trip efficiency |\n| **Reserve Requirements** | Spinning, operating, and uncertainty reserves enforced per period |\n| **Multi-Period Rolling Horizon** | 24h+ optimization with time-of-use tariff awareness |\n\n### Solar PV Forecasting\n\n| Feature | Description |\n|---------|-------------|\n| **pvlib Physics Engine** | Position-of-sun, irradiance transposition, temperature derating, DC-DC modeling |\n| **Location-Aware** | Defaults to Bandung, Indonesia (-6.9147 S, 107.6098 E, 768 m) with auto browser geolocation fallback |\n| **Southern Hemisphere Optimized** | Azimuth 0 = North-facing (correct for Indonesia) |\n| **Override Parameters** | Query-time overrides for latitude, longitude, altitude, tilt, azimuth |\n| **Weather Integration** | Real-time/past weather data via pvlib/pandas TMY data |\n| **Hourly Resolution** | Up to 168h forecast horizon |\n\n### PV Module Database\n\n| Feature | Description |\n|---------|-------------|\n| **CEC Module Cache** | 10,000+ commercial PV modules cached locally from CEC/Sandia databases |\n| **Search \u0026 Filter** | By manufacturer, technology (Mono/Multi/CdTe), power range, text search |\n| **Module Selection** | Click-to-select from browsable table; auto-suggests plant capacity based on module wattage |\n| **Manual Entry** | Override with custom STC/PTC, efficiency, Vmp, Imp, temperature coefficients |\n| **Auto-Scaling** | Enter desired plant capacity (kW) — frontend calculates module count and total output |\n\n### AI Forecasting Agents\n\n| Feature | Description |\n|---------|-------------|\n| **Ollama Integration** | Local LLM agents (Qwen3.5, accessible via `/api/v1/ai/*`) |\n| **Load Forecasting** | LLM-based pattern recognition on historical load data |\n| **Solar Forecasting** | AI-augmented correction to physics-based pvlib forecasts |\n| **Fallback Mode** | Graceful degradation to statistical methods when Ollama unavailable |\n\n### Frontend UX\n\n| Feature | Description |\n|---------|-------------|\n| **Auto Location Detection** | `navigator.geolocation` → Nominatim reverse geocode → backend fallback |\n| **Hourly Load Editor** | 24 editable cells with live daily totals, peak, and average kW |\n| **Interactive Plotly Charts** | Generation forecasts, load profiles, dispatch schedules, temperature curves |\n| **Responsive Layout** | Tailwind CSS with mobile sidebar, presentation-mode typography |\n| **Real-Time Status** | Generation status, cost summaries, capacity factors |\n\n---\n\n## Architecture\n\n```\n                    +------------------+\n                    |   React + Vite   |\n                    |   (Frontend)     |\n                    +--------+---------+\n                             |\n           +-----------------+------------------+\n           |                                    |\n    +------v-------+     +----------+     +------v-------+\n    |   Plotly     |     |  Axios   |     |  Leaflet   |\n    |  Charts      |     |  REST    |     |   Map      |\n    +--------------+     +----+-----+     +------------+\n                              |\n                    +---------v-----------+\n                    |    FastAPI (8000)   |\n                    |    Python Backend   |\n                    +----+----------+-----+\n                         |          |\n            +------------+          +------------+\n            |                                    |\n     +------v-------+                    +------v-------+\n     |   UC/ED      |                    |  Solar/Weather |\n     |   Optimizer  |                    |  Forecasting   |\n     |   (PuLP)     |                    |  (pvlib)       |\n     +--------------+                    +------+---------+\n                                                |\n                                   +------------+------------+\n                                   |                         |\n                            +------v-----+           +------v------+\n                            |    CEC     |           |   Ollama    |\n                            |  Module DB |           |   (LLMs)    |\n                            +------------+           +-------------+\n```\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|------------|\n| **Backend** | FastAPI, Pydantic, Uvicorn |\n| **Optimization** | PuLP (CBC), NumPy, SciPy |\n| **Solar Physics** | pvlib, pandas, requests |\n| **AI/ML** | Ollama (local LLMs), scikit-learn, Prophet |\n| **Frontend** | React 18, TypeScript, Vite |\n| **Visualization** | Plotly.js, Recharts, Leaflet |\n| **Styling** | Tailwind CSS, Radix UI, Lucide icons |\n| **State** | Zustand, React Query |\n\n---\n\n## API Endpoints\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `POST` | `/api/v1/optimize/run` | Run UC/ED optimization |\n| `POST` | `/api/v1/optimize/run-with-solar` | UC/ED with auto solar forecast |\n| `GET`  | `/api/v1/optimize/status` | Solver config \u0026 availability |\n| `GET`  | `/api/v1/forecast/solar` | Solar generation forecast (pvlib) |\n| `GET`  | `/api/v1/forecast/load` | Statistical load forecast |\n| `GET`  | `/api/v1/ai/load` | AI/LLM load forecast |\n| `GET`  | `/api/v1/pv/modules/search` | Search CEC PV module database |\n| `GET`  | `/api/v1/pv/modules/{name}` | PV module detail |\n| `GET`  | `/api/v1/weather/current` | Current weather data |\n| `GET`  | `/api/v1/location/current` | Backend default location config |\n| `POST` | `/api/v1/generators` | Manage generator fleet |\n\n---\n\n## Quick Start\n\n### Prerequisites\n- Python 3.10+\n- Node.js 18+\n- Ollama (optional, for AI forecasting)\n\n### Backend\n```bash\ncd backend\npython -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\nuvicorn app.main:app --reload --host 0.0.0.0 --port 8000\n```\n\n### Frontend\n```bash\ncd frontend\nnpm install\nnpm run dev        # Vite dev server on :5173\n```\n\n### Ollama (optional)\n```bash\nollama pull qwen3.5        # Or any local model\nollama serve               # Must be running for AI features\n```\n\n---\n\n## Configuration\n\nEnvironment variables in `backend/.env`:\n\n```env\nLATITUDE=-6.9147\nLONGITUDE=107.6098\nALTITUDE=768\nTIMEZONE=Asia/Jakarta\nBASE_CURRENCY=IDR\nUSD_IDR_RATE=15500\nCARBON_PRICE=50000\nSOLVER_NAME=CBC\n```\n\n---\n\n## Project Structure\n\n```\nsolara-optima-platform/\n├── backend/\n│   ├── app/\n│   │   ├── api/               # REST endpoints (optimize, forecast, pv_modules, ai, weather, location)\n│   │   ├── core/              # Config, logging, security\n│   │   ├── models/            # Pydantic schemas\n│   │   ├── services/          # Optimizer, solar_forecast, pv_module_db, ai_forecast\n│   │   └── main.py            # FastAPI app factory\n│   ├── data/\n│   │   ├── cec_modules_cache.json          # 10K+ CEC module specs\n│   │   ├── cec_modules_timestamp.txt        # Cache freshness marker\n│   │   ├── load_profiles/      # Sample daily profiles\n│   │   └── weather/            # TMY data files\n│   ├── tests/\n│   └── requirements.txt\n├── frontend/\n│   ├── src/\n│   │   ├── pages/             # Dashboard, Optimization, SolarForecast, Generators, Settings\n│   │   ├── components/        # Layout, LocationMap\n│   │   ├── App.tsx\n│   │   └── main.tsx\n│   └── package.json\n├── docs/\n│   └── screenshot-dashboard.png\n├── docker-compose.yml\n├── LICENSE\n└── README.md\n```\n\n---\n\n## Screenshots\n\n### Dashboard\n![Dashboard](docs/screenshot-dashboard.png)\n\n### Solar Forecast with PV Module Selection\nBrowse 10,000+ CEC modules, filter by manufacturer/technology, and auto-scale plant capacity.\n\n### Optimization with Hourly Load Editor\n24-cell editable load profile with live kWh totals and interactive Plotly charting.\n\n---\n\n## Recent Updates\n\n| Date | Change |\n|------|--------|\n| **Apr 2026** | PV Module Database: CEC search + filter + manual entry + auto-scaling |\n| **Apr 2026** | Auto geolocation: browser GPS → Nominatim → backend fallback |\n| **Apr 2026** | Hourly load profile editor with live stats on Optimization page |\n| **Apr 2026** | BESS binary charge/discharge mode fix, SOC constraint scaling |\n| **Apr 2026** | Solar forecast unit fixes (kW/kWh consistency, no double divide-by-1000) |\n| **Apr 2026** | Altitude override param added to forecast API |\n| **Apr 2026** | Frontend presentation-mode typography and sidebar sizing |\n| Apr 2026 | Location map + geocoding integration |\n| Apr 2026 | Blue-themed dashboard UI |\n| v1.0.0 | Initial release — UC/ED MILP, pvlib forecasting, Ollama AI |\n\n---\n\n## License\n\nMIT License — see [LICENSE](./LICENSE)\n\n## Author\n\n**Zulfikar Aji Kusworo**  \nGitHub: [@zakusworo](https://github.com/zakusworo)  \nEmail: greataji13@gmail.com  \nAffiliation: Politeknik Energi dan Pertambangan Bandung, Indonesia  \nDOI: [10.5281/zenodo.19653510](https://doi.org/10.5281/zenodo.19653510)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzakusworo%2Fsolara-optima-platform","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzakusworo%2Fsolara-optima-platform","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzakusworo%2Fsolara-optima-platform/lists"}