Raspberry Pi 搭配Cacti監控溫濕度

cacti-dht22-raspberry-pi-temperature-humidity
以Cacti紀錄由DHT22取得的濕度、溫度
由數據可知,夏天真的來了…又熱又悶…
上一篇文章提到如何將DHT22/AM2302溫濕度感測器接到Raspberry Pi、並取得溫度、濕度。不過,如果僅是單純的取得這兩個天氣環境數據,意義似乎不大~如能長期觀測,才有參考價值。

所以,想藉由平常習慣用的網管軟體-Cacti來搭配,做長期的氣象資料記錄。

先說明我的環境,我只有一片Raspberry Pi,所以Cacti和DHT22都是在同一片Raspberry Pi上。

先說明要完成使用Cacti搭配DHT22紀錄溫度、濕度的步驟
  1. 安裝Cacti
  2. 撰寫產生溫度、濕度資料的python程式
  3. 設定排程定期取得溫度、濕度
  4. 讓Cacti取得上述資料的shell script
  5. 設定Cacti以下template
    1. Data Input Methods
    2. Data Templates
    3. Graph Templates
註:如果使用我的template,就只需要處理Data Templates、與Graph Templates

步驟一:安裝Cacti

安裝過程中,會詢問用於cacti登入的密碼
#安裝cacti
sudo apt-get update
sudo apt-get install cacti
不過,這樣方式所安裝的Cacti版本非常舊。我的是 0.8.8h+ds1-10,但當時Cacti官網上卻已經出到 1.1.38 。

步驟二:撰寫產生溫度、濕度資料的python程式

假設程式放於 /pi/DHT22.py,以下為程式內容。程式中直接設定sensor為DHT22、並讀取GPIO#4。為何這樣設定?請參考上一篇文章

這裡產生的資料,後續是藉由Cacti Data Input Methods方式取得。因此輸出格式,必須符合Cacti Data Input Methods的規範。格式如下…
KEY1:VAL1 KEY2:VAL2
#!/usr/bin/python
import Adafruit_DHT
sensor = Adafruit_DHT.DHT22
pin = 4
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

if humidity is not None and temperature is not None:
    print('temp:{0:0.1f} humidity:{1:0.1f}'.format(temperature, humidity))

步驟三:設定排程定期取得溫度、濕度

一般來說,Cati是可以直接呼叫shell script取得所需數值。一開始,我也是採用此方式直接呼叫 /pi/DHT22.py。但……卻一直出現『CMDPHP: Poller[0] Host[1] DS[1] WARNING: Result from CMD not valid. Partial Result: U』的錯誤。讓我花了不少時間尋找問題…卻找不出原因…

直到,看到官方AM2302 (wired DHT22) temperature-humidity sensor ID: 393 - $15.00 : Adafruit Industries, Unique & fun DIY electronics and kits產品介紹中提到,讀取數據時間約2秒…才讓我恍然大悟。可能是等待執行結果的時間超過Cacti的允許時間,讓Cacti覺得無法正常取得資料。

因此,我只好改成設定排程先取得溫度、濕度的數據並寫入temp檔案,之後再讀取的方案。如此,終於讓Cacti正常取得資料。

對了,因為Cacti是每五分鐘來抓資料,因此我的排程就故意往前一分鐘,設定為每小時的4分、9分取溫度、濕度.....
#設定排程
sudo crontab -e
#增加以下設定
4,9,14,19,24,29,34,39,44,49,54,59 * * * * /pi/DHT22.sh
shell script(/pi/DHT22.sh)的內容如下…
#將溫度、濕度數據寫入temp檔案
/pi/DHT22.py > /tmp/DHT22.dat
註:找問題時,使用 php -q cmd.php 看Cacti執行結果,是可以正常取得濕度、溫度數據,並不會發生錯誤

步驟四:讓Cacti取得上述資料的shell script

在上一步驟已經可以產生數據寫入temp檔案,在這步驟就是將temp檔案的內容丟給Cacti。因此,我做了一個shell script,檔案放在 /usr/share/cacti/site/scripts/DHT22.sh
註:我是使用Raspbian Stretch Lite,Cacti被安裝於/usr/share/cacti/

shell script內容如下…
#讀取temp檔案內容
cat /tmp/DHT22.dat

步驟五:設定Cacti,讓Cacti看懂資料格式

我採用shell script方式讓Cacti讀取資料,因此要設定Data Input Methods。為了簡化設定,以下提供Data Templates、Graph Templates。將Templates匯入Cacti後即可設定、使用~
  1. cacti_data_template_dht22.xml
  2. cacti_graph_template_dht22.xml

如此,就可以在Cacti產生如下圖,來長期監控氣象趨勢了~雖然我的Raspberry Pi放在室內陰暗處,但在這五月就已經30度了…看來,今年的用電量應該只會增加不會減少吧~以後出門,還是僅量戴口罩吧~
cacti-dht22-raspberry-pi-temperature-humidity
這麼高的濕度,在配上30度高溫…真是悶熱…


留言

Carol寫道…
你好,想與您請教問題
您所附的cacti template內有寫到cacti會執行"/usr/share/cacti/site/scripts/DHT22.sh"再去抓取DHT22值
請問若cacti並非架設在Pi上,而是另外一台機器上,此部分有建議如何修改呢?
謝謝
KingF寫道…
您好
不同機器,可以使用SNMP的方式
找了一下,這篇文章的作法、概念,您可以參考看看~
http://www.satsignal.eu/raspberry-pi/monitoring.html
james_diving寫道…
你好:
我設定好 Cacti ,但會出現WARNING: Invalid Response(s) ,沒有收值,請問是哪裡設定錯誤,
我用script讓cacti定期執行,測試手動執行 SH 是正常, 資料格式 hight:13.4

2019/08/31 20:10:03 - SYSTEM STATS: Time:1.2717 Method:cmd.php Processes:1 Threads:N/A Hosts:1 HostsPerProcess:1 DataSources:1 RRDsProcessed:1
2019/08/31 20:10:03 - POLLER: Poller[1] WARNING: Invalid Response(s), Errors[1] Device[1] Thread[1] DS[1]
2019/08/31 20:10:03 - POLLER: Poller[1] Device[1] DS[1] CMD: /usr/share/cacti/site/scripts/height.sh, output: U
2019/08/31 20:10:03 - POLLER: Poller[1] Device[1] STATUS: Device 'LLTC' is UP.
2019/08/31 20:05:03 - SYSTEM STATS: Time:1.3163 Method:cmd.php Processes:1 Threads:N/A Hosts:1 HostsPerProcess:1 DataSources:1 RRDsProcessed:1
2019/08/31 20:05:02 - POLLER: Poller[1] WARNING: Invalid Response(s), Errors[1] Device[1] Thread[1] DS[1]
2019/08/31 20:05:02 - POLLER: Poller[1] Device[1] DS[1] CMD: /usr