CatGenie: Resetting a SaniSolution Cartridge





Introduction: CatGenie: Resetting a SaniSolution Cartridge

Some Background:
I have two CatGenies, both of which take a proprietary cartridge that are good for sixty cycles. The CatGenie will not run without a non-empty cartridge installed. In my home, each unit runs four times a day (I have six cats), so a cartridge lasts only fifteen days. Each cartridge is about fifteen bucks. For those of you following along without benefit of a calculator, that totals sixty bucks a month in cartridges.

Environmentally, four cartridges per month equals a lot of foil, plastic and little circuit boards in the landfill - and I really don't see how CatGenie could sell refills without totally redesigning the cartridge.

Proposed Solution:
Adding new solution to an empty cartridge is not that complicated (see my other instructable), but it isn't really helpful because the cartridge has a microchip on it that acts as a counter. When the counter reaches zero, the cartridge is trash. This instructable will demonstrate how to reset the counter on the cartridge to "full" - allowing you to drop it back into the unit and rock on.

This instructable does cover resetting but does not cover refilling the solution in the cartridge; it assumes you have done so already. If you need help with the refilling process, please see my other instructable.

Step 1: Disclaimers, Warnings, Materials and Safety

It should be noted that I am in no way affiliated with CatGenie or PetNovations LTD. This instructable is (obviously) not approved or endorsed by PetNovations LTD. CatGenie is a registered trademark of PetNovations LTD.

Should you break or damage your CatGenie, your CatGenie SaniSolution cartridge, an Arduino, your computer, sprain your thumb get divorced or whatever - you follow these instructions at your own risk and I assume no liability for what you do or what happens to you. You're a big person. Caveat Emptor.

By following this instructable you may in some way void your CatGenie warranty... but as long as you don't send back the cartridge with non-CatGenie cleanser in it, I don't see how they would know.

There really aren't any safety concerns I can think of beyond common sense. If common sense is an uncommon virtue for you, maybe you should find someone to help you. :-) If not, then rock on!

  • an Arduino microprocessor (or clone thereof)**
  • some breadboarding wires and an LED (any color)
  • a computer with which to program said Arduino
  • a "dead" SaniSolution cartridge
  • a CatGenie you're willing to disassemble and put back together.***

**actually, any microprocessor that communicates via I2C (aka "Two Wire) protocol will suffice, but the Arduino is what I have available and one with which I am familiar. Programming a PIC controller or whatever is on you.

***unless you're willing to fabricate your own cartridge holder. You're on your own there.

Step 2: Get Everything Ready: the Arduino Software

The Arduino
Get your Arduino (I will be using a Diecimila so if you're at all intimidated by the Arduino, get that one), then download and install the software onto your computer. I know I'm being pretty vague here, but this is covered much better on the Arduino web site than I could ever do.

Verily thou must venture there, learn much, and return unto me enlightened. :-)

The Software Side

Once you've got everything bought / built / installed and working, you'll need to load this "sketch" (Arduino-ese for "program") into your Arduino (copy & paste it into your development environment, then upload it to your Arduino):
#include <Wire.h>#define CG (B1010000)boolean resetSuccess = false;int isReset = 13;int byteArray []= {01, 01, 01, 60, 60, 60, 60, 60, 60, 8, 8, 8, 33, 33, 33, 255};void setup(){   pinMode(isReset, OUTPUT);  digitalWrite(isReset, LOW);  Wire.begin();        // join i2c bus (address optional for master)}void loop(){  if (resetSuccess)   {    delay (2000);      // our work is done - pause for a while     resetSuccess = false;  } else {    resetCartridge();    resetSuccess = verifyCartridge();    digitalWrite(isReset, resetSuccess);  }}void resetCartridge(){  for (int i=3; i < sizeof(byteArray)/2; i++)  {    Wire.beginTransmission(CG);    Wire.send(i);    Wire.send(byteArray[i]);    Wire.endTransmission();    delay(4);  }}void movePointerTo(int deviceAddr, int memoryAddr){  Wire.beginTransmission(deviceAddr);  Wire.send(memoryAddr);  Wire.endTransmission();}boolean verifyCartridge(){  boolean success = true;  movePointerTo(CG, 3);  Wire.requestFrom(CG, 3);  while (Wire.available())  {    if (Wire.receive() == 60 && success == true)    {       // looking good so far    } else {      success = false;    }  }  return success;}
Those of you who are Arduino programmer gurus please feel free to optimize this code - just send me the improved version so I can post it here.

You needn't trouble yourself with the details of what is actually happening lest you feel so inclined; basically, you connect your cartridge to the Arduino and it turns on an LED when the reset is successful. When you disconnect the cartridge, the light goes out. Lather, rinse, repeat.

on to the hardware...

Step 3: Get Everything Ready: the Arduino Hardware

Okay... if you're going to hook your Arduino up to your cartridge, you're going to have to wire it up. Take a deep breath, find your center and relax. Its easy as can be... and we have pictures. Everyone loves pictures. :-)

