New Z-Wave JS binding released

I thought about that, too, but because the scenes are not visible in ZUI I think it is not successfull.

If I find more information I will open a new topic to not clutter this one.

It looks like two issues, one in ZUI, one in the Z-Wave JS binding.
My findings from today:

I activated MQTT in addition to the WS Server.
I was able to get the Scene Activation CC working in ZUI:


As long as I don’t restart ZUI, the CC stays active → ZUI problem

I deleted the Z-Wave JS Thing and rescanned it, but the Scene Activation CC does not appear. → Z-Wave JS problem

I looked into MQTT and found:

{"time":1755440716788,"value":14}
{"time":1755440714130,"value":16}

So it seems to work in MQTT.

In comparison the Thing config from Z-Wave JS:

Thing config Z-Wave JS

UID: zwavejs:node:gateway:node37
label: Z-wave js Fibargroup FGD212 (node 37)
thingTypeUID: zwavejs:node
configuration:
  configuration-include-consumption-by-device-itself-in-reports: 0
  configuration-automatic-control-dimming-step-size: 1
  configuration-smoke-co-or-co-2-alarm-response: 3
  configuration-swap-functionality-of-key-s-1-and-key-s-2: 0
  configuration-force-auto-calibration: 0
  configuration-forced-switch-on-brightness: 99
  configuration-change-toggle-switch-behavior: 0
  configuration-double-click-sets-brightness-to-100: 0
  configuration-auto-calibration-status: 1
  configuration-active-power-calculation-method: 0
  configuration-surge-alarm-report: 1
  configuration-manual-control-dimming-step-timing: 5
  configuration-perform-auto-calibration: 1
  configuration-approximated-power-at-the-maximum-brightness-level: 0
  configuration-power-limit: 250
  configuration-dimmability-recognized-during-auto-calibration: 0
  configuration-timer-functionality-auto-off: 0
  id: 37
  configuration-general-purpose-alarm-response: 3
  configuration-automatic-control-dimming-step-timing: 1
  configuration-behavior-after-overcurrent-or-surge: 1
  configuration-scene-activation-functionality: 1
  configuration-all-on-all-off-function: 0
  configuration-manual-control-dimming-step-size: 5
  configuration-input-button-switch-configuration: 0
  configuration-time-of-alarm-state: 600
  configuration-periodic-active-power-and-energy-reports: 3600
  configuration-load-error-alarm-report: 1
  configuration-power-reports-relative-change-threshold: 10
  configuration-incandescence-level-of-dimmable-cfl: 99
  configuration-3-way-switch-function: 0
  configuration-burnt-out-bulb-detection-time-delay: 5
  configuration-minimum-brightness-level: 22
  configuration-dimmer-mode-recognized-during-auto-calibration: 1
  configuration-dimmer-mode: 2
  configuration-maximum-brightness-level: 70
  configuration-water-flood-alarm-response: 2
  configuration-overcurrent-alarm-report: 1
  configuration-state-after-power-failure: 1
  configuration-energy-reports-threshold: 10
  configuration-overheat-and-voltage-drop-alarm-report: 1
  configuration-power-limit-alarm-report: 1
  configuration-value-sent-to-associated-devices-on-single-click: 1
  configuration-on-off-mode: 2
  configuration-temperature-alarm-response: 1
  configuration-burnt-out-bulb-detection-power-variation: 30
  configuration-soft-start-functionality: 1
  configuration-incandescence-time-of-dimmable-cfl: 0
bridgeUID: zwavejs:gateway:gateway
channels:
  - id: basic-restore-previous-1
    channelTypeUID: zwavejs:7d339fe873626f7bf81314e289c143ff
    label: EP1 Restore Previous Value
    configuration:
      endpoint: 1
      writePropertyStr: restorePrevious
      commandClassId: 32
      commandClassName: Basic
      factor: 1
      inverted: false
  - id: basic-restore-previous-2
    channelTypeUID: zwavejs:7d339fe873626f7bf81314e289c143ff
    label: EP2 Restore Previous Value
    configuration:
      endpoint: 2
      writePropertyStr: restorePrevious
      commandClassId: 32
      commandClassName: Basic
      factor: 1
      inverted: false
  - id: basic-value-1
    channelTypeUID: zwavejs:a9b7a453105c353c2f5198d63b2aa221
    label: EP1 Current Value
    configuration:
      endpoint: 1
      readProperty: currentValue
      writePropertyStr: targetValue
      commandClassId: 32
      commandClassName: Basic
      factor: 1
      inverted: false
  - id: basic-value-2
    channelTypeUID: zwavejs:a9b7a453105c353c2f5198d63b2aa221
    label: EP2 Current Value
    configuration:
      endpoint: 2
      readProperty: currentValue
      writePropertyStr: targetValue
      commandClassId: 32
      commandClassName: Basic
      factor: 1
      inverted: false
  - id: meter-reset-1
    channelTypeUID: zwavejs:c546973fb1a1ddbd38cdf0f5ed9b0a01
    label: EP1 Reset Accumulated Values
    configuration:
      endpoint: 1
      writePropertyStr: reset
      commandClassId: 50
      commandClassName: Meter
      factor: 1
      inverted: false
  - id: meter-value-65537-1
    channelTypeUID: zwavejs:8d49c4b0e781ee5cb8b8f2bc8924e61e
    label: EP1 Electric Consumption
    configuration:
      incomingUnit: kWh
      endpoint: 1
      propertyKeyInt: 65537
      readProperty: value
      commandClassId: 50
      commandClassName: Meter
      factor: 1
      inverted: false
  - id: meter-value-66049-1
    channelTypeUID: zwavejs:d9982d7b1d66c1624bb9cf6f47c7ea8c
    label: EP1 Electric Consumption
    configuration:
      incomingUnit: W
      endpoint: 1
      propertyKeyInt: 66049
      readProperty: value
      commandClassId: 50
      commandClassName: Meter
      factor: 1
      inverted: false
  - id: multilevel-sensor-power-1
    channelTypeUID: zwavejs:d9982d7b1d66c1624bb9cf6f47c7ea8c
    label: EP1 Power
    configuration:
      incomingUnit: W
      endpoint: 1
      readProperty: Power
      commandClassId: 49
      commandClassName: Multilevel Sensor
      factor: 1
      inverted: false
  - id: multilevel-switch-duration-1
    channelTypeUID: zwavejs:ab748d0845f4377be75d7b26c960db96
    label: EP1 Remaining Duration
    configuration:
      endpoint: 1
      readProperty: duration
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: multilevel-switch-duration-2
    channelTypeUID: zwavejs:ab748d0845f4377be75d7b26c960db96
    label: EP2 Remaining Duration
    configuration:
      endpoint: 2
      readProperty: duration
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: multilevel-switch-off-1
    channelTypeUID: zwavejs:7d339fe873626f7bf81314e289c143ff
    label: EP1 Perform A Level Change (Off)
    configuration:
      endpoint: 1
      writePropertyStr: Off
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: multilevel-switch-off-2
    channelTypeUID: zwavejs:7d339fe873626f7bf81314e289c143ff
    label: EP2 Perform A Level Change (Off)
    configuration:
      endpoint: 2
      writePropertyStr: Off
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: multilevel-switch-on-1
    channelTypeUID: zwavejs:7d339fe873626f7bf81314e289c143ff
    label: EP1 Perform A Level Change (On)
    configuration:
      endpoint: 1
      writePropertyStr: On
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: multilevel-switch-on-2
    channelTypeUID: zwavejs:7d339fe873626f7bf81314e289c143ff
    label: EP2 Perform A Level Change (On)
    configuration:
      endpoint: 2
      writePropertyStr: On
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: multilevel-switch-restore-previous-1
    channelTypeUID: zwavejs:7d339fe873626f7bf81314e289c143ff
    label: EP1 Restore Previous Value
    configuration:
      endpoint: 1
      writePropertyStr: restorePrevious
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: multilevel-switch-restore-previous-2
    channelTypeUID: zwavejs:7d339fe873626f7bf81314e289c143ff
    label: EP2 Restore Previous Value
    configuration:
      endpoint: 2
      writePropertyStr: restorePrevious
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: multilevel-switch-value-1
    channelTypeUID: zwavejs:f8f6829c90eaa01370120edbb7e9f514
    label: EP1 Current Value
    configuration:
      endpoint: 1
      readProperty: currentValue
      writePropertyStr: targetValue
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: multilevel-switch-value-2
    channelTypeUID: zwavejs:f8f6829c90eaa01370120edbb7e9f514
    label: EP2 Current Value
    configuration:
      endpoint: 2
      readProperty: currentValue
      writePropertyStr: targetValue
      commandClassId: 38
      commandClassName: Multilevel Switch
      factor: 1
      inverted: false
  - id: notification-alarm-level-1
    channelTypeUID: zwavejs:2ffebecc878ef4f1673efedf55c71a72
    label: EP1 Alarm Level
    configuration:
      endpoint: 1
      readProperty: alarmLevel
      commandClassId: 113
      commandClassName: Notification
      factor: 1
      inverted: false
  - id: notification-alarm-type-1
    channelTypeUID: zwavejs:2ffebecc878ef4f1673efedf55c71a72
    label: EP1 Alarm Type
    configuration:
      endpoint: 1
      readProperty: alarmType
      commandClassId: 113
      commandClassName: Notification
      factor: 1
      inverted: false
  - id: notification-heat-alarm-heat-sensor-status-1
    channelTypeUID: zwavejs:3c2a1014d58e7a530f6384461d3899e1
    label: EP1 Heat Sensor Status
    configuration:
      propertyKeyStr: Heat sensor status
      endpoint: 1
      readProperty: Heat Alarm
      commandClassId: 113
      commandClassName: Notification
      factor: 1
      inverted: false
  - id: notification-power-management-load-error-status-1
    channelTypeUID: zwavejs:3c2a1014d58e7a530f6384461d3899e1
    label: EP1 Load Error Status
    configuration:
      propertyKeyStr: Load error status
      endpoint: 1
      readProperty: Power Management
      commandClassId: 113
      commandClassName: Notification
      factor: 1
      inverted: false
  - id: notification-power-management-over-current-status-1
    channelTypeUID: zwavejs:3c2a1014d58e7a530f6384461d3899e1
    label: EP1 Over-Current Status
    configuration:
      propertyKeyStr: Over-current status
      endpoint: 1
      readProperty: Power Management
      commandClassId: 113
      commandClassName: Notification
      factor: 1
      inverted: false
  - id: notification-power-management-over-load-status-1
    channelTypeUID: zwavejs:3c2a1014d58e7a530f6384461d3899e1
    label: EP1 Over-Load Status
    configuration:
      propertyKeyStr: Over-load status
      endpoint: 1
      readProperty: Power Management
      commandClassId: 113
      commandClassName: Notification
      factor: 1
      inverted: false
  - id: notification-system-hardware-status-1
    channelTypeUID: zwavejs:886b46e4a119a6c3210d82f621e066d4
    label: EP1 Hardware Status
    configuration:
      propertyKeyStr: Hardware status
      endpoint: 1
      readProperty: System
      commandClassId: 113
      commandClassName: Notification
      factor: 1
      inverted: false
  - id: protection-exclusive-control-node-id
    channelTypeUID: zwavejs:b21be530364ce443c0b9e7a5bb7ea9a6
    label: Node ID With Exclusive Control
    configuration:
      endpoint: 0
      writePropertyStr: exclusiveControlNodeId
      commandClassId: 117
      commandClassName: Protection
      factor: 1
      inverted: false
  - id: protection-local
    channelTypeUID: zwavejs:3a99c804b54ecf56d5436435ee13b203
    label: Local Protection State
    configuration:
      endpoint: 0
      writePropertyStr: local
      commandClassId: 117
      commandClassName: Protection
      factor: 1
      inverted: false
  - id: protection-rf
    channelTypeUID: zwavejs:d760a909cb58310c2dd9ab0b6e0c6b8d
    label: RF Protection State
    configuration:
      endpoint: 0
      writePropertyStr: rf
      commandClassId: 117
      commandClassName: Protection
      factor: 1
      inverted: false
  - id: protection-timeout
    channelTypeUID: zwavejs:a89d9cec8ba33b53a30162ea0d13ee80
    label: RF Protection Timeout
    configuration:
      endpoint: 0
      writePropertyStr: timeout
      commandClassId: 117
      commandClassName: Protection
      factor: 1
      inverted: false

I don’t see any channels that contain the info from the Notification command class.

However, I do see the information here in the ZUI debug log.

2025-08-16 16:04:00.506 CNTRLR   [Node 002] [Notification]
                                   type:  Access Control
                                   event: Manual unlock operation
2025-08-16 16:04:00.508 INFO Z-WAVE: [Node 002] CC Notification notification {
  type: 6,
  event: 2,
  label: 'Access Control',
  eventLabel: 'Manual unlock operation',
  parameters: undefined
}

I’m a little confused by the channels that are created by the binding. I finally found the channel to operate the lock (door-lock-mode). It’s defined as a Number with 0x00 being Unsecured (unlock) and 0xFF being Secured (lock). It would be very nice if there was a Switch channel in addition to this channel.

Can you provide the node json from the store that is logged when the binding connects to the webserver? (Trace level)

I might be able to model it to model it to a switch. Hard part is the mapping value.

Sure, do you want the whole thing, or just that node?

Just the node would do. I can then add it to the store we use for unittests. From there it would be ‘easy’ to develop a stable switch function

Here it is.

node2-lock.json (77.8 KB)

Edit: I scrubbed all the user codes, so it should be good to include in unit tests.

I just posted my issue here.

Then I found this newer thread and it seems discussions about scene activation are already ongoing. I guess this is same/similar to what others have experienced?

