How can I control the 8,500 watt ring heater via BrewBlox?

Hello All,
I have installed the ring heating element with 8,500 watts in the boil kettle. Currently it is designed that I can switch all 3 phases manually via my panel using 3 rocker switches. I also have 3 SSRs one SSR per phase to control the ring heating element.
Now my question, how can I implement this with BrewBlox and the Spark 4, so that over the 3 SSRs the temperature is maintained in the boil kettle? Or do I have a thought error and I need only one SSR for the ring heating element?

Who can help?

Kind regards,

You should use them as a single heater in software.

You have 2 options:

  • Do it in hardware: connect the 2 output pins (- and +) to all 3 SSRs
  • Do it in software: Create a mechanical relay channel instead of an SSR channel and set it to 3A. We don’t have the choice for the current for the SSR, because SSRs don’t use much current…


If you set it to 3A, it will assign 6 pins instead of 2. They will be assigned as - - - + + +.

1 Like

Thanks for the fast reply.

Which is your favorite option?
Do I have enough pins if I also want to control a pump and a heater each with one relay? (I have 5 SSRs in total)
I installed 1 x Brewblox 1-Wire and GPIO module.

I answered the question myself :wink:
In my opinion it is not possible.

I can switch the pump manually via the rocker switch for the moment.

Am I right?

You can set the channel mode to “Only +”, and use an external - pin. This way you can fit >4 relays on a single module.
For wiring details you’ll need Elco, but it’s definitely possible.

1 Like

I am not following you exactly, what is not possible?

Why would you need to switch the 3 phases individually? You can control the intensity with PWM.

In the case Brewblox or the raspberry is not available I can adjust the temperature manually with the rocker switches.

Ah I get it. You have it a bit different from mine.

What I have is this:

  • Spark → manual switch → float switch → SSR

So the heater only turns on if the Spark tells it to AND there is water in the kettle.

If you want to control the heater with the Spark OR the switch, I would use the fact that most switches have 3 pins. The middle pin is connected with one of 2 pins. If you have 1 as the spark and the other one as something else, you can switch between the 2 signals.

If you have a 4th switch to 5V, you have full control. You connect to the spark or the fourth switch. And with the fourth switch, you can toggle all of them on or off at the same time.

Can you give me a hint how to connect the SSR 3V when I use “Only +”.

The + wire from Brewblox goes to the + pole (3) on the SSR. How to connect the - pole (4)?

Edit: Neutral from the source?

Can you please give a complete overview of what you want to do? Which actuators do you want to connect and how many io modules do you have?
Then we can advise you on the best way to connect everything.

Now we are giving advice based on what we are guessing that you are guessing on what would be the way to do it.

Thanks for the offer. Here is my plan:

There is a rocker switch “Maischen/Kochen” to avoid accidental overload due to too many consumers.

Aha. I think you are trying to solve a problem we already solved in software.

In Brewblox, we support load balancing your heaters and making them mutually exclusive.

First, mutually exclusive. A heater that turns on claims the mutex. No other heater can get the mutex now until it is released.
This is at the pwm level. As soon as a heater turns off, the other can turn on.
If you have both heaters at 50% pwm, they alternate in claiming the mutex, so they can heat at the same time. They are not turned on at exactly the same time, but both average 50%.

Next, the balancer. It ensures that the sum is 100% at most. If the heaters want 100% and 50%, they are reduced to 67% and 33%. This ensures the mutex is shared fairly.

Once configured, all of this is automatic.

Using this, you can have 8500W in both kettles on a single 16A 3-phase connection. You should still have overload protection of course. Don’t rely on software for safety, but it works very well.


Yes, I need the rocker switch for the manuel mode, in the case the raspberry or Brewblox is not available. The boil tun can continue to heat in manual mode with 2/3 of the power, while I simultaneously heat up the mash tun. This should be enough to keep the temperature in the boil tun.

Can I wire the SSRs as shown in the wiring diagram? I take the neutral and connect it to minus. This way I can save sockets on the Brewblox. Correct?

The “only +” is for the moment not working. So I will use the “- and +” option and will not connect the pump.
It looks like this: my Pin assignment:

  1. pin = + pole mash SSR
  2. pin = - pole mash SSR
  3. pin = + pole boil 1 SSR
  4. pin = + pole boil 2 SSR
  5. pin = + pole boil 3 SSR
  6. pin = - pole boil 1 SSR
  7. pin = - pole boil 2 SSR
  8. pin = - pole boil 3 SSR

Is this correct?
I can´t find any documentation how to connect the brewblox GPIO pins

I have 4,86V DC applied to the relays but the relays does not switch. Also the control lamps do not light up.

