IoT Temperature & Humidity to Initial State Using a Raspberry Pi & DHT22
I have a Raspberry Pi 3 running OpenHab located on my desk next to my iMac. Since I spend most of day here, I thought it would be good to get some Temperature & Humidity data reading. Right now I am sending that data to Initial State as they have some really cool dashboards! I also plan to send this data to OpenHab but havent figured that out yet(I will update this post when I do). In this tutorial, I will go over the steps so you can do the same or similar. I haven’t tested but assume a DHT11 would work as well.
*Disclaimer: Most if not all links on this page will be Affiliate Links. This helps pay for things like website hosting and more bits & gadgets to write about.
DHT22/AM2302 Digital Temperature and Humidity Measurement Sensor
These come in a few versions, some bare with four connectors and some mounted to a board with only 2 connection (VCC, DATA & Ground). If you’re using the bare version, you’ll need to use a resistor. It seems like most of the mounted AM2302 versions have the resistor built in. These AM2302 versions are a little pricey on Amazon at $9.99 a piece, but if you’re “Prime Spoiled” and need it in two days, that’s the price you pay! I was able to find a pack of 4 on Ebay for about $20 shipped.
Initial State
Initial State allows you to send data from various devices such as Raspberry Pis and ESP8266s to a beautifully visualized dashboard viewable in a web browser. Their free account is fairly generous and allows 25,000 events per month, but you can only view the last 24 hours of data. Fork over $5/month and you’ll remove those limits. The Pro account at $25/month adds Email/SMS triggers.
To get started with Initial State on my Raspberry Pi 3, I followed their post on Github “Create a System Health Dashboard for your Raspberry Pi”. If you get an error in Step 2 when installing psutil like I did, you’ll need to run:
$ sudo apt-get install gcc python-dev
$ sudo pip install psutil
Once you get that up and running, hopefully you won’t find that your Pi has a memory leak like I did!
Now they you have Initial State up and running, it’s time to get the DHT22/AM2302 connected to your Raspberry Pi.
The DHT22/2302 has 3 connections: 3V+, Data Out, and Ground
- Connect 3V+ to Pin 1 on my RPi
- Connect Data Out to GPIO 4(Pin 7)
- Connect Ground to Pin 6 GND
Now that you have it wired it’s time to install some more code!
I followed the Adafruit install instruction here: https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/software-install-updated
pi@OpenHAB:~ $ pwd /home/pi pi@OpenHAB:~ $ git clone https://github.com/adafruit/Adafruit_Python_DHT.git Cloning into 'Adafruit_Python_DHT'... remote: Counting objects: 223, done. remote: Total 223 (delta 0), reused 0 (delta 0), pack-reused 223 Receiving objects: 100% (223/223), 71.72 KiB | 0 bytes/s, done. Resolving deltas: 100% (125/125), done. Checking connectivity... done. pi@OpenHAB:~ $ cd Adafruit_Python_DHT/ pi@OpenHAB:~/Adafruit_Python_DHT $ sudo python setup.py install running install running bdist_egg running egg_info creating Adafruit_DHT.egg-info writing Adafruit_DHT.egg-info/PKG-INFO writing top-level names to Adafruit_DHT.egg-info/top_level.txt writing dependency_links to Adafruit_DHT.egg-info/dependency_links.txt writing manifest file 'Adafruit_DHT.egg-info/SOURCES.txt' reading manifest file 'Adafruit_DHT.egg-info/SOURCES.txt' writing manifest file 'Adafruit_DHT.egg-info/SOURCES.txt' installing library code to build/bdist.linux-armv7l/egg running install_lib running build_py creating build creating build/lib.linux-armv7l-2.7 creating build/lib.linux-armv7l-2.7/Adafruit_DHT copying Adafruit_DHT/__init__.py -> build/lib.linux-armv7l-2.7/Adafruit_DHT copying Adafruit_DHT/Test.py -> build/lib.linux-armv7l-2.7/Adafruit_DHT copying Adafruit_DHT/Raspberry_Pi.py -> build/lib.linux-armv7l-2.7/Adafruit_DHT copying Adafruit_DHT/Raspberry_Pi_2.py -> build/lib.linux-armv7l-2.7/Adafruit_DHT copying Adafruit_DHT/Beaglebone_Black.py -> build/lib.linux-armv7l-2.7/Adafruit_DHT copying Adafruit_DHT/platform_detect.py -> build/lib.linux-armv7l-2.7/Adafruit_DHT copying Adafruit_DHT/common.py -> build/lib.linux-armv7l-2.7/Adafruit_DHT running build_ext building 'Adafruit_DHT.Raspberry_Pi_2_Driver' extension creating build/temp.linux-armv7l-2.7 creating build/temp.linux-armv7l-2.7/source creating build/temp.linux-armv7l-2.7/source/Raspberry_Pi_2 arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c source/_Raspberry_Pi_2_Driver.c -o build/temp.linux-armv7l-2.7/source/_Raspberry_Pi_2_Driver.o -std=gnu99 arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c source/common_dht_read.c -o build/temp.linux-armv7l-2.7/source/common_dht_read.o -std=gnu99 arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c source/Raspberry_Pi_2/pi_2_dht_read.c -o build/temp.linux-armv7l-2.7/source/Raspberry_Pi_2/pi_2_dht_read.o -std=gnu99 arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c source/Raspberry_Pi_2/pi_2_mmio.c -o build/temp.linux-armv7l-2.7/source/Raspberry_Pi_2/pi_2_mmio.o -std=gnu99 arm-linux-gnueabihf-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wl,-z,relro -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security build/temp.linux-armv7l-2.7/source/_Raspberry_Pi_2_Driver.o build/temp.linux-armv7l-2.7/source/common_dht_read.o build/temp.linux-armv7l-2.7/source/Raspberry_Pi_2/pi_2_dht_read.o build/temp.linux-armv7l-2.7/source/Raspberry_Pi_2/pi_2_mmio.o -lrt -o build/lib.linux-armv7l-2.7/Adafruit_DHT/Raspberry_Pi_2_Driver.so creating build/bdist.linux-armv7l creating build/bdist.linux-armv7l/egg creating build/bdist.linux-armv7l/egg/Adafruit_DHT copying build/lib.linux-armv7l-2.7/Adafruit_DHT/__init__.py -> build/bdist.linux-armv7l/egg/Adafruit_DHT copying build/lib.linux-armv7l-2.7/Adafruit_DHT/Test.py -> build/bdist.linux-armv7l/egg/Adafruit_DHT copying build/lib.linux-armv7l-2.7/Adafruit_DHT/Raspberry_Pi_2_Driver.so -> build/bdist.linux-armv7l/egg/Adafruit_DHT copying build/lib.linux-armv7l-2.7/Adafruit_DHT/Raspberry_Pi.py -> build/bdist.linux-armv7l/egg/Adafruit_DHT copying build/lib.linux-armv7l-2.7/Adafruit_DHT/Raspberry_Pi_2.py -> build/bdist.linux-armv7l/egg/Adafruit_DHT copying build/lib.linux-armv7l-2.7/Adafruit_DHT/Beaglebone_Black.py -> build/bdist.linux-armv7l/egg/Adafruit_DHT copying build/lib.linux-armv7l-2.7/Adafruit_DHT/platform_detect.py -> build/bdist.linux-armv7l/egg/Adafruit_DHT copying build/lib.linux-armv7l-2.7/Adafruit_DHT/common.py -> build/bdist.linux-armv7l/egg/Adafruit_DHT byte-compiling build/bdist.linux-armv7l/egg/Adafruit_DHT/__init__.py to __init__.pyc byte-compiling build/bdist.linux-armv7l/egg/Adafruit_DHT/Test.py to Test.pyc byte-compiling build/bdist.linux-armv7l/egg/Adafruit_DHT/Raspberry_Pi.py to Raspberry_Pi.pyc byte-compiling build/bdist.linux-armv7l/egg/Adafruit_DHT/Raspberry_Pi_2.py to Raspberry_Pi_2.pyc byte-compiling build/bdist.linux-armv7l/egg/Adafruit_DHT/Beaglebone_Black.py to Beaglebone_Black.pyc byte-compiling build/bdist.linux-armv7l/egg/Adafruit_DHT/platform_detect.py to platform_detect.pyc byte-compiling build/bdist.linux-armv7l/egg/Adafruit_DHT/common.py to common.pyc creating stub loader for Adafruit_DHT/Raspberry_Pi_2_Driver.so byte-compiling build/bdist.linux-armv7l/egg/Adafruit_DHT/Raspberry_Pi_2_Driver.py to Raspberry_Pi_2_Driver.pyc creating build/bdist.linux-armv7l/egg/EGG-INFO copying Adafruit_DHT.egg-info/PKG-INFO -> build/bdist.linux-armv7l/egg/EGG-INFO copying Adafruit_DHT.egg-info/SOURCES.txt -> build/bdist.linux-armv7l/egg/EGG-INFO copying Adafruit_DHT.egg-info/dependency_links.txt -> build/bdist.linux-armv7l/egg/EGG-INFO copying Adafruit_DHT.egg-info/top_level.txt -> build/bdist.linux-armv7l/egg/EGG-INFO writing build/bdist.linux-armv7l/egg/EGG-INFO/native_libs.txt zip_safe flag not set; analyzing archive contents... creating dist creating 'dist/Adafruit_DHT-1.3.0-py2.7-linux-armv7l.egg' and adding 'build/bdist.linux-armv7l/egg' to it removing 'build/bdist.linux-armv7l/egg' (and everything under it) Processing Adafruit_DHT-1.3.0-py2.7-linux-armv7l.egg Copying Adafruit_DHT-1.3.0-py2.7-linux-armv7l.egg to /usr/local/lib/python2.7/dist-packages Adding Adafruit-DHT 1.3.0 to easy-install.pth file . Installed /usr/local/lib/python2.7/dist-packages/Adafruit_DHT-1.3.0-py2.7-linux-armv7l.egg Processing dependencies for Adafruit-DHT==1.3.0 Finished processing dependencies for Adafruit-DHT==1.3.0 pi@OpenHAB:~/Adafruit_Python_DHT $ ls Adafruit_DHT Adafruit_DHT.egg-info build dist examples ez_setup.py ez_setup.pyc LICENSE README.md setup.py source pi@OpenHAB:~/Adafruit_Python_DHT $ cd examples pi@OpenHAB:~/Adafruit_Python_DHT/examples $ ls -l total 16 -rwxr-xr-x 1 pi pi 2340 Aug 1 18:36 AdafruitDHT.py -rwxr-xr-x 1 pi pi 5715 Aug 1 18:36 google_spreadsheet.py -rw-r--r-- 1 pi pi 2035 Aug 1 18:36 simpletest.py pi@OpenHAB:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 22 4 Temp=27.8* Humidity=50.7%
Great Success! Don’t worry if you need Fahrenheit we will convert it later.
Sending Temperature and Humidity Readings to Initial State
For this basically took some code from the Grove Pi DHT22 Initial State Git and combines it with the code used from psutil that we did previously to send Raspberry Pi system health to Initial State and came up with the following. (Keep in mind I really don’t know much Python and any improvements/recommendations to the code are welcome!)
import sys import Adafruit_DHT import os import time from ISStreamer.Streamer import Streamer # --------- User Settings --------- # The DHT_SENSOR_TYPE below may need to be changed depending on which DHT sensor you have: # 0 - DHT11 - blue one - comes with the GrovePi+ Starter Kit # 1 - DHT22 - white one, aka DHT Pro or AM2302 # 2 - DHT21 - black one, aka AM2301 DHT_SENSOR_TYPE = 22 # Connect the DHT sensor to one of the digital pins (i.e. 2, 3, 4, 7, or 8) DHT_SENSOR_PIN = 4 # Initial State settings BUCKET_NAME = ":partly_sunny: Indoor Weather" BUCKET_KEY = "dht-rpi" ACCESS_KEY = "ENTER YOUR INITIAL STATE KEY HERE" # Set the time between sensor reads MINUTES_BETWEEN_READS = 1 CONVERT_TO_FAHRENHEIT = True # --------------------------------- def main(): streamer = Streamer(bucket_name=BUCKET_NAME, bucket_key=BUCKET_KEY, access_key=ACCESS_KEY) while True: [hum1,temp_c1] = Adafruit_DHT.read_retry(DHT_SENSOR_TYPE,DHT_SENSOR_PIN) #if isFloat(temp_c1): temp_c = float(round(temp_c1,2)) if (CONVERT_TO_FAHRENHEIT): temp_f = temp_c * 9.0 / 5.0 + 32.0 # print("Temperature(F) = ", temp_f) streamer.log("Temperature(F)",temp_f) else: # print("Temperature(C) = ", temp_c) streamer.log("Temperature(C)",temp_c) #if ((isFloat(hum1)) and (hum1 >= 0)): hum = float(round(hum1,1)) # print("Humidity(%) = ", hum) streamer.log(":sweat_drops: Humidity(%)",hum) streamer.flush() #except IOError: # print ("Error") time.sleep(60*MINUTES_BETWEEN_READS) if __name__ == '__main__': main()
Create a file and copy the code into it:
nano rpi-temp.py
Run the code
sudo python /home/pi/pihealth/rpi-temp2.py
To run the code and not have it cancel if your SSH session terminates:
chmod +x rpi-temp.py nohup /home/pi/pihealth/rpi-temp2.py &
Wait a minute or so and go check your Initial State Dashboard:
I am using a standalone “Comfortmeter” to make some comparisons. Temperature seems to be pretty much the same, but humidity is off. That said my Nest Controller in the next room says 53% humidity, so I think the DHT22/AM2302 is fairly accurate.
Next I’ll figure out to also send this data to OpenHab. I’ll update this post when I do!
Reminder, some links in the post might be affiliate links, so I’ll make some coffee/beer/gadget money if you buy anything. You get it at the normal price, though!
[geoip-content region=”TX, CA.”] Content just for everyone in Texas and California [/geoip-content]
Pingback: Send humidity & temperature sensor readings to Initial State from a Raspberry Pi – Raspberry Pi Pod
Pingback: IdO température et d’humidité à l’état initial L’utilisation d’un Raspberry Pi & DHT22 | RoboTechno