Simple docker container for running zwave-js (without mqtt)

I spent a considerable amount of time searching the web to get this running yesterday, so I hope it saves at least one person some time.

I run Home Assistant from docker, without MQTT. No hate towards it, I just don’t need it.
Therefore, I was trying to find a good docker image for just zwave-js-server. Unfortunately, I could not find a good official one, and I’m reluctant to run something without some kind of official support.

From a closed pull request, I found a promising dockerfile written by somebody else.

I made a gist showing how I built and launched it:

A few things:

  • These steps make no attempt to keep your existing key or settings. I’m lucky in that my first z-wave devices arrived within a day of the zwave-js annoucement.
  • I use named volumes, you may want to do this another way
  • I also use host networking whenever possible. If you want to do that another way, zwave-js runs on port 3000.
  • I use watchtower to update my images. If you don’t, then you can drop the label.
  • if an official image is ever published, I’d recommend using that. Until then rebuild often.
  • docker compose can really help with this. I just don’t use it, so I didn’t write instructions for it.
1 Like

thanks for this.

It might come in handy later if/when HA includes a fully functional control panel for zwavejs.

Right now I’ll just stick to the zwavejs2mqtt image for that functionality

One, question tho…

if we use an existing key what is the format?

does it use the “0x” format or without those bits like the jwavejs2mqtt image uses?

Yes, it does require the 0x prefixes. I tried many different formats before landing on this one.

1 Like

You can use either the old OZW key format or the zwave-js 32-char hex string.

I’ve added the docker compose setup to the gist in the comments.

on the network key, it seems like my ozw key needed spaces after the commas

1 Like

You can just run the official zwave2jsmqtt docker and disable mqtt. In fact, it’s disabled by default. That way you also have the UI front end.

1 Like

Good observation. The server converts a OZW-like key to the zwave-js format, but only for for ", " and not ",".

To summarize, the zwave-js-server will accept:



0x86, 0x80, 0x50, ...

but not


Overall, it’s easier to just convert to the plain string format ("868050...") because it’s the zwave-js format and portable between zwave-js-server and zwavejs2mqtt.

1 Like

Wow this is absolutely the way to go. The web UI is sooooo nice.

here’s the docker-compose for that:

    container_name: zwavejs2mqtt
    image: zwavejs/zwavejs2mqtt:latest
    restart: always
    tty: true
    stop_signal: SIGINT
      - "/dev/serial/by-id/usb-0658_0200-if00:/dev/ttyACM0"
      - ./store:/usr/src/app/store
      - '8091:8091' # port for web interface
      - '3000:3000' # port for zwave-js websocket server

in the web UI is where you’ll specify your network key, it’s not immediately obvious but if you had something like

0xBA 0xDE 0xCE …

it should be


inside the web UI there’s a configuration setup to enable for “home assistant” just enable it then you’ll be good to go to meet @rveachkc original request of doing this without mqtt.


Running the dev tagged docker image is generally pretty safe and recommended. Otherwise you’ll be slightly behind the addon.