• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zwave-js / zwave-js-ui / 26517551850
19%

Build:
DEFAULT BRANCH: master
Ran 27 May 2026 02:29PM UTC
Jobs 1
Files 70
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

27 May 2026 02:28PM UTC coverage: 18.557% (-0.03%) from 18.585%
26517551850

push

github

web-flow
fix(ui): reduce nodes-table re-render pressure and clear inclusion ghosts (#4649)

## Summary

On meshes with many chatty nodes the control panel becomes laggy and
visibly broken — see discussion #4639 (94-node setup, logs attached
there). Three distinct UI symptoms, two of them sharing a root cause:

1. **The expanded config panel collapses mid-edit.** Every socket-driven
node update was both `Object.assign`ing into the existing node object
*and* `splice`ing it back into `this.nodes` — the splice was an
array-level reactivity pulse that invalidated v-data-table's row
identity and dropped the expanded slot.
2. **Hover tooltips on the table columns orphan and stack up** until
something forces a global refresh. `RichValue.vue` used the `v-tooltip`
directive form, which leaks overlays when the activator unmounts during
a burst of re-renders. The component form (`<v-tooltip
activator="parent">`) ties the overlay to its own mount lifecycle and is
properly torn down.
3. **Failed inclusions leave permanent `ProtocolInfo` ghost entries.**
`_onNodeFound` always pushes a partial node to the UI;
`_onInclusionFailed` cleared `tmpNode`/`isReplacing` but never removed
the ghost — and zwave-js does not consistently emit `node removed` when
inclusion aborts before interview completes.

The reporter's logs also showed that **~50% of all `valueUpdated` socket
emits were no-ops** (`X => X` — e.g. `0 => 0`, `true => true`, `100 =>
100`). Suppressing those alone halves the re-render pressure on the
frontend, which incidentally also widens the orphan-tooltip and collapse
windows by a lot.

## Changes

### `api/lib/ZwaveClient.ts`

- `emitValueChanged` now skips the socket broadcast when `changed ===
false`. The local `'valueChanged'` event is still emitted unchanged so
the MQTT gateway (`Gateway._onValueChanged`) sees every refresh — only
the UI socket traffic is gated. `valueId.lastUpdate` is still updated
server-side so the next real change carries a fresh timestamp.
- S... (continued)

339 of 455 branches covered (74.51%)

Branch coverage included in aggregate %.

0 of 41 new or added lines in 2 files covered. (0.0%)

4142 of 23692 relevant lines covered (17.48%)

1.12 hits per line

Uncovered Changes

Lines Coverage ∆ File
36
0.0
0.0% api/lib/ZwaveClient.ts
5
0.0
0.0% src/stores/base.js
Jobs
ID Job ID Ran Files Coverage
1 26517551850.1 27 May 2026 02:29PM UTC 70
18.56
GitHub Action Run
Source Files on build 26517551850
  • Tree
  • List 70
  • Changed 2
  • Source Changed 0
  • Coverage Changed 2
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 037d4002 on github
  • Prev Build on master (#26153656584)
  • Next Build on master (#26517614546)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc