# Brewblox release notes

Relevant links:

  • User guides: https://brewblox.netlify.app/
  • Previous release notes: https://brewblox.netlify.app/user/release_notes.html
  • Project board: https://github.com/orgs/Brewblox/projects/1
  • Code repositories: https://github.com/Brewblox

# Brewblox release 2020/10/19

firmware release date: 2020/10/11

brewblox-ctl uses Python. Python 3.5, the default version for Raspbian Stretch, was discontinued in september. Raspbian does not support upgrading Python versions. If you are not yet running the latest Raspbian (Buster), we strongly recommend re-flashing your SD card. For those unsure of which Raspbian version they're using: brewblox-ctl will warn you if your Python version is unsupported.

brewblox-ctl still works on Raspbian Stretch, but depends on other software projects that have announced they will soon no longer be compatible with Python 3.5.

We added commands to brewblox-ctl to make it easy to move your Brewblox installation without losing any settings or history data. For more information, see our system upgrade guide.

The PWM block has also received a minor rework, both in firmware, and in the UI. In the firmware, we fixed an issue where the PWM overcompensated for setting changes after it had spent a long period at either 0% or 100%. In the UI, we reworked the widget to improve visibility of desired setting, actual setting, and achieved value. We also added a slider to the Basic version of the widget, making it much easier to control.

In response to this thread, we created an experimental service for sharing data with Home Assistant. It will be some time before we find the time to significantly extend this service, but the concept is promising.


  • (docs) Added system upgrade guide.
    • https://brewblox.netlify.app/user/system_upgrades
  • (docs) Added service architecture doc.
    • https://brewblox.netlify.app/dev/service/architecture
  • (feature) Added the brewblox-ctl init command. This creates a brewblox dir. It is also part of brewblox-ctl install.
  • (feature) Added the brewblox-ctl snapshot save command. This zips the entire brewblox dir. It is more complete, but also takes much more space than brewblox-ctl backup save.
  • (feature) Added the brewblox-ctl snapshot load command. This restores snapshots created by brewblox-ctl snapshot save. You can also use brewblox-ctl install --snapshot ARCHIVE.
  • (improve) brewblox-ctl now shows a warning if the Python version is unsupported (currently 3.5 or earlier).
  • (feature) Added the Stopwatch widget.
  • (improve) Reworked the PWM widget.
    • Desired setting is now set by using a slider.
    • It clearly shows when the PWM is driven, and setting can't be set manually.
    • Improved rendering of desired setting, actual setting, and achieved value.
  • (feature) Added the brewblox-hass service as proof of concept for Home Assistant integration.
    • https://github.com/BrewBlox/brewblox-hass
  • (improve) Reworked discover/connect behavior in the Spark service to reboot the service less frequently.
  • (improve) Invalid command arguments in services now generate a warning, but do not immediately cause the service to exit.
  • (improve) The UI now shows the Spark Troubleshooter if the service is running, but does not respond to status requests.
  • (improve) The Spark Troubleshooter now shows whether a firmware update is in progress.
  • (improve) Increased brightness for some text elements on the Spark display screen.
  • (improve) System objects with no persistent data are no longer stored in persistent memory.
  • (fix) Possibly fixed a bug where the UI would show its "waiting for datastore" notification even when the datastore already is available.
    • We're not sure about this one, as we couldn't consistently reproduce the error.
  • (fix) The PWM no longer overcompensates for setting changes after spending a long time at 0% or 100%.
  • (fix) If changing block settings would cause the Spark to run out of persistent memory, the old block settings are retained.

# Brewblox release 2020/09/23

firmware release date: 2020/09/22

After one too many "Waiting for datastore..." notification, we decided to go looking for a replacement. We evaluated multiple candidates, and decided to try Redis as a replacement. This trial was a success. For our purposes, Redis is simpler, faster, and more reliable than CouchDB.

Your data will be migrated automatically, and the old CouchDB data will be moved to brewblox/couchdb-migrated-{DATE}.

brewblox-ctl backup load is backwards compatible with archives generated by brewblox-ctl backup save during previous releases.

We also added a new block: Temp Sensor (Combined). This is a sensor where the value is the min/max/average value of multiple other sensors.

This release includes a new system layer and bootloader. If your Spark is connected to a Wifi network, the bootloader will be updated automatically. If not, you can follow the instructions in brewblox-ctl flash to update the bootloader.

If your Spark is connected to the service using USB, then the UI update will throw an error. The fix for this is included in the new firmware. To get this update you'll have to use brewblox-ctl flash.

Changes 2020/09/28

  • (feature) Added Spark service action to reboot the service.
  • (improve) Non-fullscreen graphs are now static on mobile.
  • (feature) Long press on graph widget to open fullscreen.
  • (fix) Creating a Setpoint with default settings no longer causes an "invalid magnitude for Quantity" error.
  • (fix) Resolved a bug where fetching graph data would fail for some users.


  • (feature) Added the Temp Sensor (Combined) block.
  • (migrate) Replaced the CouchDB datastore implementation with Redis.
  • (remove) Removed deprecated AMQP listener in brewblox-history.
  • (remove) Removed deprecated brewcast/state/{SERVICE}/blocks publish in Spark service.
  • (improve) Setpoint blocks now always show their enable/disable toggle.
  • (improve) Builder no longer opens the editor when double clicking.
  • (improve) When using a touchscreen, interaction with Builder parts now requires a long press.
  • (improve) Added hint of how and when to flash the bootloader to the output of brewblox-ctl flash.
  • (update) Updated the firmware system layer from 1.5.2 to 2.0.0-rc1.
  • (fix) Improved stability of firmware / bootloader updates.
  • (fix) Graphs no longer show a line between the last and the first point after config changes.
  • (fix) If you open a new update dialog while the update is in progress, it will now receive update log messages.
  • (fix) Fixed default values in the Spark wifi config menu.

Automation changes

  • (improve) Added isLessThanEqual(other) alias for the qty().lte() function in automation sandbox.
  • (improve) Added isGreaterThanEqual(other) alias for the qty().gte() function in automation sandbox.
  • (improve) Set a timeout of 10 seconds for automation sandbox scripts.
  • (fix) Signficantly reduced memory usage of automation service.

# Brewblox release 2020/08/31

firmware release date: 2020/08/24

This is a small update to the 2020/08/26 release.


  • (fix) Session log graph notes no longer incorrectly show an error that end date is before start date.
  • (fix) Restored the pause/resume autoconnect button in the Spark troubleshooter.
  • (fix) The traefik service now correctly restarts after a Pi reboot.
  • (feature) Added the brewblox-ctl service pull command, that can be used for updating single services without performing a full brewblox-ctl update.
  • (improve) Added current status for Brewblox service containers to brewblox-ctl log output.
  • (improve) avahi-daemon is added to the list of apt packages installed by brewblox-ctl install.

# Brewblox release 2020/08/26

firmware release date: 2020/08/24

This release is bigger (and took longer) than usual. We're introducing new features, but we're also working towards having a stable and well-documented API that can be used for hobby projects or third-party applications.

To make the automation service more flexible, we're introducing scripted actions and conditions. These provide an alternative to the existing UI-based configuration.

Brewblox is gradually becoming more stable, and we decided now is a good time to add public documentation for block data types.
This will help anyone who wants to listen in on block state events or use their own service, script, or application to read or write blocks.

Recently, we switched from AMQP events to MQTT. We're very happy with how this turned out, and are now updating the eventbus service to run Mosquitto. This lets us use some very useful MQTT features that were not available in RabbitMQ.

The infrastructure for Spark discovery over Wifi has been improved, resulting in the removal of the mdns service.

We also added two more Quickstart wizards, and gave the block / block widget wizards an overhaul.

# Automation scripts

While implementing automation functionality, the limitations of a fully UI-based configuration became noticeable. If the action or condition is repetitive, complicated, or uncommon, then it quickly becomes cumbersome or even impossible to configure.

Our solution is to implement an optional JavaScript sandbox for actions and conditions.

Some of the highlights:

  • The scripting API is optional.

Scripts are not a replacement for UI-based configuration. They are an extension of the Brewblox design philosophy, where we build everything to be flexible and accessible, but add shortcuts to make the popular easy. Here, scripts provide the flexibility, and the UI-based options are the shortcuts.

  • The UI code editor helps.

The script editor has multiple features to make it easier to write and test your scripts.

While editing, you can run the script in the automation service, and immediately see the output.

We also added snippet generators for common functionality. These snippets can ask you some questions, and will then generate code.

For example, the Get block field snippet will show you a dropdown to select a block and field, and will then add the getBlockField() function call with the arguments already filled in.

  • Helper functions are included.

There are functions to get and set block values, but also to help you check values. For example, the qty(value, unit) function helps you write conditions where unit conversion is handled automatically.

# Block types

With the introduction of the automation scripting sandbox, users can now access the raw block data. To help with that, we're declaring blocks a public interface, and added reference documentation.
Starting with the next release, we'll use a deprecation period if we have to make any breaking changes to block data types.

# Eventbus migration

In the 2020/06/15 release, we started to migrate from the AMQP event protocol to MQTT.
This release we're making the MQTT-only Mosquitto broker the default image for the eventbus service.

We're not aware of any third-party service still relying on AMQP, but you can switch back to using RabbitMQ if you want to.

To do so: add the following service override to your docker-compose.yml file.

    image: brewblox/rabbitmq:${BREWBLOX_RELEASE}

Do note that the deprecation period for AMQP support ends 2020/09/15. After that, all AMQP events will be ignored.

# mDNS changes

Previously, Brewblox used a separate service to do Wifi discovery of Spark controllers. We've revisited this design, and replaced it with a change to the avahi-daemon configuration on the host.

This means we now have one less service, and no longer use port 5000. For more details, see the decision document.

This change does depend on the host environment and network layout. The change to Avahi settings is kept optional, and we mapped multiple alternatives. If you want to run Brewblox on a system without Avahi, or are having problems with the new settings, feel free to drop us a message.

# Wizardry

This release includes two more Quick Start wizards: Brew kettle, and Fridge without beer sensor.

Brew kettle produces a control chain for a single input/output heater, comparable to the BK in a HERMS setup.

Fridge without beer sensor produces the same output as the Fermentation fridge wizard, but without the beer mode controls. This is useful if you wish to (temporarily) use your fermentation chamber as a normal fridge.

A common issue when running Quick Start wizards was that you'd arrive at the hardware step, and then had to figure out if your beer sensor was New|TempSensorOneWire-1 or New|TempSensorOneWire-2.

We can't magically decide what the purpose is of a newly discovered sensor, but we can help with identification.
Most wizards now start with a discovery step. Here you are shown the current status and measured value of available OneWire sensors and chips, with prominent "change block name" buttons.
Unplug a device, and one of these blocks will suddenly have a disconnected status.

Block (widget) wizards were somewhat clunky, so we reworked those, and added a New Block option to wizardry.
In the New Widget wizard you can create a widget that is based on either a new, or an existing block.
In the New Block wizard you can create a new block, and optionally add a widget for displaying your block on a dashboard.


  • (improve) Changed the default eventbus broker from RabbitMQ to Mosquitto.
  • (remove) Removed support for UI plugins.
  • (feature) Added the New Block wizard to the Wizardry menu.
  • (feature) Quick Start wizards now have a step for identifying and renaming discovered blocks.
  • (feature) Added the Brew kettle Quick Start wizard.
  • (feature) Added the Fridge without beer sensor Quick Start wizard.
  • (feature) Added a Builder part for the Setpoint Driver block.
  • (improve) If the PID is controlling a Setpoint Driver, values in PID and Setpoint Driver parts are automatically converted to user temp units.
    • The underlying value is still unitless degC.
  • (improve) Added a Setpoint Driver part to the Builder layout generated by the HERMS Quickstart wizard.
  • (feature) brewblox-ctl setup and brewblox-ctl update enable reflection in the avahi-daemon config. This removes the need for a separate mdns service.
  • (remove) Removed the mdns service.
  • (improve) The Spark service no longer relies on the mdns service for Wifi device discovery.
  • (improve) Spark device discovery in brewblox-ctl no longer requires pulling and running an mdns container.
  • (improve) Removed the --mdns-port setting from brewblox-ctl service ports.
  • (documentation) Added documentation for the state/history events published by the Spark service.
    • These events are now considered a public interface, meaning we'll strive to make any changes backwards compatible. A deprecation period will be used if this is impossible.
  • (documentation) Added documentation for block types. You can find it at https://brewblox.netlify.app/dev/reference/block_types.html.
    • Blocks are now also considered a public interface spec.
  • (improve) Updated traefik and traefik label syntax to v2.
  • (feature) The DS2408 block can now toggle between Valve mode and Actuator mode.
  • (feature) The last controller actions before shutdown are now logged when the Spark service connects. This will help us debug controller crashes.
  • (improve) The UI now immediately shows updated status if the Spark service stops or crashes.
  • (improve) If the Spark service is unable to connect to a controller, it will gradually increase the retry interval.
    • The minimum interval is 2s, the maximum is 30s. After 20 failed attempts, the service increases the interval, and restarts.
    • The retry interval is reset when a connection attempt succeeds.
  • (improve) Generated (default) labels in Graph/Metrics widgets now support degree units other dan Celsius/Fahrenheit/Kelvin.
    • For example: sensor/value[degP] will have the default graph label [sensor] value °P.
    • This change is not applied retroactively. To update the default label, remove and re-add the field.
  • (feature) The legend in graphs now shows the latest value for each field.
  • (improve) Improved dialogs for selecting blocks / block fields.
  • (feature) In dashboard edit mode, you can now move selected widgets by using the arrow keys.
  • (feature) In Brewery Builder, you can now move selected parts by using arrow keys.
  • (feature) You can now double click on widgets to toggle between Basic and Full modes.
  • (improve) Improved the block wizard and block widget wizard layout.
  • (improve) Overlaid dialogs now show a "back" button instead of a "close" button.
  • (feature) Added the brewblox-ctl add-plaato command to add a service for the Plaato digital airlock.
  • (feature) Added the brewblox-ctl makecert command to generate SSL certificates.
  • (feature) Added the brewblox-ctl libs command to reload the release-specific commands.
  • (improve) Tweaked Influx settings to reduce SD card wear and tear.
  • (improve) Added dmesg to the log generated by brewblox-ctl log.
  • (improve) brewblox-ctl add-spark now shows a warning if an existing Spark service is found that has no --device-id or --device-host flag set. This prevents errors where both services attempt to connect to the same controller.
  • (improve) brewblox-ctl setup no longer create the Home dashboard and spark-one service in the UI. Quick Start wizards and service autodiscovery made presets redundant.
  • (improve) Added the --quiet flag when installing Python packages in brewblox-ctl update.
  • (improve) If the digital actuator state is pending, the Valve part will now show a spinner. This mirrors behavior of the ON/OFF button shown in digital actuator / valve / pin array blocks.
  • (improve) The enable/disable toggle in blocks is now more consistent, and mentions which block is (or isn't) driven.
  • (update) Updated device-os in firmware to 1.5.2, with fix for uninitialized variable in network handler.
  • (improve) Improved test coverage tooling in firmware.
  • (fix) Fix rounding errors when converting Celsius to Fahrenheit in firmware.
  • (fix) Reduced impact of OneWire disconnects and communication errors in firmware, so they do not slow down the system.
  • (fix) The history service now correctly discards invalid history event data.
  • (fix) Fixed a bug where min/max range overrides in the Graph were converted to string values.
  • (fix) Dashboard widgets no longer make sudden large jumps when being dragged.
  • (fix) The Setpoint Profile graph is no longer sometimes initially rendered much smaller than the widget.
  • (fix) Fixed a bug where Spark blocks were not correctly logged in brewblox-ctl log.
  • (fix) Moving widgets no longer causes a document update conflict in the datastore.
  • (fix) The shelf height in the Fridge part is now editable again.

Automation changes

  • (improve) Improved visibility for inactive automation elements.
  • (improve) The title property is now editable when adding a new automation action/condition.
  • (improve) The automation editor is now enabled on mobile or small screens.
  • (fix) The automation editor now shows the correct template when loading a /ui/automation/<template-id> URL.
  • (feature) Added Scripted action.
  • (feature) Added Scripted condition.
  • (feature) Added code snippet generators to the script editor.
  • (improve) Block value conditions now correctly convert quantity values (eg. degC/degF) if the condition and block use different units.
  • (fix) HTTP Request action errors now show the error, and not just "request failed with status code XXX".
  • (fix) Changing block links in the Block change action no longer causes an error.

# Brewblox release 2020/06/23

firmware release date: 2020/06/23

To fix issues with potential hangups in DS2413/DS2408 extension boards, we rewrote the code for OneWire devices to be simpler and better testable.

Down the line, this also allows for using simulated OneWire blocks in the firmware sim, and better feedback for when faulty devices are connected to the bus.

Hotfix 2020/07/01

  • Fixed a typo in the reference enum (setting / measured) for the SetpointDriver block
  • If saving a widget or dashboard causes a datastore error, an error message is shown, and the object is rolled back to the latest state in the datastore. You can then retry the change.
  • Empty event messages sent by disconnecting services no longer cause an error in the UI.


  • (improve) OneWire classes for DS18B20, DS2413 and DS2408 have been rewritten from scratch.
  • (improve) Mock implementations of these devices and a mocked OneWire bus have been added.
  • (improve) Simulation and unit testing of OneWire hardware is now possible and has been added.
  • (improve) OneWire communication errors are now simulated and tested
    • Details: https://github.com/BrewBlox/brewblox-firmware/pull/234
  • (improve) Added the --no-pull option to brewblox-ctl setup. This can be used for configurations that explicitly want to use locally built or retagged images.
  • (fix) Fixed sizing and alignment for some icons in Builder parts.

Automation changes

  • (fix) Blocks with only readonly fields can now be used in Block Value conditions.
  • (improve) Changed "exit process" tooltip in automation widget to "close and remove process".
  • (feature) Request headers are now editable in the Webhook action.

# Brewblox release 2020/06/15

Firmware release date: 2020/06/07

While evaluating what will be next for the automation service, we spent this release improving the internals of Brewblox.

The biggest change is that we decided to use a different protocol for eventbus messages (used to publish history data). The short version is that the MQTT protocol is more lightweight, and can be used by external scripts and services without exposing the 5672 port. The details of the how and why are described here and here.

The existing protocol will be supported until 2020/09/15.

After that, services and scripts that publish history data will have to use MQTT to be compatible. We updated the boilerplate repository and the script tutorials to provide code examples.

The immediate advantage is that Brewblox needs one less Docker container: the emitter service was used to convert AMQP events to a protocol usable by the UI. The UI can now subscribe directly to MQTT events, eliminating the need for the emitter service.


  • (feature) Brewblox now uses the MQTT protocol for history events. AMQP is still supported, but will be disabled in three months.
  • (improve) Removed the emitter service.
  • (improve) The integral in the PID now adds P+D every interval instead of only P.
  • (improve) Significantly reduced CPU usage in the Spark service when communicating with the controller.
  • (improve) Spark page behavior (list/relations, sorting mode) is no longer shared for all users of the UI.
  • (improve) Reduced output noise during brewblox-ctl setup
  • (improve) Improved handling for the Pump part:
    • If no block linked, it will toggle manually, and use part settings to remember on/off.
    • If a block is linked, but does not exist, it will show an error.
    • If a digital actuator is linked, it will toggle the block when clicked.
    • If a PWM is linked, it will show a slider dialog when clicked.
  • (improve) Reduced line stretching when the carboy is scaled.
  • (feature) Timestamp formatting when exporting history data to CSV is now configurable (nanoseconds, milliseconds, seconds, ISO 8601-string).
  • (feature) The troubleshooter now shows an "update firmware" button when firmware is incompatible.
  • (fix) Fixed too much config being imported when adding a block to the graph widget.

Changes (automation)

  • The Webhook action now has a "Try it" button in the template editor.

# Brewblox release 2020/05/27

Firmware release date: 2020/05/13

For the last few months, we have been working on building advanced process control for Brewblox. After all: brewing is a process with multiple distinct steps. Currently, Spark settings must be changed multiple times over the course of a brew day.

We aim to streamline this, so you only have to press "start" and "next" during a brew day.

This is implemented as the new automation service on the Pi.

The service is currently in alpha / preview, and is not yet enabled by default

You can use the UI to build processes with branching or repeating steps. The service runs processes in the background, and can interact with all Brewblox devices. This includes Spark controllers, but also third-party devices and REST APIs.

Processes can use sensor values from one device to adjust settings on another device. They can also integrate manual actions by creating tasks for the user, and then waiting until the task is marked as done.

Later features will include integration with recipe formats such as beer.xml.

Everything else in Brewblox will keep working as usual. The automation service is and will be completely optional.

We'll make an announcement when the automation service is sufficiently polished and stable for general release. For now you'll see release notes split between regular changes, and those concerning automation.

For those wanting to try the preview version, we added a short guide.


  • (improve) Widgets now show hints / get started buttons when empty.
  • (feature) Some builder parts are now scalable. This applies to parts that did not previously have size sliders, and do not include tubing.
  • (feature) Merged the PwmPump and Pump parts in Builder. If you had a PwmPump, it is automatically migrated.
  • (feature) Value display parts now can act as tube. Do note that scaling parts with flow enabled rapidly increases flow calculation time.
  • (feature) The Graph Widget now has an action to quickly add fields from specific blocks.

Automation changes

  • (feature) Added webhook action
  • (improve) Changed Create Task to Edit Task.
  • (improve) Condition tasks are now created at step start.
  • (improve) Steps and focused phase (conditions / actions / transitions) are now shown side by side.
  • (fix) You can now use readonly fields as a condition.
  • (feature) You can now select all options when changing task status.

# Brewblox release 2020/05/14

Firmware release date: 2020/05/13

This release fixes a bug where Digital Actuators would "freeze" under certain circumstances.

We also added a new command to brewblox-ctl: brewblox-ctl service expose. This sets or clears exposed ports for any service.

So far, the most common use case is to expose the eventbus port. You can do this by running brewblox-ctl service expose eventbus 5672:5672.

Earlier this week, we also published some tutorials for adding straightforward scripts that interact with Brewblox. You can check them out at https://brewblox.netlify.app/dev/.


  • (feature) Spark services can now be paused. The service will wait with discovering / connecting a controller until the status is cleared.
  • (feature) Constraints are now settable in Quick Actions.
  • (feature) Added a scale slider to the Brewery Page. This allows rendering the same layout in a sensible size in both the Builder Widget, and the Brewery Page.
  • (improve) Changed the layout selector dropdown in the Builder Editor to use a tab. This hopefully improves visibility.
  • (defaults) Increased the default Kp for the Glycol Quickstart wizard heater from 20 to 100 1/degC.
  • (feature) Added the brewblox-ctl service expose command.
  • (improve) Increased filtering for derivative a bit again to reduce effect of limited sensor resolution for slow processes with high TD.
  • (fix) Fixed interval for periodic check on digital actuators to verify that desired and actual state match.

# Brewblox release 2020/05/04

Firmware release date: 2020/05/03

# Spark simulator

We now officially support Spark simulation on the Raspberry Pi. This means that you can run a fully simulated Spark, instead of the actual hardware, to experiment with settings, or try before you buy. The code used by the simulator is the actual firmware code running on the Spark, with some changes for simulation of course.

You can find instructions on how to add and use it at https://brewblox.netlify.app/user/adding_spark_sim.html. From now on, the simulator is embedded in the devcon container. If you used the preview simulator, please update by running

brewblox-ctl add-spark --name spark-sim --force --simulation

# New MDNS library (firmware)

We found out that one of the reasons for instability was running out of memory. A big consumer of memory was a third party MDNS library. MDNS resolves .local addresses and automatically finds your Sparks on the network.

Elco refactored the MDNS library to use much less memory and cpu. It is available here to use in your own projects.

PR #217

# Interpolate values in output of slower filter stages (firmware)

Sensor data runs through max 6 filter stages. Each stage runs at a slower update rate as the previous. This resulted in blocky output for slow filters. I added linear interpolation between values of slower updated filters, for a smooth output. See the image below for the before and after.


PR #225

# PID improvements to make the derivative much more usable (firmware)

The PID reads the derative from a certain filter stage depending on the value of the Td time constant. The default filter it selected was very slow, larger than Td, to not have much noise. But this meant that the derivative used by the PID was also delayed a lot. Not helpful if you want to prevent overshoot!

With the new filter implementation, the PID can work with a lot less filtering, and the selected filter delay is now 25-50% of Td. The derivate part will also only be active if it counteracts the proportional part (if it prevents overshoot).

You'll find that the derivative part of the PID is now a lot more predictable and more effective.

PR #226

# PWM improvements to look more towards the future (firmware)

The calculations for the achieved PWM value only looked back, not ahead. This meant the PWM value always lagged the setting.

  • The PWM now looks ahead for what it can achieve and limits how far it looks back.
  • When at 0% or 100%, the achived value now also slowly changes.
  • A minimal low/high time is introduced to prevent two short bursts when the setting increases quickly.

PR #217

# Reduce memory used by filters in setpoints (firmware)

Another change to reduce memory use is to create filter stages on demand. When you change the filtering in a setpoint, or the Td value of a PID, the setpoint will create only the needed filter stages.

PR #223

# Fix fluctuations in mock sensors (firmware)

For testing, you can add periodic fluctuations in a simulated mock sensor. I fixed some bugs and they now work as expected.

PR #224 and PR #218

# Other changes

  • (feature) Added indicator icons for connection type (wifi | usb | simulation) in sidebar.
  • (feature) UI temperature units and display settings units are now settable in the same dialog. The dialog can be accessed from both the Display Settings block and the service actions.
  • (removed) Dropped support for Kelvin temperature units.
  • (removed) Time and LongTime units are no longer configurable.
  • (improve) Made Quick Actions editor less cluttered.
  • (fix) Fixed a bug where PID settings were not correctly editable in Quick Actions.
  • (feature) Setpoint Profile profiles now support import/export from and to file.
  • (feature) Quickstart wizards in simulation services now offer to create mock sensors.

# Brewblox release 2020/04/21

Firmware release date: 2020/04/20

The previous release brought multiple firmware issues to light. We hotfixed some of them immediately, and then started work on the others. This release includes fixes for a few nasty out-of-memory errors that would manifest as sudden reboots.

In the UI, we focused on improving usability. This includes fixes for scenarios such as:

  • "I don't see any dashboards or services" (show notification while waiting for datastore, automatically reload page when available)
  • "Controller out of memory in Quickstart wizard" (prompt if existing control blocks are found on controller)
  • "I picked the wrong sensor in Quickstart" (swap addresses of sensor blocks)

For the majority of changes, we'd be happy if nobody notices them, and they Just Work.

We also added the L-Valve Builder part.


  • (fix) The outOfMemory handler in the firmware could cause a crash.
  • (fix) Reduced firmware memory use to avoid crashes in listening mode.
  • (fix) Removed firmware lock on serial connection to avoid crash in listening mode.
  • (fix) Controller now reboots after listening mode.
  • (fix) Reduced connection timeout in firmware.
  • (feature) Instructions are now shown on LCD screen during listening mode.
  • (feature) Memory use is now shown on LCD screen.
  • (feature) Added eeprom dump command, for use in brewblox-ctl. This allows detailed export of persistent data for debugging purposes.
  • (fix) PWM now keeps better track of state history. This prevents incorrect jumps after a period of steady state.
  • (fix) PWM will now only stretch periods after a normal-length period.
  • (improve) Docker volumes are now also pruned during updates.
  • (improve) Added the --ignore-spark-error flag to brewblox-ctl backup save. If set, the update will continue if it encounters an unreachable Spark service.
  • (feature) Added the brewblox-ctl disable-ipv6 command. Having IPv6 enabled on the Pi can cause interrupts for all services whenever a service restarts. If your Spark service is frequently unreachable without the controller restarting, you can run this.
  • (improve) Reduced UI memory usage.
  • (improve) In the relations diagram, Logic Actuator comparison blocks are now rendered above the Logic Actuator itself. This shows more clearly them being "input" for the Logic Actuator.
  • (feature) The Quick Actions widget is now compatible with all Spark services on your system.
  • (improve) Show a spinner when busy applying a Quick Action.
  • (improve) Show a notification whenever a Quick Action is applied.
  • (improve) Refresh all blocks after a Quick Action, to show secondary effects (eg. PID values after changing a Setpoint).
  • (improve) Quick Start wizards are now disabled when no Spark service is available.
  • (config) Changed the default Ferment fridge Minimum ON constraint from 3 -> 2 minutes.
  • (fix) The brewery page no longer potentially references to a property of a removed layout.
  • (feature) Sidebar status is now stored in localstorage. It will retain its open/closed status on next visits.
  • (feature) The UI now waits for the datastore to be available, and then automatically reloads the page. This prevents mysteriously blank pages just after startup.
  • (feature) Added controller reboot action to the Spark service page actions.
  • (fix) The actual HTTP errors are shown again in error notifications.
  • (feature) Added the L-valve Builder part. The valve can be triggered manually, or linked to a Digital Actuator / Motor Valve.
  • (feature) Progress messages are now streamed to the UI during firmware updates.
  • (improve) The "Edit start/end" button is now always available for Session Graph Notes.
  • (feature) Added a duration preset dropdown for all relevant graphs. This was previously missing for sidebar graphs in dialogs.
  • (deprecate) Deprecated the Block Groups feature. It provided a solution to a problem nobody had.
  • (deprecate) Removed the Session View widget (the precursor to Session Log). It has been deprecated for 6 months now.
  • (feature) Added widget wizards for discovered blocks.
  • (feature) Quickstart wizards now check for existing blocks on the controller. If blocks are found, you can choose to keep them or remove them. You still have to remove obsolete dashboards and widgets yourself.
  • (fix) Resolved an issue where Builder parts were not draggable in browser fullscreen mode.
  • (improve) ENTER / CTRL-ENTER behavior in dialogs now more consistently saves and closes input dialogs.
  • (feature) Added OneWire Temp Sensor action to swap addresses with a different sensor. This should help when a sensor is being replaced, or the wrong sensor was chosen during a Quickstart wizard.
  • (feature) Added selectors for overriding graph Y ranges (both Y1 and Y2).
  • (API) Added "policy" argument to history/query/last_values endpoint.
  • (fix) Graphs with a start time earlier than 24h ago will now never use the realtime dataset (only kept for 24h).
  • (improve) When the service can connect, but does not receive a handshake, the troubleshooter suggests to flash the bootloader.

# Brewblox release 2020/04/06

Firmware release date: 2020/04/06

This release includes a collection of quick fixes to problems introduced or uncovered in the previous release.

Important: we fixed a problem with updating brewblox-ctl. To make use of the fix, please run brewblox-ctl update twice. The correct version of brewblox-ctl for this release is 0.18.0.


  • (fix) The Spark LCD now uses the correct formula for converting Celsius to Fahrenheit.
  • (fix) PID integral is now reset Ti is set to 0.
  • (fix) Two consecutive operators (a|&b) in Logic Actuator now trigger an error result in firmware.
  • (improvement) brewblox-ctl flash is now faster.
  • (improvement) brewblox-ctl bootloader no longer requires the --force option.
  • (fix) Improved how in-UI firmware updates are handled. This doesn't solve all known issues, but should improve reliability.
  • (fix) The update of brewblox-ctl now ignores the local cache. Please run brewblox-ctl update twice to make use of this fix.
  • (fix) Blocks from all services can now be selected in Builder Setpoint / Sensor display parts.
  • (improvement) The Logic Actuator expression field is now more responsive.
  • (improvement) The Logic Actuator error display now has a fixed height. Lower-placed elements will now consistently render in the same place.
  • (fix) When loading the UI, a notification will appear if the datastore could not yet be reached. It is common for the datastore to be much slower to start up than the UI. This results in a UI without any available dashboards or services.

# Brewblox release 2020/04/02

Firmware release date: 2020/04/02

We're happy to announce the release of the Logic Actuator block. You can use this block to toggle a Digital Actuator based on the state of other Digital Actuator, Motor Valve, Setpoint, or PWM blocks.

For a more in-depth explanation, see the blocks page.

To assist with this feature, we also added the Mock Pins block, and constraints for delaying the ON or OFF switch on digital actuators.

A less noticeable change is that we now build all our Docker images to be suitable for both AMD64 desktop computers and the ARM32 Raspberry Pi.

Previously, we prefixed Pi image tags with rpi-. This is no longer required. To prevent breakage, we now tag the universally compatible images both with and without prefix.

This change will make it possible to move your system between a desktop computer and a Pi without having to make any changes to configuration.


  • Added Logic Actuator block.
  • Added Mock Pins block.
  • Added Delay ON and Delay OFF digital constraints.
  • Made all Docker images multiplatform, removing the need for rpi- prefixes.
  • Updated Spark system libraries.
  • Fixed a bug where controllers would stop being discoverable over Wifi.
  • Added support for value fluctuations in Temp Sensor (Mock).
  • brewblox-ctl backup load now reads the values from the loaded .env file before loading databases and Spark services.
    • You can disable this with the --no-load-env option.
  • brewblox-ctl backup load now restarts Spark services to make sure they use the correct block names.
  • brewblox-ctl setup now uses a Docker container to generate SSL certificates. The host no longer needs to have OpenSSL installed. This was an issue for installing the system on Mac hosts.
  • Fixed a bug where the graph in Setpoint Profile was not updated if the block settings where changed in a different widget.
  • The firmware simulator is now embedded in the Spark service Docker image. This is a first step towards having a demo setup that does not need a controller. For now this only works on amd64 (desktop) computers. We're still working on getting the firmware to compile an ARM simulator.
  • Fixed a bug where DS2408 / DS2413 chips could not be removed in the UI.

# Brewblox release 2020/03/18

Firmware release date: 2020/03/02


  • Added the Brewery page mode, for full-screen display of a single Builder layout.
  • Added documentation page describing all widget types.
  • Added documentation page describing all block types.
  • Timeout values for Spark services are now configurable in docker-compose.yml.
  • Refactored part settings dialogs in Builder.
  • Fixed a bug where no block was selectable as link in the Temp Sensor part.
  • Fixed a bug where a disabled PWM pump part was still animated.
  • Decreased minimum Builder layout size to 1x1.

# Brewblox release 2020/03/05

Firmware release date: 2020/03/02

This is a smaller release to fix some issues that popped up after the 2020/03/02 release.

A new feature is that now block widgets can easily be added to the Spark LCD screen. Quick start wizards will also try and add generated PIDs to the display.


  • Quick start wizards now try to add their PID blocks to the display.
  • Added the "Add to Spark display" action to sensors, setpoints, PWM, and PID blocks. This will attempt to add the block to an available slot on the Spark LCD, and open the display settings in a dialog.
  • The .env file is now included in backups.
  • Fixed a bug where the wrong actuators would be listed in the text file created during the Remove all blocks action.
  • Exporting actuator / sensor links is now also available as separate action.
  • Fixed a bug in the Glycol wizard where the backend would interpret a time value as the Planck constant.
  • The Spark service now uses a 60s timeout instead of a fixed number of retry attempts before it restarts.
  • docker-compose.shared.yml is now always copied from defaults during updates
    • If you need to make changes to shared services, you can do so in docker-compose.yml

# Brewblox release 2020/03/02

Firmware release date: 2020/03/02

This release includes fixes for two very important bugs.

The controller needed a reboot when losing and regaining connection to Wifi. Many Spark controllers are placed in basements or sheds where reception is patchy, making this a very serious issue. We're reasonably certain we fixed this particular bug, but please let us know if you continue to have connection issues.

The second issue is not as common, but no less serious. It was possible for actuators with mutex constraints to enter a deadlock if a DS2413/DS2408 device disconnected and reconnected at the wrong time.

To solve this, we reworked how constraints interact with the mutex. This includes constraints now having their own setting for the extra lock time (the time between an actuator turning off, and the next actuator being allowed to turn on). To not break current configurations, the mutex will still have its own setting, which will be treated as a default value. The setting in the constraint overrides the one in the mutex.


  • Fixed a bug where the controller could not be discovered over Wifi after a network or router reset.
  • Fixed a bug where the controller could not be connected to over Wifi after a network or router reset.
  • The service will now restart and reconnect after multiple controller messages failed to send.
  • Fixed a bug where the controller losing connection to a DS2413 actuator could cause a mutex deadlock.
  • Mutex constraints for digital actuators can now override the extra lock time setting in the Mutex.
    • The extra lock time is the minimum time between an actuator turning off, and a different actuator being allowed to turn on.
  • Updated docker-compose.yml version to 3.7.
  • Fixed a bug where the sensor display builder part was showing its value twice.
  • Made boil mode less prominent in the PID.
    • The "boil" text is hidden if the minimum boiling output is not set.
    • Boil mode settings are moved to below the PID calculation display.
  • Fixed a bug where additional fields were not shown in OneWire Temp Sensor full mode.
  • Streamlined wizards.
    • Options are now shown as clickable items.
    • Single click to toggle selection, double click to immediately continue.
  • The block name field is automatically filled with a suggestion when selecting an item in the block wizard.
  • You can now double click on dashboards to open the widget wizard.
  • You can now double click on the spark service page to open the block wizard.
  • Removed the menu for creating mock blocks - the block wizard is sufficiently efficient for quickly and often creating mocks.
  • Fixed a bug where the dashboard graph would not update when its configuration was changed in a dialog.
  • brewblox-ctl install now runs commands after all prompts are done. You shouldn't need to babysit a process that can take 10+ minutes.
  • Added a user guide for the basic concepts of the Brewery Builder.
  • Moved the layout selector in the Builder editor from the toolbar to the sidebar.

# Brewblox release 2020/02/12

Firmware release date: 2020/01/17

During development of the new website, we discovered the existence of a whole spectrum of colors not called $dark, $dark_darker, $dark_bright, or $darkish. We sprinkled some of them over the UI and brewblox-ctl.

As a happy side effect of implementing the automation service, we added auto discovery of Spark services. Any active Spark service in your docker-compose network will automatically show up in the UI sidebar. Click on it to add it as UI service.

Brewblox-ctl has been made significantly less spammy. You are still prompted at the start of commands (and can still disable that), but it now offers to do a dry run.

Dry running a command will print all shell commands / config changes to the terminal instead of executing them. If you enable verbose mode, it will both print and execute.


  • Implemented new color palette in UI.
  • Reworked widget styling.
  • Reworked widget/dialog toolbars.
    • Click the toolbar to edit widget title / block name / service title.
  • Improved scroll behavior and styling.
  • Improved wrapping behavior in small widgets.
  • Spark services are automatically discovered.
  • A green/yellow/red indicator for service status is shown in the sidebar.
  • Removed service wizards.
  • (Developers): Significant changes to interfaces used by plugins.
    • See brewblox-plugin for descriptions and examples.
  • Unpinned widgets no longer jump when being resized.
  • Reworked brewblox-ctl to add more options, and reduce spam.
  • Added --quiet, --verbose, and --dry-run flags to brewblox-ctl.
  • Use the --dry-run option, or answer d / dry-run in a prompt to have the command print its actions instead of executing them.
  • Added env commands to brewblox-ctl to list/get/set values in .env.
  • Moved brewblox-ctl save-backup to brewblox-ctl backup save.
  • Added brewblox-ctl backup load.
  • Moved brewblox-ctl editor and brewblox-ctl ports to the brewblox-ctl service group.
  • Added brewblox-ctl service remove and brewblox-ctl service show.
  • Added brewblox-ctl follow to see service logs.
  • Added help texts throughout brewblox-ctl.
  • brewblox-ctl service editor will now show an address you can directly copy to your browser to visit the editor GUI.

# Brewblox release 2020/01/20

Firmware release date: 2020/01/17

This release, we're happy to introduce the new Brewblox logo.

We've also fixed some longstanding bugs in how Safari displays Builder layouts.


  • Added the new Brewblox logo.
    • This is displayed in the UI, and on the Spark boot screen.
  • Firmware build date is now displayed on the Spark boot screen.
  • Added the brewblox-ctl save-backup command.
    • This creates a zip file in brewblox/backup/ with datastore and Spark export files.
    • We will soon add the corresponding load-backup command.
  • Fixed a bug in history where the wrong dataset was displayed in graphs for data with a very low update rate.
  • Fixed Builder icons being displayed in the top left in Webkit browsers (Safari).
  • Added an overview of previous notifications.
    • This can be accessed by clicking the bell icon in the bottom right of the UI.
  • A warning is now shown if the flow calculation in Builder exited early due to an overly complex layout.
  • Updated the icon used for heating PIDs in the Builder.
  • Dashboard / service / layout title is now shown as page title in the browser.

# Brewblox release 2020/01/02

Firmware release date: 2019/12/24

First of all: happy new year everyone!

As of this release, we officially support mobile devices. This update fixes the UI elements we identified as being broken on small screens. Any newly reported issues will be treated as bugs, and given due priority.

One exception is the Builder Editor. While technically it now works on mobile, it's pretty much unusable. For this reason, we've hidden UI links to the editor on small screens. Builder widgets in dashboards are still shown, and now automatically resize the layout to fit the widget/screen.


  • The UI automatically switches to mobile mode if the screen is less than 1000px wide.
    • This applies both when opening the UI on a small device, or resizing the browser window.
  • In mobile mode, some elements behave differently:
    • Widget/wizard dialogs are always maximized.
    • Dashboards are rendered as list.
    • In the Spark service page, only the block index is shown. Clicking on it will open the block in a dialog.
    • Graphs are given a fixed height to prevent rendering issues.
    • The Builder editor is hidden.
  • Fixed a lot of issues with elements not scrolling correctly.
  • The displayed layout in the builder widget now automatically resizes to match the widget.
    • To fix alignment issues in your layout, adjust the grid size in the builder editor.
    • We updated the default grid size for layouts generated in Quick Start wizards.
  • Redesigned toolbar buttons on dashboard and service pages.
  • Graphs now consistently re-render when widget is resized due to:
    • window resize
    • sidebar open/close
    • device rotation
  • Fixed double display of "this PID is disabled" warning in full PID widget.
  • Fixed warnings in Setpoint Profile having a lighter background color.
  • Fixed varying widget widths in the Spark service page.
  • Placed index buttons for dashboard/builder/wizard in the sidebar
  • Builder editor is now implemented as a page, and not a dialog.
  • Redesigned/moved the sidebar buttons for navigating to dashboards/builder/wizards.
  • Added option in the builder sidebar to prevent the "Click to resume editing" warning.
    • You still need to refocus the screen before you can use shortcuts.
  • Added a layout selection menu to the Builder widget toolbar.
    • This includes a dropdown with all known layouts, and a list with starred layouts.
    • You can star/unstar layouts in the dropdown.
  • Removed "full" version of the Builder widget (made redundant by the layout selection menu).
  • Reduced timeout in service <-> controller communication to prevent reboots caused by dropped messages.

# Brewblox release 2019/12/23

Firmware release date: 2019/12/17


  • Added annotations for graphs in session log
    • Open the graph and click on a line to add/edit an annotation
    • You may have to open/close the graph before the annotation shows. This will be fixed soon.
  • Updated system layer in firmware.
  • Fixed a bug in how spark pins are claimed / released.
  • Fixed a bug in how graph notes are exported in session log
  • Fixed a bug in build where source parts would disappear while dragging to copy parts
  • Fixed a bug in builder where flow was calculated incorrectly if there were multiple parallel pumps

# Brewblox release 2019/12/17

Firmware release date: 2019/12/03


  • Fixed a bug where device ID checks during discovery and handshakes were case sensitive.
  • Added automated migration from Session View sessions to Session Log sessions.
  • Added functionality to export/import a single block.
    • This is only useful in very specific scenarios, as the exported block includes links.
  • Plotly graphs are now exported in higher resolution.
    • To export a graph, mouseover the graph, and click the camera button.
  • Reworked the buttons in the widget toolbar to be more consistent.
    • In widget, from left to right:
      • toggle between full/basic view
      • open widget in dialog
      • show menu
    • in dialog, from left to right:
      • toggle between full/basic view
      • show menu
      • close dialog
  • Reworked the widget dropdown menu. It now shows all items in multiple columns.
  • Removed multiple redundant or obsolete actions from widget menus.
  • Fixed a bug in quick start wizards where editing the prefix could cause the application to freeze.
  • Fixed a bug in the graph settings where the tree would not correctly expand when searching.
  • Fixed a bug in the graph settings where you could not tick fields while searching.
  • In the builder, when clicking a heating element that is driven by a PID, it will open the PID dialog.
  • Setpoint setting is now directly editable in the PID widget (both in basic, and full view).

# Brewblox release 2019/12/06

Firmware release date: 2019/12/03

A smaller release again, with some fixed bugs, and a handful of display improvements.

To make it easier to find sessions, they can now have tags. When selecting sessions you can search to filter by name, date, or tag.


  • Added tags to Session Log sessions
  • You can now close the current session in Session log to return to initial state (no selected session)
  • PWM/PID displays in builder are now postfixed with %/°C.
    • Support for Fahrenheit when the PID is using a Setpoint Driver is still on the backlog.
  • PID displays in builder now display a different icon (±) when driving a Setpoint Driver.
  • Fixed a bug in quick actions where the change editor would close every time blocks were refreshed.
  • Fixed a bug where the side graph in a block dialog would exit and not resume when the full-screen graph was opened.
  • Fixed a bug where side graphs would not resize when basic/full mode was toggled in a block dialog.
  • Added help text to discover and add-spark commands
  • The plaato service now has an install script.
    • https://github.com/Brewblox/brewblox-plaato
  • brewblox-ctl update will prompt for pruning images at the start, not halfway in.
    • Due to how brewblox-ctl updates itself, this will take effect in the next update.
  • Improved rendering when there is a large number of dashboards.
    • Dashboards will no longer scroll in front of the bottom buttons in the sidebar
    • In wizards, a dropdown will be shown if there is a large number of dashboard options.

# Brewblox release 2019/12/03

Firmware release date: 2019/12/03

While the initial installation by now is pretty smooth, editing docker-compose.yml has a steeper learning curve.

To counteract this we moved some configuration, and added two commands to brewblox-ctl: discover and add-spark.

brewblox-ctl discover scans USB/Wifi for devices, and will print the ones it found.


pi@fridgepi:~/brewblox $ brewblox-ctl discover
usb 280038000847343337373738 Photon
wifi 280038000847343337373738 8332
wifi 240024000451353432383931 8332

brewblox-ctl add-spark will create a new Spark service in docker-compose.yml. It accepts multiple arguments, some mandatory, some optional.

For reference, see the updated docs for adding a spark and connection settings.

Example call:

steersbob@BrewBox:~/brewblox$ brewblox-ctl add-spark
How do you want to call this service? The name must be unique: new-spark
Discovering devices...
device 1 :: wifi 280038000847343337373738 8332
device 2 :: wifi 240024000451353432383931 8332

Which device do you want to use? [press ENTER for default value '1']2

Added Spark service "new-spark".
You can now add it as service in the UI.

For those cases when docker-compose.yml still needs to be changed, we moved the system services to docker-compose.shared.yml, to reduce cognitive load when editing.


  • Added brewblox-ctl discover
  • Added brewblox-ctl add-spark
  • Moved system services to their own file (docker-compose.shared.yml)
  • Added / updated documentation for adding and using multiple services
    • https://brewblox.netlify.com/user/multiple_devices.html
    • https://brewblox.netlify.com/user/adding_spark.html
    • https://brewblox.netlify.com/user/connect_settings.html
  • The --device-id flag in the Spark service configuration is now checked when connecting to a controlller.
    • This allows it to be used in combination with --device-host.
  • Prettified Quick Actions editor
  • Fixed a bug in glycol wizard actions

# Brewblox release 2019/11/21

Firmware release date: 2019/11/12

Instead of releasing a big new feature, we took the time to polish and refactor multiple smaller UI components.

We made a lot of small tweaks to the Session Log widget, and to many input components throughout the UI.


  • Multiple small improvements to the Session Log widget.
    • Insert date now inserts at the current cursor position, not always at the end of the note.
    • Creating a new Session now spawns a dialog where you can pick the session name, and choose from which other session to import notes.
    • Drag to resize notes when editing the Session Log (cogwheel button).
    • Render content of text notes to reduce layout "jumps" when toggling between basic and full mode.
  • Deprecated the Session View widget.
  • Improved display of editable fields (no more underlined text, but something that looks like an input field).
  • Next to presets, you can also pick a custom duration in the graph toolbar.
  • Auto-fill SSL cert questions in brewblox-ctl setup
  • Fixed an error that caused the PWM pump in the builder to not respond to clicks.
  • Display warning icon if a PWM/PID itself is disabled in the builder.
    • Recommended way to disable a control chain is to disable the setpoint.
  • Builder editor remembers the active layout.
  • Setpoint profile will now offer to insert a new point when making any change that will cause the current temperature setting to jump.
    • Previously, this only happened when changing the temperature of the last or next point.
    • Now it will also happen when editing the time.

# Brewblox release 2019/11/12

Firmware release date: 2019/11/12

Firmware stability and calendar time

Multiple users were suffering from crashes and hangups most likely caused by bugs in the Wifi system layer. This release includes a system layer update from particle that that should fix many of these issues.

The Spark now also receives the current time if it connects to the Spark cloud. So if the brewblox service on the pi down, it can still track profiles. If no cloud connection is used or the Sprak does not have WiFi, it will be able to restore the last system time it recieved from the service from backup memory. This means that the system time will only be lost on a power cycle. When using only USB, the service swill still set the time.

These changes also mean that the time cannot overflow anymore and long running profiles are not a problem.

Graph configruation

We reworked yet another configuration screen. This time it's selection of history fields (Graph, Metrics, Session View).

The Graph configuration suffered from being overly detailed. The history service has no notion of blocks, and allows every individual field to be selected. This requires users to make very fine-grained decisions when selecting data to show. Settings were also very spread out: adding a single field might require using 3 out of 4 tabs in the settings.

To improve visibility we removed the tabbed layout, and merged the settings in the field tree. You can now click on nodes to edit their display settings.

New Widget: Session Log

We added a new widget: the Session Log. The goal of this widget is to write down things during a brew day: when did things happen? What was the start SG? You can export this to printable HTML. It is also the easiest place to keep graphs of sessions, because it has a start and stop button.

The Session Log allows creating a template for your brew day / batch notes. In the basic view, you can click on a note to edit its value without changing the template settings. When starting a new session, it will automatically copy the template from the current opened session.

The session consists of a number of notes. You can edit the title and display width for each note in the Full view of the Session log widget.

  • Text notes are multiline editable fields. There's a button for adding a timestamp, to make it easy to use for logging purposes.
  • Graph notes have two sets of configuration.
    • You configure the graph fields while creating the template.
    • You can import fields from Graph widgets, or other graph notes.
    • During the brew day you click on the note to show the graph, or start and stop the period.

You can export sessions to a simple HTML file. Any markdown syntax in text notes will be rendered.

We think that Session Log is a sufficiently big improvement over the Session View widget that it can completely replace it. If feedback is positive, we'll likely deprecate and eventually remove the Session View widget.


  • Updated Spark system software.
    • This fixes multiple bugs that caused crashes or boot loops.
  • Reworked the settings component for selecting history data (used in Graph, Metrics, Session View, Session Log)
  • Add Session Log widget and builder part.
  • Tweaked the sidebar layout to remove visual clutter.
  • Renamed the Step View widget to Quick Actions.
  • Remove prompt to locally preview brewblox-ctl log.
  • Fixed a bug where invalid pin assignment would crash generation of the link file when clearing Spark blocks.
  • Setpoints now show the enable/disable toggle in the basic display.
  • Import graph settings when starting a new session in Session View
  • Improved Dashboard wizard.
    • ID/URL is now automatically suggested based on chosen title.
  • Block dialogs opened by clicking a relation diagram will now initially show the basic display.

# Brewblox release 2019/10/17

Firmware release date: 2019/10/14

The Builder editor was functional, but somewhat clunky at times. We often saw users being surprised by what happened when they clicked in the grid, because they didn't realise they still had a specific tool active.

To combat this, we split the tools between modes, and tools.

modes function like tools used to: a persistent mode that determines what happens when you click or drag in the grid.

  • Select: click or drag to select or unselect part. (No changes here).
  • Interact: click on parts to interact with them - this toggles valves or opens block dialogs. (No changes here either).

tools are now immediate actions that modify parts that are currently selected or under the cursor. You can trigger a tool by either selecting the target parts and clicking on the button, or selecting/hovering target parts and using the keyboard shortcut.

  • New: immediately opens the block catalog. After selecting a part in the catalog, click in the grid to place it.
  • Move: selected or hovered parts are attached to the cursor. Click in the grid to place them.
  • Copy: same as Move, except that parts are copied.
  • Rotate: floating, selected or hovered part is rotated 90 degrees clockwise. (Does nothing if multiple parts are selected.)
  • Flip: floating, selected or hovered part is flipped. (Does nothing if multiple parts are selected.)
  • Edit Settings: opens part settings for selected or hovered part. (Does nothing if multiple parts are selected.)
  • Interact: interacts with selected or hovered part. (Does nothing if multiple parts are selected.)
  • Delete: removes selected or hovered parts.

On the whole, this should offer a smoother and more intuitive editing experience.


  • Overhauled Builder editor tools.
    • Split tools in modes and tools (described above).
    • Automatically detect when the editor loses focus, to clearly display when keyboard shortcuts won't register.
    • Added redo button.
    • undo and redo are now triggered by ctrl+Z / ctrl+Y.
    • Moved the layout actions and selector to the toolbar.
  • Renamed many builder parts to follow a common convention, and allow sensible grouping when sorted.
  • Added the Label: text part to go along with Label: URL (previously Url Display).
  • Simplified the naming task in Quick Start wizards. Now it just asks to pick a prefix and a dashboard name.
  • Quick Start wizards now always create a new dashboard.
  • Added a toggle to the Spark service page, to show blocks either in a list (previous behaviour), or in a relations diagram.
  • Added a build date to the debug menu in the sidebar, to help identify the currently installed release.
  • When visiting the Spark IP in the browser, it now also shows its unique device ID.
    • This should make it easier to setup a configuration that uses multiple Sparks connected over Wifi.
    • See https://brewblox.netlify.com/user/connect_settings.html#spark-connection-settings for how this device ID can be used.
  • Fixed a bug in the Glycol wizard that would not allow the user to create a configuration without a glycol sensor.

# Brewblox release 2019/10/10

Firmware release date: 2019/09/16

We're happy with how we can open a block in a dialog from anywhere in the UI, but there were some drawbacks. Most notably, dialogs always used the (more extensive) settings component.

To fix this, we reworked how widgets are rendered. Most widgets can now easily toggle between simple and full modes, both when displayed on a dashboard, and in a dialog. Toolbar buttons have been tweaked to make accessing settings smoother.

In the coming weeks, we will be reviewing all widgets.

  • The basic view is for day-to-day use: settings and values that you want to see during a brew day.
  • The full view is for configuration: setting up and tuning your system.

While we were at it, we also improved the Spark service page. The index and the widgets now scroll independently. When selecting a widget in the index, the displayed widget will automatically scroll in view.


  • All widgets can now toggle between Basic and Full mode
    • The settings button on the widget toolbar will now toggle the widget to Full.
    • Clicking the settings button again will open the settings in a dialog.
  • Improved the Spark service page.
    • The index and widgets are now elements that scroll separately.
    • Click on an element in the index to make it visible in the right-hand scroll area.
    • Click the check button on the left to collapse the widget - it will no longer be shown on the right.
  • Blocks without links are now shown in the Spark relations diagram.
  • Builder parts with links now display a warning if they have a broken link.
  • Fixed a bug in Setpoint Profile where the Graph would not resize after a warning disappeared.
  • Added an express mode to brewblox-ctl install. This will install with default settings, and disable the the following commands will be used prompt.
  • Improved wording in brewblox-ctl prompts to clarify that immediately pressing enter will choose the default value.
  • Added a button to switch the Block in a Step View change while keeping the changed fields.
  • Added an option to restore names of discovered blocks when removing all blocks in the Spark Service page.
    • This is useful for resetting your system without having to figure out the physical position of New|TempSensorOneWire-1 again.
    • The following types can be restored: OneWire Temp Sensor, DS2408, DS2413.
  • Added an option to save a text file with hardware links when removing all blocks in the Spark Service page.
    • This can serve as reminder which pins were used by which actuator.
  • Fixed a bug that incorrectly marked some Step View steps as not active if they contained PID setting changes.
  • Shuffled some items in the sidebar.
    • Added a quick button for the Builder Editor.
    • Moved the dashboards and services up, and placed the Quick Start and Builder Editor items below them.
    • Placed the plugins button at the bottom, next to the debug button.
  • Added a button in the Builder Editor to create a widget showing the current layout.

# Brewblox release 2019/10/01

Firmware release date: 2019/09/16

So far, we like how quick start wizards simplify the setup process. We intend to have a wizard for all commonly used setups. Feel free to make a request if you have or want a specific setup!

We added two this release:

RIMS Brew-in-a-Bag uses a single kettle and a RIMS tube.

Glycol Fermentation generates a fermentation setup where cooling is done by pumping glycol through a coil.

  • Added RIMS Brew-in-a-Bag and Glycol Fermentation quick start wizards.
  • You can now export graph data to CSV from the Graph widget actions.
    • This will use the currently displayed time span, but always choose high precision data.
  • You can now save and load stored profiles in Setpoint Profile.
    • Profiles are stored globally, and can be used in all your Setpoint Profiles.
    • When loading a saved profile, the Setpoint Profile keeps its current target.
    • Profile points are relative to the start time. When loading a profile you can choose to set start time to now.
  • Fixed a bug that significantly increased the UI size. Page load should now be noticeably faster.
  • brewblox-ctl update now asks to prune docker images to clean up disk space.
  • Added builder parts:
    • Gravity tube (simulates height differences in your layout by increasing flow speed).
    • RIMS tube
    • PWM display part (shows the same values as the Heating Element part)
  • The liquid level in Kettles is now editable. This is a cosmetic change: flow calculations treat every kettle as completely full.
  • Settings in quickstart wizards are now remembered if you go back in the wizard.
  • Setpoint displays in the builder can now be placed inline in tubes.
    • Each edge is connected to all other edges.

# Brewblox release 2019/09/12

Firmware release date: 2019/09/12

There is now a wizard for a HERMS configuration. To go along with this, we reworked the flow calculations to also consider kettles. This has been a pretty big rewrite, and we'll be adding fixes for some edge cases in the coming weeks.

If you have a layout where flows are suddenly going the wrong way, please let us know.

We did rename "arrangement" to "Quick Start", to better communicate the use case behind the wizard.

Because we're making more and more use of the setting popup components, we added a pull-out tab for graphs. This includes the Graph widget, but also various blocks, and the Setpoint Profile. The intention is that you can now easily access graphs, even if you opened the settings from a Builder layout or relations diagram.

This is part of the ongoing approach to reduce the number of elements initially visible, while making it easy to navigate between related blocks and widgets.

As it's a relevant feature for HERMS, we added Boil Mode support to the PID. When the setpoint is higher than a configurable value (default 100 celsius or equivalent), the integrator is disabled. A minimum output during boil mode can also be set.


  • Renamed "Arrangement" to Quick Start.
  • Added HERMS Quick Start wizard.
  • Reworked flow calculations.
    • Flow calculations now include kettles (no more need for the SystemIO workaround).
    • Calculations are significantly faster.
    • Increased default pressure for System IOs and pumps (flows go faster).
  • All blocks with graphs can now display them inline in their settings menu.
  • Changed some builder components.
    • Added a Setpoint Profile part.
    • The Heating Element part in the Builder can now be resized.
    • System IO/Pump pressure is now configurable in part settings.
    • Condensed service/block link selector into a single select that shows all blocks on all spark services.
    • You can now use a color picker and preset colors in both containers (Kettle, Carboy, Bottle), and System IO parts.
    • The PID display part now shows output setting. If output value is 0, the icon color turns white instead of red/blue.
  • Fixed a firmware crash if the Balancer tried to remove a non-existent ID.
  • The Web Editor for the configuration file now continuously checks whether the server is still online.
  • Display current status and values for pin/sensor options in quick start wizards.
  • Fixed a bug where the Step View would fail to update PID Kp settings.
  • Fixed a bug where the Step View would consider time durations such as "1h" and "60m" as not equal.
  • Fixed a bug where the relations diagram would not render correctly in Firefox.
  • PIDs are now configured differently for fridge and beer modes.
    • Changed the default settings when generated through a quick start wizard.
    • Changing beer <-> fridge constant mode will also change the PID settings. This is prompted to avoid silently overwriting user settings.
    • Fixed PID presets, and added new ones.
  • In the Setpoint Profile, if you change the upcoming point, it will offer to splice the profile.
    • This will generate a point at the current time and temperature setting.
    • This avoids immediate jumps in temperature setting - it will calculate the line from the current setting to the next point instead of from the previous point to the next point.
  • Fixed a bug where zoom level would be reset when a graph received a data update.
  • Improved the tooltip when constraints are configured, but none are currently limiting the value.
  • Improved explanatory text in Wizardry.
  • Fixed a bug in Quick Start wizards where repeatedly going back and forth between steps would exit the wizard.
  • Tweaked the theme colors. Toolbars are now less prominent.
  • The PID now supports Boil Mode.
  • Improved the toggle button for changing dashboard edit mode.

# Brewblox release 2019/08/22

Firmware release date: 2019/08/20

To make it easier to edit the configuration, we added a web-based editor for the docker-compose.yml file. You can start it by running brewblox-ctl editor, and visiting the Pi IP at port 8300.

To avoid redirection issues we've moved the UI to the /ui/ subdirectory. If you navigate to https://PI_ADDRESS you'll be automatically redirected. This fixes multiple issues with accessing the datastore on startup.


  • Added the editor command to brewblox-ctl.
  • Moved UI address root from / to /ui.
  • Pinned Docker image versions for external services (datastore, influx, and traefik).
  • Fixed erronous period stretching in the firmware when PWM duty goes over 50%.
  • Added ?safe URL parameter to disable loading remote plugins.
    • This allows removing plugins that prevent the UI from rendering.
  • Improved the Step view diff tooltip.
    • Actuator state is now printed as Active,Inactive,Unknown instead of a number.
    • Changed values are now rendered with old values in red, and new values in green.
    • Unchanged values are now rendered as a single value, instead of old => new.
  • Fixed a bug in Builder where a new part would be placed at an incorrect location.
  • Disabled the Editor button in IE/Edge browsers due to a breaking bug.
  • Improved help texts in the Builder settings screen.
  • Third-party plugins can now register Builder parts.
    • We'll be working to allow third-party plugins to acces helper functions.
  • Fixed a bug where the UI would return a 200 status code for /datastore and /history endpoints if the datastore/history service is not (yet) online.
  • Fixed a bug where changing duration in a Block graph would not re-render the graph.

# Brewblox release 2019/08/12

Firmware release date: 2019/08/06

No dramatic new features this week, just a steady stream of iterative improvements.


  • Added two oft-requested features to the Step View widget:
    • The Step tooltip in the widget now shows a detailed overview of the changes that would be applied (current => new).
    • In the settings popup, Steps and Step Changes can now be dragged to change their order.
  • Refactored the Graph settings popup.
    • It now uses tabs instead of expansion items.
    • There's a combined display settings tab. Y-axis and line color settings are placed here, with room for future settings.
    • Added help text clarifying that only fields updated the last 24h are shown, and that this will include renamed or deleted fields.
    • Added help text explaining averaging periods.
  • In the Builder Widget, tweaked the Select tool
    • You can now drag to add more parts to the current selection. (Previously it would clear current selection)
    • Flow is now correctly updated for currently selected parts after dragging them.
  • The UI is now more responsive while calculating flows.
  • Fixed a bug in the Step View widget where it would use the wrong field for PWM/Setpoint Driver setting.
  • When using brewblox-ctl log, blocks from the default spark-one service are added to the output.
    • We're still working on automatically detecting all active Spark servies.

# Brewblox release 2019/08/07

Firmware release date: 2019/08/06

The UI now supports third-party plugins. If you want to add your own custom widgets, you can now do so. We created the example repository https://github.com/Brewblox/brewblox-plugin to get developers started.


  • Added the plugin menu to the sidebar.
    • Plugins are loaded from an URL, and require a page reload to activate.
    • If a plugin failed to load, an error is shown here.
  • Fixed a bug where fast PWM mode failed to activate (Spark pins automatically switch to 100Hz mode when PWM period is set to < 1s)
  • Fixed a bug where you could not select a different service in the Fridge arrangement wizard.

# Brewblox release 2019/07/30

Firmware release date: 2019/07/25

This release is all about the UI. We implemented a handful of feature requests, and did some additional tinkering on the Brewery Builder.

We like where the Builder is headed in terms of features, but performance is becoming an issue. We'll likely re-evaluate the flow calculations soon, to make everything much more snappy.


  • Added a warning to the Motor Valve widget when 12V is disabled (Spark 3 only).
    • You can also toggle this in the Spark Pins widget.
    • 12V is disabled by default, to prevent accidental damage to 5V peripherals.
  • You can now select multiple parts in the Brewery Builder.
    • Drag to select in a square.
    • Click on a part to select/unselect it.
    • Click on the grid to unselect all.
    • Selected parts can be copied/moved/removed using the respective tools.
  • Added Undo button to the Brewery Builder.
    • Changes to the currently open layout are tracked.
    • Removed an earlier change where the delete tool would not be persisted.
  • The center shelf position in the Fridge Part is now configurable.
  • In the Builder Editor, moved the coordinate numbers from individual parts to the left and top edges of the grid.
  • Fixed a graphical bug in toolbars where title text would overflow.
  • Widget warnings now have a max width.
    • This prevents widgets in the service page suddenly all becoming much wider.
  • Constraints now show a separate message if no constraints are configured.
    • "Not limited" is still shown if constraints are configured, but not limiting.
  • When editing dashboard IDs, the ID is now validated to prevent unreachable URLs.
  • Default labels in the Graph and Metrics widgets are now prettified.
    • spark/sensor-1/value[degC] becomes sensor-1 value °C.
    • You can still edit labels to give them custom names.
  • In the Graph widget, line colors are now editable.
  • Objects in the relation diagram now have a hover effect.
    • This should increase visibility that they are clickable.
  • Made block warnings more consistent.
    • A warning is now also shown if the target is not set (eg. PID is not driving anything).

# Brewblox release 2019/07/23

Firmware release date: 2019/07/23

We're pushing some fixes in firmware, and the first of some new features in the Builder widget.

When brewing, processes often require physical changes to your layout (eg. when using detachable hoses). This can't be easily expressed in a single Builder, so we added the ability to quickly switch between layouts.


  • Introducing Layouts in the Builder widget.
    • Layouts are collections of parts, and are kept globally.
    • Each Builder can select one or more Layouts, and change between them like a slide show.
    • The Builder editor can toggle between all available Layouts.
    • Existing configurations are automatically migrated to a new Layout.
  • Made multiple improvements to the reliability of runtime firmware updates.
    • Some of them are firmware-side, so you'll only notice them during the next update.
    • Changed the LED color during runtime firmware updates from orange to purple.
    • Now immediately throws an error if you try to update while the service is not connected.
  • Fixed a bug where Digital Actuators would lose the link to the pin channel after a reboot.
  • A retry is scheduled when connection is lost to a Spark service.
    • If the retry restores connection, the notification will be automatically closed.

# Brewblox release 2019/07/18

Firmware release date: 2019/07/17

Due to Elco's upcoming holiday, we decided to push some firmware changes now. This leaves us time to fix any critical issues while he's still here.

This release does include a pretty exciting change: we can now update firmware over Wifi! You can even run it from the UI, without having to restart your services.

# IMPORTANT: If you skipped the last update, you'll need to run brewblox-ctl flash to enable updates in the UI.

The new mechanism is experimental, and may require a retry before it works. There are multiple checks in place to ensure that if an update fails halfway, the current firmware is not corrupted.


  • When the PWM setting is less than 5%, its actuator will not be listed as waiting for the Mutex.
    • This is mostly a cosmetic change, to prevent actuators visibly waiting for the Mutex because the PWM setting (briefly) jumped to 0.0001.
  • Fixed a bug where errors in the OneWire bus would cause the Spark to be stuck after rebooting.
  • Enabled flashing the firmware in the UI. It can be accessed from the actions button in the Spark service page.
    • This is available for both USB and Wifi connections, and does not require other controllers to be unplugged.
    • brewblox-ctl flash is still available.
    • If you're updating from an older version, you'll have to run brewblox-ctl flash to enable this feature.
    • The UI will prompt you to update if an older firmware version is found.
    • brewblox-ctl update no longer prompts you to flash the controller.
  • Brewery Builder changes:
    • Removed the % sign from the Pid Display part
    • Added the Url Display part. You can use this to easily navigate to local or external links.
    • The fridge wizard adds an Url Display that links to the fermentation arrangement guide.
    • PWM Display / Heating element parts are now clickable, and open the PWM settings dialog.
    • Pid / PWM displays now show achieved output values.
    • When closing / reopening the Builder editor with the Delete tool selected, the previous tool will be used instead.
    • Added a search field to the part catalog (shown when adding a new part).
  • Unit edit dialogs now use a value rounded to 2 decimals.
  • Reworked how constraints are displayed.
    • Normally, only the currently limiting constraints are shown.
    • Clicking the field opens an edit dialog.
    • This standardizes how constraints are rendered in widgets and block setting dialogs, and removes the need for an expansion item in setting dialogs.
  • Removed expansion items (collapsable subsections) from block settings dialogs.
    • During the last few months, we've moved generic actions and less relevant fields to dialogs and actions. This made the expansion items unnecessary.
  • Fixed an issue where API errors would generate useless error messages about commits only being possible in dynamic modules.

# Brewblox release 2019/07/15

Firmware release date: 2019/07/15

We've been reconsidering some widget names, as the "XXX View" format has some issues.

The immediate result is that Process View is now called Brewery Builder. It still works the same, but now has a different subtitle in the widget. Step View will also be renamed, but we're not sure yet how to call it. Feel free to add suggestions!

In the past, we've deprecated multiple types of blocks. This created some leftovers on the Spark that consumed valuable space in memory. Deprecated blocks will now be shown in the UI, where they can be removed.

The service/controller handshake mechanism added a useful version check, but was somewhat unreliable. We've added some fixes here to improve that.

Due to how driven blocks work (eg. a PID driving a PWM), it was possible for PWMs or Digital Actuators to suddenly turn on if the controller rebooted after the PID or Setpoint was disabled. We'd rather not have that, so we fixed it.


  • Show deprecated objects.
    • This allows you to clear space on the controller.
    • In the future, we'll use these objects to gracefully migrate the configuration when we deprecate blocks.
  • Improved PWM behavior when constrained.
  • Fixed a bug where PWM/Digital actuators would suddenly turn on if the driving PID was disabled.
  • Make display brightness configurable with a slider on the Spark 3.
    • Previously only supported on/off.
  • Fixed a bug where widgets would not be placed at the end when copied to a dashboard.
  • You can now view the PID relations from the settings dialog.
  • You can now view graphs for block widgets from the settings dialog.
  • Setting dialogs are now correctly closed when a breaking change is made. This happens when:
    • The block ID is changed.
    • The widget is removed.
    • The block is removed.
  • Renamed Process View to "Brewery Builder".
  • Fixed window scrolling when editing the Brewery Builder (again).
  • Parts in the Brewery Builder can now be placed on top of each other.
    • An indicator will show how many parts are placed at the same position.
    • New parts can be created on top of other parts (useful when filling kettles or fridges).
  • Standardized the Kettle part in Brewery Builder.
    • Kettle can be scaled in both width and height.
    • Small and Large kettles are now just kettles.
    • A liquid color can be set manually. This is a stopgap solution until we calculate liquid levels in kettles.
    • The text is now editable.
  • Added the Filter Bottom part. It can be resized in width to visually fit the kettle.
  • Improved handshake behavior in the Spark service.
    • The handshake is triggered repeatedly until a confirmation is received.
    • Added a timeout to the "waiting for handshake" state. Service is restarted after.
  • Added runtime firmware updates.
    • This allows updating the controller over both Wifi and USB, without having to stop all other services.
    • Firmware changes were required, so the first opportunity to use the new update mechanism is the next release.
    • UI prompts to update will be enabled in the next release.
    • This minimizes the issue where actuators would turn on while the firmware was being updated.

# Brewblox release 2019/07/10

Firmware release date: 2019/07/10

This release adds some usability improvements, and fixes an annoying bug in the firmware.

An oft-requested feature was for the Step view widget to display which step already has been applied. Note that this is independent from whether you actually clicked the button: it will consider the step active if applying it would not change anything.

The firmware had a bug where if the Spark couldn't find the network, it would retry before the previous search was finished. This would significantly slow down everything else.


  • Fixed a bug where the controller becomes very slow if Wifi is unavailable.
  • Improved the PID response to setpoint changes.
    • The proportional part of the calculation uses the immediate (unfiltered) value.
    • The integral still uses the filtered value.
  • Added a filter option to Setpoint: unfiltered.
  • Improved display of pending state in Digital Actuators and Motor Valves.
    • State is pending if one or more constraints block it.
    • A spinner is displayed over the desired state.
    • If the actuator is not driven, you can toggle the state back to the (non-constrained) setting.
    • A tooltip displays which constraint is currently blocking the state change.
  • The Graph now displays a message if no data is available for the current settings.
  • The "Apply Step" button is colored green if the step is currently active (matches the current state).
  • If a value was changed during the Step view prompt, it is persisted in settings.
  • Changed multiple parts in Process View:
    • Split the Pump in two parts: Pump, and PWM Pump.
    • Pump can be either manual, or linked to a digital actuator.
    • PWM pump is linked to a PWM (big surprise), and will turn slower/faster depending on PWM setting.
    • Actuator Valve can now also be linked to a Digital Actuator.
  • Display settings are reset when removing all service blocks.

# Brewblox release 2019/07/01

Firmware release date: 2019/07/01

This release moves around some things to make it easier to understand the system:

  • Filtering is moved from the PID to the (shared) setpoint.
    • The old value is not copied, so check the filter period in your updated setpoint widgets!
  • The filter now stores the sensor value, instead of the difference between setting and sensor. As a result, the setpoint is no longer filtered. Changing it will trigger an immediate response.

We've reworked the Fermentation Fridge arrangement. The result should now be much more intuitive for both starting and expert users. The default configuration now is that the actuators directly respond to the beer temperature, not via the fridge setpoint. This is much easier to understand and is less sensitive to badly tuned PID settings.

If you are running a pretty standard fridge setup, you probably want to restart from scratch with the new wizard.


  • Reworked the Classic BrewPi wizard.
    • It's now called "Fermentation Fridge".
    • Added documentation page at https://brewblox.netlify.com/user/ferment_guide.html
    • Generates fewer and more useful widgets on the new dashboard.
    • Simplified the Beer constant mode: it now directly uses the beer setpoint.
    • A Process View widget is added, displaying fridge/beer setpoints, and PID output.
    • Added back buttons in the wizard.
    • Automatically select unused block names.
    • Improved validation of block names.
    • Added short explanation while blocks and widgets are being created.
  • Renamed Setpoint/Sensor Pair to Setpoint
  • Moved the input filter from PID to Setpoint.
  • The Setpoint filter can now be manually bypassed.
  • The PID I value can now be manually set.
  • Added multiple parts to the Process View widget.
    • Setpoint display
    • PID display
    • PWM display
    • Fridge (can change size)
    • Carboy (can display a setpoint)
    • Keg (can display a setpoint)
    • Beer bottle
  • Added widget and block actions to the setting popups.
  • Improved the rendering and scroll behavior of the relations diagram (again).
  • Show widget type name in the settings popup toolbar.
  • You can now copy steps in the Step View widget.
  • Moved the "Add block" button to the bottom of the step in the Step View widget.
  • Fixed a bug where Actuator valves in Process view couldn't be linked to Motor Valve blocks.
  • Actuator toggle buttons now display a loading icon when they're waiting for a constraint.
  • Added edit button to Driven indicator (click to open settings for the top-level driver).
  • Added edit button in block selection popup.
  • Added Clone Block action.
  • Setpoints now display which PID blocks are using them as input.
  • Added an option in Step View to prompt for the actual value before applying.
  • Dashboard actions are now also shown in the dropdown on the dashboard toolbar.

# Brewblox release 2019/06/24

Firmware release date: 2019/06/24


  • Improved time to first load for the UI.
  • Improved firmware compatibility check.
    • Now separately displays whether it's still waiting for the service <-> firmware handshake.
    • Fixed a bug where the service <-> firmware handshake would not happen.

# Brewblox release 2019/06/19

Firmware release date: 2019/06/19 (Now also checked automatically)

WARNING: This release contains breaking changes

DS2408 Valves are now supported. We've also refactored actuators to be more consistent between DS2413 and Spark pins.

Pin Actuator and DS2413 Actuator no longer exist. The Spark now has a single block that contains references to all pins. There is now a single Digital Actuator block that can target either a Spark pin, or a DS2413 channel.

See the updated control chain documentation for a full overview of how this impacts configurations.

Newly introduced blocks: DS2408 Chip and Motor Valve. Their behavior is comparable to DS2413 Chip and Digital Actuator: Motor Valve targets a channel on DS2408 Chip, and can be toggled on (open) and off (closed).

Motor Valve is a valid target for PWM if you wish to have more fine-grained flow control.


  • Note down the current constraints of your DS2413 Actuator and Pin Actuator blocks.
  • Update your system.
  • Run the Discover new OneWire Blocks action in the Spark service page.
  • Add Digital Actuator blocks to replace your (now disappeared) DS2413 Actuator and Pin Actuator blocks.
  • Point your actuators towards the correct Spark pins or DS2413 pins.
  • Set the constraints on your new actuators.


  • Added new blocks:
    • Spark2Pins (System object, only exists on Spark v1 and v2)
    • Spark3Pins (System object, only exists on Spark v3)
      • Allows toggling 5V and 12V
      • Displays actual 5V and 12V voltage
      • Allows toggling LCD backlight
    • DS2408 Chip (Discovered)
    • Digital Actuator
    • Motor Valve
  • Removed blocks:
    • Pin Actuator
    • DS2413 Actuator
  • Actuator Valves in Process View Widget now can be linked to Motor Valve blocks.
  • Moved multiple Block actions to the Action dropdown button in the widget.
    • Rename Block
    • Choose Block (select different Block to be displayed by widget)
    • Block Info
    • Choose Groups
    • Choose Preset
    • Remove Block
  • Improved edit popups for values.
  • Improved performance when opening a dialog to select a block.
    • Options should now appear immediately.
  • Unit fields (temperature, time, etc) will no longer automatically replace - with 0 while editing.
  • Reworked the Datetime edit dialog.
    • For now we've gone with a masked input field.
    • The option to use a date picker will be re-added in a future release.
  • Fixed rendering issues in graphs.
    • The graph in the Graph widget will now correctly update when resizing the widget.
    • Full-screen graphs will no longer be rendered small before updating to the correct size.
  • Improved Display Settings layout.
    • Slots in the widget are now clickable, and will open the settings menu.
    • The settings menu layout now resembles the LCD layout: two rows of three slots.
    • Added border color to slots in the settings menu.
  • The Block Relations diagram is now also scrollable in the horizontal direction.
  • Fixed a bug where incorrect rules were used for Block names in wizards.
  • Fixed multiple bugs in the widget wizard when creating a new widget for an existing block.
  • In the PID widget, the entire input/output row are now clickable (opens settings dialog for input/output block)
  • When selecting a link (target block / input block /etc), you now often have the option to create a new block of a compatible type
  • The Spark service now compares service and firmware versions when connecting. An error will be displayed in the UI when they are incompatible.
  • Fixed a bug where a disabled Setpoint driver would not stop driving the Setpoint Sensor Pair

# Brewblox release 2019/06/04

Firmware release date: 2019/06/04

We (hopefully) fixed the reboot issues people were experiencing, and added the Step View widget.


  • Added Firmware Release Date to the Spark Widget. This should make it easier to check whether you need to flash the controller.
  • Added the Step View widget.
    • This allows applying predetermined changes to multiple Blocks at the same time.
    • You can choose to change a subset of Block fields - values will be merged.
  • Only reinitialize OneWire sensors when they are actually found, but have lost power since last read.
    • Previously a re-init was tried at every read error. This is a slow operation, which really slowed down the system when configured sensors were disconnected.
  • When using 100Hz PWM, unregister interrupt handler before PWM block destruction (fixed hard fault SOS).
  • Handle WiFi status and IP address display in system event handler.
    • A major bug in particle device-os could cause a hard fault SOS when WiFi was connecting in the system thread while the application thread was trying to read the IP address.

# Brewblox release 2019/05/28

Firmware version: 9b0330f4 (no changes)

Also compatible: 2789cc06.

A set of smaller changes. Two bigger features are in progress, but are not yet ready for release:

  • A rework of digital actuators, to also support valve expansion boards.
  • A stepper widget: apply predetermined changes to multiple Blocks at the same time.


  • The Spark service page can now be sorted by Block role.
    • Roles are: Process, Control, Output, Limiter, and Display.
    • The icons in the Spark page index are now role-specific.
  • Sorting in the Spark page is now persistent (will retain the setting if you reload the page).
  • Fixed a bug where Block (widget) wizards would not allow - characters in the name.
  • The Blocks in the relations diagram are now clickable.
    • Clicking on them will open the settings popup for that Block.
  • Added a "show relations" action to PID.
    • This displays its direct relations: from the sensor input to the pin output.
    • Blocks in this display are also clickable.
  • The metric selection trees in Graph/Metric wizards display fields that have had an update in the last day.

# Brewblox release 2019/05/20

Firmware version: 9b0330f4 (no changes)

Also compatible: 2789cc06.

The UI can be very overwhelming and cluttered, especially for new users. To combat this, we've updated the Spark page. It is now more suitable for quickly finding and showing specific blocks.

In the future, we'll also be grouping blocks more. For many use cases, control loops are more relevant than a bunch of loose blocks.


  • Reworked the Spark service page.
    • An index is shown on the left, and the blocks on the right.
    • To show a block on the right, select it in the index.
    • Added searching and sorting blocks in the service page.
  • Improved the block relations diagram.
    • Layout is now more inline with the control chain documentation diagrams.
    • Relations diagram is now scrollable.
    • Added an "export" button. This will export the full diagram as PNG.
    • Type display names are now used in the diagram (was: type id).
  • Added preview graphs to Graph and Setpoint Profile widgets.
    • They're shown when editing the widget, if the browser window is at least 1500px wide.
    • We're considering whether to add them to all block widgets that can display fullscreen graphs.
  • Fixed a bug where text fields in the Process view edit window would trigger tool shortcuts.
  • Fixed a bug where editing copied widgets and parts would also change the original.
  • Fixed scrolling in Graph and Metric widgets if a large number of metrics were selected.
  • Changed the display name of "Offset Actuator" to "Setpoint Driver".
  • Changed the display name of "Pulse Width Modulator" to "PWM".

# Brewblox release 2019/05/14

Firmware version: 9b0330f4 (same as last week)

Also compatible: 2789cc06.


  • Fixed a bug where the Block relations diagram would fail to render if any Block linked to a non-existent other Block.
  • Removed a fix for an earlier bug, where the Process View edit window would calculate the wrong grid square when opened after scrolling the page.
    • The bug was also fixed upstream, making our fix an overcorrection.
  • Improved error messages when the UI failed to save the change in the backend.
  • Added the "Export errors" action.
    • This can be found in a dropdown menu in the bottom left corner of the sidebar.
    • This will save all REST/datastore errors in the current session to a .json file.
    • If you're getting error messages in the UI, please run this action, and add the file in your bug report.
    • Errors are only kept for the current session: please export them before refreshing the page.
  • Fixed a bug where during creation of a Setpoint Profile, no target Block could be selected.
  • Moved both Y-axes in graphs to the right side, for easier viewing of the latest value.
  • The Brewpi Classic arrangement wizard now also creates a Graph widget
  • During the Brewpi Classic wizard, initial fridge/beer setpoint values are configurable in the user-defined temperature units.
  • The first created point in a Setpoint Profile is automatically set at 20 degC, 68 degF, or 293 degK, depending on the user-defined temperature unit.
  • When editing the Graph settings, a small preview graph is displayed.
    • This is only shown if the browser viewport is more than 1500px wide.
  • Fixed a bug in brewblox-devcon-spark where Blocks could not be read/changed/deleted using their numeric ID.

# Brewblox release 2019/05/07

Firmware version: 9b0330f4 If you're on the previous firmware version (2789cc06), you don't need to flash your Spark.

This release, we've reworked the brewblox-ctl tool. This improved code quality, and gives us more options for what we can do with future commands.

Running brewblox-ctl without a command will no longer open a menu, but now print all available commands. This allows us to add arguments to commands.


  • Reworked brewblox-ctl.
    • When running brewblox-ctl on an ARMv6 platform (Raspberry Pi model 0 or 1), a warning message with a confirmation prompt will be shown on startup.
    • The firmware flash commands will no longer print a notification about updating particle-cli.
    • The flash/bootloader/wifi commands must now either be run in a Brewblox directory, or with the --release argument.
    • Added brewblox-ctl http. This is used by other commands to make HTTP requests, and can be used for debugging the system.
    • The system will automatically restart after running brewblox-ctl update
  • Made decimal precision user-configurable in the Metrics widget.
  • Made the rules for new Block IDs stricter to prevent future issues.
    • ID must start with a letter.
    • ID may consist of letters, numbers, spaces, and these characters: | ( ) _ -
    • ID must not be longer than 200 characters.
  • Fixed a bug where clicking on an actuator button in unknown state would do nothing.
  • Disabled edit button (pencil) in PID widgets for input/output blocks that are not set.
  • The Wizardry menu is now scrollable on smaller screens.
  • Fixed a bug where the Block ID was still reserved if Block creation failed during importing of Spark Blocks.
  • Fixed a bug where importing a large amount of Blocks over USB would cause a buffer overrun.

# Brewblox release 2019/04/29


  • Added the Metrics widget
    • This is like the Graph widget, except that it only displays the last logged value from history.
    • It displays warning messages for values that have not been updated in a while. The "valid time" can be configured.
  • Fixed importing/exporting Blocks on the Spark controller.
    • The export format has changed: old export files are no longer compatible.
    • The import button is re-enabled in the Spark service page.
    • If a Block couldn't be imported, it will be skipped, and a message will be displayed in the UI.
    • Removed the savepoints functionality, as it was made obsolete by the new import/export mechanics.
  • Fixed a bug where Setpoint Profile would fail to save points with a temperature lower than 0°C.
  • In Process View, if a part can be linked to a Block (valves, sensors), the part menu now has a shortcut to configure the linked Block.
  • Fixed a bug where new Process View parts would be placed incorrectly if you scrolled the page before opening the edit modal.
  • Improved widget layout: if a Block has both a setting, and a measured value, it will consistently display setting before (left of) value.
  • Services will now log their version on startup.
  • EDIT: brewblox-ctl now allows disabling confirmation prompts. Run brewblox-ctl settings to enable/disable.

# Brewblox release 2019/04/23

There are no firmware changes in this release. If you have the latest version (2019/04/18), you do not need to flash your Spark. When in doubt, it's best to be safe and flash your Spark.


  • In the Process View edit modal, tools can now be swapped by hotkey.
    • Keys are listed to the right of the tool in the side bar.
  • In Process View, parts can be flipped again, using either the part menu, or the Flip tool.
  • Improved part display in the "New Part" modal.
  • Moved generic actions from the Spark Widget modal to the Actions button in the Spark service page.
  • Fixed a bug in Graph where the config would be corrupted when changing display type.
  • Fixed a bug in PID where Measured and Target output were displayed swapped.
  • DS2413 actuators are now viable options when running the BrewPi classic arrangement wizard.
    • For now, you must manually create the DS2413 actuator.
    • A button to create new blocks was added to the wizard.

# Brewblox release 2019/04/18

This is a small release, to fix two serious bugs. We will be releasing new features after Easter.


  • Fixed a bug where setpoint profile time values would be corrupted after changing them.
  • Fixed a bug where some Block wizards would crash.

# Brewblox release 2019/04/16

  • Fixed how setpoint/sensor pair works, so that setting can always be set and enabled/disabled is handled separately.
  • Fixed some issues with popup edit menus
  • Make invalid widgets deletable
  • Fix tree dropdown in graph config to not hide children when search is used

# Brewblox release 2019/04/15

Breaking Changes

  • SetpointSimple Blocks no longer exist, and have been merged into SetpointSensorPair
  • SetpointProfile now drives SetpointSensorPair
  • In Process View, rotated parts larger than 1x1 will have moved a few squares.
    • This is due to the new calculation for rotating parts


  • Resolved multiple issues with setpoints.
    • Merged SetpointSimple and SetpointSensorPair.
    • All fancy setpoints (eg. SetpointProfile) are now drivers of SetpointSensorPair.
    • Thanks @j616s for the suggestion of making SetpointProfile a driver!
  • Fixed a bug where disabling a PID would not set its output value to 0.
  • Overhauled how Process View is edited:
    • Editing is now done in a fullscreen modal. The widget is never editable.
    • Moved "Export widget" and "Delete all parts" actions to the edit modal.
    • Parts are highlighted on mouseover in the edit modal.
    • Editing can be done with selectable tools. Select a tool, and then click or drag parts.
    • Available tools:
      • Click to add new part.
      • Drag to move part.
      • Click to rotate part.
      • Click to open part menu (edit settings).
      • Click to interact with part (toggle valves and pumps).
      • Drag to copy part.
      • Click to delete part.
  • Parts now consistently react if you click in the square containing the part.
  • When rotating parts, the upper left corner will stay in place. (the part used to rotate around its center).
  • Fixed a bug where flows would be incorrectly calculated for rotated parts greater than 1x1.
  • Improved responsiveness when moving parts.
  • Improved collision detection when moving parts.
  • HeatingElement parts can now be linked to a PWM Block, and will display the achieved duty setting.
  • Fixed a bug where ActuatorValve parts would cause datastore conflicts
  • Fixed a bug where datastore conflicts would cause Process View to silently stop persisting changes
    • An error is now displayed, and the last change is rolled back. You can redo the change to continue.
  • Widgets are now unpinned when moved or copied.
  • Disabled the "Import Blocks" button while we fix some serious issues.
  • When a service loses connection, a notification with a "Retry" button is displayed.
    • This notification will disappear automatically if connection is restored.
  • Made PID input/output blocks directly editable from the PID widget.

# Brewblox release 2019/04/04

This release includes a pretty big rework of the UI.

The framework we're using for UI components (Quasar) recently released a major update. While we were making all the required changes, we took the opportunity to revisit many of our more clumsy UI elements.

We're pretty happy with the result. It looks better, loads faster, and the underlying code is significantly cleaner.


  • Lots of small display improvements throughout the UI.
    • The dashboard background is now lighter than the widgets, improving contrast.
    • Widget title is now displayed above the type to improve display of small widgets.
    • Widgets now have a dropdown menu with additional actions. This allowed us to add more actions while saving space.
    • Improved layout for all widgets and widget settings forms.
    • Removed color from unimportant warnings (eg. inactive actuators).
    • Improved and standardized the toolbar in modal windows (eg. Widget settings).
  • The Block relations diagram is now displayed fullscreen.
  • Fixed multiple issues with the Block relations diagram, and improved startup time.
  • Reworked all wizards to be more consistent and easier to navigate.
  • The widget options menu (accessible in dashboard edit mode) is removed.
  • Added the widget actions to a dropdown menu. This makes copy/move/delete widget buttons more accessible.
  • You can now resize widgets without activating dashboard edit mode.
    • Widgets on the Spark page are still not resizable.
  • Fixed an issue where the version would not display in the left drawer.
  • You can now separately change dashboard title (displayed) and ID (unique, used for the URL)
  • Widget names were reworked.
    • Widget names no longer have to be unique.
    • Block widgets now always use the Block ID as name. This improves visibility how widgets and blocks are linked.
    • You can freely change names for non-block widgets (graph, session view, process view).
  • You can now export and import widgets.
    • For now the Process view is the only widget where exporting it makes any sense.
    • Import widgets in the Wizardry menu.
  • You can now export, import, and clear Blocks on the controller.
    • The functionality is accessible through the Spark Service widget.
    • Exporting Blocks will export all Blocks.
    • Clearing Blocks will remove all user-added Blocks, and reset the system Blocks.
    • Importing Blocks will first clear Blocks, and then import from file.
  • Fixed a bug where the Lauterhexe Process view part did not have any flow.
  • Added the small and large kettles to the Process view.
    • This is in addition to the "normal" kettle already available.
  • Added the Sensor display part to the Process view. It can be linked to a temperature sensor, and will display the value.
  • Added the Actuator valve part to the Process view. It can be linked to a digital actuator (Actuator Pin or DS2413 Actuator).
    • Toggling the valve will toggle the actuator, and vice versa.
  • Fixed a bug where the eventbus would gradually consume more RAM, until it froze.

# Brewblox release 2019/03/18

  • brewblox-ctl update will now prompt to also update the firmware
    • IMPORTANT: this does not apply to this update. You will need to manually run brewblox-ctl flash this time.
  • Updated the firmware system layer to version 1.0.1. This will be automatically applied when updating the firmware.
  • Fixed a bug where brewblox-ctl would not create downsampling rules in history (only display 4.5 hours in graphs)
  • The graph widget can now be displayed fullscreen
  • Graphs now have preset buttons for displayed period (duration to now: 10m, 1h, 1d, 7d, 14d, 30d)
  • Blocks now display whether their values are set by other blocks (eg. PWM controlled by PID).
  • When a PID is disabled, it will stop overriding the setting of its output block.
  • PWM and offset actuator can now be disabled separately. This allows manually setting their target.
  • PWM now supports a 100Hz mode when controlling digital pins.
    • This can be used for driving DC pumps or fans.
    • This will be triggered automatically when the period is set to less than 1s.
    • OneWire actuators still have a minimum period of 1s.

Apart from these changes, we're working on the implementation of a drag-n-drop interactive display of a brewery - flows included. https://brewpi-ui-demo.herokuapp.com/processview/herms-automated-valves is the prototype and proof of concept. The Brewblox implementation will allow users to recreate their own setup, and control / view their blocks in the display.

When the most important features are included, we will start drawing more attention to it in the UI, and add it to the BrewPi classic wizard.

For those interested in an early preview: it is creatable as the Process View widget.

# Brewblox release 2019/03/11

This release includes changes to the firmware. To update, please run both brewblox-ctl flash, and brewblox-ctl update.

  • The Spark LCD can now display temperatures as either Celsius or Fahrenheit. This is configurable in the Display Settings widget.
  • Added a wrapper in brewblox-ctl to make HTTP request commands significantly shorter.
  • Dashboards are now displayed as a list of cards on mobile devices. This eliminates clipping, but dashboard editing is disabled.
  • Fixed a bug where you no longer could show/hide single values in graphs by (double) clicking.
  • Graph values mapped to the right axis are now indicated by having a different color title in the legend.
  • Fixed a bug where Spark Photon devices would not be discovered over USB.
  • Added the --discovery=all|usb|wifi argument for the Spark service. This allows specifying connection type without hard-coding the address. Defaults to "all".
    • This can be used in combination with --device-id.