Skip to content

Eliminate tower dual-homing (fixes HA zeroconf boot race that takes down Air Quality dashboard) #281

Description

@etrobert-bot

Problem

On 2026-06-20, a tower reboot (HA 2026.6.1 upgrade) left Home Assistant's
zeroconf component dead: OSError: [Errno 19] No such device while joining
mDNS multicast (setsockopt(IP_ADD_MEMBERSHIP)). Because HA's shared aiohttp
DNS resolver is built on zeroconf, the failure cascaded to every integration
that lazily creates a client session after boot — airgradient (the Air Quality
dashboard sensors) and mobile_app notify both went unavailable. HA ran
degraded for ~2 days until a manual restart fixed it. The AirGradient device
itself was healthy the whole time.

Root cause

Tower is dual-homed on the same /24:

  • enp11s0-static192.168.0.10 (declared in modules/hosts/tower/configuration.nix)
  • soft (WiFi, wlp12s0) → 192.168.0.52 (an undeclared, runtime-stored NM connection)

zeroconf enumerates every interface at startup and joins mDNS multicast on each.
The WiFi associates slower than the wired NIC; if zeroconf hits it mid-bringup →
ENODEV → the whole socket setup fails. network-online.target doesn't help
because nm-online -s reports ready as soon as one connection is up, not when
every interface is multicast-ready. systemd after/wants are already present
(NixOS default) and were satisfied before HA started.

The WiFi exists only as a workaround: tower's single ethernet cable is sometimes
unplugged and moved to the MacBook for low-latency wired gaming, and WiFi keeps
tower (and HA) alive during those sessions.

Plan

  1. Hardware: add a small unmanaged switch at the desk. Router → switch;
    switch → tower's onboard NIC; switch → monitor's RJ45. Both machines wired
    permanently, no more cable swapping. A switch is latency-transparent for
    gaming (~µs vs. the ms of internet RTT). Gigabit is plenty; 2.5GbE only for
    LAN-transfer headroom.
  2. Ignore the monitor's USB-ethernet on tower. The monitor is a USB-C hub
    with built-in ethernet that follows the active host. When tower is the active
    host it would inherit that USB NIC on top of enp11s0 — recreating the
    dual-homing. Mark that adapter unmanaged in NetworkManager (by MAC or
    driver:r8152) so tower always stays single-homed on enp11s0.
  3. Remove tower's WiFi (wlp12s0 / the undeclared soft connection)
    declaratively. With the switch in place it's no longer needed, and removing it
    kills the zeroconf race at the source and removes config drift.

Sequencing constraint

Do not remove WiFi (step 3) before the switch (step 1) is physically
installed — HA runs on tower, so today the WiFi is the only thing keeping tower
online when the ethernet cable is moved to the Mac.

Open item

Identify the monitor's USB-ethernet adapter (MAC / driver) to write the
unmanaged match — read ip -brief link while tower is the active monitor host,
or infer the chipset from the monitor model (likely Realtek RTL8153 / r8152).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions