如果你想知道你的树莓派的性能如何,那么你可能需要一个树莓派的仪表盘。在本文中,我将演示如何快速构建一个按需监控仪表盘,以实时查看你的树莓派的 CPU 性能、内存和磁盘使用情况,并根据需要随时添加更多视图和操作。
如果你已经使用 Appsmith,你还可以直接导入 示例应用程序 并开始使用。
Appsmith 是一个开源的 低代码 应用构建工具,帮助开发人员轻松快速地构建内部应用,如仪表盘和管理面板。它是一个用于仪表盘的很好选择,并减少了传统编码方法所需的时间和复杂性。
在此示例的仪表盘中,我显示以下统计信息:
你需要一种从树莓派获取这些数据并传递给 Appsmith 的方法。psutil 是一个用于监控和分析的 Python 库,而 Flask-RESTful 是一个创建 REST API 的 Flask 扩展。
Appsmith 每隔几秒钟调用 REST API 以自动刷新数据,并以 JSON 对象作为响应,其中包含所有所需的统计信息,如下所示:
pip 一次性安装它们。你必须在重新启动树莓派后执行此操作。pi_stats.py 的文件来存放使用 psutil 检索树莓派系统统计信息的逻辑。将以下代码粘贴到 pi_stats.py 文件中:from flask import Flaskfrom flask_restful import Resource, Apiimport psutilapp = Flask(__name__)api = Api(app)class PiData(Resource):def get(self):return "RPI Stat dashboard"api.add_resource(PiData, '/get-stats')if __name__ == '__main__':app.run(debug=True)
这段代码的作用如下:
app = Flask(name)
来定义嵌套 API 对象的应用程序。PiData
定义为具体的 Resource 类 ,以公开每个支持的 HTTP 方法。api.add_resource(PiData, '/get-stats')
将资源 PiData
附加到 API 对象 api
。/get-stats
时,将返回 PiData
作为响应。要从你的树莓派获取统计信息,你可以使用 psutil
提供的这些内置函数:
cpu_percentage
、cpu_count
、cpu_freq
和 sensors_temperatures
函数分别用于获取 CPU 的占用百分比、计数、时钟速度和温度。sensors_temperatures
报告了与树莓派连接的所有设备的温度。要仅获取 CPU 的温度,请使用键 cpu-thermal
。virtual_memory
函数可返回总内存、可用内存、已使用内存和空闲内存的统计信息(以字节为单位)。disk_usage
函数可返回总磁盘空间、已使用空间和可用空间的统计信息(以字节为单位)。将所有函数组合到一个 Python 字典中的示例如下:
PiData.py:gunicorn 生产服务器。现在,你可以启动 Flask API。每次重新启动树莓派时都需要执行此操作。$ gunicorn -w 4 'PyData:app'Serving on http://0.0.0.0:8000
要从外部世界访问你的树莓派,请在网络防火墙中打开一个端口,并将流量定向到你树莓派的 IP 地址,端口为 8000。
首先,获取树莓派的内部 IP 地址:
Store,你在 initialOnPageLoad 对象中创建了一个 JavaScript 函数,并将 storeValue 函数放在其中。你使用 storeValue("cpu_util_data", []); 将 cpu_util_data 中的值存储到 storeValue 函数中。此函数在页面加载时运行。到目前为止,每次刷新页面时,代码都会将 cpu_util_data 中的一个数据点存储到 Store 中。为了存储一个数组,你使用了 x 和 y 的下标变量,两者都存储了来自 cpu_percent 数据属性的值。你还希望通过设定存储值之间的固定时间间隔来自动存储这些数据。当执行 setInterval 函数时:获取存储在 cpu_util_data 中的值。调用 API PiData。使用返回的最新 cpu_percent 数据将 cpu_util_data 更新为 x 和 y 变量。将 cpu_util_data 的值存储在键 utilData 中。仅当设置为自动执行函数时,才重复执行步骤 1 到 4。你使用 Switch 小部件将其设置为自动执行,这就解释了为什么有一个 getLiveData 父函数。在 “设置Settings” 选项卡中,找到对象中的所有父函数,并在 “页面加载时运行RUN ON PAGE LOAD” 选项中将 initialOnPageLoad 设置为 “Yes(是)”。设置页面加载时要执行的函数现在刷新页面进行确认。返回到画布。单击 “图表Chart” 小部件,并找到 “图表数据Chart Data” 属性。将绑定 {{ appsmith.store.disk_util_data }} 粘贴到其中。这样,如果你自己多次运行对象 utils,就可以获得图表数据。要自动运行此操作:查找并单击仪表盘标题中的 “实时数据开关Live Data Switch” 小部件。查找 onChange 事件。将其绑定到 {{ utils.getLiveData() }}。JavaScript 对象是 utils,而 getLiveData 是在你切换开关时激活的函数,它会从你的树莓派获取实时数据。但是还有其他实时数据,因此同一开关也适用于它们。继续阅读以了解详情。将数据绑定到内存和磁盘部分的小部件与你在 CPU 统计信息部分所做的方式类似。对于内存部分,绑定如下所示:进度条中的绑定为:{{( PiData.data.cpu_mem_avail/1000000000).toPrecision(2) * 100 ?? 0 }}。三个统计框小部件的绑定分别为:{{ ${(PiData.data.cpu_mem_used/1000000000).toPrecision(2)} ?? 0 }} GB、{{ ${(PiData.data.cpu_mem_free/1000000000).toPrecision(2)} ?? 0}} GB 和 {{ ${(PiData.data.cpu_mem_total/1000000000).toPrecision(2)} ?? 0 }} GB。对于磁盘部分,进度条和统计框小部件的绑定分别变为:进度条的绑定为:{{ PiData.data.disk_usage_percent ?? 0 }}。三个统计框小部件的绑定分别为:{{ ${(PiData.data.disk_usage_used/1000000000).toPrecision(2)} ?? 0 }} GB、{{ ${(PiData.data.disk_usage_free/1000000000).toPrecision(2)} ?? 0 }} GB 和 {{ ${(PiData.data.disk_usage_total/1000000000).toPrecision(2)} ?? 0 }} GB。这里的图表需要更新你为 CPU 统计信息创建的 utils 对象,使用 storeValue 键名为 disk_util_data,嵌套在 getLiveData 下面,其逻辑与 cpu_util_data 类似。对于磁盘利用率图表,我们存储的 disk_util_data 的逻辑与 CPU 利用率趋势图的逻辑相同。export default {getLiveData: () => {//When switch is on:if (Switch1.isSwitchedOn) {setInterval(() => { const cpuUtilData = appsmith.store.cpu_util_data; const diskUtilData = appsmith.store.disk_util_data; PiData.run(); storeValue("cpu_util_data", [...cpuUtilData, { x: PiData.data.cpu_percent,y: PiData.data.cpu_percent }]); storeValue("disk_util_data", [...diskUtilData, { x: PiData.data.disk_usage_percent,y: PiData.data.disk_usage_percent }]);}, 1500, 'timerId')} else {clearInterval('timerId');}},initialOnPageLoad: () => {storeValue("cpu_util_data", []);storeValue("disk_util_data", []);}}
通过使用 utils
JavaScript 对象在打开和关闭真实数据开关时触发的数据流可视化如下所示:
切换
在打开实时数据开关时,图表会变成这样:
显示实时数据
整体上,它既漂亮,又简约,而且非常有用。
当你对 psutils
、JavaScript 和 Appsmith 更加熟悉时,我相信你会发现可以轻松无限地调整你的仪表板,实现非常酷的功能,例如:
psutils
扩展到另一台安装有 Python 的计算机上在下一个令人兴奋的项目中,祝你玩得愉快!