From 2cde5b255b1658856b2e43d51d8bd2f8c3f08200 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 24 Dec 2025 12:28:09 -0800 Subject: [PATCH] Fix multi-port device discovery by accumulating universes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Multi-port ArtNet devices (like PD8000) send separate ArtPollReply packets for each group of 4 ports. Previously we overwrote universes on each reply; now we accumulate them. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- artnet/discovery.go | 18 ++++++++++++++++-- main.go | 2 -- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/artnet/discovery.go b/artnet/discovery.go index d47dcfa..fcb5b8e 100644 --- a/artnet/discovery.go +++ b/artnet/discovery.go @@ -153,14 +153,28 @@ func (d *Discovery) HandlePollReply(src *net.UDPAddr, pkt *PollReplyPacket) { Port: pkt.Port, // Use port from packet, not UDP source port } d.nodes[ip] = node - log.Printf("[artnet] discovered ip=%s name=%s universes=%v", ip, shortName, universes) + log.Printf("[artnet] discovered ip=%s name=%s", ip, shortName) } node.ShortName = shortName node.LongName = longName - node.Universes = universes node.LastSeen = time.Now() node.CanTransmit = true + + // Accumulate universes from multiple ArtPollReply packets + // (multi-port devices send separate replies for each group of 4 ports) + for _, u := range universes { + found := false + for _, existing := range node.Universes { + if existing == u { + found = true + break + } + } + if !found { + node.Universes = append(node.Universes, u) + } + } } // HandlePoll processes an incoming ArtPoll and responds diff --git a/main.go b/main.go index 7e9456d..4561b01 100644 --- a/main.go +++ b/main.go @@ -297,8 +297,6 @@ func (a *App) sendOutputs(outputs []remap.Output) { func init() { log.SetFlags(log.Ltime | log.Lmicroseconds) - fmt.Println("artmap - ArtNet Remapping Proxy") - fmt.Println() } // parseListenAddr parses listen address formats: