83 lines
3.8 KiB
Markdown
83 lines
3.8 KiB
Markdown
# GL-S200 Thread Border Router Integration Plan
|
|
|
|
Planning notes for adding a GL.iNet GL-S200 as a Thread Border Router for Home Assistant on concord NUC.
|
|
|
|
## Device Overview
|
|
|
|
**GL-S200** ([product page](https://www.gl-inet.com/products/gl-s200/))
|
|
|
|
| Spec | Value |
|
|
|------|-------|
|
|
| CPU | QCA9531 @ 650 MHz |
|
|
| RAM / Flash | 128 MB DDR2 / 128 MB NAND |
|
|
| OS | GL.iNet firmware (OpenWrt 21.02, kernel 5.4) |
|
|
| Radios | Thread + BLE 5.0 + Wi-Fi 2.4 GHz b/g/n (150 Mbps) |
|
|
| Ports | 1x WAN, 1x LAN (10/100 Mbps) |
|
|
| Power | USB-C 5V / 2A |
|
|
| Role | Thread Border Router (OTBR) — not a Matter controller; Matter runs on top via python-matter-server already deployed on the NUC |
|
|
|
|
## Where to Plug It In
|
|
|
|
**Must land on the same L2 segment as Home Assistant.**
|
|
|
|
HA runs as a Docker container on `vish-concord-nuc` with `network_mode: host`. The NUC sits on `192.168.68.0/22` (gateway `192.168.68.1`) — **deliberately separated** from the main homelab LAN (`192.168.0.0/24`).
|
|
|
|
Thread/Matter border router discovery uses mDNS (`_meshcop._udp`), which is link-local. Cross-subnet discovery would require an mDNS reflector (not currently deployed). So:
|
|
|
|
- ✅ Plug S200 WAN into a switch/AP on `192.168.68.0/22` (same segment as the NUC).
|
|
- ❌ Do not plug into the main 192.168.0.0/24 LAN — HA will not see it.
|
|
|
|
## Existing Stack on Concord NUC
|
|
|
|
Compose: `concord_nuc/homeassistant.yaml`
|
|
|
|
| Service | Purpose | Status |
|
|
|---------|---------|--------|
|
|
| `homeassistant` | HA Core (host networking) | Running |
|
|
| `matter-server` | python-matter-server (host networking) | Running |
|
|
| `piper` | Wyoming TTS (port 10200) | Running |
|
|
| `whisper` | Wyoming STT (port 10300) | Running |
|
|
| `openwakeword` | Wyoming wake word (port 10400) | Running |
|
|
|
|
The Matter server is already in place — the S200 plugs in as the *radio* layer for Thread. No compose changes needed to add the S200 itself.
|
|
|
|
## Integration Steps (When Device Arrives)
|
|
|
|
1. **Physical setup**
|
|
- Connect S200 WAN to the 192.168.68.0/22 network.
|
|
- Power via USB-C (5V/2A).
|
|
- First-boot admin UI reachable at `192.168.8.1` until reconfigured, then at the DHCP-assigned 192.168.68.x address.
|
|
- Update firmware, set an admin password.
|
|
|
|
2. **Verify mDNS discovery from the NUC**
|
|
```bash
|
|
# Run on concord NUC (Tailscale: 100.72.55.21)
|
|
avahi-browse -rt _meshcop._udp
|
|
```
|
|
Should list the S200 as a Thread Border Router with a TXT record containing `rv=1`, `tv=1.3.0`, etc.
|
|
|
|
3. **Add to Home Assistant**
|
|
- Settings → Devices & Services → Add Integration → **Thread**
|
|
- S200 should auto-discover. Add it as an External Thread Border Router.
|
|
- Settings → Devices & Services → Add Integration → **Matter (BETA)** (already configured to talk to the local matter-server container).
|
|
|
|
4. **Pair Matter devices**
|
|
- Use the Home Assistant Companion app (iOS/Android) to pair.
|
|
- The app hands off Thread commissioning credentials to each device so it joins the S200's mesh.
|
|
|
|
## Gotchas
|
|
|
|
- **Firmware lag**: GL.iNet's OTBR implementation trails upstream OpenThread. Check the admin UI for firmware updates before committing to the device.
|
|
- **No Zigbee**: S200 is Thread-only. Existing Zigbee devices (if any) still need a separate coordinator (e.g., a Zigbee stick on the NUC via Zigbee2MQTT or ZHA).
|
|
- **Thread credential backup**: Once the S200 forms an operational dataset (network name, PAN ID, network key), export and back it up — losing it means re-commissioning every Thread device.
|
|
- **HA network_mode: host is load-bearing**: If HA is ever migrated to bridge networking, Matter/Thread discovery breaks. Keep host networking.
|
|
|
|
## Status
|
|
|
|
- [ ] S200 acquired
|
|
- [ ] Plugged into 192.168.68.0/22 segment
|
|
- [ ] mDNS discovery verified from NUC
|
|
- [ ] Added to HA Thread integration
|
|
- [ ] First Matter device paired
|
|
- [ ] Thread operational dataset backed up
|