使用RPi-Monitor监控、统计Guitar的运行状态

2024-02-04 07:10

本文主要是介绍使用RPi-Monitor监控、统计Guitar的运行状态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

之前发在ickey社区上的一系列文章:

  1. 犹抱琵琶半遮面,无人知是荔枝来——unboxing & interview 一、二、三
  2. 葡萄美酒夜光杯,巧妇难为无米炊——资料与社区
  3. 一支穿云箭,板子要加散热片——系统监控与发热问题
  4. 念去去千里烟波,暮霭沉沉楚天阔——远程控制相关
  5. 竹喧归浣女,莲动小轻舟——延长板载eMMC寿命、优化性能

RPi-Monitor简介

前文 讲到如何通过一个shell脚本获取CPU状态和PMU温度,而RPi-Monitor基于perl,内置webserver,通过优化后对sd卡占用更少。由于其极强的可定制性与拓展性,你可以换用熟悉的Web Server,显示服务状态,甚至作为视频监控。最早是基于树莓派的项目,后来在XApple社区发现有人移植到蓮霧派,今天cnx-software也报道了,特此记录下来。之前都是使用的phpsysinfo

项目主页:http://rpi-experiences.blogspot.com/
Github主页: https://github.com/XavierBerger/RPi-Monitor

开始页面

67163219.jpg

统计页面

直接用cnx-software的图了

安装配置

添加rpimonitor源

sudo -s
apt-get install apt-transport-https ca-certificates
wget https://raw.githubusercontent.com/XavierBerger/RPi-Monitor/master/init/apt/sources.list.d/rpimonitor.list -O /etc/apt/sources.list.d/rpimonitor.list
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 2C0D3C0F

安装升级RPi-Monitor

apt-get update && apt-get install rpimonitor && apt-get upgrade

停止服务添加自定义模块

systemctl stop rpimonitor
nano /etc/rpimonitor/template/S500_ATC2603.conf

输入以下内容:

########################################################################
# Extract S500/ATC2603 information
#  Page: 1
#  Information               Status     Statistics
#  - cpu frequency           - yes      - yes
#  - cpu load 1, 5, 15       - yes      - yes
#  - cpu scaling governor    - yes      - no
#  - power in voltage        - yes      - yes
#  - power in consumption    - yes      - yes
#  - USB OTG voltage         - yes      - yes
#  - USB OTG consumption     - yes      - yes
#  - battery consumption     - yes      - yes
#  - total consumption       - yes      - yes
#  - power in current        - yes      - yes
#  - USB OTG current         - yes      - yes
#  - soc temperature         - yes      - yes
#  - pmu temperature         - yes      - yes
########################################################################
dynamic.1.name=cpu_frequency
dynamic.1.source=/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
dynamic.1.regexp=(.*)
dynamic.1.postprocess=$1/1000
dynamic.1.rrd=GAUGEdynamic.2.name=load1,load5,load15
dynamic.2.source=/proc/loadavg
dynamic.2.regexp=^(\S+)\s(\S+)\s(\S+)
dynamic.2.postprocess=
dynamic.2.rrd=GAUGEdynamic.3.name=scaling_governor
dynamic.3.source=/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
dynamic.3.regexp=(.*)
dynamic.3.postprocess=
dynamic.3.rrd=dynamic.4.name=ac_voltage
dynamic.4.source=/sys/devices/b0170000.i2c/i2c-0/0-0065/atc2603c-hwmon.0/wall_voltage
dynamic.4.regexp=(.*)
dynamic.4.postprocess=sprintf("%.2f", $1/1000)
dynamic.4.rrd=GAUGEdynamic.5.name=ac_consumption
dynamic.5.source=/sys/devices/b0170000.i2c/i2c-0/0-0065/atc2603c-hwmon.0/wall_current
dynamic.5.regexp=(.*)
dynamic.5.postprocess=sprintf("%.2f", $1/153 * $this->{'dynamic'}->{'ac_voltage'})
dynamic.5.rrd=GAUGEdynamic.6.name=usb_voltage
dynamic.6.source=/sys/devices/b0170000.i2c/i2c-0/0-0065/atc2603c-hwmon.0/vbus_voltage
dynamic.6.regexp=(.*)
dynamic.6.postprocess=sprintf("%.2f", $1/1000)
dynamic.6.rrd=GAUGEdynamic.7.name=usb_consumption
dynamic.7.source=/sys/devices/b0170000.i2c/i2c-0/0-0065/atc2603c-hwmon.0/vbus_current
dynamic.7.regexp=(.*)
dynamic.7.postprocess=sprintf("%.2f", $1/1000 * $this->{'dynamic'}->{'usb_voltage'})
dynamic.7.rrd=GAUGEdynamic.8.name=battery_consumption
dynamic.8.source=/sys/devices/b0170000.i2c/i2c-0/0-0065/atc2603c-hwmon.0/bat_current
dynamic.8.regexp=(.*)
dynamic.8.postprocess=sprintf("%.2f", $1/1000)
dynamic.8.rrd=GAUGEdynamic.9.name=total_consumption
dynamic.9.source=/sys/devices/b0170000.i2c/i2c-0/0-0065/atc2603c-hwmon.0/bat_voltage
dynamic.9.regexp=(.*)
dynamic.9.postprocess=sprintf("%.2f", $1/1000 + $this->{'dynamic'}->{'ac_consumption'} + $this->{'dynamic'}->{'usb_consumption'})
dynamic.9.rrd=GAUGEdynamic.10.name=usb_current
dynamic.10.source=/sys/devices/b0170000.i2c/i2c-0/0-0065/atc2603c-hwmon.0/vbus_current
dynamic.10.regexp=(.*)
dynamic.10.postprocess=sprintf("%.2f", $1/1000)
dynamic.10.rrd=GAUGEdynamic.11.name=ac_current
dynamic.11.source=/sys/devices/b0170000.i2c/i2c-0/0-0065/atc2603c-hwmon.0/wall_current
dynamic.11.regexp=(.*)
dynamic.11.postprocess=sprintf("%.2f", $1/153)
dynamic.11.rrd=GAUGEdynamic.12.name=soc_temp
dynamic.12.source=/sys/devices/virtual/thermal/thermal_zone1/temp
dynamic.12.regexp=(.*)
dynamic.12.postprocess=sprintf("%.1f", $1/1000)
dynamic.12.rrd=GAUGEdynamic.13.name=pmu_temp
dynamic.13.source=/sys/devices/b0170000.i2c/i2c-0/0-0065/atc2603c-hwmon.0/ic_temperature
dynamic.13.regexp=(.*)
dynamic.13.postprocess=sprintf("%.1f", $1/1000)
dynamic.13.rrd=GAUGEweb.status.1.content.1.name=CPU
web.status.1.content.1.icon=cpu.png
web.status.1.content.1.line.1="Loads: <b>" + data.load1 + "</b> [1min] - <b>" + data.load5 + "</b> [5min] - <b>" + data.load15 + "</b> [15min]"
web.status.1.content.1.line.2="CPU frequency: <b>" + data.cpu_frequency + "MHz</b>  Governor: <b>" + data.scaling_governor + "</b>"web.status.1.content.2.name=PMU
web.status.1.content.2.icon=pmu.png
web.status.1.content.2.line.1="Total PMU Consumption: <b>" + data.total_consumption + " W</b>"
web.status.1.content.2.line.2="PWR in: <b>" + data.ac_consumption + " W</b> USB OTG in: <b>" + data.usb_consumption + " W</b> BATT in: <b>" + data.battery_consumption + " W</b>"web.status.1.content.3.name=Temperature
web.status.1.content.3.icon=cpu_temp.png
web.status.1.content.3.line.1=JustGageBar("SoC", "°C",0, data.soc_temp , 125,100,80,percentColors,70,85)+" "+JustGageBar("PMU", "°C",0, data.pmu_temp , 125,100,80,percentColors,70,85)web.statistics.1.content.1.name=Load / cpufreq / Consumption
web.statistics.1.content.1.graph.1=load1
web.statistics.1.content.1.graph.2=load5
web.statistics.1.content.1.graph.3=load15
web.statistics.1.content.1.graph.4=total_consumption
web.statistics.1.content.1.graph.5=cpu_frequency
web.statistics.1.content.1.ds_graph_options.load1.label=Load 1 min
web.statistics.1.content.1.ds_graph_options.load5.label=Load 5 min
web.statistics.1.content.1.ds_graph_options.load15.label=Load 15 min
web.statistics.1.content.1.ds_graph_options.total_consumption.label=Consumption (W)
web.statistics.1.content.1.ds_graph_options.cpu_frequency.label=Clock speed (MHz)
web.statistics.1.content.1.ds_graph_options.cpu_frequency.yaxis=2
web.statistics.1.content.1.graph_options.y2axis={ position: "right" }web.statistics.1.content.2.name=PMU current/voltage
web.statistics.1.content.2.graph.1=ac_voltage
web.statistics.1.content.2.graph.2=usb_voltage
web.statistics.1.content.2.graph.3=ac_current
web.statistics.1.content.2.graph.4=usb_current
web.statistics.1.content.2.graph.5=battery_consumption
web.statistics.1.content.2.ds_graph_options.ac_voltage.label=Voltage PWR in (V)
web.statistics.1.content.2.ds_graph_options.usb_voltage.label=Voltage USB OTG (V)
web.statistics.1.content.2.ds_graph_options.ac_current.label=Current PWR in (A)
web.statistics.1.content.2.ds_graph_options.usb_current.label=Current USB OTG (mA)
web.statistics.1.content.2.ds_graph_options.battery_consumption.label=Consumption Battery (W)
web.statistics.1.content.2.ds_graph_options.ac_voltage.yaxis=1
web.statistics.1.content.2.ds_graph_options.usb_voltage.yaxis=1
web.statistics.1.content.2.ds_graph_options.ac_current.yaxis=2
web.statistics.1.content.2.ds_graph_options.usb_current.yaxis=2
web.statistics.1.content.2.ds_graph_options.battery_consumption.yaxis=1
web.statistics.1.content.2.graph_options.y1axis={ position: "left", min: 1.5, max: 11 }
web.statistics.1.content.2.graph_options.y2axis={ position: "right" }web.statistics.1.content.3.name=Temperature / Consumption
web.statistics.1.content.3.graph.1=pmu_temp
web.statistics.1.content.3.graph.2=soc_temp
web.statistics.1.content.3.graph.3=total_consumption
web.statistics.1.content.3.ds_graph_options.pmu_temp.label=PMU temperature (°C)
web.statistics.1.content.3.ds_graph_options.soc_temp.label=SoC temperature (°C)
web.statistics.1.content.3.ds_graph_options.total_consumption.label=Consumption (W)
web.statistics.1.content.3.ds_graph_options.total_consumption.yaxis=2
web.statistics.1.content.3.graph_options.y1axis={ position: "left", min: 0, max: 125 }
web.statistics.1.content.3.graph_options.y2axis={ position: "right" }
nano /etc/rpimonitor/template/lemaker_guitar.conf

