Neptune Apex Programming Tutorials, Part 2: Timers

SuncrestReef

That Apex guy
View Badges
Joined
Jan 18, 2018
Messages
4,214
Reaction score
9,217
Location
Oregon
Rating - 0%
0   0   0
Neptune Apex Programming Tutorials, Part 2: Timers


For inspiration: a beautiful 10-gallon nano tank.

r2rdferrari13.jpg

This photo is from the Reef2Reef archives courtesy of @Dferrari13 ©2019, All Rights Reserved.

Note From the Editor:


This article is Part 2 of a series. Part 1 may be found here.

This article and several future ones by the same author were originally part of several presentations made to a local aquarium club on programming your Neptune Apex Controller. The article is reprinted with permission from the author.

Because this topic will be of great interest to some readers but no interest to others who have not automated their systems, R2R will run these programming articles every Friday until we come to the end of the series.

Photos, images, and diagrams included in this article below are all courtesy of the author, @SuncrestReef ©2019, All Rights Reserved.

~~~~~~~~~~~~~~~~~~~~~~~

Timers: OSC, If Time, DOW, Defer, When, and Min Time

One of the most common tasks in reefing is to turn on and off a device on a specific schedule, whether that’s based on time of day, a repeating cycle of a number of minutes or hours, or on specific days of the week. The Apex gives you a number of choices on how to program outputs based on timers, each with a specific purpose:

  • OSC: A repeating On/Off interval, where you specify the number of minutes & seconds to be ON, and the number of minutes and seconds to be OFF
  • If Time: Turn on or off between specific times on the clock, down to the minute
  • DOW: Turn on or off based on the day of week
  • Defer: A delay of time in minutes and seconds to wait before turning on or off
  • When: A failsafe to switch an output from AUTO to OFF if it has been on or off for longer than specified in minutes and seconds. Requires manual intervention to reactivate the automatic programming.
  • Min Time: A delay of minutes and seconds before the output is allowed to turn on or off, regardless of the programming conditions
Some of these timers can be combined to achieve unique requirements, such as to turn on a pump every day from noon until 1pm, except for Saturday and Sunday. Let’s look at examples for each of these timers:

OSC

The OSC (short for Oscillation) command is great for turning things on and off in a repeating cycle. It uses three separate timers:

OSC MMM:SS/MMM:SS/MMM:SS Then [ON/OFF/Profile]

The timers define Delay before first run / Time to run / Delay until next run

The maximum value you can specify for any one of the timers is 999:99, which equates to 16 hours, 39 minutes, 59 seconds.

Here are a few examples:

OSC 000:00/005:00/005:00 Then ON

This would turn on the output for 5 minutes, then turn it off for 5 minutes, and repeat indefinitely:

image3-1.png

OSC 000:00/007:00/002:00 Then ON

This would turn on the output for 7 minutes, then turn it off for 2 minutes, and repeat indefinitely:

image3-2.png

OSC 007:00/002:00/000:00 Then ON

This would wait for 7 minutes, then turn on the output for 2 minutes, then turn it off for 0 minutes. It would then repeat the 7 minute off, 2 minute on cycle.

Screen Shot 2019-06-14 at 8.48.15 PM.png

One reason to use the initial delay would be to stagger two different outputs so they don’t run at the exact same time, such as dosing pumps.

The odd thing about the initial delay timer is that it calculates from midnight of January 1, 1996. If your timer values added together are evenly divisible into 1440 (24 hours), then your output will always come on at the same times each day. If they are not divisible into 1440, then each day will be slightly different, and you’d have to do some interesting math to figure out when it would turn on on any given day.

My personal example:

I use the OSC command to activate my Swabbie skimmer neck cleaner every six hours. The Swabbie has a motor that rotates the cleaning wiper in the skimmer neck very slowly, so it needs to run for about 2 minutes to thoroughly wipe all the crud from the neck. Here is the programming for my Swabbie output:

Fallback OFF
OSC 000:00/002:00/358:00 Then ON
If Output EB_3_Skimmer = OFF Then OFF


The first line — Fallback OFF — instructs the Apex to turn off this output if the Apex ever gets disconnected from the Energy Bar where the Swabbie is plugged in. This could also apply if the Apex locks up and becomes unresponsive (which rarely happens). This just basically means don’t run the program if the Apex unit isn’t in control of the situation.

The OSC timers in this example are:
  • 000:00 = zero minutes from midnight until the first run
  • 002:00 = two minutes of actual run time
  • 358:00 = 5 hours & 58 minutes to delay until the next run
The third line disables the Swabbie from running if my skimmer is off. This would prevent it from rotating accidentally if I’m performing maintenance on the skimmer or if it’s off during a feed mode.

Since my timers multiplied by 4 = 1440, my OSC timers trigger the Swabbie at the same times each day: Midnight, 6am, noon, 6pm.

If Time

If Time is used to turn on or turn off an output between a range of time:

If Time HH:MM to HH:MM Then [ON/OFF/Profile]

The If Time command is much simpler than OSC, but it does have a few intricacies to be aware of:

The times can only be specified in hours and minutes (in 24 hour format), so it is not as granular as the OSC command which goes down to minutes and seconds.

A very important thing to know is that the beginning time and ending times are inclusive. For example:

Set OFF
If Time 10:00 to 10:01 Then ON


will turn on the output at 10:00 and turn it off at 10:02:

image3-4.png

This means that the shortest duration you can run an output using If Time is actually two minutes. You cannot specify the same value for the start and end times, so 10:00 to 10:00 is invalid. If you want to use If Time for a shorter duration, it would need to be combined with the Defer statement:

Set OFF
If Time 10:00 to 10:01 Then ON
Defer 001:00 Then ON


This will cause it to wait until 10:01 to turn on, then turn off at 10:02. effectively giving you a 1 minute timer:

image3-5.png

I’ll explain Defer in more detail in the next section.

Another tip for If Time is that you can span midnight with your start and end time. For example, I run my refugium light on the opposite schedule from my display tank lights:

Set OFF
If Time 18:00 to 08:00 Then ON

image3-6.png

DOW

The DOW (Day Of Week) command can use to turn on or off and output based on the day of week.

If DOW SMTWTFS Then [ON/OFF/Profile]

The letters for each day of the week are placeholders, and if you substitute one with a hyphen, then that day will evaluate False and the output will not be triggered for that day. For example:

Set OFF
If DOW SM-W-FS Then ON


This would turn on the output every day except for Tuesday and Thursday.

image3-7.png

DOW is particularly useful when combined with the If Time command. Let’s say you want to run a circulation pump once per day for an hour every day except on Saturday when you are doing maintenance:

Set OFF
If Time 12:00 to 12:59 Then ON
If DOW ------S Then OFF


Remember from my introduction section that the last line of programming that evaluates True will dictate what the output does. In this example, the If Time command is true from 12:00 to 12:59, but the DOW command will evaluate True only on Saturday since that’s the only placeholder not replaced with a hyphen.


Defer

Defer is used to delay taking action on an output for a period of time.

Defer MMM:SS Then [ON/OFF]

This command is different than other ON/OFF commands because it’s actually delaying the outlet from changing from off to on, or from on to off, for the specified amount of time. In the above example using If Time where we need the output to turn on for less than 2 minutes, but If Time can’t do that, so the Defer delay was used to prevent the output from turning on until the 1 minute delay elapsed.

Defer is particularly useful when basing an output on the reading of a probe or sensor. For example, if you have a float switch in your sump to trigger your ATO pump when the water is low, but the water surface has small ripples that can cause the float switch to go up and down with the water movement, it could trigger your ATO pump on and off rapidly for no valid reason. To prevent this, the Defer command can be used to wait for the float switch to provide a consistent reading for a period of time, ensuring that the water really is low enough to justify turning on the ATO pump:

Set OFF
If Float1 Open Then ON
Defer 000:10 Then ON


In this example, the float switch needs to continuously report Open for 10 seconds before the pump will actually be turned on. Once the float switch first reports Open, the Defer countdown timer begins. If after 3 seconds the float switch reports Closed, then the timer is reset to 10 seconds.

A good analogy for Defer is the shot clock in NBA basketball. (sorry to those non-basketball fans reading this). Once your team has the ball, you have 24 seconds to make a shot. If the ball doesn’t touch the rim, the ball is turned over to your opponent. But if you do make a shot that hits the rim but doesn’t go in, the shot clock is reset and you have another 24 seconds to try again. The Defer is just a countdown timer that once it expires, the output can then change state.