Channel pin layout is always [ - + ]. For wider channels (2-4A option), this becomes [ - - + + ], [ - - - + + + ], and so on.
Your approach is correct, but you need to switch all + and - poles.

Looks like you’re correct. I’ll get that fixed.

1 Like

Thanks Bob.

I now get the relays switched. Unfortunately, the system behaves a bit strange. When the boiling kettle reaches and holds the temperature, the mash relay also switches on and off constantly, although the temperature is far from being reached.

When the mash temperature has been reached, then only the mash SSR is also switched on and off to maintain the temperature. The SSRs for the boil tun are still on - as expected. Only in the opposite case (as described above) is the weird behavior occurring.

Here my configuration:

“blocks”:[{“nid”:101,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“TempSensorOneWire”},“id”:“Kochen Sensor”,“serviceId”:“spark-one”},{“nid”:102,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“TempSensorOneWire”},“id”:“Maischen Sensor”,“serviceId”:“spark-one”},{“nid”:112,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“TempSensorCombi”},“id”:“Kochen”,“serviceId”:“spark-one”},{“nid”:113,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“TempSensorCombi”},“id”:“Maische”,“serviceId”:“spark-one”},{“nid”:7,“groups”:[7],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“DisplaySettings”},“id”:“DisplaySettings”,“serviceId”:“spark-one”},{“nid”:106,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“Pid”},“id”:“Maischen PID”,“serviceId”:“spark-one”},{“nid”:109,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“Pid”},“id”:“Kochen PID”,“serviceId”:“spark-one”},{“nid”:114,“groups”:[0],“type”:“Balancer”,“data”:{“clients”:[]},“id”:“Balancer”,“serviceId”:“spark-one”},{“nid”:115,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“Mutex”},“id”:“Mutex”,“serviceId”:“spark-one”},{“nid”:100,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“OneWireGpioModule”},“id”:“VC GPIO”,“serviceId”:“spark-one”},{“nid”:105,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“ActuatorPwm”},“id”:“Maischen PWM”,“serviceId”:“spark-one”},{“nid”:116,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“DigitalActuator”},“id”:“Maischen Actuator”,“serviceId”:“spark-one”},{“nid”:110,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“ActuatorPwm”},“id”:“Kochen PWM”,“serviceId”:“spark-one”},{“nid”:117,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“DigitalActuator”},“id”:“Kochen Actuator”,“serviceId”:“spark-one”},{“nid”:103,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“SetpointSensorPair”},“id”:“Kochen Setpoint”,“serviceId”:“spark-one”},{“nid”:107,“groups”:[0],“type”:“ErrorObject”,“data”:{“error”:“DecodeError(Field number 0 is illegal.)”,“type”:“SetpointSensorPair”},“id”:“Maischen Setpoint”,“serviceId”:“spark-one”}],“store”:[{“keys”:[“ActiveGroups”,1],“data”:{}},{“keys”:[“SystemInfo”,2],“data”:{}},{“keys”:[“SystemTime”,3],“data”:{}},{“keys”:[“DisplaySettings”,7],“data”:{}},{“keys”:[“VC GPIO”,100],“data”:{}},{“keys”:[“Kochen”,112],“data”:{}},{“keys”:[“Maische”,113],“data”:{}},{“keys”:[“Kochen PID”,109],“data”:{}},{“keys”:[“Maischen PID”,106],“data”:{}},{“keys”:[“OneWireBus”,4],“data”:{}},{“keys”:[“WiFiSettings”,5],“data”:{}},{“keys”:[“TouchSettings”,6],“data”:{}},{“keys”:[“SparkPins”,19],“data”:{}},{“keys”:[“Balancer”,114],“data”:{}},{“keys”:[“Mutex”,115],“data”:{}},{“keys”:[“New|ActuatorDigitalInterface-1”,104],“data”:{}},{“keys”:[“New|ActuatorDigitalInterface-2”,111],“data”:{}},{“keys”:[“Maischen Actuator”,116],“data”:{}},{“keys”:[“Kochen Actuator”,117],“data”:{}},{“keys”:[“Kochen PWM”,110],“data”:{}},{“keys”:[“Kochen Setpoint”,103],“data”:{}},{“keys”:[“Kochen Sensor”,101],“data”:{}},{“keys”:[“Maischen PWM”,105],“data”:{}},{“keys”:[“Maischen Setpoint”,107],“data”:{}},{“keys”:[“Maischen Sensor”,102],“data”:{}}]}

Case 1:

the corresponding video from the SSRs:

(all SSRs are flickering)

Case 2:

the corresponding video from the SSRs:

(only the mash SSR is flickering)

The flickering was caused by a bug in the firmware and we just released a fix.

1 Like

That’s a fast reaction. Thanks, I will update the spark and test if it’s working.

First test shows, that the defect is fixed! Thanks!

1 Like