My directions are for an Arduino Diecimila, so if you got a different version you may see some slight variations, but its probably nothing you can't figure out by your lonesome. If it is, just drop me a line and I'll help you out.

Picture #1 has us installing an LED. You can use any color you like. You'll jam the legs of the LED into Digital Pin 13 and GND (fortuitously situated next to each other) but first check the polarity! The bottom of your LED will have a flat edge. The pin on that edge needs to go into GND.

If you get it backwards, it will never light up. NEVER! Mwuhahaha...... Of course, you could always just turn it around. That might work.

I'm okay now. As I was saying....

We've got our indicator hooked up (cake, wasn't it?), now we just need to connect to the cartridge.

The chip on the cartridge has four contacts. I know, I know - it looks like there are eleven, but trust me... there are only four. Eleven little gold contacts connected to four wires: power, ground, clock and data, so four contacts. These equate to pins 3V3, Gnd, A4 & A5 on the Arduino. These are all on the oppsite edge of the board from the LED - if you want to make it easier on yourself you can use black, white, blue and green wires as I have done here in picture 2.

Step 4: Get Everything Ready: Disassemble Your CatGenie

I know.

You have a love/hate relationship with your CatGenie - but that doesn't mean you're ready to tear it apart. It was hard for me too, at first - but I persevered. I was able to move past my initial shock and horror, and embrace my inner hacker.

You can too. Be strong.

