我們有一堆Raspberry PI,我們將其用作運(yùn)行python、gunicorn、sqlite數(shù)據(jù)庫(kù)和mqtt代理的Web服務(wù)器。我們希望有一個(gè)設(shè)備,我們可以監(jiān)測(cè)這些樹莓派的情況,比如內(nèi)存和溫度等等。為了不浪費(fèi)顯示屏干這事情,我們決定使用Nanomesher HMI做一個(gè)簡(jiǎn)單的監(jiān)控解決方案。如果內(nèi)存或存儲(chǔ)空間不足,它還會(huì)點(diǎn)亮板載LED作為警告。
NanoMesher HMI是NanoMesher開發(fā)的WiFi觸摸屏顯示器,具有易于使用的HTTP和基于MQTT的API。在這個(gè)項(xiàng)目中,Raspberry PI將通過(guò)HTTP API更新Nanomesher HMI。大概這么干吧結(jié)構(gòu)很簡(jiǎn)單。每個(gè)Raspberry PI運(yùn)行一個(gè)python腳本,它定期獲取健康信息(CPU利用率、CPU溫度、空閑內(nèi)存和空閑磁盤空間),并通過(guò)HTTP更新nanomesher HMI。該怎么顯示信息?我們使用Nextion Editor在屏幕上繪制5行文本框。屏幕上的每一行就是一個(gè)PI的信息。行數(shù)的大小取決于字體和屏幕的設(shè)計(jì)?!癷plbl”用于顯示屏幕的IP地址。
▲ 用Nextion Editor做的用戶界面
獲取CPU溫度最簡(jiǎn)單方法是使用下面的命令。
/opt/vc/bin/vcgencmd measure_temp
python提供了open命令來(lái)運(yùn)行linux命令并返回結(jié)果。添加了一些字符串把輸出格式替換成我們需要的格式。
def GetTemp(): cmd = "/opt/vc/bin/vcgencmd measure_temp | sed -s 's/=/:/g'" p = Popen(cmd, shell=True, stdout=PIPE) output = p.communicate()[0] return output.replace(' ','').replace('temp:','Temp:').replace("'C","c")
獲取內(nèi)存、CPU利用率和可用磁盤空間使用psutil python庫(kù)會(huì)非常容易解決這個(gè)問(wèn)題。安裝:
sudo pip install psutil
或者使用python3:
sudo pip3 install psutil
virtual_memory() 用作返回以字節(jié)為單位的值。因此,我們需要除以1024兩次才能得到兆字節(jié)值。
def GetFreeMem(): return str(psutil.virtual_memory().free/1024/1024) + "M"
CPU和空閑磁盤空間相當(dāng)直接
def GetCpuPercent(): return str(psutil.cpu_percent()) + "%"def GetFreeDisk(): return str(psutil.disk_usage('/home/pi').free/1024/1024) + "M"
IP地址最后,從eth0或wlan0接口獲取IP地址。
def GetLANIP():cmd = "ip addr show eth0 | grep inet| grep -v inet6 | awk '{print $2}' | cut -d '/' -f 1"p = Popen(cmd, shell=True, stdout=PIPE)output = p.communicate()[0]return outputdef GetWLANIP():cmd = "ip addr show wlan0 | grep inet| grep -v inet6 | awk '{print $2}' | cut -d '/' -f 1"p = Popen(cmd, shell=True, stdout=PIPE)output = p.communicate()[0]return output
更新Nanomesher HMI數(shù)據(jù)下面使用簡(jiǎn)單的HTTPGET請(qǐng)求在顯示屏上設(shè)置值和顏色。
‘p’ - 頁(yè)碼
‘n’ - UI組件的名字
‘v’ - 文本集
‘fc’ - 前景色(16位)
def PublishToDisplay(text,label_prefix): try: data = {} data['p'] = '0' data['n'] = label_prefix + sys.argv[2] data['v'] = text data['fc'] = '23555' url_values = urllib.urlencode(data) url = "http://" + sys.argv[1] + "/TextSetText?" + url_values response = urllib2.urlopen(url) html = response.read() except: pass
['n']表示作為命令行參數(shù)傳入的組件名稱。行數(shù)取決于如何設(shè)計(jì)屏幕布局。在本例中,有4行分別命名為line1、line2、line3和line4。警告我們認(rèn)為給出PI健康問(wèn)題(如內(nèi)存或磁盤空間不足)的視覺指示是有用的,因此我們?cè)谙旅嫣砑恿舜祟悪z查,以紅色顯示信息并點(diǎn)亮LED。
freemem = GetFreeMem() if(freemem > 100): PublishToDisplay(str(freemem) + "M","mem","23555") LedOff() else: PublishToDisplay(str(freemem) + "M","mem","61455") LedOn() freedisk = GetFreeDisk() if(freedisk > 500): PublishToDisplay(str(freedisk) + "M","disk","23555") LedOff() else: PublishToDisplay(str(freedisk) + "M","disk","61455") LedOn() if(freemem > 100 and freedisk > 500): LedOff() else: LedOn()
▲ 低內(nèi)存警報(bào)
運(yùn)行起來(lái)從Github下載pimonitor.py。安裝PIP,如果沒有:
sudo apt-get install python-pip
安裝psutil
sudo pip install psutil
或者用python3:
sudo pip3 install psutil
運(yùn)行使用
python PiMonitor.py 192.168.11.116 1
192.168.11.116是Nanomesher HMI的IP地址(顯示在屏幕上),最后的1是指要更新顯示中的哪一行,因此不同的PI將更新不同的行(1-4)。打完收工,希望你喜歡這個(gè)項(xiàng)目。
-
led
+關(guān)注
關(guān)注
242文章
23299瀏覽量
661410 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3817瀏覽量
64484 -
樹莓派
+關(guān)注
關(guān)注
117文章
1708瀏覽量
105703
原文標(biāo)題:同時(shí)監(jiān)測(cè)一堆樹莓派是怎么樣的體驗(yàn)?
文章出處:【微信號(hào):cirmall,微信公眾號(hào):電路設(shè)計(jì)技能】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論