Jump to content

Apex control of CaRx

Recommended Posts

So,  I am currently dosing 300mls/day of 2-part to keep my Alk around 8-8.5 dKH. Decide it is time to bring my CaRx on line and could use some help with the hookup and coding.

My set up;

-a Geo 612 rector with pH probe

-CO2 regulator with dual gauge solenoid (https://fragtasticreef.com/deluxe-co2-regulator/)

- small eheim feed pump (about 80gph)

-Apex classic

 I reckon i need to plug the regulator into the EB8 and i can plug the pumps into any wall outlets.

Can someone confirm this and help with the programming codes, what codes to put where?


many thanks



Share this post

Link to post
Share on other sites

Here's how mine is set up.

  • A pH probe is in the reactor, controlling when CO2 is dosed. The probe is named CaRxpH. It's important to keep this probe calibrated.
  • My regulator (Aquarium Plants Carbon Doser) is set to deliver about 1 to 1.5 bubbles per second - precision not important. The doser is on an Apex-controlled outlet named CO2.
  • A Masterflex peristaltic pump is set up to deliver a set rate of tank water into the calcium reactor whenever it is on. It, too, is on an Apex-controlled outlet named CaRx_Feed.
  • There's a re-circulation pump on the reactor that is always on, but I have it on an Apex-controlled outlet named CaRx_Circ so that I can shut it off during maintenance without unplugging it.

Here's the theory behind how it works:

  • Ultimately, you want your supplementation to match consumption. That is, ions_used = total_ions_dosed in an arbitrary but equal window of time. Let's assume that window of time is 24 hours. Calcium reactors deliver a balanced mix of ions (calcium, alkalinity, and trace elements) used in the growth of coral skeletons. It does this by dissolving reactor media composed of skelton material from dead corals. It does not add nutrients needed by non-skeletal coral tissue.
  • Supplementation is controlled by dosing controlled amounts of the reactor effluent into the tank. Total_ions_dosed = ion_concentration x dosing_rate x dosing_time
  • Reactor pH establishes the saturation level of dissolved reactor media in the calcium reactor body. This controls ion_concentration. Too high and the level of supplementation (aqueous ionic content in the effluent) is minimal. Too low and your reactor media turns to mush. This setting can vary with different reactor media from different sources or even different size. In other words, you use CaRxpH to establish ion_concentration. Ideally, I like to try to get the effluent up to 20-30 dKH once it passes through the reactor. Where exactly it lands is less important than stability.
  • Supplementation is metered by a peristaltic pump. This controls the dosing_rate.
  • Dosing is done 24/7/365 using a duty-cycle approach breaking each day into 24 1-hour cycles. That is, it's on for some fixed amount of time every hour. This sets the dosing_time/24. Because the effluent is dosed every hour, the total dosing time in a 24-hour window is dosing_time.
  • Control is achieved by adjusting dosing_time. That is, by adjusting how much time the peristaltic pump is on every hour.
  • Dialing-in is achieved by adding dosing_time if alkalinity is decreasing in the tank, or by reducing dosing_time if it is increasing. Adjust dosing_rate (i.e. my peristaltic pump rate setting) as a very coarse level of control. The same goes for ion_concentration (i.e. CaRxpH). Adjusting that one is typically only done if I'm changing reactor media sources. The dialing-in process can take a few days of monitoring, testing at the same time every day and making the appropriate adjustments afterwards. Once dialed-in, testing is much less frequent.


Here's my outlet code:

For CO2:

Fallback OFF
If CaRxpH > 6.42 Then ON
If CaRxpH < 6.35 Then OFF


For CaRx_Feed:

Fallback OFF
OSC 000:00/018:00/042:00 Then ON


For CaRx_Circ:

Fallback ON
Set ON


So, you see that I run my reactor at a target pH around 6.4 and that the reactor is on 18 minutes out of every hour. I don't, off hand, remember exactly what my peristaltic pump rate is set for. It could be set to deliver 30 ml/minute but I don't honestly recall. If my alkalinity starts dropping, I'll increase the time on and decrease the time off. If my alk is climbing, I'll do the reverse.





Share this post

Link to post
Share on other sites

Milton, your situation is different and may lead to a different setup.


In your situation, you don't have calibrated control over dosing_rate. That is, your small 80 gph feed pump output may vary over time. However, you'll be able to get some stabilization with using a microvalve on the output of the reactor and adjusting it so that a fairly constant stream of effluent comes out of the reactor whenever the feed pump is on. One common setup leaves that feed pump on constantly and tuning the microvalve to deliver a somewhat-controlled rate of effluent, then adjusting the reactor pH to control the ion_concentration. I say "somewhat-controlled" because microvalves clog and mess up that control. I had bad luck using the "1 drop every second" of concentrated effluent approach to dosing. Another way used increases the rate by setting the microvalve to a steady stream and reducing the concentration (raising the CaRx pH). Either way, you wind up vulnerable to microvalve clogging (which might be mitigated if you submerged the valve - but then you'd have to take it out from time to time to check it). Another option might be to put a solenoid valve on ahead of the microvalve and use it to control (turn on and off) the time the effluent stream is on, much like I use my peristaltic pump to do the same.


I know that it all sounds complicated, but it really boils down to that equation near the top of my last post: Total_ions_dosed = ion_concentration x dosing_rate x dosing_time. There are several ways to get there, but the approach that I outlined above works well and is easy to adjust.


The only easier way that I think we could do this with today's technology would be to add one of those automated alkalinity testers to control effluent dosing. Expensive, but definitely goes directly to what you're trying to achieve.

Share this post

Link to post
Share on other sites

Ok Tom,

Many thanks for responding.

So, here is what  I will start with;

1. My CO2 regulator/solenoid will be plugged into an Apex outlet

2. My CaRx_Feed pump will also be plugged into an Apex outlet. I will then use a code to turn CaRx-Feed outlet off when the CO2/solenoid is off. Correct?

3. My CaRx_Circ will be plugged into the wall (as i may want to save the extra Apex outlet


As I do not have a peristaltic pump, I will use a small valve to control the effluent going into the tank.  I will use this to fine tune the Alk levels in the tank.


my codes:


For CO2/Solenoid:

Fallback OFF
If CaRxpH > X Then ON
If CaRxpH < Y Then OFF


For CaRx_Feed:

Fallback OFF
If outlet CO2/Solenoid OFF then OFF


Does this looks good?


Is there a way for me to set up some sort of alert to let me know that the CO2 tank is empty?

Share this post

Link to post
Share on other sites

No. I'm not sure why you would turn the feed pump off when the CO2 is running. You want to maintain the pH in the reactor and, if feed pump is running, the pH in the reactor will immediately start to climb (albeit slowly) because it's being diluted with more alkaline incoming water. There's not a huge risk to leaving the effluent flowing while the CO2 is running. Remember a few things here: 


1) Since your running a constant stream output from the reactor, you need to slow the flow down to slightly more than a trickle. Measure it over 1 to 5 minutes, because you're going to want to measure it again sometime down the line to see if either your pump is slowing down or the line is clogging. 


2) Since you'll have continuous effluent, you'll most likely be controlling your dosing by either twiddling with the reactor pH or the effluent flow rate. Pick one that you have control over and make sure the other remains stable.


3) And, finally, keep an eye out for siphoning. If your pump or your outlet are below the height of the reactor water level, you run the risk of setting up a siphon where effluent may continue to flow/drip, even if the feed pump is off.


