How to use many Pixelblaze on a network (Sync or Firestorm)

One of the first questions I was asked when I introduced Pixelblaze was “how can I control many at the same time?”

April 2023 Update

Most people will want to check out the new sync feature. This feature is in firmware v3.40 and above. It allows a single Pixelblaze to run patterns and playlists across multiple Pixelblaze (as well as to send sensor board data wirelessly to other Pixelblazes).

See how to use the sync feature in the announcement.

Firestorm is another solution for synchronizing many Pixelblazes, and it was the only solution from 2018-2022. The main difference is that while the sync feature runs directly on a Pixelblaze board, Firestorm is a NodeJS/React app that runs on a separate computer, such as a laptop or Raspberry Pi.

There are a few cases where using Firestorm makes sense:

  • Firestorm is open source, so it’s a good solution if you needed to customize the way sync works for your particular project. For example:
    • You need to trigger patterns based on external events from other APIs, such as DMX, OSC, MIDI, or an internet-connected service such as a weather API.
    • You want to orchestrate things that can’t be yet controlled by the Sync feature, such as pushing arbitrary variables out to multiple Pixelblazes
    • You need a lot of computing power for something Pixelblaze can’t do
  • You needed an interface that audience members could use to trigger different patterns without being able to edit code and settings, such as in a museum or interactive art piece.
  • Your WiFi network is weak or strained and cannot handle the marginal additional traffic required by the sync feature. Firestorm uses infrequent and concise network messages for device discovery, time sync, pattern list, and pattern launch actions, whereas the built-in sync sends entire patterns at launch and 40Hz sensor board data over the network.

Firestorm is not a good solution if you need to take sensor board data and distribute it to many Pixelblazes, though we’d welcome that as a community-contributed enhancement.

Original March 2019 post

Originally Pixelblaze didn’t have anything to use multiple Pixelblazes on a network, but around summer of '18 I worked on a project to sync and control a whole network of Pixelblaze for a theme camp. Whats a lot of 'blaze? A Firestorm!

Pixelblaze Firestorm synchronizes the animation timers of multiple Pixelblaze on a network, and allows for switching patterns simultaneously.

Firestorm also exposes a simple API, and can be used for all kinds of smart home integration projects, or used as a base for creating your own Pixelblaze control console.

Firestorm was designed with reliability in mind as well. It remembers the current settings and last command and will resend those in case of a network error or a device reset.

Firestorm is a web server application that runs on a computer. Once installed and running, it can server out web pages from that computer to mobile devices.

It can run on a laptop, or desktop, or something like a Raspberry Pi. It’s based on NodeJS, About | Node.js and can run anywhere that NodeJS does.

I include instructions for installing on a Raspberry Pi on the GitHub page. It would be similar for other Linux based systems, but would vary for Windows and Mac (and I don’t have install instructions for them).

Go check out Firestorm on GitHub

I’m following the guide on github to installing Firestorm on a raspberry pi. When entering the line:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi

I receive the following error:
env: ‘/usr/lib/node_modules/pm2/bin/pm2’: No such file or directory

Would anyone be able to help here?

Thanks!

Hi bubbahana,
You might be missing pm2. Did you run this?

sudo npm install -g pm2

What do you get when you run

which pm2

Try it with that path if it is different.

1 Like

Got it! The path was /usr/local/bin
Thanks for the help! It is refreshing to find a group that doesnt ridicule you for not being able to figure stuff out. :smiley:

2 Likes

Happy to help! I might need to update my instructions!

Hi, I also had to update my command with /usr/local/bin for the path to pm2, FYI.

In case anyone else runs into this. After installing and getting everything running, I had some issues with Firestorm not showing PB’s on the network. FYI I was testing with multiple PB’s and cloning my Debian OS to prep for multiple Pi/PB setups - so something may have happened in all that. I found after you cd into firestorm and set that up, I followed with yarn, yarn build and then yarn init. Then finished with pm2 start server.js and pm2 save. All my issues seemed to be from yarn, hopefully it was just me - but if not maybe this can help.

2 Likes

When using firestorm, is it possible to set the value of sliders? For example, I might have a slider that sets the speed of a pattern. Adjusting it via an api command would allow it to change the speed of the pattern without having to have several duplicate patterns with slightly different speeds. As far as I can tell from the Firestorm docs all I can change is the current pattern, but nothing below that.

Firestorm doesn’t have controls support yet in the interface. Partly because I’ve been busy with other stuff, but also I’m not 100% sure how it should work with multiple patterns. Do I group them by name, and show every unique name (similar to switching patterns)?

Thoughts?

You mean that you could have several pixel blazes with the same pattern name (so that they are all synchronized) but the underlying pattern is different? I was thinking that instead of the following post command

{
  "command": {
    "programName": "blink fade"
  },
  "ids": [
    6909667,
    9398311
  ]
}

you could have something like (syntax is probably wrong)

{
  "command": {
    "programName": "blink fade"
  },
"Sliders":[slider1,0.2,slider2,0.4,...etc],
  "ids": [
    6909667,
    9398311
  ]
}

And if the pattern on a given device had something named slider1, slider2, etc it would use the value associated with that, and it would ignore it otherwise.