Automatically run household appliances (pool pump, EV charger, washing machine, …) when your solar panels are producing surplus energy.
Built for Raspberry Pi 4/5 (arm64), but runs on any Linux machine with Docker.
- Live dashboard — solar production, grid draw, surplus, running appliances
- 24 h power chart — see where your energy went
- Smart scheduling —
solar_only,solar_preferred,time_window, ormanualper appliance - Manual override — force any appliance on/off from the dashboard
- Multiple energy sources — KaKu P1 meter and/or SolarEdge cloud API
- Multiple plug types — KaKu ICS2000 smart plugs and Zigbee devices via Zigbee2MQTT
- Automatic updates — Watchtower polls ghcr.io and restarts containers on new releases
- HTTPS by default — Nginx with a self-signed certificate (or bring your own)
- mDNS — accessible at
https://solarsync.localon your home network, no IP needed
curl -fsSL https://raw.githubusercontent.com/Mel-Raeven/SolarSync-Power-Manager/main/solarsync/scripts/install.sh | bashNo configuration needed. The script runs fully automatically:
- Set the Pi's hostname to
solarsyncand enable mDNS (avahi-daemon) - Install Docker (if missing)
- Clone this repository to
~/solarsync - Auto-generate all internal secrets (
APP_KEY,INTERNAL_API_KEY, MQTT credentials) - Generate a self-signed TLS certificate (includes
solarsync.localas a SAN) - Pull the latest images from ghcr.io and start all services
Open https://solarsync.local in your browser. The first time you log in with admin / admin, you will be prompted to set your own username and password before you can access anything. After that, follow the onboarding wizard to connect your energy source and smart plugs.
Note:
solarsync.localworks on any device on the same home network. macOS, iOS, Android, Linux, and Windows 10 (build 1809+) / Windows 11 all support mDNS natively — no extra software needed.
git clone https://github.com/Mel-Raeven/SolarSync-Power-Manager.git ~/solarsync
cd ~/solarsync/solarsynccp .env.example .env
nano .envThe .env file only contains infrastructure-level settings. There are only a few you may want to change:
| Variable | Description |
|---|---|
ALLOWED_ORIGINS |
Hostname(s) you use to access the dashboard (e.g. https://solarsync.local) |
POLL_INTERVAL_SECONDS |
How often the solar engine runs (default: 300) |
Everything else is handled automatically:
APP_KEY— generated by the install scriptINTERNAL_API_KEY— generated by the install scriptMQTT_USERNAME/MQTT_PASSWORD— auto-generated random credentials- Web login credentials — set by the user on first login (default:
admin/admin, forced to change) - Energy source, hub credentials, and appliances — configured through the onboarding wizard in the web interface
If running without the install script, generate secrets manually:
openssl rand -base64 32forAPP_KEY,openssl rand -hex 32forINTERNAL_API_KEY.
bash scripts/generate-certs.shDevelopment (builds images locally):
docker compose up -dProduction (pulls from ghcr.io, includes Watchtower):
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -dIf you have a Zigbee USB adapter, start the Zigbee2MQTT service:
docker compose --profile zigbee up -dEdit zigbee2mqtt/configuration.yaml to set your USB device path and MQTT credentials.
Watchtower automatically checks ghcr.io every hour and restarts containers when a new image is available. No manual action required.
To update manually:
cd ~/solarsync
git pull
docker compose -f solarsync/docker-compose.yml -f solarsync/docker-compose.prod.yml pull
docker compose -f solarsync/docker-compose.yml -f solarsync/docker-compose.prod.yml up -dBrowser ──HTTPS──► Nginx (443)
│
┌──────────┴──────────┐
│ │
Laravel (PHP-FPM) FastAPI (Python)
UI + Auth Solar engine + REST API
│ │
└──────────┬──────────┘
│
SQLite (volume)
+ Mosquitto (MQTT broker)
+ Zigbee2MQTT (optional, --profile zigbee)
+ Watchtower (auto-updates from ghcr.io)
| Layer | Technology |
|---|---|
| Frontend | Laravel 11 + Blade + Tailwind CSS |
| Backend API | Python + FastAPI |
| Scheduler | APScheduler (inside FastAPI) |
| Database | SQLite via SQLModel |
| Auth | Laravel Sanctum (single household credential) |
| API Auth | Shared secret header (X-Internal-API-Key) between Laravel and FastAPI |
| MQTT | Eclipse Mosquitto (password-protected, internal network only) |
| Container | Docker Compose (arm64) |
| TLS | Nginx reverse proxy + self-signed cert |
| Auto-update | Watchtower |
- Merge changes to
main - Create and push a version tag:
git tag v1.2.3 git push origin v1.2.3
- GitHub Actions builds arm64 Docker images and pushes them to ghcr.io
- Watchtower on your Pi picks up the new
latesttag within the hour
- KaKu core — original ICS2000 Python library
Copyright (c) 2026. All rights reserved.
This software is proprietary and confidential. Unauthorized copying, distribution, modification, or use of this software, in whole or in part, is strictly prohibited.