Scenes are detected in Zwave JS UI. They are also forwarded to my HomeAssistans instance. But in OH I get nothing when triggering the scenes.

Scenes are currently not supported. It was one of the areas that needs work and didnt make it into oh5

Looked at the json and was about to start, but before i do i want to know what you expect exactly. The channel `door-lock-mode is based on this metadata provided by the ZUI server. It contains 8 possible states. I cannot model 8 states in a single switch.

{
“endpoint”: 0,
“commandClass”: 98,
“commandClassName”: “Door Lock”,
“property”: “currentMode”,
“propertyName”: “currentMode”,
“ccVersion”: 2,
“metadata”: {
“type”: “number”,
“readable”: true,
“writeable”: false,
“label”: “Current lock mode”,
“min”: 0,
“max”: 255,
“states”: {
“0”: “Unsecured”,
“1”: “UnsecuredWithTimeout”,
“16”: “InsideUnsecured”,
“17”: “InsideUnsecuredWithTimeout”,
“32”: “OutsideUnsecured”,
“33”: “OutsideUnsecuredWithTimeout”,
“254”: “Unknown”,
“255”: “Secured”
},
“stateful”: true,
“secret”: false
},
“value”: 255
}

Yes, i understand.

The goal is to be able to operate the lock as a Switch. So, is it possible to create another channel of type Switch, that sends 0x0 (Unsecured) when an OFF command is sent to the item linked to that channel, and sends 0xff (Secured) when an ON command is sent?

I think this might be similar to how you handled RollerShutter?

I want to keep as close to ZUI as possible. The Rollershutter case is a little different as it aggregates three channels into one and does not touch their values.

What would the state be if any of the interim states is set by ZUI? And other devices might have other states/vales, making it nearly impossible to scale.

Maybe a transformation/map is what you are looking for? You can create a switch item that maps the two desired states to on/off

Yeah that may be the best thing to do. I was thinking that it’s a little nasty what i was asking you to do.

Quick look at the OH Zwave looks like the Odd and even are grouped for ON/OFF.

        switch (channel.getDataType()) {
            case OpenClosedType:
                return (eventValue & 0x01) == 0x00 ? OpenClosedType.OPEN : OpenClosedType.CLOSED;

@sihui I’m curious why this didn’t work. I assume you put the file in the config directory… Did ZUI not pick up the file, or was there some other problem. I’m trying to add a device file for a device that’s not in the database, and I can’t seem to get ZUI to recognize the file/device.

I probably had the wrong syntax.
@apella12 provided me a json which works like a charme.
If you need more information, please shout.

Yeah, that’s what I did.

And I’m pretty sure the json is correct because I modeled it off an almost identical device.

I have a snap installation, so I wonder if that’s causing the issue. If it’s looking for a directory named store, it doesn’t exist in a snap installation e.g. /var/snap/zwave-js-ui/current/config/zen75.json