Im working on a program for Arduino controllers that would make the Arduino the controller for auto-top-off as well as auto-water changes... made a list of standard features I want to include and the sensors I want to interface. I think something like this (a cheap microcontroller) would be the best method for automating the process. If I have say, a 300g display, I would want something like a 300g sump, or a chamber plumbed in series & in parallel with valves that holds at least 200g (well call it a circulation tank). Having a large empty res of just saltwater helps keep the tank stable and serves as the drain/fill tank for water changes. Next to that I would have another tank of matching volume (so, 200g lets say) and then the RO top off tank which could vary in size but I would suggest at least 40 gallons (we will call these the mixing tank and RO tank). Now, minimizing the number of tanks is possible but makes things less stable and requires more programming. You could use two tanks for three of the functions, but then you have complications and delays... like if you have one tank for mixing&circulation and another for RO, then you would have to suspend top-off functions until the RO tank is done supplying the mixing/circulation tank and refills itself... a long time for a larger water change like 200g. The idea is that then each chamber has its fill valves and drain valves controlled, or you could use pumps with each to pump into or out of each chamber to and from each other. In each chamber, you could use laser distance finders to sense the water levels, or mechanical float switches to tell the arduino when each chamber is full, empty, or somewhere in between. The arduino would then use relays to either turn on pumps or open and shut valves to drain and fill each tank. The entire process could be easily automated then into something like this with the push of one button:
When button "change" button is pressed (or a pre-programmed timer says its time), the pump or valves that circulate water in series with the sump or in a closed loop with the sump are closed and if plumbed in series, the valves that bypass this circulation chamber are opened. In this case, the auto-top-off can stay on.
Next, if the top float in the circulation tank indicates the chamber is full, then the drain opens (or drain pump is turned on) to empty this chamber until the bottom float in the circulation tank indicates that it is empty.
Next, the drain valve is shut or the drain pump is shut off.
Next, if the mixing tank's top float indicates that it is full (there is some additional programming here that is up to the user's pref's), and a salinity meter indicates that it is saltwater (or it could trigger an alarm for a manual check that the water is mixed, or to mix it in the first place which could be a seperate program all together or automated with pre-measured cups of salt and a mixing pump), it opens its drain valve (or turns on a drain pump) to pump/drain freshly mixed saltwater into the circulation tank.
Next, when the bottom float indicates the mixing tank is empty, the drain valve closes on the mixing tank (this could also just be controlled by generous or manually entered time-delay).
Next, recheck that the drain valve/drain pump on the circulation tank is closed, then open up the valves that allow the circulation tank to run in series with the sump and shut close the ones that put it in parallel... or if plumbed into a closed loop with the sump (like another display tank but empty) turn on the loop pump.
Next, with the drain on the mixing tank shut (or drain to circulation tank off), the mixing tank refills (from RO tank means the auto-top-off must be suspended until the mixing tank is full again, or have them both fill in parallel) until its top valve indicates that it is full with RO water again. During this period though, something will need to be figured out between filling the RO tank (if they are in series or parallel) and the mixing tank depending on the time needed to fill each (capacity of RO, daily RO demands, tank capacities will determine this).
Next, when the mixing tank's top switch indicates that it is full, the arduino can set off an alarm, send an email over ethernet or WiFi (with respective sheilds), etc... to tell the user that another batch of fresh RO water is ready to be mixed into saltwater. Until the user responds and tells the controller that the salt has been mixed in, operations are put on hold of course to prevent RO from being mixed into the sump.
The auto-top-off tank would have float switches inside it in the top and bottom to tell when its empty and full. There would also be two switches inside the sump or a laser rangefinder/optical switches, etc... to prevent mechanical failures and tell the arduino what the level is inside the sump.
When the lower float switch in the sump (or laser rangefinder) indicates that the sump needs water, and RO functions have not been suspended due to water change functions, the arduino would open up a solenoid or turn on a small pump to feed RO water from the RO tank to the sump.
Next, when the upper float switch in the sump shows that the sump is at its maximum level, the arduino shuts off the top-off mechanism (pump or valve).
If at any time the top off stays on for more than say... 30 seconds (exact value TBD by user based on pump flow rate and maximum possible top-off time), it will suspend top-off functions and sound an alarm telling that there is a malfunction with the top-off system (a float switch in the RO tank or the top switch in the sump has failed).
When the top-off is turned on, regardless of what the upper valve in the sump indicates, it must stay on for at least (TBD) 10 seconds to prevent a situation where if the floats in the sump are too close together, or the top one sticks, it wont trigger on and off constantly...
Similar to the 10 second minimum, so that waves/surges in the sump dont trigger a false fill, a minimum of 30 seconds with the bottom float switch in the sump in the "needs a fill" position is needed to trigger a top-off.
The floats inside the RO tank tell the top-off if it is full or empty and allows the arduino to trigger a solenoid to fill the tank (in conjunction with the normal float valve for redundancy). This allows the RO to fill a larger volume at once than the float alone would (RO's take out more if allowed to run larger volumes at a time).
Anyways, you get the idea... you can use an arduino or other microcontroller with simple float switch add-ons and basic logic to automate the processes of ATO's and water changes by using some simple float switch interfacing and valve/pump relay controls.