You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:33:53