Introduction: Introducing Climaduino - the Arduino-Based Thermostat You Control From Your Phone!

There is a new version of the Climaduino and the Climaduino Controller with some very significant changes.

  • Supports multiple zones
  • Uses the Arduino Yún
  • Works with Central A/C
  • Communicates using the MQTT protocol (can integrate with other systems besides the Climaduino Controller)
  • Does not have an LCD or temperature setting buttons (they will need to be added back at some point)

For more information, visit the develop branch of both projects Git in the git repo:


Not everyone lives somewhere with central air, or is willing to pay for a Nest or similar "smart" thermostat. The Climaduino is a DIY Arduino-based thermostat designed to control a wall unit A/C. I incorporated both temperature and humidity sensors in order to optimize comfort and reduce energy usage. I then developed a Raspberry Pi-based web interface to control the Climaduino from my phone.

This is still a work in progress, but is definitely functional. I am posting this instructable so others can both build their own smart thermostats, and hopefully build on this project with their Climaduino improvements.

Here are the features so far:

Climaduino thermostat

  • Arduino-based
  • temperature and humidity sensors
  • Relay to control A/C
  • LCD Display
  • Buttons to control temperature
  • Controls both temperature and humidity
  • Settings stored in EEPROM and survive power failures
  • Short cycle protection for efficiency and compressor protection

Climaduino Controller

  • Raspberry Pi-based
  • Wifi-enabled
  • Mobile-optimized web interface to control Climaduino settings
  • Historical temperature and humidity graphs
  • Programmable temperature and humidity changes

Why did I want to build this? Mainly because it was fun to do and I've always been very interested in climate control. (I know that sounds weird, but it's true.) It's also because humidity is a huge issue in my area, South Florida. I designed the Climaduino Thermostat to take this into account. The A/C will stay on just a little bit longer when it's humid to wring more moisture out of the air. I also added a humidity control mode. It can save a significant amount of power and prevent coming home to a mold-infested house. Humidity control mode ignores temperature and only runs the A/C when things get too humid. It's useful when going out of town or when the house is empty (of people and pets).

Obligatory warning
If you perform any of the steps in this instructable, you assume all risk for the outcome. Working with high voltage can be extremely dangerous. Improperly altering your A/C unit could lead it to malfunction or completely break. Please be careful.

Electrical Safety: Safety and Health for Electrical Trades Student Manual

Step 1: Supplies

The following will be needed to complete this project.

Climaduino Thermostat

  • 1 x Arduino - I'm using an Arduino Uno
  • 1 x Solderless breadboard
  • 2 x buttons - momentary on (optional)
  • 1 x DHT22 temperature and humidity sensor
  • 1 x LCD display (optional) - Not sure of the model, but it is parallel-based and uses the LiquidCrystal library
  • Resistors:
    1 x 4.7K ohms
    1 x 220 ohms (only required if LCD is used)
  • Wires to connect everything
  • The DHT library installed in Arduino/libraries
  • Climaduino Thermostat source code

Climaduino Controller

Step 2: Thermostat: Building and Installing the Relay

  • Look up how much current your A/C draws. If it is more than 20 amps, you'll have to find a different relay kit.
  • Solder parts on the Beefcake Relay PCB except for the output terminals (the PCB is labelled). The Arduino Controlled Relay Box instructable has steps and some tips and tricks.
  • Solder wire of an appropriate gauge for the amount of current your AC will draw directly to the larger pads labelled LOAD on the PCB.
  • Create a relay-controlled power cord or outlet for the A/C to connect to. The Arduino Controlled Relay Box instructable is a good place to start.

    Note: Make sure to use a power cord that can handle the current your A/C draws and has the right plug type.

    Another option is to subvert the A/C's built in controls and install the relay inside the A/C. (Has serious potential to break your A/C, and can be dangerous if not insulated properly from the chassis.)

I originally planned on creating a power cable for the unit with the relay inline. Unfortunately, this unit's built-in thermostat was cycling it off prematurely. I looked up the unit's wiring diagram and found a way to wire in the relay so the old built-in thermostat could still be used in the future. I then set the built-in thermostat to its hottest setting giving the Climaduino Thermostat full control.

Step 3: Thermostat: Wiring It All Up

  • Wire things up as they are in the diagram. The LCD and buttons can be skipped if you don't want them.
  • Connect the relay to the Arduino:

    GND to - rail on the breadboard
    CTRL to pin 10 on the Arduino
    5V to + rail on the breadboard

I recommend orienting the Arduino so pins 0-13 are next to the the breadboard. This makes the wiring for the LCD a lot neater.

The resistor used for the LCD is 220 ohms, and the one used as a pull-up for the DHT22 sensor's data line is 4.7K ohms.

Step 4: Thermostat: Loading the Code and Testing

  • Connect the Arduino to your computer and upload the Climaduino sketch.

    If it fails to upload, this may be because you do not have the DHT library installed in your Arduino/libraries folder.

Once uploaded, the LCD should display the current temperature/humidity settings and readings. The temperature setting can be changed using the two buttons on the Thermostat. One button raises the temperature by a degree at a time and the other lowers it. Hold the button down until the setpoint changes to the desired value. It will not be very responsive. Earlier attempts at using interrupts to allow immediate reactions to button presses caused problems.

The thermostat outputs current readings, parameters, and other operational details as JSON over the serial port. To test this, open the serial monitor (right-most button in Arduino IDE). You should see JSON data being sent from the Arduino to your computer. This data includes the operational parameters, the current settings, and readings.

To test changing the settings, open the serial monitor. Click the drop-down menu at the bottom of the window that says Newline and select No line ending. Type the desired temperature followed by an F (case sensitive) and press Send to change the temperature setpoint. 77F and then Send would change the temperature to 77 degrees fahrenheit. Type the desired humidity followed by a % and press Send to change the humidity setpoint. 55% and then Send would change the humidity setpoint to 55 degrees of relative humidity. Finally, the mode can be changed by typing the desired mode number followed by M (case sensitive) and pressing Send.

Valid values for mode are:
  • 0 - Cooling/Humidity Control
  • 1 - Humidity Control
  • 9 - System Off

Step 5: Controller: Installing Pre-requisites

This assumes you already have a Raspberry Pi running the Adafruit Occidentalis Distribution (based on Raspbian). It also assumes you have network connectivity either by connecting directly over Ethernet, or by setting up and using a USB WiFi adapter.

Here are some resources to help those new to the Raspberry Pi:

The Occidentalis distribution advertises itself as raspberrypi.local using Avahi (Bonjour). This means that Macs, and iPhones will be able to access the Raspberry Pi using this rather than IP address. If unable to use raspberrypi.local, it may be advisable to configure a static ip. If you decide not to configure a static IP, and can not use raspberrypi.local, you can find the IP address assigned to the device from your router or by logging on to the Raspberry Pi using a monitor and keyboard and typing ifconfig. You will use the account pi to log in. The default password for the pi account is raspberry.

Change the default password (optional)

  • Log on to the Raspberry Pi using pi as the username and raspberry as the password.
    • can ssh in (ssh pi@raspberrypi.local in the Mac Terminal)
    • can log in at the console using a connected keyboard and monitor
  • Type passwd and follow the on-screen prompts to change the password

Install Python Setuptools

Python Setuptools makes it easier to download, install, and configure Python packages. It provides the easy_install command I'm going to use a lot in these steps.

Update apt-get

  • sudo apt-get update

Install rrdtool

  • sudo apt-get install libcairo2-dev libpango1.0-dev libxml2-dev rrdtool librrd-dev

Installing Git (optional)

  • sudo apt-get install git

Install Python virtualenv (optional)

  • sudo easy_install virtualenv

Python virtualenv
allows creating a isolated install of Python. The advantage of doing this is that it keeps any modifications you make to Python compartmentalized in that one virtual environment. This is a bit overkill for what we are doing with the Climaduino Controller, but I like to leave things in a good state for future projects. Here is a quote from that explains it well:

"The basic problem being addressed is one of dependencies and versions, and indirectly permissions. Imagine you have an application that needs version 1 of LibFoo, but another application requires version 2. How can you use both these applications? If you install everything into /usr/lib/python2.7/site-packages (or whatever your platform's standard location is), it's easy to end up in a situation where you unintentionally upgrade an application that shouldn't be upgraded."

Creating a Virtualenv (optional)

  • virtualenv ~

We're now going to create a Python virtualenv at /home/pi. Since we are logged in as pi, ~ expands to /home/pi. If you choose to create your virtualenv somewhere else, then the steps and examples in the rest of this instructable will need to be adjusted accordingly.

Using a Virtualenv

  • source ~/bin/activate

There are two ways to use your virtualenv. You can either directly use the activate script (installed with the virtualenv) to update your path, or directly reference the executable in the virtualenv.

Using the activate script to use the virtualenv is the option I chose as it is less error-prone. When choosing this option, no special considerations need to be made as the right executables will be used. This has to be repeated each time you log in and want to use your virtualenv.

If you choose not to use the activate script, then care must be taken when running Python programs or using easy_install. When the activate script is not used, then the system-wide versions are used unless you specify the path of the executable you want to use. To run a python program you would need to type ~/bin/python and to use easy_install, you would need to type ~/bin/easy_install package_name.

Note: The rest of the commands in this instructable will assume a virtualenv was created and the activate script was used to update the path. If no virtualenv was created, the easy_install commands will need sudo prepended to them. If a virtualenv was created and the activate script was not used, ~/bin/ will need to be prepended to some commands.

Step 6: Controller: Initial Setup

Connect the Arduino

  • Connect a USB cable from the Arduino to the Raspberry Pi.

Installing Needed Python Packages

  • easy_install pySerial
  • easy_install python-rrdtool
  • pip install Django==1.6.10

Get the Climaduino Controller source code
The code can either be:

Set Up the Climaduino controller

  • cd ~/climaduino
  • Create the database
    • python syncdb
    • Answer yes and follow the prompts to create an administrator user
  • Start the development server listening on all IP addresses on port 8000
    • python runserver

Test Initial Setup

  • Browse to http://raspberrypi.local:8000 on your computer and/or phone. A page should display showing the current temperature, temperature setpoint, humidity, humidity setpoint, and mode.
  • Verify the readings listed on the page match those on the Climaduino Thermostat's LCD (if you installed one).
  • Change the temperature by clicking or tapping on the button displaying the temperature. Change it to another value and verify the setpoint displayed on the thermostat's LCD displays the new value after a couple seconds pass.
  • Access the administrative interface from your computer by browsing to http://raspberrypi.local:8000/admin/. Log on using the administrative credentials entered during the database setup.

Step 7: Controller: Polishing the Setup

The setup as we left it is not very polished. The following are optional steps that can be taken to make the Climaduino Controller's installation more polished.

Change the hostname so it can be accessed using climaduino.local
This will change it so we connect to the controller at climaduino.local rather than raspberrypi.local.

  • sudo nano /etc/hostname
  • replaceraspberrypi with climaduino
  • Ctrl + x, y, and then press Enter
  • sudo reboot

The Climaduino Controller should now be accessible at http://climaduino.local:8000.

Start Automatically at Boot and use Port 80
I have already created a startup script that can be used. If any details of your implementation differ from the steps in this instructable, the script may need some tweaking.

  • sudo apt-get install screen
  • sudo cp ~/climaduino-2/startup_script\ for\ Debian/climaduino-controller /etc/init.d
  • update-rc.d climaduino-controller defaults
  • sudo reboot

After reboot, the Climaduino Controller should start automatically. It should now be accessible without adding a port number since port 80 is the default for http. http://climaduino.local (or http://raspberrypi.local if the hostname was not changed).

Step 8: Thermostat: Advanced Tweaking

Most people are probably going to want to ignore this step. It is just extra information about parameters in the Climaduino Thermostat that can be tweaked and what they do.

There are many variables that are not currently able to be adjusted without changing them in the code. While some may be exposed using the serial interface in the future, for now the following variables can be changed in the source code. The sketch can then be re-uploaded to the Arduino.

  • tempHysteresis
    • Default: 2
    • Number of degrees the temperature is allowed to go above the temperature setpoint when in Cooling mode and below the setpoint when in Heating mode.
  • humidityHysteresis
    • Default: 2
    • Percent relative humidity the humidity is allowed to go above the temperature setpoint when in Cooling or Humidity Control mode.
  • humidityOverCooling
    • Default: 5
    • Degrees cooler than temperature setpoint allowed when humidity is above the humidity setpoint. Only used when in Cooling / Humidity Control mode. This puts a cap on how much cooler the area is allowed to become when the compressor is running because humidity is too high. If set too low, there may not be adequate humidity control in some cases. If set too high, the area may become uncomfortably cold in some cases.
  • minRunTimeMillis
    • Default: 600000 (10 minutes)
    • Minimum time the system will run for when in a mode that uses the compressor. This may lead to overshooting the temperature or humidity setpoint, but it should lead to greater efficiency and be easier on the compressor. This prevents short cycling.
  • minOffTimeMillis
    • Default: 180000 (3 minutes)
    • Minimum time the system will stay off for before coming back on when in a mode that uses the compressor. This prevents short cycling and protects the life of the compressor. Most wall units likely already have protection to keep the compressor from coming back on too quickly after it has turned off, but it seemed safer to explicitly add this to the code.
  • numberOfReadings
    • Default: 2
    • Number of readings to average before returning a temperature value. This was mainly coded in for when this project was being prototyped using less accurate and more inconsistent analog thermistors. I left it in the code, because it may still help to get more stable readings.
  • delayBetweenReadingsMillis
    • Default: 2000 (2 seconds)
    • Time to wait between each reading to be averaged. This is set to 2 seconds because the DHT22 sensor can only give readings every 2 seconds. The DHT library, in fact, will not check the sensor again until 2 seconds have elapsed. If queried before this time has elapsed, the library simply returns the previous value. That would negate the point of averaging 2 readings.
  • pinRelay
    • Default: 10
    • Pin that will trigger the relay.
  • pinSensor
    • Default: 9
    • Pin DHT22 sensor data line is connected to
  • pinCooler
    • Default: 11
    • Pin button to lower temperature setpoint is connected to
  • pinWarmer
    • Default: 12
    • Pin button to raise temperature setpoint is connected to
  • lcdRS
    • Default: 3
  • lcdEnable
    • Default: 4
  • lcdD4
    • Default: 5
  • lcdD5
    • Default: 6
  • lcdD6
    • Default: 7
  • lcdD7
    • Default: 8

Step 9: Contribute Back

If you use this project and improve it or fix any bugs, please contribute your changes back. Comment on this instructable or contact me through instructables.

Thanks and hope you enjoy this project!


lzu (author)2013-12-15

Very cool!!!
I thought of something very similar. Obviously using my open source java library control. Actually there is still no web interface (you can just control Arduino from network) but it works very well with Raspberry. If you are interested check it at

bbustin (author)lzu2013-12-15

Izu, that looks very intriguing. It is an extremely cool project that I would love to experiment with at some point. Thanks for letting me know about it.

lzu (author)bbustin2013-12-15

Thank you. Give me a feedback when you'll try it.

jwabel (author)2016-11-28


Do you believe the climaduino can go solar?

I have transpired solar collectors on a house with inlet and exhaust dampers. All I need to do now is cost-effectively control the pre-heated solar hot/warm air by way of the homes furnace fan.

If the collectors and the outside air temperature had a remote temperature sensor that could talk to a controller that activates a home's furnace fan then the system will work.

The practical aspect is: Collectors are 75 F or higher and the outside air is 62 F or below. This combination of data is relayed to the controller remotely. Whem the parameters are met the controller turns on the home's furnace fan and circulates the heated air from the collectors throughout the home.

Is the Climaduino the right way to go?

bbustin (author)jwabel2016-12-01

It probably could do that, but many of the assumptions baked into the Climaduino may not meet what you want to do.

This Instructable is old, and there is another branch on Github that uses MQTT to communicate. (

I think your best bet would probably be to copy some of the MQTT code from there. Then you could have the Climaduino relay the temperature using MQTT to a home automation server like OpenHAB or Vera. The outside temperature could also be sent to the home automation server. Then the home automation server could send a command over MQTT to turn on or off the fan.

The other option is to have the Climaduino read the MQTT data from the outdoor thermostat itself and make that determination.

If you'd like to keep costs down, you could use an ESP8266 (like the Adafruit Huzzah) instead of an Arduino Yun. The Adafruit Huzzah was about $5 or so. I don't have any code on Github for that, but I successfully used it as a remote IR sender for a wall airconditioning unit. I could put that code on Github, but it is not very polished at all.

jwabel (author)bbustin2016-12-01


Thank you, great info and insight. I hope to let you know if I get this pulled off.

Thanks again for your generosity.

bbustin (author)jwabel2016-12-01

I posted a longer reply, but Instructables seems to not have put it up.

Climaduino has a lot of assumptions that are not true here. You could use the MQTT branch Then possibly remove the Thermostat.cpp and .h files. Remove Thermostat from the .ino file and implement your logic in the .ino file instead.

My recommendation is to use MQTT to communicate between the multiple sensors and possibly with a home automation server (like OpenHAB or Vera). The choice would be whether you want the logic in the thermostat device itself or on the home automation server. For Climaduino I chose to keep the logic on the thermostat device, but made the parameters the logic uses remotely configurable over MQTT. That way it keeps working even if it loses connectivity or the home automation server goes down.

If you have it on the device itself, you can use MQTT on the thermostat to get the outside temperature from the other sensor and make the determination there.

There is another option which could help to lower costs. You may be able to use the ESP8266 instead of an Arduino Yun. The Adafruit Huzzah is about $5, but you need to do some soldering. I used one as a remote IR sender hooked up to my home automation server using MQTT. That way I could lower and raise the temperatures programmatically.

I don't have that code on Github, but could post it. It is not very polished. It also doe snot have any thermostat logic, but that could be added in.

bbustin (author)2016-12-01

You could also have the logic on the home automation server and then simply provide a means using MQTT to trigger the furnace fan on and off.

DIoTY_co (author)2016-01-17

As you're already using MQTT you could use as MQTT broker... Like this you have the easy configurable mobile app from DIoTY available to you as mobile (android + iOS) interface...

deekaylol (author)2015-03-18

Dear bbustin, could you provide for me Raspberry pi controller code if I want to use raspberry pi and arduno uno over usb please?

I did everything as was mentioned in this tutorial, but I get error message if I try to click on submit or on settings or history for example, I can´t get the readings too :/

Help me please, thank you :)

I used this for Arduino:

And this one for pi:

bbustin (author)deekaylol2015-03-18

Hi Deekaylol,

The code you used should work for that; however, I think that the problem here is that there is a new version of Django that was released in the interim. The old code is not working with the new version of Django.

Maybe you could try uninstalling Django and then installing the older version:
pip install Django==1.6.10

If that works, please let me know and I will update this instructable so others do not run into the problem.

deekaylol (author)bbustin2015-03-20

Dear bbustin,

That did the trick ! I was able to uninstall Django with pip uninstall, and install the version you mentioned, the reading is working, great :) Thank you,you are the king bro ! ;)

I got two more questions, I hope you could help me:

1, I see Heating option, but I in the Arduino code, I just see one relay output "const int pinRelay = 10; // pin for relay" , could you provide some information about this ? I would be really thankful, If you coud edit the code for second relay, which could control the heating.

2, Could you provide some information how the temperature could be changed to SI ? I mean to Celsius, since I´d like to use that code to control heating/cooling system in our bungallow (AC and Heating is connected to 220V so the relay shoud do the trick.)

I look forward to hear from you.

Best regards, deekaylol

bbustin (author)deekaylol2015-03-20

Hi Deekaylol,

The original code currently only handles one relay for cooling. I had put the heating in there for the future. The current code handles heating as well; however, it works in a completely different way and has different requirements.

Changing the code to display Celsius should be easy. Change line 216 in the code from

"float readingTemp = dht.readTemperature(true);"


"float readingTemp = dht.readTemperature(false);"

deekaylol (author)bbustin2015-03-20

Dear bbustin,

I was ablet to edit the code, second powerstate and pinrelay did the trick, it´s a bit buggy at the moment, but working. But I was stucked with the F to C converting, that was so easy. Thank you very much !

Have a nice day ;-)


bbustin (author)2015-03-06

Hi Tom,

I think that about the init script not following the LSB standards may be ok. One way to tell is to see if the rest of the steps work. If they do not, let me know and I will try my best to come up with some steps that should work.

I'm sorry this has been so difficult. The code you are using is the newest and best, but I have not had time to polish things up or write an install guide yet.

TomL5 (author)bbustin2015-03-19

hi bbustin. We got it, the fact you told us to reset the Yun distro actually worked. I guess this is a valuable experience. We continue to work on it as adding more features like controlling washer too. But your help is so great and we want to say thank you..

actually, we have to change a tiny bit in

mqtt_connect('climaduino.local') with our Pi's address. then it started collecting data.

wget and is another experience. we actually did wget whole html file instad of python file.

bbustin (author)TomL52015-03-20

Hi Tom,

I am really happy it is working now. I updated the README file to now tell others to first update their Yún. If I can help with anything else, let me know.

TomL5 (author)bbustin2015-03-11

thank you for your respond.

First, we uploaded sketch to arduino Yun and tried to see how data be transmitted, (no shield yet). even though, we used

ssh root@yourYunsName.local 'telnet localhost 6571'

tried to get data but the error : telnet bad address "localhost" stopped this happening.

how we can define the Yun hostname is big thing

Second, at the same time, we installed develop code controller for Raspberry pi but cannot understand how Raspberry pi able to communicate with Yun, we understood that MQTT bridge does that part but how Pi is able to load the data from Arduino Yun is a big challenger. All steps were followed.

but the question is : should we install MQTT into Pi as well? most of other projects we saw MQTT been installed to all machines it communicates with. how can MQTT in Yun able to communicate with Pi if the receiver doesn't have the same program to receive the message?

I would like to hear you back soon, we tried many steps but not going anywhere further yet. the data is not transmitted. no communicate between Yun and Pi .

bbustin (author)TomL52015-03-12

Hi Tom,

The code in the Develop branch of the controller has instructions for installing MQTT on the Pi. What you have is an MQTT broker server on the Pi. Then you have the MQTT bridge component on the Pi that talks to the MQTT broker. The Yún has an MQTT bridge component as well which communicates with the MQTT broker on the Pi.

For some reason the Yún does not seem to support MDNS, so I had to add instructions in the README about adding the Raspberry Pi's IP to the hosts file until I can figure out how to get MDNS working properly on the Yún.

So the communication is from each component to the MQTT broker server. The Yún puts messages on the MQTT broker and the Climaduino Controller software picks them up. This information is stuff like current temperature and humidity, whether the system is on or not, whether the fan is on or auto. The Climaduino Controller software subscribes to those types of messages with the MQTT broker. Whenever the Yún sends one of these messages out to the MQTT broker, the MQTT broker sends the message to the Climaduino Controller.

The process also works in reverse. When the Climaduino Controller needs to ask the Climaduino to change a setting (such as changing the temperature set point), it sends this information to the MQTT broker. The Yún is subscribed to those kinds of messages with the MQTT broker. So whenever the broker gets one of the setting messages, it sends it to the Yún.

The MQTT broker is what handles all of the data receiving, storing, sending. The MQTT Bridge components on the Yún and the Pi are the ones that interface with the MQTT broker.

The MQTT bridge on the Yún is different code than the MQTT bridge on the Pi. So the Pi should have the Climaduino Controller code from the Develop branch and the Yún should have the Climaduino code from its Develop branch. Both have README files that are not great (remember the Develop branch is very much a work in progress), but give a general idea of some of the steps that are needed to get it up and running.

Time-permitting I really want to make this a lot easier to deploy. Maybe some sort of installer routine and better documentation. If you see any areas where a specific type of documentation would help or something is very unclear, let me know. That way I can improve those parts and we can work together to make this project even better and easier for anyone to use.

hahmim (author)2015-03-19

Hi Brian

It worked we updated the version of the yun to be compatible with the software and the readings made it to the local.

we did however modifi the on the mqtt_connect = "climaduino.local" to mqtt_connect = ''our raspberry pi IP " and it panned out.

also in the /etc/rc.local the latest version we believe that the mDNS is working because it showed localhost

so we didn't have to add anything else to that file. thought you should know as an update.

hahmim (author)2015-03-17

Hi Bbustin

The information you sent to us
about checking the status of the mosquitto on the pi came back with the message

[ok] mosquitto is running

I also apt-get mosquitto and it
said that the latest version is already installed.

so we are still stuck with the
same problem which is when we telnet from the pi through the command:

telnet localhost 5700

it comes back with:



telnet: unable to connect to
remote host: Address family not supported by protocol.

Also we studied the script and saw that the /tmp/climaduino_mqtt_bridge socket file
is plugged in the socket_address variable however I don't see anything in that
file and I believe that there is a discrepancy there. also the screen -r gave
us no screen to be resumed.

we are also available today at
anytime for the virtual conference call just replie to me in a personal message

hahmim (author)2015-03-15

Hi Bbustin,

in the raspberry pi I telnetted : telnet localhost 5700 this spitted out the following respons

telnet: unable to connect to remote host: address family not supported by protocol.

I also ettmpted to just telnet through the following command:

telnet 5700

it came back with the following message:

telnet: unable to connect to remote host: connection refused

when typing

netstat -an | egrep 'Proto|LISTEN'

it return with

TCP listening on port 22, 23, and 1883 but no instance for 5700

i also tried telnetting on the yun

telnet climaduino.local 5700

it didn't work so I found the ip of the pi and telnetted

telnet 5700 and the response was

telnet: unable to connect to remote host: connection refused

I am not sure what is wrong.

also you mentioned a virtual conference call. please let me know when and how we can do that if you still up for it.

bbustin (author)hahmim2015-03-16

It sounds like the MQTT broker may not be running on the Raspberry Pi. On the Pi, try typing 'service mosquitto status' to see if it is up. If it does not exist, try making sure it is installed by running 'sudo apt-get install mosquitto'. If it was not installed, this last command will install it and start it.

I will send you a private message about setting up a conference call in case that does not work...

hahmim (author)2015-03-14

Hi Bbustin,
I am TomL5 Partner working on the same project. So I in turn would like to ask you a couple of questions. Firstly, after following your instructions to the Tee, are we supposed to get data from the sensor into the WUI (Web User Interface) or is that still a work in progress . Second are we suppose to configure the Telnet. And if so how can we get it to point to the proper place to fetch data from the Yun. As it seems the MQTT protocol is not establishing any connection with the local host because when running a shell command line
Found in the arduino Yun documentation : telnet localhost 6571. We get the telnet bad address 'localhost'. I did find that the port that you specified on the to communicate with the local host is 5700 do we need to specify that anywhere else in the micro controllers configuration. I have a felling that there is something missing in that regard. Because I have tested and successfully received data from the DHT22 from an Uno but no data from the Yun. We also tried to remove the Seed shield to see if the discrepancy is in that structure of the work however to no avail. Please point us to the right direction so we can be on the same page as the latest and greatest

bbustin (author)hahmim2015-03-14

Hi. The test of telnetting to port 6571 on the Arduino Yún is not a good test. The reason is because the MQTT broker is not running on the Arduino Yún. If you want to test MQTT, then on the Raspberry Pi, try telnetting to localhost port 5700. If that works, then the next step is to test is the Arduino Yún has connectivity to the MQTT broker running on the Raspberry Pi. Try telnetting from the Yún to climaduino.local port 5700. If that does not work, find the IP of the Raspberry Pi. Then go back to the Yún and try telnetting to the Pi's IP port 5700. If that works, then the issue is the hosts file.

If everything checks out, then we can continue the troubleshooting. The first thing to do on the Yún is to type 'screen -r'. This should give you the console output of the Yún's MQTT broker. If it is working, it should say it is sending settings. If it is not, there may be an error there. To get out of there without killin the MQTT bridge, press Ctrl + A, then let go of both and press D.

If everything looked fine there, then we can continue with troubleshooting steps on the Pi. I'm not home on my computer (everything above is from memory), but if those steps do not find the prolem I can come up with more when I get home.

If needed, we can also set up a virtual online conference call where you can show me what is happening. I really want to help you guys to get this working...

TomL5 (author)2015-03-02

hi bbustin. we uploaded the code and script as you mentioned in your steps with Yun. but when we go the web, we dont have any reading from DHT22 and when we type new temperature or humidity values they dont get send in the thermostat display Is this the file installation somehow affected to collect data. we using honeywell trueIAQ connected with relay shiled. we connected the NOs 2 and 3 into the Heating pin and the Fan pin op thermostat. we also dont have a HVAC system hooked.

bbustin (author)TomL52015-03-03

Hi Tom,

It sounds like you are using the code in my development repository. This code works significantly differently than the code in the instructable.

The key difference is using the Arduino Yúns WiFi and Linux processor. The communications between the controller and the Climaduino code on the Yún is also vastly different. The MQTT pub/sub protocol is used. The Yún's Linux processor runs the file. This reads any settings for the device. It also opens a file-based socket for the file to be able to set the readings on the MQTT broker.

For this to work, it must be paired with the development branch of the Coimaduino controller code. Since this is all. Dry experimental, there are bound to be some rough edges. I am glad to help you to get this up and running and am ecstatic that someone else will be using this new code.

TomL5 (author)bbustin2015-03-03

thanks a lot my friend. We try to understand the concept and idea how all connected wireless.we using all news board Yun and Pi B+; plus all the developing code. i guessed we messed up with connection since we try to hook Arduino Yun board and Raspberry Pi B+ by USB cable. and somehow DHT22 not able to collect data. Also, when we tried to add device on Django admin page, about adding informatioi of Yun Hostname and Zonenumber. i used root for hostname and .climaduino for zonename. but i believe this step maynot be right then it may affected to Pi communicates with Yun to load data? your information is so great and we should be careful since begining. Thank you very much

best regard


bbustin (author)TomL52015-03-05

Hi Tom,

First make sure that you are using the develop branch for both the Climaduino and Climaduino Controller parts of the project. The Climaduino code in develop, for instance, will not work with the master branch of the Climaduino controller. It sounds like you are not using the develop branch for the controller as zone number has been removed.

Each of those repositories had a README file as part of the develop branch that gives some initial steps for how to set everything up. I've not had a chance to polish things up much as it is still very much a work in progress. (It does work though as I am using it to control a central AC at the house for the last month.)

The steps at a high level are:

- Follow the README steps to get the Climaduino-web-controller code in the develop branch running on your Raspberry Pi and the MQTT broker set up.

- Get Arduino Yún on your WiFi network or connected through ethernet

- Get code loaded onto the Arduino AVR portion of the Arduino Yún (upload the sketch).

- Get the and components installed on the Linux part of the Arduino Yún. There are details how to do this in README file in the mqtt_yun_bridge folder.

At this point when browsing to climaduino.local, you should see a zone that was added automatically. If you click on the button, you should see the readings and settings for your climaduino.

Note: Do not give the Yún the hostname climaduino. Only the Raspberry Pi should have a hostname of climaduino. The Yún's hostname can reflect where it is or be an arbitrary name depending on your preferences.

Hope this helps. Please let me know. I'm glad to help.

TomL5 (author)bbustin2015-03-06

I got this problem since I run the command in Pi. Do you have an idea?

i just follow the same steps like you posted. I thought maybe file in develop may corrupt the work?

pi@climaduino ~/climaduino $ python syncdb

Operations to perform:

Synchronize unmigrated apps: history

Apply all migrations: admin, contenttypes, settings, auth, sessions

Synchronizing apps without migrations:

Creating tables...

Installing custom SQL...

Installing indexes...

Running migrations:

No migrations to apply.

pi@climaduino ~/climaduino $ sudo cp ~/climaduino/startup_script\ for\ Debian/climaduino-controller /etc/init.d

pi@climaduino ~/climaduino $ sudo update-rc.d climaduino-controller defaults

update-rc.d: using dependency based boot sequencing

insserv: Script climaduino-controller is broken: incomplete LSB comment.

insserv: missing `Required-Start:' entry: please add even if empty.

insserv: missing `Required-Stop:' entry: please add even if empty.

insserv: missing `Default-Start:' entry: please add even if empty.

insserv: missing `Default-Stop:' entry: please add even if empty.

insserv: Default-Start undefined, assuming empty start runlevel(s) for script `climaduino-controller'

insserv: Default-Stop undefined, assuming empty stop runlevel(s) for script `climaduino-controller'

kbarkhau1 (author)2015-03-02


I am having a nightmare of a time getting rrdtool to install. I am using a raspberry Pi 2 and have tried the steps in your instructable with both the latest version of wheezy with the adafruit tools installed and also with the occidentalis v0.2 distro. In both cases I am getting the following error when executing the easy_install python-rrdtool command above:

(pi)pi@raspberrypi ~ $ easy_install python-rrdtool

Searching for python-rrdtool


/home/pi/local/lib/python2.7/site-packages/pkg_resources/ PEP440Warning: 'python (rrdtool-1.4.7)' is being parsed as a legacy, non PEP 440, version. You may find odd behavior and sort order. In particular it will be sorted as less than 0.0. It is recommend to migrate to PEP 440 compatible versions.


Best match: python-rrdtool 1.4.7


Processing python-rrdtool-1.4.7.tar.gz

Writing /tmp/easy_install-wPVPRm/python-rrdtool-1.4.7/setup.cfg

Running python-rrdtool-1.4.7/ -q bdist_egg --dist-dir /tmp/easy_install-wPVPRm/python-rrdtool-1.4.7/egg-dist-tmp-yrYogk

checking build system type... armv7l-unknown-linux-gnueabi

checking host system type... armv7l-unknown-linux-gnueabi

checking target system type... armv7l-unknown-linux-gnueabi

checking for gcc... gcc

checking for C compiler default output file name... a.out

checking whether the C compiler works... yes

checking whether we are cross compiling... no

checking for suffix of executables...

checking for suffix of object files... o

checking whether we are using the GNU C compiler... yes

checking whether gcc accepts -g... yes

checking for gcc option to accept ISO C89... none needed

checking how to run the C preprocessor... gcc -E

checking for grep that handles long lines and -e... /bin/grep

checking for egrep... /bin/grep -E

checking for ANSI C header files... yes

checking for sys/types.h... yes

checking for sys/stat.h... yes

checking for stdlib.h... yes

checking for string.h... yes

checking for memory.h... yes

checking for strings.h... yes

checking for inttypes.h... yes

checking for stdint.h... yes

checking for unistd.h... yes

checking minix/config.h usability... no

checking minix/config.h presence... no

checking for minix/config.h... no

checking whether it is safe to define __EXTENSIONS__... yes

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for a thread-safe mkdir -p... /bin/mkdir -p

checking for gawk... no

checking for mawk... mawk

checking whether make sets $(MAKE)... yes

checking for style of include used by make... GNU

checking dependency style of gcc... gcc3

checking whether to enable maintainer-specific portions of Makefiles... no

Audit Compilation Environment

checking how to run the C preprocessor... gcc -E

checking for gcc... (cached) gcc

checking whether we are using the GNU C compiler... (cached) yes

checking whether gcc accepts -g... (cached) yes

checking for gcc option to accept ISO C89... (cached) none needed

checking whether gcc and cc understand -c and -o together... yes

checking for a sed that does not truncate output... /bin/sed

checking for fgrep... /bin/grep -F

checking for ld used by gcc... /usr/bin/ld

checking if the linker (/usr/bin/ld) is GNU ld... yes

checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B

checking the name lister (/usr/bin/nm -B) interface... BSD nm

checking whether ln -s works... yes

checking the maximum length of command line arguments... 1572864

checking whether the shell understands some XSI constructs... yes

checking whether the shell understands "+="... yes

checking for /usr/bin/ld option to reload object files... -r

checking for objdump... objdump

checking how to recognize dependent libraries... pass_all

checking for ar... ar

checking for strip... strip

checking for ranlib... ranlib

checking command to parse /usr/bin/nm -B output from gcc object... ok

checking for dlfcn.h... yes

checking for objdir... .libs

checking if gcc supports -fno-rtti -fno-exceptions... no

checking for gcc option to produce PIC... -fPIC -DPIC

checking if gcc PIC flag -fPIC -DPIC works... yes

checking if gcc static flag -static works... yes

checking if gcc supports -c -o file.o... yes

checking if gcc supports -c -o file.o... (cached) yes

checking whether the gcc linker (/usr/bin/ld) supports shared libraries... yes

checking whether -lc should be explicitly linked in... no

checking dynamic linker characteristics... GNU/Linux

checking how to hardcode library paths into programs... immediate

checking whether stripping libraries is possible... yes

checking if libtool supports shared libraries... yes

checking whether to build shared libraries... yes

checking whether to build static libraries... yes

checking if gcc likes the -Werror flag... yes

checking if gcc likes the -fno-strict-aliasing flag... yes

checking if gcc likes the -Wall flag... yes

checking if gcc likes the -std=gnu99 flag... yes

checking if gcc likes the -pedantic flag... yes

checking if gcc likes the -Wundef flag... yes

checking if gcc likes the -Wshadow flag... yes

checking if gcc likes the -Wpointer-arith flag... yes

checking if gcc likes the -Wcast-align flag... yes

checking if gcc likes the -Wmissing-prototypes flag... yes

checking if gcc likes the -Wmissing-declarations flag... yes

checking if gcc likes the -Wnested-externs flag... yes

checking if gcc likes the -Winline flag... yes

checking if gcc likes the -Wold-style-definition flag... yes

checking if gcc likes the -W flag... yes

Checking for Header Files

checking for ANSI C header files... (cached) yes

checking for dirent.h that defines DIR... yes

checking for library containing opendir... none required

checking langinfo.h usability... yes

checking langinfo.h presence... yes

checking for langinfo.h... yes

checking for stdint.h... (cached) yes

checking for inttypes.h... (cached) yes

checking libgen.h usability... yes

checking libgen.h presence... yes

checking for libgen.h... yes

checking features.h usability... yes

checking features.h presence... yes

checking for features.h... yes

checking for sys/stat.h... (cached) yes

checking for sys/types.h... (cached) yes

checking fcntl.h usability... yes

checking fcntl.h presence... yes

checking for fcntl.h... yes

checking fp_class.h usability... no

checking fp_class.h presence... no

checking for fp_class.h... no

checking malloc.h usability... yes

checking malloc.h presence... yes

checking for malloc.h... yes

checking for unistd.h... (cached) yes

checking ieeefp.h usability... no

checking ieeefp.h presence... no

checking for ieeefp.h... no

checking math.h usability... yes

checking math.h presence... yes

checking for math.h... yes

checking sys/times.h usability... yes

checking sys/times.h presence... yes

checking for sys/times.h... yes

checking sys/param.h usability... yes

checking sys/param.h presence... yes

checking for sys/param.h... yes

checking sys/resource.h usability... yes

checking sys/resource.h presence... yes

checking for sys/resource.h... yes

checking signal.h usability... yes

checking signal.h presence... yes

checking for signal.h... yes

checking float.h usability... yes

checking float.h presence... yes

checking for float.h... yes

checking stdio.h usability... yes

checking stdio.h presence... yes

checking for stdio.h... yes

checking for stdlib.h... (cached) yes

checking errno.h usability... yes

checking errno.h presence... yes

checking for errno.h... yes

checking for string.h... (cached) yes

checking ctype.h usability... yes

checking ctype.h presence... yes

checking for ctype.h... yes

checking for an ANSI C-conforming const... yes

checking whether time.h and sys/time.h may both be included... yes

checking whether struct tm is in sys/time.h or time.h... time.h

Test Library Functions

checking for acos... no

checking for acos in -lm... yes

checking for strftime... yes

checking for vprintf... yes

checking for _doprnt... no

checking whether byte ordering is bigendian... no

checking for nl_langinfo... yes

checking for tzset... yes

checking for round... yes

checking for rint... yes

checking for fsync... yes

checking for mbstowcs... yes

checking for opendir... yes

checking for readdir... yes

checking for chdir... yes

checking for chroot... yes

checking for getuid... yes

checking for strerror... yes

checking for snprintf... yes

checking for vsnprintf... yes

checking for vasprintf... yes

checking for fpclass... no

checking for class... no

checking for fp_class... no

checking for isnan... yes

checking for memmove... yes

checking for strchr... yes

checking for mktime... yes

checking for getrusage... yes

checking for gettimeofday... yes

checking whether strerror_r is declared... yes

checking for strerror_r... yes

checking whether strerror_r returns char *... yes

Map/Fadvis/Madvise checking

checking for fdatasync... yes

checking for fsync... (cached) yes

checking for socket... yes

checking for getaddrinfo... yes

checking sys/mman.h usability... yes

checking sys/mman.h presence... yes

checking for sys/mman.h... yes

checking for stdlib.h... (cached) yes

checking for unistd.h... (cached) yes

checking for getpagesize... yes

checking for working mmap... yes

checking for mmap... yes

checking for munmap... yes

checking for msync... yes

checking whether madvise is declared... yes

checking for madvise... yes

checking whether posix_fadvise is declared... yes

checking for posix_fadvise... yes

Libintl Processing

checking whether NLS is requested... yes

checking for msgfmt... /usr/bin/msgfmt

checking for gmsgfmt... /usr/bin/msgfmt

checking for xgettext... /usr/bin/xgettext

checking for msgmerge... /usr/bin/msgmerge

checking for ld used by GCC... /usr/bin/ld

checking if the linker (/usr/bin/ld) is GNU ld... yes

checking for shared library run path origin... done

checking for CFPreferencesCopyAppValue... no

checking for CFLocaleCopyCurrent... no

checking for GNU gettext in libc... yes

checking whether to use NLS... yes

checking where the gettext function comes from... libc

IEEE Math Checks

checking for fpclassify... no

checking for fpclassify with <math.h>... yes

checking for isinf... yes

checking whether isfinite is broken... no

checking if IEEE math works out of the box... yes

Resolve Portability Issues

checking tm_gmtoff in struct tm... yes

checking __tm_gmtoff in struct tm... no

checking if msync with MS_ASYNC updates the files mtime... yes

checking for _NL_TIME_WEEK_1STDAY... no

checking for nl_langinfo(_NL_TIME_WEEK_1STDAY) with langinfo.h... yes

checking for opterr... yes

checking for getopt_long... yes

checking if realloc can deal with NULL... yes

checking if ctime_r need special care to act posixly correct... no

checking for the pthreads library -lpthreads... no

checking whether pthreads work without any flags... no

checking whether pthreads work with -Kthread... no

checking whether pthreads work with -kthread... no

checking for the pthreads library -llthread... no

checking whether pthreads work with -pthread... yes

checking for joinable pthread attribute... PTHREAD_CREATE_JOINABLE

checking if more special flags are required for pthreads... no

checking for cc_r... gcc

checking do we need malloc/malloc.h... nope, works out of the box

checking the type of time_t... checking size of time_t... 4

time_t is 32 bit

Find 3rd-Party Libraries

checking dbi/dbi.h usability... no

checking dbi/dbi.h presence... no

checking for dbi/dbi.h... no

checking tcpd.h usability... no

checking tcpd.h presence... no

checking for tcpd.h... no

checking for cairo_font_options_create in -lcairo... yes

checking cairo.h usability... no

checking cairo.h presence... no

checking for cairo.h... no

checking for pkg-config... pkg-config

checking for cairo_font_options_create in -lcairo... yes

checking cairo.h usability... yes

checking cairo.h presence... yes

checking for cairo.h... yes

checking for cairo_svg_surface_create in -lcairo... yes

checking cairo-svg.h usability... yes

checking cairo-svg.h presence... yes

checking for cairo-svg.h... yes

checking for cairo_pdf_surface_create in -lcairo... yes

checking cairo-pdf.h usability... yes

checking cairo-pdf.h presence... yes

checking for cairo-pdf.h... yes

checking for cairo_ps_surface_create in -lcairo... yes

checking cairo-ps.h usability... yes

checking cairo-ps.h presence... yes

checking for cairo-ps.h... yes

checking for pango_cairo_context_set_font_options in -lpangocairo-1.0... yes

checking pango/pango.h usability... no

checking pango/pango.h presence... no

checking for pango/pango.h... no

checking for pkg-config... (cached) pkg-config

checking for pango_cairo_context_set_font_options in -lpangocairo-1.0... yes

checking pango/pango.h usability... yes

checking pango/pango.h presence... yes

checking for pango/pango.h... yes

checking for glib_check_version in -lglib-2.0... yes

checking glib.h usability... yes

checking glib.h presence... yes

checking for glib.h... yes

checking for xmlParseFile in -lxml2... yes

checking libxml/parser.h usability... yes

checking libxml/parser.h presence... yes

checking for libxml/parser.h... yes

Prep for Building Language Bindings

checking for perl... /usr/bin/perl

checking for pod2man... /usr/bin/pod2man

checking for pod2html... /usr/bin/pod2html

checking for the perl version you are running... 5.14.2

checking for the C compiler perl wants to use to build its modules... cc

checking for cc... /usr/bin/cc

checking Perl Modules to build... perl_piped perl_shared

checking for ruby... no

checking if ruby modules can be built... No .. Ruby not found or disabled

checking for lua... /usr/bin/lua

checking for lua >= 5.0... 5.1 found

checking lua51/lua.h usability... no

checking lua51/lua.h presence... no

checking for lua51/lua.h... no

checking lua5.1/lua.h usability... no

checking lua5.1/lua.h presence... no

checking for lua5.1/lua.h... no

checking lua.h usability... no

checking lua.h presence... no

checking for lua.h... no

checking for library containing lua_call... no

Lua headers found but not the libraries! Please reinstall the dev packages for Lua 5.1

checking for in /usr/lib... no

checking for in /usr/lib64... no

checking for in /usr/local/lib... no

checking for in /usr/lib/tcl8.4... no

checking for in /usr/lib/tcl8.3... no

configure: WARNING: not found - Tcl interface will not be built

checking for a Python interpreter with version >= 2.3... python

checking for python... /home/pi/bin/python

checking for python version... 2.7

checking for python platform... linux2

checking for python script directory... ${prefix}/lib/python2.7/site-packages

checking for python extension module directory... ${exec_prefix}/lib/python2.7/site-packages

checking for headers required to compile python extensions... found

checking for gnroff... no

checking for nroff... /usr/bin/nroff

checking for groff... /usr/bin/groff

Apply Configuration Information

configure: creating ./config.status

config.status: creating examples/

config.status: creating examples/

config.status: creating examples/

config.status: creating examples/

config.status: creating examples/

config.status: creating examples/

config.status: creating examples/

config.status: creating examples/Makefile

config.status: creating examples/rrdcached/Makefile

config.status: creating doc/Makefile

config.status: creating po/

config.status: creating src/Makefile

config.status: creating src/

config.status: creating src/librrd.pc

config.status: creating bindings/Makefile

config.status: creating bindings/tcl/Makefile

config.status: creating bindings/tcl/ifOctets.tcl

config.status: creating Makefile

config.status: creating bindings/lua/Makefile

config.status: creating rrd_config.h

config.status: executing depfiles commands

config.status: executing libtool commands

config.status: executing po-directories commands

config.status: creating po/POTFILES

config.status: creating po/Makefile

config.status: executing default commands

checking in... and out again

ordering CD from .... just kidding ;-)


Config is DONE!

With MMAP IO: yes

Build rrd_getopt: no

Build rrd_graph: yes

Static programs: no

Perl Modules: perl_piped perl_shared

Perl Binary: /usr/bin/perl

Perl Version: 5.14.2

Perl Options: PREFIX=/opt/rrdtool-1.4.7 LIB=/opt/rrdtool-1.4.7/lib/perl/5.14.2

Ruby Modules:

Ruby Binary: no

Ruby Options: sitedir=/opt/rrdtool-1.4.7/lib/ruby

Build Lua Bindings: no

Build Tcl Bindings: no

Build Python Bindings: yes

Build rrdcgi: yes

Build librrd MT: yes

Use gettext: yes

With libDBI: no

With libwrap: no

Libraries: -lxml2 -lglib-2.0 -lcairo -lcairo -lcairo -lm -lcairo -lpng12 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0

Type 'make' to compile the software and use 'make install' to

install everything to: /opt/rrdtool-1.4.7.

... that wishlist is NO JOKE. If you find RRDtool useful

make me happy. Go to and

place an order.

-- Tobi Oetiker <>


In file included from /usr/include/python2.7/Python.h:8:0,

from rrdtool-1.4.7/bindings/python/rrdtoolmodule.c:44:

/usr/include/python2.7/pyconfig.h:1161:0: warning: "_POSIX_C_SOURCE" redefined [enabled by default]

/usr/include/features.h:163:0: note: this is the location of the previous definition

/usr/include/python2.7/pyconfig.h:1183:0: warning: "_XOPEN_SOURCE" redefined [enabled by default]

/usr/include/features.h:165:0: note: this is the location of the previous definition

/usr/bin/ld: cannot find -lrrd

collect2: ld returned 1 exit status

error: Setup script exited with error: command 'gcc' failed with exit status 1

(pi)pi@raspberrypi ~ $


I have tried loading the apt-get install libpango1.0-dev libxml2-dev as noted in the comments, but it did not help.

Any help in what I am doing wrong and how to fix would be greatly appreciated


bbustin (author)kbarkhau12015-03-02

Hi Keith,

Can you try running the following and see if it helps?

sudo apt-get install -y build-essential python-dev python-setuptools libcairo2-dev libpango1.0-dev libxml2-dev rrdtool librrd-dev

16ThGoD (author)2015-01-28

sir what is climaduino sketch?
in step 4?

BryanS5 (author)2014-11-10

Bbustin I have fixed some code up to work on arduino mega

I was also going to add code for a heater relay instead of JUST AC

at least how I read it is that you only have AC toggle otherwise I would assume you need 2x relay outputs and also a setup for heat rather than Just cold :D Some of us live in a cold climate and want efficient heating rather than cooling :D or actually I planned on both

BryanS5 (author)BryanS52014-11-10

I also updated code to work with RGB lcd from adafruit and give feedback via colors based on wether the climaduino was heating or cooling

Now to figure out how to get code inserted for it to my heating / cooling using a 2nd relay :D

LeeJ1 (author)BryanS52014-12-12

Could you share the code for heater only? Or give me a hint on what to change? I am going to use this to run a pellet stove in Oregon, so I won't need any of the cooling function

BryanS5 (author)2014-11-12

apt-get install libpango1.0-dev libxml2-dev
For people getting problems with python-rrdtool setup

trane.depriest (author)2014-10-15

I would love to use this to control a Trane Electric Furnace and AC Compressor combo. Any thoughts or advice before I dive in?

duncangallimore (author)2014-07-10

This looks brilliant - exactly what I want to do. The only addition I need is hot water control. Do you think the arduino is capable of controlling that as well?

Thanks, Duncan

afalzon (author)2013-12-26

i am stuck @ step six - setup the controller unit.

i Run:
pi@raspberrypi ~/climaduino $ python syncdb
And Get:

Traceback (most recent call last):
File "", line 8, in
from import execute_from_command_line
ImportError: No module named

any thoughts?

afalzon (author)afalzon2013-12-26

I just realised that django was not installing it says i don't have enough space. :(

I will get myself another SD card and try again.

bbustin (author)afalzon2014-01-03

Hi afalzon. Let us know how it works when you get the bigger SD card. Can't wait to have another person running this so we can work together to improve it.

afalzon (author)bbustin2014-01-03

Hi bbustin,
I have now tried a 16 gig card and im getting the same issue. any thoughts?

bbustin (author)afalzon2014-01-07

Hi afalzon, try running:
sudo raspi-config

then choose to auto-expand the installation.

If this works, let me know and I'll ad it into the steps to make sure no one else has the same problem.

afalzon (author)bbustin2014-01-14

hi bbustin, i had already done that.

i made a new temp folder on my main partition and that fixed that issue. i still cant get it to work though.

i have a feeling the versions of everything have changed since these instructions were written and therefore some things may need different steps

bbustin (author)afalzon2014-06-20

I found the following steps here Maybe they would help?

mkdir tmp
export TMPDIR=/home/pi/tmp

(I know this response is very late, but I want to put it here to help others as well.)

daniel2078 (author)2014-06-17

I have a quick question, I followed all the steps, the Thermostat with display work fine, I'm able to see readings through the admin on the PI but if I try run the page to view readings I'm getting the following error

'Manager' object has no attribute last()'

I'm not using any virtualenv since I plan to have this eventually running on its own.

Any suggestions ??

Thanks in advance

bbustin (author)daniel20782014-06-17

Hi. I think this is because there are no readings in the database. Try going to http://climaduino.local/admin/settings/reading/. Then click add reading and add some bogus values. The trick will be to see if this updates with the proper readings later.

I'm in the process of making some major changes. It will work with multiple zones over a WiFi network using the Arduino Yún ( The newer code will be better about creating default database entries so there is less of a chance the error you are getting will happen.

daniel2078 (author)bbustin2014-06-17

I tried your suggestion but got same error, I'll try it with the virtualenv instead, perhaps thats the way it works, I'll keep checking if you gonna post a new version, cool project BTW !!

bbustin (author)daniel20782014-06-18

Thanks! Maybe it is because it is missing a setting? If so, try doing the same same thing here:


Just create a setting and see if that helps. That page you are going to is pulling data from both settings and readings. Maybe the code drops the ball if one is missing...