創(chuàng)建了一個獨立的便攜式能量監(jiān)測和分析設備,并集成了Web應用程序
測量任何插入設備的能量參數(電流/電壓/功率等),并在web應用程序上查看儀表板和歷史數據圖表
在這個項目中,我創(chuàng)建了一個獨立的便攜式能量監(jiān)測和分析設備,并集成了Web應用程序。
你一天看多少電視?那要花你多少錢?你的使用模式是什么?把洗衣機放在非高峰時間而不是高峰時間,你能省下多少錢?
或者,如果你是一家企業(yè),你在業(yè)務中使用某種工具的頻率是多少?操作那臺機器的費用是多少?敏感實驗室設備周圍的電壓有多穩(wěn)定?你所在位置接收到的電能質量如何?例如,您可以使用這些信息來更好地估計產品成本,或者通過進行異常檢測或預測性維護。
這個便攜式能量監(jiān)測裝置可以幫助你回答這些問題。它測量插入的任何設備/負載的能量參數:
?監(jiān)控能源參數(電流(RMS),電壓(RMS),功率因數,線路頻率,功率,能耗等),并將其寫入時間序列數據庫(InfluxDB)
?重置每天午夜的能量積累,這樣能量積累(累計消耗的能量)是每天進行的。
?監(jiān)控事件條件(過流/功率,電壓驟降/浪涌)
?呈現一個顯示所有當前參數的web儀表板。單擊每個參數還可以獲取并顯示最近5分鐘的活動。
?使用線形圖呈現較長時期的歷史數據-您可以在同一圖形上覆蓋多個參數以進行比較。您可以從下拉菜單中選擇數據的間隔- 5m, 10m, 30m, 1hr, 3hr, 6hr, 12hr和24hr
它是用Raspberry Pi 4、Dr. Wattson Energy Monitoring Board V2和OLED屏幕制作的。
ProtoStax機箱用于樹莓派3/4/5和Dr. Wattson能源監(jiān)視器,為整個項目提供了一個很好的模塊化機箱解決方案,包括一個電源入口和一個可以測量能耗參數的插座。插入您感興趣的負載并開始測量!
樹莓派運行一個基于python Flask的應用程序,每秒查詢Dr. watson,并將數據上傳到InfluxDB實例。該應用程序還提供了一個使用HTML, CSS和Javascript的web用戶界面,在儀表板中顯示當前的能源指標。您可以點擊每個指標來查看最近5分鐘的活動。您還可以通過圖表查看歷史數據-最近5分鐘,10分鐘,30分鐘,60分鐘,3小時,6小時,12小時和24小時。您可以使用REST api直接查詢JSON格式的數據。設備上附帶的OLED屏幕顯示當前的關鍵參數,因此您可以通過查看設備屏幕快速查看數據。
此基礎設施還允許在其上輕松構建任何其他數據分析和控制。您可以使用web應用程序原樣獲得大量有用的信息,包括當前和歷史數據(最多24小時),而無需任何額外的編碼。由于歷史數據存儲在時間序列數據庫中,您也可以查詢它,將其可視化(使用與InfluxDB配合良好的Grafana等工具),并通過額外的編碼和數據分析來分析它。
這是架構圖。
使用它
我試圖簡化在你自己的設置中使用Energy Monitor的過程。
第一步是把電路組裝在一起,并將其組裝在外殼中。ProtoStax和沃森博士的用戶手冊里有足夠的信息,我建議你參考一下。
一旦您完成了這些,您將希望啟用Raspberry Pi的無頭操作。目前的樹莓派Imager使它相當簡單,允許你配置你的WiFi網絡設置,也啟用SSH等。
一旦你有了一個工作設備,你可以啟動和登錄,你必須安裝軟件。如果你還沒有git,你首先需要安裝它:
您還需要安裝并設置InfluxDB2。關于這個有很多教程,所以我就不重復了。您需要設置組織和存儲桶,以及用于身份驗證的令牌。注意這些值。
之后,你可以從Github克隆軟件:
接下來,我們將創(chuàng)建一個python虛擬環(huán)境,以方便安裝所需的軟件包,然后使用項目中的需求一次輕松安裝所有依賴項:
接下來,您需要創(chuàng)建一個config.ini文件來包含連接到InfluxDB實例的憑據。提供了一個樣例config_sample.ini。你可以使用它,并在適當的時候更新它。記得創(chuàng)建一個新的文件config.ini(而不是修改config_sample.ini文件)
如果一切正常,你應該可以像這樣啟動應用程序:
您還可以創(chuàng)建一個服務,以便在樹莓派啟動時自動啟動應用程序。Github README有關于如何做到這一點的說明。我提供了一個示例服務文件供您根據需要進行修改。
如果代碼正常運行,您應該能夠打開瀏覽器到您的web應用程序。假設您將樹莓派命名為myPi.local。
代碼深潛
代碼是用Python編寫的。我使用了Flask,它是一個輕量級的web框架,作為web服務器,不僅提供web UI,還提供JSON格式的數據(客戶端Javascript使用JSON格式加載、顯示和刷新歷史數據)。
為了與沃森博士交流,我使用它的Python庫UpbeatLabs_Python_MCP39F521。
我還安裝了一個InfluxDB2數據庫作為時間序列數據庫。InfluxDB的最新版本是3,但該版本有一個嚴格的限制,即只能支持大約72小時的數據查詢(再多的話性能就不高了,而且會給系統(tǒng)帶來很大的壓力)。InfluxDB2工作得很好,在可預見的未來,我將使用它超過3個版本(直到他們修復/解決問題)。對于InfluxDB2,您必須使用Flux查詢,這不是最流行的,但我認為它們使用起來很好!
為了與OLED屏幕進行通信,我使用Adafruit的Adafruit_Python_SSD1306。請注意,這個庫現在已被棄用,取而代之的是他們的CircuitPython庫,但它還不能在Raspberry Pi 5/bookworm上工作。我還必須用GPIO python庫做一些技巧來讓bookworm工作。
我使用Dr. watson的事件檢測引腳在事件觸發(fā)條件發(fā)生時獲得通知,并使用它打開顯示板上的LED。
當連接到InfluxDB數據庫時,我使用配置文件來存儲必要的信息(url、令牌、org、要使用的桶),并使用configparser庫來讀取和獲取數據。確保創(chuàng)建一個包含您自己的數據庫信息的config.ini文件!
Dr. Wattson使用的MCP39F521提供能量積累,Dr. Wattson公開api來打開/關閉能量積累。python應用程序會在午夜重置能量積累,這樣我們就可以記錄一天的能量積累。
為了確保每天只進行一次重置,即使應用程序重新啟動,我也使用shelve python庫來跟蹤文件中的這些信息。如果當天的能量積累已經重置,則調用該函數沒有任何作用。
在Flask中,它定義路由,其中既包括數據(JSON格式),也包括呈現客戶端HTML、CSS和Javascript頁面。在Flask中,默認情況下,html頁面存儲在“templates”目錄下,其他靜態(tài)資產(如CSS和Javascript)存儲在“static”目錄下。
對于客戶端,我使用Bootstrap框架來提供一致的、移動友好的響應界面,而不需要太多的麻煩。當然,熟悉它是有學習曲線的!
對于儀表板以及度量圖表頁面,我使用Chart.js小部件和圖形來顯示各種項目。
例如,我使用“甜甜圈”圖表在儀表板上顯示電流、電壓、線路頻率、功率因數等指標。我還使用了doughnutLabel注釋插件。這允許我將當前值表示為一個儀表,以獲得更令人愉悅的視覺外觀。單擊每個儀表板指標還會彈出一個指標圖表,顯示最近5分鐘的活動。讓它工作有點棘手!
對于事件條件(過電流,過功率,電壓下降和電壓浪涌)以及功率象限表示,我使用了一個散點圖,中心為0,0,并用4個注釋表示四個事件或四個功率象限。
在事件的情況下,一個或多個事件可以是活動的,而功率象限可以是4個值中的一個。將鼠標移到每個將給出額外的信息-例如,觸發(fā)過電流的條件是> 0.18 A。因此,這個小部件呈現了大量的信息,同時看起來極簡主義。將鼠標懸停在數據點上并單擊可以獲得更多信息,活動區(qū)域會改變顏色和大小(紅點變大)。
度量圖表頁面顯示一個線形圖,并具有所有不同的屬性。默認情況下,只顯示當前RMS,但您可以單擊其他屬性來啟用/禁用它們。因此,一個圖表可以用于所有屬性。我還添加了從下拉菜單中選擇不同時間框架的功能。這將獲取新數據并重新呈現圖表。它還智能地更改刷新間隔- 24小時圖表將每分鐘刷新一次,而5分鐘圖表將每5秒刷新一次。javascript使用合適的查詢參數調用后端REST API來獲取數據并更新圖表。我必須測試雙方,以確保一切都按預期工作,并發(fā)現和修復一些漏洞。這都是過程的一部分!
也可以設置y軸縮放的最小/最大-否則Chart.js會根據手頭的數據自動縮放。如果你正在尋找特定的模式,并知道你正在觀察的最小/最大值,并在這些范圍內渲染圖表,那么自己設置比例是很有用的。
為了在所有頁面之間共享導航鏈接和標題,我有一個base.html頁面,所有其他頁面都繼承自這個頁面,所以如果我想更改導航鏈接,我可以只在一個位置這樣做。
因此,您可以看到在客戶端也發(fā)生了相當多的事情!
前進
由于數據在InfluxDB中,并且它支持Python,因此您可以通過編寫單獨的Python程序和直接查詢數據庫來添加額外的數據分析,并利用各種Python庫和框架進行人工智能和數據分析(例如,生成每日報告)。
當然,你也可以修改/增強現有的應用程序:
?添加用戶身份驗證,這樣用戶必須登錄才能看到儀表板
?使用不同類型的圖表——條形圖、散點圖等。
?增加對查詢更長的數據周期的支持(目前最多可查詢24小時)。在查詢大量數據時要記住一些事情。如何減少數據點的數量?您可以在Chart.js中使用數據抽取來幫助減少數據點的數量。或者您可以在服務器端進行處理以減少它(例如,將數據聚合為5分鐘間隔以減少數據點的數量)。
?添加額外的分析和報告-您可以創(chuàng)建一個新的頁面來顯示報告
?添加用于更改配置設置的頁面—例如,事件觸發(fā)條件(這些現在是硬編碼的,但可以由用戶配置)
本文編譯自hackster.io