寻求Node-RED中Windows显示器节电模式事件监听方案
监听显示器节电模式的Node-RED实现方案
嘿,我来给你梳理几个靠谱的方向,帮你搞定这个从EventGhost迁移到Node-RED的需求~ 毕竟你已经折腾两天了,咱们直接上干货:
先搞定Windows 10测试环境的方案
Windows系统下获取显示器电源状态,有两种实用思路:
1. 用Node.js包直接监听系统事件
找个能读取系统电源/显示器状态的npm包,在Node-RED里自定义逻辑:
- 首先在Node-RED的用户目录(一般是
C:\Users\<你的用户名>\.node-red)打开命令行,安装systeminformation包:npm install systeminformation - 然后在Node-RED里添加一个函数节点,写入类似下面的代码(记得先运行一次
si.graphics()查看返回结构,再调整字段):const si = require('systeminformation'); let lastState = null; // 定时查询显示器状态,每2秒一次 const checkDisplayState = () => { si.graphics().then(data => { // 这里的字段可能需要根据你的系统调整,比如有的是powerState,有的看displayActive const currentState = data.displays[0].displayActive ? 'on' : 'off'; if (currentState !== lastState) { lastState = currentState; node.send({ payload: currentState }); } }).catch(err => node.error('获取显示器状态失败:' + err)); }; // 启动定时查询 const interval = setInterval(checkDisplayState, 2000); checkDisplayState(); // 初始化先查一次 // 节点关闭时清理定时器,避免内存泄漏 node.on('close', () => { clearInterval(interval); }); return null; - 之后接一个开关节点,判断
msg.payload是on还是off,分别输出开灯/关灯的信号到后续控制节点(比如MQTT、HTTP请求或者本地脚本)。
2. 用PowerShell脚本配合Exec节点
如果不想折腾npm包,用Windows自带的PowerShell也能搞定:
- 写一个PowerShell脚本,持续监听显示器电源状态变化(或者定期查询),比如:
$lastState = $null while($true) { # 获取显示器状态,这里的逻辑可能需要根据你的设备调整 $currentState = (Get-CimInstance -ClassName Win32_DesktopMonitor).Availability # Availability字段:3=运行中(开),4=节电(关),其他值自行查文档 $stateText = if($currentState -eq 3) { 'on' } else { 'off' } if($stateText -ne $lastState) { Write-Output $stateText $lastState = $stateText } Start-Sleep -Seconds 2 } - 在Node-RED里添加Exec节点,设置运行这个PowerShell脚本(命令写
powershell.exe -File "你的脚本路径.ps1"),勾选“持续运行”,然后捕获脚本的输出,后续流程和上面一致。
后续迁移到Raspberry Pi 3(Linux)的方案
树莓派用的是Linux系统,主要靠DPMS(显示电源管理信号)来获取状态,推荐这两种方法:
1. 用xrandr/xset命令配合Exec节点
Linux下可以通过命令行直接读取显示器状态:
- 用
xrandr --query命令查看显示接口的状态,比如HDMI接口的状态:
输出如果是xrandr --query | grep " connected" | awk '{print $4}'off就是节电模式,normal就是开启状态。 - 在Node-RED里用Exec节点定期执行这个命令(比如每2秒一次),然后用函数节点解析输出,判断状态变化后发送控制信号。
2. 监听系统状态文件
树莓派的显示状态会写入sys目录下的文件,比如HDMI接口的状态文件可能是/sys/class/drm/card0/card0-HDMI-A-1/status(路径可能因你的显示接口不同而变),文件内容是connected或disconnected,或者结合DPMS状态文件。
- 在Node-RED里添加File节点,设置监听这个文件的内容变化,当内容改变时触发事件,再判断状态输出控制信号。
通用注意事项
- 权限问题:树莓派里运行xrandr/xset需要X权限,确保Node-RED运行的用户有访问X的权限(比如用
sudo -u pi node-red启动,或者配置DISPLAY环境变量);Windows下如果用API可能需要管理员权限。 - 状态去重:不管用哪种方法,都要记录上一次的状态,避免重复发送相同的控制信号。
内容的提问来源于stack exchange,提问作者kman 2017
相关产品推荐
相关产品推荐

