Smart Swimming Pool is an open-source project to automate your swimming pool using home automation. Control circulation, heating, and monitoring β all from your smartphone.
π Website: smart-swimmingpool.com
| Module | Description |
|---|---|
| Pool Controller | ESP8266-based control unit with Home Assistant MQTT discovery. The smart brain of your pool. |
| openHAB Configuration | Sitemap and rules to control your pool via openHAB mobile app. |
| Pool Monitor | Solar-powered wireless temperature display for your pool. |
| Grafana Dashboard | Visualize pool data with a beautiful Grafana dashboard. |
- β Automated circulation for water cleaning
- β Solar-powered ecological temperature control
- β Open Source (MIT License)
- β Works with Home Assistant (MQTT discovery)
- β Works without permanent WiFi connection
- β Modular and extensible
Head over to the Getting Started guide to set up your smart swimming pool.
We welcome contributions! Here's how to get started with developing the website locally.
- Hugo (extended) v0.162.1 or later β Install Hugo
- Python 3.x β required for the documentation merge script (
grabrepos.py) - Git β with submodule support
# 1. Clone the repository with submodules (for the theme)
git clone --recursive https://github.com/smart-swimmingpool/website.git
cd website
# 2. (Optional) Create a Python virtual environment and install dependencies
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -r requirements.txt
# 3. Start the Hugo development server with live reload
hugo server -DThe site will be available at http://localhost:1313. Changes to content, layouts, and config are reflected immediately.
βββ assets/ # CSS, JS, images (processed by Hugo)
βββ content/ # Page content in Markdown
β βββ docs/ # Documentation pages
β β βββ pool-controller/ # Generated by grabrepos.py (gitignored)
β β βββ openhab-configuration/ # Generated by grabrepos.py (gitignored)
β β βββ grafana-dashboard/ # Generated by grabrepos.py (gitignored)
β β βββ pool-monitor/ # Generated by grabrepos.py (gitignored)
β βββ _index.md # Home page (English)
β βββ _index.de.md # Home page (German)
βββ docs/ # GitHub-published docs (trigger-website-rebuild)
βββ i18n/ # Translation files
βββ layouts/ # Custom Hugo templates
βββ static/ # Static files (images, CNAME, etc.)
βββ temp/ # gitignored, auto-created by grabrepos.py
βββ themes/hextra/ # Hextra theme (git submodule)
βββ grabrepos.py # Script to merge module documentation
βββ hugo.yaml # Hugo configuration
βββ multiversion.yml # Multi-version content configuration
βββ .opencode/ # Opencode AI agent skill definitions (internal)
| Task | Command |
|---|---|
| Start dev server | hugo server -D |
| Build for production | hugo --minify |
| Clean build cache | hugo --cleanDestinationDir |
| Merge module docs | python grabrepos.py |
| Update theme | git submodule update --remote themes/hextra |
- Fork the repository on GitHub
- Create a branch with a descriptive name (e.g.
fix/typo-in-docs,feat/new-contributor-guide) - Make your changes and test locally with
hugo server -D - Commit with a clear message describing what and why
- Open a Pull Request against the
mainbranch
- Markdown: Wrap lines at ~80 characters for readability. Use semantic line breaks.
- Front matter: Use YAML format. Required fields:
title,date(if dated content). - Images: Place in
static/img/and reference with/img/...in Markdown. Optimize images before committing. - Translations: German pages (
*.de.md) should mirror the English version's structure. Update both when adding or changing content.
The website pulls documentation from separate module repositories (pool-controller, openhab-config, grafana-dashboard, monitor) via grabrepos.py. The build process:
- Reads
multiversion.ymlto find which repos to include and their file patterns - Clones (or fetches) each repo into
temp/ - For each
.mdfile matching the pattern:- Extracts YAML frontmatter (title, tags, date, etc.) and preserves it
_index.mdfiles are always written as landing pages- Other files are split by
##headings (files without any headings are skipped) - Writes to
content/docs/{modulename}/with combined frontmatter
- Generated module docs are gitignored β never committed to the repo
- No
##headings in_index.md: Always written regardless (landing pages) - Malformed YAML (e.g.
summary:Γberwacheβ missing space after colon): Gracefully degraded β empty metadata, body still correctly extracted - Internal documents: Skipped when frontmatter has
noindex: true+private: true
| Trigger | Method |
|---|---|
Push to main |
GitHub Actions CI |
| Daily 6:00 UTC | Cron in deploy-hugo.yml |
| Module doc change | repository_dispatch doc_update |
| Manual | GitHub Actions β "Run workflow" |
π‘ For module maintainers: Add this workflow to your module repo to trigger a rebuild automatically when docs change:
# .github/workflows/trigger-website-rebuild.yml name: Trigger Website Rebuild on: push: branches: [main] paths: ["docs/**"] jobs: trigger: runs-on: ubuntu-latest steps: - name: Repository Dispatch uses: peter-evans/repository-dispatch@v3 with: token: ${{ secrets.WEBSITE_DISPATCH_TOKEN }} repository: smart-swimmingpool/website event-type: doc_updateA full step-by-step guide is available at
docs/trigger-website-rebuild.md(also available in German).
flowchart LR
A[Push / Cron / Dispatch] --> B[grabrepos.py]
B --> C[content/docs/ updated]
C --> D[hugo --minify]
D --> E[GitHub Pages deploy]
subgraph GitHub Actions
B
C
D
end
- Use
hugo server -D --navigateToChangedto automatically open the browser when editing content. - The Hextra theme is included as a git submodule. To preview theme changes, either submit them upstream or override templates in the
layouts/directory.
MIT β see LICENSE.
Made with β€οΈ by the Smart Swimming Pool community