Recently I decided I needed a better way to monitor the temperature and humidity in various parts of my house. The main reason was the thermostat for the house is located in a hallway that is more closed in than anything. So while the thermostat may show that it is 75 degrees in the house the rest of the house my only have been 70 degrees or less. After the winter we have had, I also needed a good way to monitor the humidity in the house. The only was I was able to do it was with a little Oregon Scientific thermometer I bought at Target. But the problem with this was it was only for one room, didn’t seem to be very accurate and I had no way of logging the values over a time period.
In comes the Raspberry Pi, along with a DHT22 temperature/humidity sensor and Splunk, I can now monitor, record and graph in realtime the temp and relative humidity in various parts of the house (and the outside).
What I got was this:
- 3 x Raspberry Pi 2 Canakits from Amazon.com
- 5 x DHT22 Digital Sensors from Amazon.com
- 1 x DHT11 Digital Sensor from Amazon.com
Now the DHT11, was what I purchased in the first round along with just one of the Raspberry Pi’s. It is not as sensitive as the DHT22’s, but since it was just for the original test it was ok for what I needed. The second round I bought the other two Raspberry Pi’s and the 5 DHT22 sensors.
What I intend to do is use some of the pre-existing CAT5 runs through the house to wire the DHT22’s in to and then have the other end of the CAT5 runs connect in to a Raspberry Pi in the Garage. This way I can do multiple sensors on one device versus having a device in every room.
Some of the benefits of getting the Raspberry Pi Canakits I got are:
- A clear case is included with the correct cut outs for the raspberry pi.
- A USB wifi dongle is included, and the drivers are pre-loaded in the OS.
- It comes with a pre-loaded 8GB microSD card.
- It comes with a miniature breadboard with a 40 pin cable and breakout board that plugs perfectly in to the breadboard.
- Comes with various resistors and led’s and pushbuttons.
- Has a HDMI cable included, which made it easy to hook in to my monitor
- Various jumper cables for the breadboard
Overall, I would say that the total time to get a base monitor up and running is a few minutes. But this is based of me already having Splunk, the network, dhcp, dns, etc already set up. So I am going to detail the basic steps I used to get it up and running:
- Unbox the raspberry pi, place the heatsinks on the two “large” chips on the top side, and then place it in the clear case.
- Hook up the HDMI, keyboard, mouse, and WIFI dongle.
- Insert to the microSD card
- Hook up the USB power cable and watch it boot NOOBS.
- Once it is booted, select the Raspbian to install. This probably takes the longest of all the steps to do, as it is expanding the operating system on to the microSD card.
- Once this is done, it will reboot and bring up a text based config. I set the hostname, enable ssh, set the timezone and finally set the locale.
- At the login prompt, you can log in with the userid pi and the password of raspberry.
- Next to set up the network, if you are using the ethernet, then it should already have an IP address if you have DHCP running on your network. If you are using the WiFi dongle, then edit the /etc/wpa_supplicant/wpa_supplicant.conf �file as root and put the following in it:
network={ ssid="YOURWIRELESSSSID" psk="YOURWIRELESSPASS" }
Where YOURWIRELESSSSID is the SSID of the AP you want to connect to and the PSK value is the password for that SSID/AP. (If you are doing MAC�filtering, you can get the MAC address by running ifconfig -a as root and look at the wlan0.
- Once you save the file in the item above, issue the following commands:
wpa_action wlan0 stop ifup wlan0 ifconfig -a
- By now if everything is working correctly you should have a IP address and network connectivity. You can use wpa_cli status to verify the network connectivity.
- Now that the network is up and running I needed to download some software:
sudo su - apt-get update apt-get upgrade apt-get install python-dev git clone git://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.42.tar.gz
- Now that we have the software downloaded it is time to do some little compiling:
tar -zxvf bcm2835-1.42.tar.gz cd bcm2835-1.42 ./configure make make install
That should install the driver for the bcm2835 chip.
- Next we need to do the python code setup:
cd Adafruit-Raspberry-Pi-Python-Code cd Adafruit_DHT_Driver_Python python ./setup.py install
- At this point the code should be done. You can now power down (shutdown -h now) the Raspberry Pi and hook in the DHT22 sensors. (Make sure to disconnect the power before connecting the 40 pin cable.
- The way I hooked the sensor in for testing was to connect the 40 pin cable to the Raspberry Pi and the other in to the breakout board which was attached to the mini breadboard. Once that was done I hooked a jumper from 3.3 V to the first pin on the DHT22. Then placed a 10K resistor between another 3.3V connection and the second pin. In addition a jumper was ran from GPIO4 to the second pin of the DHT22. The third pin is left unconnected and the forth pin is connected to Ground. I will post a picture later.
- Once everything is connected, power the Pi back up and log in and switch to the root account.
- Next to see if everything is working change in to the Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver_Python directory.
- Then run python ./Adafruit_DHT.py 22 4. The 22 is the type of the sensor, so if you are using a DHT11 use 11, if a DHT22 use the 22. The number 4 is the GPIO port that the sensors data pin is connected to. Once you run it you should see something like this:
root@rpi2:~/Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver_Python# python ./Adafruit_DHT.py 22 4 using pin #4 Temp = 20.2999992371 *C, Hum = 40.4000015259 %
- In the above, we can see that the Temp is 20.29C and the Humidity is 40.40%. If you want the Temp outputted as Fahrenheit, like I did, make a copy of the Adafruit_DHT.py file (for a backup) and then add a new line at line 37 with the following:
tf = (( t * 9 ) / 5.0 ) +32;
Then on line 39, you will want to change the *C to *F, and then in the format(t,h) you will want to change the t to a tf, so the line would look like this now:
print("Temp = {0} *F, Hum = {1} %".format(tf,h))
- Now if you re-run, it will look like this:
root@rpi2:~/Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver_Python# python Adafruit_DHT-f.py 22 4 using pin #4 Temp = 68.1800006866 *F, Hum = 40.0 %
- Now that we have the data being output in the format we like, the only thing left was to log it. What I did was create a shell script that is run by cron every minute (* * * * *) and it outputs the values to a log file called /var/log/temp+humid.log. This log file is then pulled in by Splunk for graphing and other fun stuff that will be another post.
- The script I wrote looks like this:
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin export PATH RESULTS="`python /root/TempLogger/Adafruit_DHT-f.py 22 4 | grep Temp `" TEMP="`echo ${RESULTS} | awk '{print $3}'`" HUMID="`echo ${RESULTS} | awk '{print $7}'`" DATE="`date \"+%Y-%m-%d %H:%M:%S\"`" echo "${DATE} ROOM=FamilyRoom TEMP=${TEMP} RH=${HUMID}" >> /var/log/temp+humid.log
- The output that gets logged looks like this:
2015-03-17 21:44:02 ROOM=FamilyRoom TEMP=68.1800006866 RH=39.7000007629
Some times, and I haven’t figured out why yet, it will log null values for the TEMP and RH. I need to add some more checking in to the script to make it more robust, but for now it is working.
In the next post I will cover what I do with the data in Splunk, and how I get the outside temps from the local airport and add them to Splunk as well.