Raspberry Pi 搭配Cacti監控溫濕度
上一篇文章提到如何將DHT22/AM2302溫濕度感測器接到Raspberry Pi、並取得溫度、濕度。不過,如果僅是單純的取得這兩個天氣環境數據,意義似乎不大~如能長期觀測,才有參考價值。
所以,想藉由平常習慣用的網管軟體-Cacti來搭配,做長期的氣象資料記錄。
先說明我的環境,我只有一片Raspberry Pi,所以Cacti和DHT22都是在同一片Raspberry Pi上。
先說明要完成使用Cacti搭配DHT22紀錄溫度、濕度的步驟
這裡產生的資料,後續是藉由Cacti Data Input Methods方式取得。因此輸出格式,必須符合Cacti Data Input Methods的規範。格式如下…
KEY1:VAL1 KEY2:VAL2
直到,看到官方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分取溫度、濕度.....
註:我是使用Raspbian Stretch Lite,Cacti被安裝於/usr/share/cacti/
shell script內容如下…
如此,就可以在Cacti產生如下圖,來長期監控氣象趨勢了~雖然我的Raspberry Pi放在室內陰暗處,但在這五月就已經30度了…看來,今年的用電量應該只會增加不會減少吧~以後出門,還是僅量戴口罩吧~
所以,想藉由平常習慣用的網管軟體-Cacti來搭配,做長期的氣象資料記錄。
先說明我的環境,我只有一片Raspberry Pi,所以Cacti和DHT22都是在同一片Raspberry Pi上。
先說明要完成使用Cacti搭配DHT22紀錄溫度、濕度的步驟
- 安裝Cacti
- 撰寫產生溫度、濕度資料的python程式
- 設定排程定期取得溫度、濕度
- 讓Cacti取得上述資料的shell script
- 設定Cacti以下template
- Data Input Methods
- 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後即可設定、使用~如此,就可以在Cacti產生如下圖,來長期監控氣象趨勢了~雖然我的Raspberry Pi放在室內陰暗處,但在這五月就已經30度了…看來,今年的用電量應該只會增加不會減少吧~以後出門,還是僅量戴口罩吧~
留言
您所附的cacti template內有寫到cacti會執行"/usr/share/cacti/site/scripts/DHT22.sh"再去抓取DHT22值
請問若cacti並非架設在Pi上,而是另外一台機器上,此部分有建議如何修改呢?
謝謝
不同機器,可以使用SNMP的方式
找了一下,這篇文章的作法、概念,您可以參考看看~
http://www.satsignal.eu/raspberry-pi/monitoring.html
我設定好 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