To take our float switch example one step further, I’ll add another Defer to handle the situation when the ATO pump is adding water and the float switch finally reports Closed due to the rising water level. Since there are still ripples on the water surface, it might toggle between Open and Closed several times before it finally settles in on Closed.

Set OFF
If Float1 Open Then ON
Defer 000:10 Then ON
Defer 000:10 Then OFF


Defer statements can be placed anywhere in the list of programming lines because they apply to the output itself and are not part of what evaluates as True or False. Another way to represent this is:

Set OFF
If Float1 Open Then ON
— — — — — — — — — — —
Defer 000:10 Then ON
Defer 000:10 Then OFF

(don’t put the dashes into your program….this is just for a visualization)

The program is above the dashed line, and the last line to evaluate as True dictates how to set the output state. The Defer statements are then controlling how long to wait before setting the output state.


When

The When command is very unique in Apex programming. It is used to switch an output’s tile from AUTO to OFF if a condition is met. It is most commonly used for ATO pump programming, since a failed optical switch or float switch could allow the ATO pump to continue flooding your sump with fresh water, harming your tank inhabitants and flooding your home; or perhaps the ATO reservoir is empty and the pump continues to run dry. Once triggered, the output is forced into manual OFF mode and the programming will no longer operate until you manually move the slider back to the AUTO position.

Using our ATO pump example from above, here we add the When command. This assumes that our ATO pump should never need to run for more that 3 minutes straight under normal evaporation conditions.

Set OFF
If Float1 Open Then ON
Defer 000:10 Then ON
Defer 000:10 Then OFF
When ON > 003:00 Then OFF


Like the Defer commands, When may be placed anywhere in the list of programming lines. I tend to place Defer and When commands at the end for ease of reading and troubleshooting.


Min Time

The Min Time command is similar to Defer, but with a distinct difference:
  • Defer - will delay an outlet from changing its state for a specified period of time
  • Min Time - will ensure an outlet stays in its current state for a minimum period of time
In other words, the output must remain in the specified state for the specified period of time, regardless of the conditions listed in the output programming.

Again, the most common example of Min Time is for the ATO pump. Rather than having it turn on and off every few minutes as dictated by the float switch for the slightest amount of evaporation, you can force it to run less frequently even though that means it needs to pump water a bit longer.

Set OFF
If Float1 Open Then ON
Defer 000:10 Then ON
Defer 000:10 Then OFF
When ON > 003:00 Then OFF
Min Time 060:00 Then OFF


This tells the output to remain Off for at least 60 minutes. Once that timer expires, the specified programming commands will operate again as normal.

Hopefully this tutorial has been helpful. Stay tuned for the next article in this series--ATK programming and troubleshooting--which builds on what I covered here.

~~~~~~~~~~

We encourage all our readers to join the Reef2Reef forum. It’s easy to register, free, and reefkeeping is much easier and more fun in a community of fellow aquarists. We pride ourselves on a warm and family-friendly forum where everyone is welcome. You will also find lots of contests and giveaways with our sponsors.

~~~~~~~~~~~

Author Profile: @SuncrestReef

John Halsey is a reefing hobbyist who keeps a Red Sea Reefer XL 425 in his living room. He is new to reefing with just over one year of experience, but has been successful in keeping a healthy mixed reef by following best practices learned here on R2R as well as actively participating in his local aquarist club -- PNWMAS -- in Portland, Oregon. John retired from his 30-year career in IT support, and put that technical expertise to good use by automating much of his aquarium equipment with an extensive Neptune Apex system.

~~~~~~~~~~~
 

Brett S

Valuable Member
View Badges
Joined
Nov 28, 2016
Messages
1,062
Reaction score
1,373
Location
Orlando
Rating - 0%
0   0   0
OSC 010:00/003:00/002:00 Then ON

This would wait for 10 minutes, then turn on the output for 3 minutes, then turn it off for 2 minutes. It only repeats the 3 minute on, 2 minute off cycle.

image3-3.png

The 10-minute delay is a one-time event. The odd thing about the initial delay timer is that it calculates from midnight of January 1, 1996. If your 2nd two timer values added together are evenly divisible into 1440 (24 hours), then your output will always come on at the same times each day. If they are not divisible into 1440, then each day will be slightly different, and you’d have to do some interesting math to figure out when it would turn on on any given day.

