Vitrum / Think Simple IV BS Scenari Wireless — 4 buttons indistinguishable in Z-Wave JS UI

I have an old Z-Wave scene controller: the Vitrum / Think Simple IV BS Scenari Wireles (model code 03B040010, manufacturer ID 0x0317). It has 4 physical buttons but no Central Scene support.

After pairing it with Z-Wave JS, I can see it only exposes a Root Endpoint and Endpoint 1, with a single association group (max 21 nodes). When I press each of the 4 buttons in turn and watch the Z-Wave JS log at silly level, all four produce byte-for-byte identical commands:

[MultiChannelCCCommandEncapsulation]
  source:      1
  destination: 0
  [BasicCCSet]
    target value: 99

The only thing that varies between button presses is the RSSI (just signal noise). There is no device config file for this device in the Z-Wave JS database.

It seems like this device was designed to broadcast to directly-associated Z-Wave nodes rather than to send distinguishable per-button events to a hub. I'm wondering if anyone has experience with this device or similar and found a way to get meaningful per-button events into Home Assistant — whether through configuration parameters, a custom device config file, or any other approach. I'm on Home Assistant (HA Green) Core 2026.6.3, OS17.3, zwave-js-ui: 11.19.1 and zwave-js: 15.24.2. Thanks for any help and ideas!

Solved — scene memorisation works without a Home Master

Posting back in case this helps anyone else with a Vitrum IV BS Scenari Wireless (or similar Vitrum scene controller).

The short version: the 4 buttons are genuinely indistinguishable at the hub in normal operation — that's by design. The device was built to control lights directly via Z-Wave association, not to send per-button events to a hub. But you can programme each button to recall a different dimming scene, and you don't need the Vitrum Home Master remote to do it.

What I worked out:

The original Vitrum workflow had the Home Master respond to a brief memorisation frame the device sends during button-hold mode. Without the Home Master, Z-Wave JS drops that frame (it's an empty/invalid MultiChannel packet). However, the device is actually waiting for a MultiChannelAssociationCC addDestinations command while it's beeping — and you can send that manually via the zwave_js.invoke_cc_api HA service.

Programming a button (one-time per scene):

  1. Set your lights to the desired levels via HA
  2. Hold the target button on the scene controller until it flashes magenta and starts beeping
  3. Immediately call this service:
action: zwave_js.invoke_cc_api
data:
  command_class: "142"
  method_name: addDestinations
  parameters:
    - groupId: 1
      nodeIds: [6, 7, 10]       # node IDs of your DIN dimmers
      endpoints: []             # use if any DIN has multiple endpoints
target:
  entity_id: switch.your_scene_controller
  1. Two beeps confirm the scene is stored.

The addDestinations call during memorisation mode is a replacement — whatever nodes you list become that button's scene at their current levels. Repeat for each button with different light levels set beforehand.

A few gotchas:

  • Scene data is stored in proprietary memory and is wiped on Z-Wave exclusion/re-inclusion. You'll need to re-programme after re-pairing.
  • All buttons share a global association pool. Add all nodes to the pool first (with no button held), then programme each button's levels independently.

Hope this saves someone else a few hours of log-watching!