添加以下内容,创建主配置文件,根据自己需要启用|禁用模块:

web.page.icon='img/logo.png'
web.page.menutitle='RPi-Monitor  <sub>('+data.hostname+')</sub>'
web.page.pagetitle='RPi-Monitor ('+data.hostname+')'web.status.1.name=lemaker_guitar
web.statistics.1.name=lemaker_guitarinclude=/etc/rpimonitor/template/version.conf
include=/etc/rpimonitor/template/uptime.conf
include=/etc/rpimonitor/template/S500_ATC2603.conf
include=/etc/rpimonitor/template/memory.conf
include=/etc/rpimonitor/template/swap.conf
include=/etc/rpimonitor/template/sdcard.conf
include=/etc/rpimonitor/template/network.conf
include=/etc/rpimonitor/template/wlan.conf

创建软链接:

ln -sf /etc/rpimonitor/template/lemaker_guitar.conf /etc/rpimonitor/data.conf

重启rpimonitor服务

systemctl start rpimonitor

访问网页前端

假如Guitar的IP为192.168.1.111,那么在浏览器里输入192.168.1.111:8888 即可打开状态页面。经过配置可以远程访问Guitar之后,无论身处何地都可以及时监控Guitar的运行状态。
软件使用GPL3 协议,所以可以对界面进行一些改造。

自定义功能与添加模块

使用配置文件生成助手

2.6版本之后引入了一个新工具:RPi-Monitor交互式配置文件生成助手 (RPi-Monitor Interactive Configuration Helper),通过运行

rpimonitord -i

可以非常方便地创建自己的监视点。Via

添加传感器数据

以DHT温湿度传感器为例,可以监视温湿度变化,绘制折线图,修改之后可以显示诸多传感器数值。Via
官网截图

使用标签显示状态

2.7版本之后引入标签显示服务状态的功能,支持6种颜色:
61139011.jpg
效果如图所示:
89729018.jpg
根据模板修改/etc/rpimonitor/template/services.conf文件即可。稍加改造可以实现更多功能。
注意:最新2.10版/etc/rpimonitor/template/services.conf文件最后一行少一个")",需要自己补上。
nano中可通过Ctrl+E快速跳至行尾。Via

进阶用法

其他进阶用法及自定义功能。Via

其他模板

  • 全志A10/A13/A20
  • 全志H3
  • A64 (Pine64)
  • A83T/H8 (Banana Pi M3, Cubietruck +)
    via

    总结

转载于:https://www.cnblogs.com/sjqlwy/p/guitar_monitor.html

这篇关于使用RPi-Monitor监控、统计Guitar的运行状态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/676706

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c