The only time I could imagine using the initial delay would be to stagger two different outputs so they don’t run at the exact same time, such as dosing pumps.

This part is incorrect. The first number is not a one time event. In your example it will wait for 10 minutes, then turn on the output for 3 minutes, then it will be off for 12 minutes (10 plus 2), then on for 3 minutes, then off for 12, etc.
 
OP
OP
SuncrestReef

SuncrestReef

That Apex guy
View Badges
Joined
Jan 18, 2018
Messages
4,214
Reaction score
9,217
Location
Oregon
Rating - 0%
0   0   0
This part is incorrect. The first number is not a one time event. In your example it will wait for 10 minutes, then turn on the output for 3 minutes, then it will be off for 12 minutes (10 plus 2), then on for 3 minutes, then off for 12, etc.

I stand corrected. Thank you for pointing that out. I just created a virtual output with logging enabled, and verified what you described is correct.

One of the reasons I wrote this series on Apex tutorials is because I found Neptune's official documentation is a bit confusing. My understanding of their Comprehensive Reference Manual is that it was just written by some other hobbiest many years ago, and not by actual Neptune engineering staff. My reading of the OSC command in that manual was unclear and therefore I interpreted the description of the first OSC parameter as an initial offset from midnight.

I'll see if R2R can post a revised version of the article to correct this.

Again, I appreciate your correction.
 

Sisterlimonpot

Effortless Perfection
View Badges
Joined
Jul 15, 2009
Messages
3,866
Reaction score
7,906
Location
Litchfield Park
Rating - 0%
0   0   0
My reading of the OSC command in that manual was unclear and therefore I interpreted the description of the first OSC parameter as an initial offset from midnight.
And my understanding of the first number of the code was, what time of a given hour do you want the intervals to begin. example OSC 010:00/003:00/002:00 Then ON at ten minutes after any hour is when the 3:00 starts and then off for 2:00. And my reasoning for that was when you're using multiple dosing pumps and want to stagger them.

On top of that, I always made sure that my numbers in the 2nd and 3d were divisible by 60 (minutes) just to ensure there wasn't a conflict.

Thanks for the clarification
 

Daniel@R2R

Living the Reef Life
View Badges
Joined
Nov 18, 2012
Messages
37,494
Reaction score
63,926
Location
Fontana, California
Rating - 100%
1   0   0
This is great!! Thanks for sharing this tutorial with our community!!
 

Cristy17

Sunshine Reef
View Badges
Joined
Sep 18, 2015
Messages
760
Reaction score
783
Location
Bradenton, Fl
Rating - 0%
0   0   0
I must admit, I am far from understanding how to program my Apex. I love having it control everything and being able to control remotely. This is really why I got it in the first place. The support at Neptune has been exceptional , however, recently they changed how you could get help from a tech. Now you must set up an appointment. To add to the confusion, there is a "basic" support or "advanced" support, which unless you know ahead of time which it is, you may need to make a second appointment. With that said, I really appreciate your articles thus far for programming. I am attempting to set up the pump on a Zeovit reactor to pump 3 hours on and then 3 hours off, then 3 hours on, etc..throughout the day, everyday. I also need to set the Avast shaker reactor to shake twice a day for 1 min., lets say 6 am and 6 pm. Could you possibly help me by writing the configuration so I can just copy it onto my Neptune? I would really be grateful.
 
OP
OP
SuncrestReef

SuncrestReef

That Apex guy
View Badges
Joined
Jan 18, 2018
Messages
4,214
Reaction score
9,217
Location
Oregon
Rating - 0%
0   0   0
I am attempting to set up the pump on a Zeovit reactor to pump 3 hours on and then 3 hours off, then 3 hours on, etc..throughout the day, everyday. I also need to set the Avast shaker reactor to shake twice a day for 1 min., lets say 6 am and 6 pm. Could you possibly help me by writing the configuration so I can just copy it onto my Neptune? I would really be grateful.

Try this:

Zeovit
———-
OSC 000:00/180:00/180:00 Then ON

Avast
———-
OSC 360:00/001:00/359:00 Then ON

Review the OSC section in the article for an explanation of the command timers.
 

Cristy17

Sunshine Reef
View Badges
Joined
Sep 18, 2015
Messages
760
Reaction score
783
Location
Bradenton, Fl
Rating - 0%
0   0   0
Try this:

Zeovit
———-
OSC 000:00/180:00/180:00 Then ON

Avast
———-
OSC 360:00/001:00/359:00 Then ON

Review the OSC section in the article for an explanation of the command timers.

Thank you Thank you Thank you!!! I just programmed it the way you wrote it. I would have never figured it out. Tomorrow I will have a better idea of how it runs. You have helped me out tremendously! Thank you again.
 
OP
OP
SuncrestReef

SuncrestReef

That Apex guy
View Badges
Joined
Jan 18, 2018
Messages
4,214
Reaction score
9,217
Location
Oregon
Rating - 0%
0   0   0
Thank you Thank you Thank you!!! I just programmed it the way you wrote it. I would have never figured it out. Tomorrow I will have a better idea of how it runs. You have helped me out tremendously! Thank you again.

Be sure to enable logging on those two outputs so you can review the logs to confirm they go on and off at the correct times.
 

Cristy17

Sunshine Reef
View Badges
Joined
Sep 18, 2015
Messages
760
Reaction score
783
Location
Bradenton, Fl
Rating - 0%
0   0   0
Would you mind telling me how to have the OCS on a time? For the Zeovit (pump) on and off every 3 hours at the 0900 hrs on, 1200 hrs off, 1500 hrs on, 1800 hrs off, 2100 hrs on, 0000 (midnight) off. This way I can actually expect when it will be on and off. For the Avast, shake for 1 min at 0900 hrs., and then shake for 1 min at 2100 hours. So far the pump is running on and off as you programmed. I have not had a chance to see the Avast shaker on..Thank you in advance!
 
OP
OP
SuncrestReef

SuncrestReef

That Apex guy
View Badges
Joined
Jan 18, 2018
Messages
4,214
Reaction score
9,217
Location
Oregon
Rating - 0%
0   0   0
Would you mind telling me how to have the OCS on a time? For the Zeovit (pump) on and off every 3 hours at the 0900 hrs on, 1200 hrs off, 1500 hrs on, 1800 hrs off, 2100 hrs on, 0000 (midnight) off. This way I can actually expect when it will be on and off. For the Avast, shake for 1 min at 0900 hrs., and then shake for 1 min at 2100 hours. So far the pump is running on and off as you programmed. I have not had a chance to see the Avast shaker on..Thank you in advance!

From the article:

"The odd thing about the initial delay timer is that it calculates from midnight of January 1, 1996. If your timer values added together are evenly divisible into 1440 (24 hours), then your output will always come on at the same times each day. If they are not divisible into 1440, then each day will be slightly different, and you’d have to do some interesting math to figure out when it would turn on on any given day."

This is one of the most difficult aspects of OSC to describe, so instead I'll just show some examples where I adjust the first and third timers:

OSC 000:00/180:00/180:00 Then ON
Screen Shot 2019-06-26 at 12.53.53 PM.png


OSC 060:00/180:00/120:00 Then ON
Screen Shot 2019-06-26 at 12.54.02 PM.png


OSC 180:00/180:00/000:00 Then ON
Screen Shot 2019-06-26 at 12.54.14 PM.png


As you can see, by adding time to the initial delay (the first timer) and subtracting time from the following delay (the third timer), you adjust when the output will turn On relative to midnight. As long as the 1st and 3rd timers add up to 3 hours, it still runs at 3 hours On, 3 hours Off.

I hope that makes sense.
 
Last edited:

Cristy17

Sunshine Reef
View Badges
Joined
Sep 18, 2015
Messages
760
Reaction score
783
Location
Bradenton, Fl
Rating - 0%
0   0   0
From the article:

"The odd thing about the initial delay timer is that it calculates from midnight of January 1, 1996. If your timer values added together are evenly divisible into 1440 (24 hours), then your output will always come on at the same times each day. If they are not divisible into 1440, then each day will be slightly different, and you’d have to do some interesting math to figure out when it would turn on on any given day."

This is one of the most difficult aspects of OSC to describe, so instead I'll just show some examples where I adjust the first and third timers:

OSC 000:00/180:00/180:00 Then ON
Screen Shot 2019-06-26 at 12.53.53 PM.png


OSC 060:00/180:00/120:00 Then ON
Screen Shot 2019-06-26 at 12.54.02 PM.png


OSC 180:00/180:00/000:00 Then ON
Screen Shot 2019-06-26 at 12.54.14 PM.png


