Initial implementation: Bordanlage boat onboard system

Complete multiroom audio + navigation dashboard:
- Docker stack: SignalK, Snapcast (4 zones), librespot, shairport-sync, Mopidy, Jellyfin, Portainer
- React 18 + Vite dashboard with nautical dark theme
- Full mock system (SignalK NMEA simulation, Snapcast zones, Mopidy player)
- Real API clients for all services with reconnect logic
- SVG instruments: Compass, WindRose, Gauge, DepthSounder, SpeedLog
- Pages: Overview, Navigation, Audio (zones/radio/library), Systems
- Dev mode runs fully without hardware (make dev)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-26 11:47:33 +01:00
commit 946c0a5377
57 changed files with 3450 additions and 0 deletions

125
bordanlage/README.md Normal file
View File

@@ -0,0 +1,125 @@
# Bordanlage Boat Onboard System
A complete multiroom audio + navigation dashboard system for boats.
Runs on any Docker-capable computer fully simulated in dev mode (no hardware needed).
---
## Prerequisites
- [Docker Desktop](https://www.docker.com/products/docker-desktop/) (or Docker Engine + Compose)
- `make`
- For Spotify Connect: a Spotify Premium account
---
## Quick Start
```bash
cd bordanlage
make dev
```
Dashboard: **http://localhost:8080**
---
## Service URLs
| Service | URL | Description |
|---------------|------------------------------|------------------------------|
| Dashboard | http://localhost:8080 | Main touch UI |
| SignalK | http://localhost:3000 | Navigation data + chart viewer |
| Mopidy/Iris | http://localhost:6680/iris/ | Music player UI |
| Snapcast Web | http://localhost:1780 | Multiroom audio control |
| Jellyfin | http://localhost:8096 | Media library |
| Portainer | http://localhost:9000 | Docker management |
---
## Spotify Connect
1. Run `make dev` (or `make boot` on the boat)
2. Open Spotify on your phone/computer
3. Tap the device icon (bottom right) → look for **"Bordanlage"**
4. If it doesn't appear automatically: Go to **Connect to a Device** → enter the IP of the host machine manually
> On Linux (boat): set `network_mode: host` for the `librespot` service in `docker-compose.yml` for reliable mDNS discovery.
---
## AirPlay
1. Ensure the `shairport` container is running
2. On your iPhone/Mac: open Control Center → tap AirPlay → select **"Bordanlage AirPlay"**
> On Mac: AirPlay works natively via Bonjour.
> On Windows WSL2: the `avahi` container in `docker-compose.dev.yml` handles mDNS.
---
## Adding Music
Drop audio files into `./music/`. Mopidy and Jellyfin both mount this directory.
Trigger a Mopidy library scan:
```bash
curl -s http://localhost:6680/mopidy/rpc -d '{"jsonrpc":"2.0","id":1,"method":"local.scan"}' \
-H "Content-Type: application/json"
```
For Jellyfin: open http://localhost:8096 → Settings → Libraries → Scan.
---
## Connecting Real NMEA Hardware
Edit `docker-compose.yml` and uncomment the `signalk` device section:
```yaml
signalk:
devices:
- /dev/ttyUSB0:/dev/ttyUSB0 # NMEA 0183 via USB-Serial
```
Then configure the NMEA connection in SignalK at http://localhost:3000 → Server → Connections.
For NMEA 2000: use a Yacht Devices YDNU-02 or similar USB gateway.
---
## Migration to Real Boat
Changes needed in `docker-compose.yml`:
1. **Audio output per zone**: add `--soundcard hw:N,0` to each `zone-*` command and uncomment `/dev/snd`
2. **Spotify/AirPlay discovery**: set `network_mode: host` for `librespot` and `shairport`
3. **Hardware video decoding** (optional): uncomment `/dev/dri` in `jellyfin`
4. **NMEA hardware**: uncomment `/dev/ttyUSB0` in `signalk`
5. Set `DEV=false` in `.env`
Run `make boot` instead of `make dev`.
---
## Troubleshooting
**Spotify device not showing up on Mac:**
- Ensure port 57621 (UDP+TCP) is accessible. Docker Desktop on Mac sometimes blocks UDP.
- Try connecting manually: Spotify → "Connect to a Device" → "Connect to [IP]"
**AirPlay not visible on Windows:**
- The `avahi` container requires D-Bus. Run Docker Desktop with host networking or use WSL2.
**Snapcast zones show as offline:**
- Audio pipes must exist before snapserver starts. Run `make pipes` or `bash scripts/init-pipes.sh`
**Mopidy won't start:**
- Check `docker compose logs mopidy`. The custom Dockerfile installs plugins on first build; rebuild with `make rebuild`
**Dashboard shows "No signal":**
- In dev mode this is normal until mock data initializes (12 seconds)
- In production: check that SignalK is running and the WebSocket URL is correct in `.env`
**Port conflicts:**
- Edit the port mappings in `docker-compose.yml` or `docker-compose.dev.yml`