I'm going to now watch that video that Eric posted....



Share this post

Link to post
Share on other sites

So, I just skimmed the video that Eric posted. It's solid. It's basically the same approach that I mentioned in my last post with his selecting the pH level inside the reactor as the user-controlled variable. In other words, he holds the effluent rate constant while adjusting the ion_concentration using reactor pH.  Again, in that equation:


Total_ions_dosed = ion_concentration x dosing_rate x dosing_time, you have three variables on the right that can be user controlled. In the video...

  • ion_concentration is the user-controlled variable and is established by the pH inside the reactor, CaRxpH.
  • dosing_rate is held constant - that's the beaded stream that he talks about. I recommend checking this from time to time since it's subject to a variety of fluctuations (more so than my peristaltic pump approach.
  • dosing_time is held constant since the feed pump is on continuously.

The primary difference in this approach and the way that I actually run my reactor are:


1) I leave ion_concentration constant as pH is not a linear scale - it's logarithmic, and so ion concentration may vary logarithmically with decreasing pH.

2) My dosing_rate is constant and controlled by a laboratory-grade peristltic pump, and thereby avoids other failure modes of pressure/valve control over flow.

3) My user-controlled variable is dosing_time, which I have fine-grained control over using the Apex.


I've basically been using this approach now for over 10 years and it works great. It's pretty easy to dial in, too. Because, once you measure the change in alkalinity over a few days, you get a sense of exactly what the scaling factor is and can more rapidly converge on the stable point. Because total_ions_dosed is proportional with dosing time, it's quick to dial in. Adjustments to pH to effect Ion_concentration may involve more trial and error, but once you're dialed in, you'll be able to let the system coast along effortlessly.


Share this post

Link to post
Share on other sites

Thanks Tom, Eric.  The video was very helpful.

I am working on it now.  Hopefully i will bring it online in a few days.

need plumbing tubings

Share this post

Link to post
Share on other sites


So i have connected my CaRx and it is now running, (no CO2 as yet, just to get a feel of leaks and flow rate.  I am not yet of its final placement.

Here are my codes:



Fallback OFF
If CaRxpH > 6.60 Then ON
If CaRxpH < 6.70 Then OFF
If CaRxpH > 7.40 Then OFF
Defer 001:00 Then ON


-The plan is to start at pH6.6 and work my way down, keeping the effluent rate the same

-The If "CaRxpH > 7.40 Then OFF" line is to alert me that the CO2 tank is empty as that should cause the ph in the chamber to increase. How can i set this to get an email alarm?



Fallback OFF

Do i need any other codes here?

Should this pump be running at all times unless for maintenance or leaks?


Any other thought/suggestions will be very much appreciated



Share this post

Link to post
Share on other sites

Your first two CO2 settings are reversed. Adding CO2 causes pH to drop. Turn on CO2 when pH is high. Turn it off when low. You'll also never get it started with the third line, because pH will start out high on regular tank water. This will shut off the CO2 when you need to add it to initialize it.

There's an alarm setting that will send an email. That's where you want the high reactor pH trigger. Not in the CO2 outlet control.

Share this post

Link to post
Share on other sites

First line should be 6.7. Second is 6.6. This keeps reactor pH between these settings. Delete third line. Not sure about the defer statement. You'll already have hysteresis so am not sure what added value the defer statement brings.







Share this post

Link to post
Share on other sites

Right you are.

Got the first two lines reversed.

I have switch those around.

I have also deleted line 3 and will place it in the txt alert, once i have started the reactor. Otherwise the alarm will keep going off.

Anything else i should consider?

Share this post

Link to post
Share on other sites

Well, when are you going to turn CaRx_Feed on? I see it defaulting to "Off" but no statement every turns it on. Remember, the default state is the one that outlets will take on if they lose communication with the Apex controller.

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now