Or, you can build some sort of cartridge adapter. Up to you (I've done both) but this way is VERY reliable, and if you reset all your empty cartridges at once you'll only have to do this every couple of months or so.

We're going to try something different on this step: all the instructions are on the photos.

You will need a longer than normal phillips head screwdriver - I'd say six inch shaft [snort!] to be safe.

Step 5: Let There Be a Joining...

Okay. We've got an Arduino with an LED and four wires sticking out of it, our sketch (aka "program") loaded into the Arduino memory, and our CatGenie cartridge holding unit successfully extracted from the processor. We must connect them.

See the four silver contacts on the side of the holder? Those contacts are how the processor connects to the cartridge. We're hijacking them. Those silver contacts have wires going out of them to a small connector... If you used colored wires and set it up like I did in the photograph, it's easy as 3.14159. Just stick the blue wire into the connector where the blue wire is, etc.

If you didn't use colored wire:

  • Connect the Arduino 3V3 to the connector's red wire
  • Connect the Arduino GND to the connector's black wire
  • Connect the Arduino Analog In 4 to the connector's white wire.
  • Connect the Arduino Analog In 5 to the connector's blue wire.

Just like that, you're ready to go.

Step 6: Let's Reset the Damn Cartridge, Already! Sheesh!

The hard part is over.

Resetting cartridges is best done in bulk - use up all but one, setting the empties aside, then you can knock them all out in a few minutes on a Saturday and be done for a few months. Resetting a cartridge literally takes five seconds once you've done all the prep work.

Hook up your battery (or USB - remember the jumper) to the Arduino and give it about ten seconds to load the program and get it running. There will really be no indication that it's ready - I suppose I could add software for that later.

Slide the cartridge into the holder. The LED will illuminate almost immediately - reset was successful. Slide the cartridge out, and in a couple of seconds the light will go out - its ready to reset another one.

Lather, rinse, repeat.

Putting your CatGenie back together consists of reversing the disassembly.

Unplug your Arduino and set it aside until next time.



  • Paper Contest 2018

    Paper Contest 2018
  • Pocket-Sized Contest

    Pocket-Sized Contest
  • Science of Cooking

    Science of Cooking

We have a be nice policy.
Please be positive and constructive.




So was anyone ever able to get this to work for the 120?

Trying this code with the UNO and the LED just stays lit. Does seem to recognize the cartridge at all either.

I'm not ready to hack my cat genie yet but its thowing an out solution error code even though its a brand new cartridge. So I want to find the source of the beeping and cut it out. I have completely disassembled the unit but can't seem to locate the speaker, or source of the beeps so I can bypass it. any help would be appreciated. Thank you.

TYLERG78, you may want to double check and see if it is throwing an error due to the water sensor. I had mine do that a couple weeks ago. All you do is lift the Motor Box, computer, whatever its called off the Catgenie base. Where it sits there is a round pin that you pull out, clean off, and put right back in. Game on. Hope this helps.

here is ann updated code with allproblems worked out. not tested yet but uploads to an arduinoo mega 2560
#define CG (B1010000)
boolean resetSuccess = false;
int isReset = 13;
int byteArray [] = {01, 01, 01, 60, 60, 60, 60, 60, 60, 8, 8, 8, 33, 33, 33, 255};

void resetCartridge()
{ for (int i = 3; i < sizeof(byteArray) / 2; i++)
{ Wire.beginTransmission(CG);
void movePointerTo(int deviceAddr, int memoryAddr)
{ Wire.beginTransmission(deviceAddr);
boolean verifyCartridge()
{ boolean success = true;

movePointerTo(CG, 3);
Wire.requestFrom(CG, 3);
while (Wire.available())
{ if ( == 60 && success == true)
{ digitalWrite(isReset, HIGH); // sets the LED on
delay(50); // waits for a second
digitalWrite(isReset, LOW); // sets the LED off
delay(50); // waits for a second
digitalWrite(isReset, HIGH); // sets the LED on
delay(50); // waits for a second
digitalWrite(isReset, LOW); // sets the LED off
delay(50); // waits for a second
digitalWrite(isReset, HIGH); // sets the LED on
delay(50); // waits for a second
digitalWrite(isReset, LOW); // sets the LED off
delay(50); // waits for a second
digitalWrite(isReset, HIGH); // sets the LED on
delay(50); // waits for a second
digitalWrite(isReset, LOW); // sets the LED off
delay(50); // waits for a second
// looking good so far
else success = false;
return success;

void setup()
{ pinMode(isReset, OUTPUT);
digitalWrite(isReset, LOW);
if (isReset == HIGH) isReset = LOW;
Wire.begin(); // join i2c bus (address optional for master)
void loop()
{ if (resetSuccess)
{ delay (2000); // our work is done - pause for a while
resetSuccess = false;
{ resetCartridge();
resetSuccess = verifyCartridge();
digitalWrite(isReset, resetSuccess);


Thank you for this post. I have several cartridges that are half full and the Catgenie 120 says that they are empty. Now I'm sitting here with no usable cartridges that are half full and have to wait for a new one to be shipped. I'm going to try this and see if I can get it to work.

If anyone cares...I found a temporary solution...

1. Take empty/full cartridge (shouldn't matter) and pull it out of the machine.

2. Insert cartridge and wait for lights to register and immediately press start until you hear the beep and genie starts up.

3. Pull out cartridge right after the genie starts.

You will have lights indicating no cartridge, but it will do the whole cycle anyway...The sanisolution is only added in the drying cycle so it's just for scent (it does help improve the smell a lot!!!)

I saw a post somewhere where someone was doing this...I ordered an Arduino chip and figured out after that it only works on the cg60 NOT 120 :(

I have been doing this with an "empty" cartridge for a while and it continues to work...possibly due to the CG not having time to recognize the cartridge level, but still enables the start function because it "sees" a cartridge in place for that 1 second.

I have yet to get a new cartridge to see if this process actually uses up the cycles stored in the cartridge...Try it out and let me know how it goes...You can't lose because it should work with spent cartridges as well

This is an interesting idea.. as long as it doesn't reduce the counter on a good cartridge. Perhaps you could set up a method by using a relay to temporarily disconnect the RFID reader in the control unit, or a servo to remove/position a good tag at the right time using an Arduino or other method. Maybe the relay could be triggered when the bowl motor runs, or a trigger line from the control board that is active when a cycle is running.


I tried this with an empty cartridge and didn't work for me. could it be that your cartridge wasn't quite empty when you started this process?

I think you're right. The cartridge I used must have 1 or 2 washes left...I just tried an empty one and it didn't work.

...So I guess you need a cartridge with at least a cycle left in it for this to work


has anyone come up with a solution for the 120 model yet?