As you can see, by adding time to the initial delay (the first timer) and subtracting time from the following delay (the third timer), you adjust when the output will turn On relative to midnight. As long as the 1st and 3rd timers add up to 3 hours, it still runs at 3 hours On, 3 hours Off.

I hope that makes sense.

Ok, I had to read it slowly a half dozen times..or more, but I think I understand. The 3 hours on and the 3 hours off is evenly divisible, therefore, I should be able to program at the times I mentioned. Now, what I probably should have asked initially is the pictures you are displaying (green and gray boxes), are they from Neptune or did you design that to make it easier for us to understand? If they are on Neptune, how do I get to it? I have been using this..
IMG_6304.jpg
 
OP
OP
SuncrestReef

SuncrestReef

That Apex guy
View Badges
Joined
Jan 18, 2018
Messages
4,214
Reaction score
9,217
Location
Oregon
Rating - 0%
0   0   0
Ok, I had to read it slowly a half dozen times..or more, but I think I understand. The 3 hours on and the 3 hours off is evenly divisible, therefore, I should be able to program at the times I mentioned. Now, what I probably should have asked initially is the pictures you are displaying (green and gray boxes), are they from Neptune or did you design that to make it easier for us to understand? If they are on Neptune, how do I get to it? I have been using this.

I made those graphics specifically for my tutorial article to illustrate the concepts. It would be nice if Neptune made some sort of graphic display like that!
 

Cristy17

Sunshine Reef
View Badges
Joined
Sep 18, 2015
Messages
760
Reaction score
783
Location
Bradenton, Fl
Rating - 0%
0   0   0
I made those graphics specifically for my tutorial article to illustrate the concepts. It would be nice if Neptune made some sort of graphic display like that!
Oh got it..I agree..love Apex, but they need to make Neptune a lot easier..not easy to learn unless you are computer programming savy..
 

Brett S

Valuable Member
View Badges
Joined
Nov 28, 2016
Messages
1,062
Reaction score
1,373
Location
Orlando
Rating - 0%
0   0   0
Oh got it..I agree..love Apex, but they need to make Neptune a lot easier..not easy to learn unless you are computer programming savy..

Just to be clear on terms here, Neptune is the company, Apex is the product and Fusion is the interface that you use to program it:)
 

Sleepydoc

Valuable Member
View Badges
Joined
Apr 10, 2017
Messages
1,423
Reaction score
1,266
Location
Minneapolis, MN
Rating - 0%
0   0   0
One of the reasons I wrote this series on Apex tutorials is because I found Neptune's official documentation is a bit confusing. My understanding of their Comprehensive Reference Manual is that it was just written by some other hobbiest many years ago, and not by actual Neptune engineering staff.

I totally agree! I like my Apex, and the Neptune forum is a very helpful community, but their documentation is lackluster. The Comprehensive Manual is also outdated.

One thing that helps me when reading code is to think of “Min Time...then Off“ as “Min Off time” I just makes a whole lot more sense to me.
 

Sisterlimonpot

Effortless Perfection
View Badges
Joined
Jul 15, 2009
Messages
3,866
Reaction score
7,906
Location
Litchfield Park
Rating - 0%
0   0   0
I totally agree! I like my Apex, and the Neptune forum is a very helpful community, but their documentation is lackluster. The Comprehensive Manual is also outdated.

One thing that helps me when reading code is to think of “Min Time...then Off“ as “Min Off time” I just makes a whole lot more sense to me.
I agree, I wouldn't reef without an Apex, but the legacy information gets jumbled in with their most recent product and it just confuses the heck out of you when you try to troubleshoot and/or research.

Most of the information that I search for is on there websites, but there's no discernment between products. Not sure why they haven't addressed this problem except that it's too much to handle....
 

Algae invading algae: Have you had unwanted algae in your good macroalgae?

  • I regularly have unwanted algae in my macroalgae.

    Votes: 43 35.0%
  • I occasionally have unwanted algae in my macroalgae.

    Votes: 27 22.0%
  • I rarely have unwanted algae in my macroalgae.

    Votes: 9 7.3%
  • I never have unwanted algae in my macroalgae.

    Votes: 9 7.3%
  • I don’t have macroalgae.

    Votes: 31 25.2%
  • Other.

    Votes: 4 3.3%
Back
Top