
Automate your home with Arduino and Click On Click Off
Please note: this article was semi-automatically translated from Dutch, translation errors may occur, links will lead to Dutch websites, you are welcome to comment in English.
Domotics, smart homes and home automation are hot topics these days. Maybe you remember the 'House of the Future' of Chriet Titulaer? His ideas are no longer dreams of the future, these products are available everywhere nowadays. But it's much more fun to build it yourself!
2006: the parallel port
One of my first attempts at controlling lighting at home I did years ago. I had build an interface that controls 220 Volts with relays via the parallel port. After a while I found out that this central control was not really useful, there were 220 Volts cables running all the way trough my room, and the entire circuit board was powered from a single wall outlet...
Attempt 2: Click On Click Off
Years later I found the solution in Click On Click Off modules. The so-called COCO system uses a relay and a 433 MHz receiver that you plug into the outlet, and a wireless remote control to turn it on. Thanks to the excellent 433 MHz library of Fuzzillogic it is relatively easy to control the sockets in an intelligent way. Please note that this library was written for the Dutch version of COCO, I'm not sure if it will work on British or American COCO units.
Arduino home automation

What do you need to build such an intelligent COCO unit? First you need an Arduino as the heart of the system. If you want your domotics unit to work without a computer, but be able to log in with your phone or tablet, you also need an Ethernet Shield. The key components are of course the 433 MHz-transmitter and receiver that allow the Arduino to talk to the COCO-sockets. Order them via Conrad or AliExpress.
Consult the datasheet of your transmitter and receiver for the right pin-out and connections. Both need at least +5 V and ground. The Tx-connector of the transmitter can be connected to any port of the Arduino. The Rx of the receiver must be connected to pin 2 or 3 of an Arduino Uno / Duemilanove, because it works with interrupts. As an antenna you can use a piece of wire about 13 cm.

Besides the transmitter and receiver I also attached a temperature sensor (NTC) and a light sensor (LDR) to my home automation system. Now the system turns on the lights automatically when it gets dark, and spins the fans if it gets too hot. Furthermore, it is important that your Arduino knows what time it is, therefore I use the Time Library. Now your home automation system is able to turn the garden lights off overnight, and turn your bedside lamp on in the morning.
Cheap PIR motion detector
Another useful addition to the domotics system are motion sensors. I wanted to use standard PIR detectors, but the wireless version of Click On Click Off is ofcourse way too expensive. Eventually I came across an offer of 230 Volts motion detectors for ony € 1.50! I decided to take the gamble and bought some, hoping that there was a standard PCB inside.
After disassembly I saw two neatly separated printed circuit boards: a PIR module operating at + 5V to 24V and a 230V relay module with voltage converter to 8V. After removing the 230 Volts part and some experimentation, I found out that the pin-out of the board is Vcc , GND and output, from left to right in the picture.

Programming the Arduino
Because every situation and every home is different, I will not put my full code here. However, I will outline how the code is structured.
In the main loop of the program, the time-critical processes are performed, in this case only the reading of the sensors. For tracking time and decoding radio frequency signals the library uses interrupt routines, so this is handled automatically.
void loop() {
sensorTemp = analogRead(PsensorTemp) - 238;
sensorTemp = pgm_read_word(&temps[sensorTemp]);
// temperatuur bij voltage opzoeken in lookup-table
if (sensorTemp > maxTemp) {maxTemp = sensorTemp;};
if (sensorTemp < minTemp) {minTemp = sensorTemp;};
sensorBuitenTemp = analogRead(PsensorTempBuiten) - 238;
sensorBuitenTemp = pgm_read_word(&temps[sensorBuitenTemp]);
// temperatuur bij voltage opzoeken in lookup-table
if (sensorBuitenTemp > maxBuitenTemp) {maxBuitenTemp = sensorBuitenTemp;};
if (sensorBuitenTemp < minBuitenTemp) {minBuitenTemp = sensorBuitenTemp;};
sensorLicht = analogRead(PsensorLicht) / 10.23;
if (sensorLicht > maxLicht) {maxLicht = sensorLicht;}
if (sensorLicht < minLicht) {minLicht = sensorLicht;}
Automation_Events();
// Events loop
WebServer();
// Check voor inkomende verbindingen en laat webserver draaien
if ((hour() != prevHour) && timeOK) {
// Elk uur data loggen naar SD
prevHour = hour();
Log_Data();
}
if ((weekday() != prevDay) && timeOK) {
// 0.00u alles resetten
prevDay = weekday();
maxTemp = sensorTemp;
minTemp = sensorTemp;
maxBuitenTemp = sensorBuitenTemp;
minBuitenTemp = sensorBuitenTemp;
maxLicht = sensorLicht;
minLicht = sensorLicht;
resetServer();
}
}
From the main loop, the other functions are called once in a while; logging to the SD card, keep the web server running, and tracking and execution of time and / or sensor -driven events. The system also has an 'home' and 'standby' (sleep/away) status, several events take this into account. Thus, the light comes on when it gets dark when the system is 'home', but not when it is at standby.
Of course we want to be in control, so despite everything running automatically, it should be possible for me and others to take control of the lights. Because I have an RF receiver connected to my Arduino, I can receive signals from the original remote. When you switch a COCO module off, the status of the module in the memory of the Arduino changes also.
Graphical interface
The cream of the crop of this project is the graphical interface from SD card, it is always available without a computer!

The interface is built in HTML and CSS and is fully responsive, so the widgets are automatically aligned as the screen size allows. On a large widescreen display there are many widgets next to each other, and on mobile everything shows under each other.
The Arduino Web server displays the HTML page that is stored on the SD card and fill it in with the correct live sensor data and switch status. The Arduino server runs not only on the local network, but is also (protected) approachable from outside. In this way I can keep an eye on my house, and adjust if necessary, from anywhere in the world.
Do you have a home automation solution built by yourself? Let me know in the comments below!
31-05-2015: Here you can download the complete code of the domotica controller.