Releases: Fohdeesha/Neewer-Bridge
Releases · Fohdeesha/Neewer-Bridge
Release list
Neewer-Bridge v1.2.1
Fixed
- A single oversized UDP datagram could crash the whole bridge on Windows.
recv_frominto the old 1024-byte buffer fails with WSAEMSGSIZE there (Linux
silently truncates instead), and a listener error is deliberately fatal — so
any packet over 1024 bytes sent to the ArtNet port took the bridge down. The
receive buffer now covers the maximum UDP payload, and Windows' spurious
connection-reset notifications on UDP sockets are ignored instead of fatal. power_on_connect = falsepowered the light OFF at connect. It now means
what it says: the bridge sends nothing at all to that light — no power, no
colour — until the first ArtNet data for it arrives. (The failsafe's poweroff
still applies after reconnects once the light is being driven.)addcould replace a config file it failed to read (permissions, disk error,
non-UTF-8 bytes) with one containing only the new light; every read failure
except "file does not exist" is now a hard error that leaves the file alone.- A crashed per-light task now brings the bridge down with a clear error
(restartable by a supervisor) instead of leaving that one light silently
dead — stuck on its last colour, never reconnecting — while the bridge
reported healthy. - Status notifications with a valid-looking header but a corrupt body are now
dropped: replies are checksum-verified whenever the complete frame is present
(truncated notifications still decode, matching the official app's behaviour). - The model catalog carried the CB200B Pro twice under two spellings; the
duplicate is folded away (140 models) and a test now rejects any future
case-insensitive duplicates. test --set rgbcw:accepted a brightness up to 255 and sent it as-is; it is
now validated to the documented 0–100 like every other probe.- A light name containing the DEL control character no longer makes
addfail. ota: a resend request arriving before the first firmware block now re-sends
the OTA header (bounded retries) instead of stalling into a timeout.
Neewer-Bridge v1.2.0
Changed
- The release zips now ship
config.example.tomlinstead ofconfig.toml.
Unzipping a new version over an existing install used to overwrite the live
configuration — every light, address, and setting — because the archive
contained a file with exactly that name. The bundled file is now a template
the bridge never reads, so upgrading in place leavesconfig.tomlalone.
Copy it once (cp config.example.toml config.toml) when setting up, or let
adddo it for you. - The shipped template no longer contains the developer's own fixtures, which a
fresh install would otherwise have tried to connect to. It carries a
commented-out[[lights]]block instead.
Added
neewer-bridge addcreatesconfig.tomlfrom the bundled
config.example.tomlwhen there isn't one yet, so a first-run config keeps
every documented default and comment rather than holding only the light that
was just added.- A missing config now says how to make one — naming the example file on disk —
instead ofrunfailing with a bare "No such file or directory".
Neewer-Bridge v1.1.2
Fixed
- One light silently ignored while the others work. If a light's DMX
channels ran past the end of the data a console was actually sending (a wrong
address, or a console configured for a smaller universe), the bridge skipped
that light with nothing in the log — it just sat on its last colour, looking
like dead hardware. It now warns once naming the light and its channel range,
and logs again when the data covers it (the light still holds its last state,
as before). - Firmware OTA header with a long device name. The
0x96header's
single-byte length field wrapped for names of 245 characters or more (the name
defaults to the firmware filename's stem), producing a frame whose declared
length disagreed with its contents — which these two-chip fixtures re-frame
by. The cosmetic name is now trimmed to fit. artnet-sendwith an out-of-range--address. Channel values placed past
channel 512 were dropped when the packet was encoded, and the command still
reported a successful send. It now refuses the patch with a clear message.test --setwith an out-of-range value. Numbers wider than the field they
land in wrapped silently (…:300became44), so the probe reported a value
it never sent. Out-of-range arguments are now rejected;--set raw:<hex>
remains the escape hatch for deliberately out-of-spec frames.
Changed
runvalidates its configuration up front, so a malformed config reported by
a library caller is a plain startup error rather than a panic in a background
task. (Nothing changes for the CLI, which already validated on load.)
Neewer-Bridge v1.1.1
Changed
- Log timestamps are now local time in a short
MM-DD HH:MM:SSform (e.g.
07-10 09:25:01) instead of the RFC-3339 UTC stamp
(2026-07-10T09:25:01.627109Z). Applies to both the console and the log
file. Nothing else about the log lines changed.
Neewer-Bridge v1.1.0
Added
- Multiple ArtNet inputs with per-channel DMX merge. The bridge can now
listen for ArtNet on several sockets at once — extra UDP ports and/or
different bind IPs — and merge the streams per channel before driving the
lights, like a hardware DMX merger. Each[[artnet.inputs]]config block
adds a listener (up to 8 total, each with optionalname,bind_ip,
port); the existing[artnet] bind_ip/portis always input 0. - Merge modes (
[artnet] merge):htp(highest takes precedence),
lowest, andltp(default) — latest takes precedence per channel, where
"latest" means the source that most recently changed the value, not the
one that last re-sent it: a source streaming unchanged refreshes never
steals a channel back from a live override. - Source expiry (
[artnet] merge_timeout_secs, default 10,0= never):
a source silent past the timeout is dropped from the merge — its HTP/lowest
contribution disappears, and LTP channels it owned fall back to the most
recently active remaining source. A channel with no live source holds its
last value (total loss remains the[failsafe]'s job). monitornow listens on every configured input, tags each logged packet
with its input label, and (with multiple inputs) logs the merged output
whenever it changes — a live view of the exact merge pipelinerunuses.
Changed
- ArtDmx sequence tracking is now per input (so one console feeding two inputs
keeps independent sequence streams). Single-input configs behave exactly as
before; the merge settings are inactive until a second input is added. - Config validation now rejects
[artnet] port = 0(it would bind an
arbitrary ephemeral port — never useful for a listener) and a wildcard
(0.0.0.0) input sharing a port with another input (the OS would refuse
the second bind at startup anyway; two specific IPs may share a port).
Neewer-Bridge v1.0.0
First versioned release. Everything below is the state of the project as of
this date — hardware-validated on a five-light fleet (2× TL120C, TL60 RGB,
TL21C, TL97C) deployed on Linux/BlueZ.
Core bridge
- ArtNet (ArtDmx) → Neewer BLE bridge: UDP listener, DMX channel mapper,
one coalescing actor per configured light (run, the default command). - Deterministic binding by MAC address — mapping is independent of
power-on / discovery / connection order. - Per-light DMX profiles:
cct,cct_gm,hsi,rgb(R/G/B→HSI, the
openHAB-friendly default),rgbcw(native 5-ch passthrough),full,
advanced(10-ch mode-select: CCT/HSI/FX/RGBCW/XY bands),pixel
(20-ch, 8-segment colour + 5 effects). - Protocol drivers: classic
0x78(incl. MAC-addressed Infinity frames,
selected per model viacmd_type), Neewer Home0x7A. Encoders byte-exact
against the decompiled NEEWER Studio app; 100+ unit tests. - 141-model capability catalog (
models.toml) extracted from the app;
addauto-identifies a light and fills driver/profile/CCT range. - Reliability: connection-health probing with recycle-on-failure, jittered
reconnect backoff (no fleet-wide reconnect storms), write coalescing at a
capped flush rate, on-demand duty-cycled discovery scanning (kind to cheap
adapters), ArtDmx sequence tracking (stale-packet drop), configurable
failsafe (hold/blackout/poweroff). - Configurable logging: console + size-rotating file sinks with per-sink
levels; startup logs the version, the loaded config path, and each light's
profile/channel span.
CLI
run(default),scan,add(interactive blink-to-identify or scripted),
test(guided one-frame probes,--status,--colors,--modes,
--pixel,raw:spelunking),ota(firmware flashing over the custom
0x78block protocol — check-code validated, no-brick by construction),
lights,models,adapters,inspect,monitor,artnet-send.--versionprints the release; the version is also the first startup
log line.