%%{init: {
"theme": "base",
"themeVariables": {
"background": "#0d1117",
"mainBkg": "#111827",
"nodeBorder": "#1e3a5f",
"clusterBkg": "#0a0f1a",
"clusterBorder": "#1c2a3e",
"titleColor": "#e2e8f0",
"edgeLabelBackground": "#0d1117",
"lineColor": "#334155",
"primaryColor": "#111827",
"primaryTextColor": "#e2e8f0",
"primaryBorderColor": "#1e3a5f",
"secondaryColor": "#0f172a",
"tertiaryColor": "#0a0f1a",
"fontFamily": "Inter, sans-serif",
"fontSize": "14px"
}
}}%%
graph TB
subgraph CTRL[" HA + MA — Control Layer "]
direction LR
HA["🏠 Home Assistant\nAutomation · Dashboards · Scenes"]
MA["🎵 Music Assistant\nStreaming · Playlists · EQ"]
HA <-->|"Media Players API"| MA
end
U["🧑💻 User\nTerrace (outside building)"]
U -.->|"Web UI / VPN"| HA
subgraph Z1[" 📍 Living Room "]
direction TB
BR1["🔗 sendspin-bt-bridge\nRaspberry Pi 5"]
subgraph Z1AD["BT Adapters"]
direction LR
A1H0["ᛒ hci0"]
A1H1["ᛒ hci1"]
end
SP1["🔊 JBL Charge 5"]
SP2["🔊 Bose SoundLink Max"]
SP3["🔊 Sony SRS-XB43"]
SP4["🔊 Harman Kardon Aura"]
end
subgraph Z2[" 📍 Kitchen "]
direction TB
BR2["🔗 sendspin-bt-bridge\nRaspberry Pi 4"]
subgraph Z2AD["BT Adapters"]
direction LR
A2H0["ᛒ hci0"]
A2H1["ᛒ hci1"]
end
SP5["🔊 JBL Flip 6"]
SP6["🔊 UE Hyperboom"]
SP7["🔊 Anker Soundcore Motion"]
end
subgraph Z3[" 📍 Conference Room "]
direction TB
BR3["🔗 sendspin-bt-bridge\nMini PC / NUC"]
subgraph Z3AD["BT Adapters"]
direction LR
A3H0["ᛒ hci0"]
A3H1["ᛒ hci1"]
end
SP8["🔊 JBL PartyBox 110"]
SP9["🔊 Sonos Move 2"]
SP10["🔊 Bang & Olufsen A1"]
SP11["🔊 Marshall Emberton III"]
end
subgraph Z4[" 📍 Terrace "]
direction TB
BR4["🔗 sendspin-bt-bridge\nRaspberry Pi Zero 2W"]
subgraph Z4AD["BT Adapters"]
direction LR
A4H0["ᛒ hci0"]
end
SP12["🔊 Ultimate Ears Epicboom"]
SP13["🔊 JBL Xtreme 3"]
end
%% MA → Bridges (each bridge = independent MA player)
MA -->|"Player: Living Room"| BR1
MA -->|"Player: Kitchen"| BR2
MA -->|"Player: Conference"| BR3
MA -->|"Player: Terrace"| BR4
%% Bridge → Adapters
BR1 --> A1H0
BR1 --> A1H1
BR2 --> A2H0
BR2 --> A2H1
BR3 --> A3H0
BR3 --> A3H1
BR4 --> A4H0
%% Adapters → Speakers
A1H0 --> SP1
A1H0 --> SP2
A1H1 --> SP3
A1H1 --> SP4
A2H0 --> SP5
A2H0 --> SP6
A2H1 --> SP7
A3H0 --> SP8
A3H0 --> SP9
A3H1 --> SP10
A3H1 --> SP11
A4H0 --> SP12
A4H0 --> SP13
%% Node styles
classDef haStyle fill:#0c1f38,stroke:#18b0ff,stroke-width:2px,color:#93c5fd,rx:10
classDef maStyle fill:#13103a,stroke:#6366f1,stroke-width:2px,color:#a5b4fc,rx:10
classDef brStyle fill:#0a2030,stroke:#22d3ee,stroke-width:1.5px,color:#67e8f9,rx:8
classDef adStyle fill:#071c14,stroke:#10b981,stroke-width:1px,color:#6ee7b7,rx:6
classDef spStyle fill:#1a1200,stroke:#f59e0b,stroke-width:1px,color:#fcd34d,rx:6
classDef userStyle fill:#0b0f14,stroke:#94a3b8,stroke-width:1.5px,color:#e2e8f0,rx:10
class HA haStyle
class MA maStyle
class BR1,BR2,BR3,BR4 brStyle
class A1H0,A1H1,A2H0,A2H1,A3H0,A3H1,A4H0,A4H1 adStyle
class SP1,SP2,SP3,SP4,SP5,SP6,SP7,SP8,SP9,SP10,SP11,SP12,SP13 spStyle
class U userStyle