Evan
发布于 2026-06-03 / 5 阅读
0
0

电脑控制

电脑控制

更新日期:2026-06-03
状态:✅ 已落地(从 HA 实际配置回写)
详细文档:/DATA/AppData/homeassistant/config/docs/PC_CONTROL.md

目标

局域网内用 HA 控制 Windows 10/11 电脑的 5 个动作 + 在线状态。

动作 实现方式 命令
开机 WOL(UDP 广播) 魔术包 → 192.168.12.255
关机 SSH shutdown /s /t 0
睡眠 SSH rundll32.exe powrprof.dll,SetSuspendState 0,1,0
休眠 SSH rundll32.exe powrprof.dll,SetSuspendState 1,1,0
重启 SSH shutdown /r /t 0
在线状态 Ping ICMP 探测

网络拓扑

[HA Docker, host 网络]  192.168.12.110
       │  WOL 广播 / SSH 22
       ▼
[Windows 10/11 PC]      192.168.12.112  MAC 08:BF:B8:85:A5:EB

关键点:HA 容器必须 network_mode: host,否则 WOL 广播发不出去。

实现方式:密码 SSH(不是密钥)

为什么不用密钥

最初设计是 SSH 密钥,但遇到 Windows OpenSSH Server 的 Match Group administrators​ 块强制走 C:\ProgramData\ssh\administrators_authorized_keys,部署复杂,改用密码。

为什么 HA 端能直接用密码(无 sshpass)

  • HA Docker 镜像没有 sshpass
  • 自带 paramiko(Python SSH 库)
  • 写一个 Python 包装脚本,内部读密码文件,调 paramiko

文件结构

config/
├── configuration.yaml      # 5 个 switch 集成
├── secrets.yaml            # pc_ssh_user / pc_host
├── scripts.yaml            # 5 个便捷脚本
├── .ssh/
│   ├── pc_password         # 600,密码明文
│   └── pc_ssh.py           # 700,paramiko 包装
└── docs/PC_CONTROL.md

Windows 端前置

  1. 装 OpenSSH Server:Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
  2. 启动服务:Start-Service sshd; Set-Service -Name sshd -StartupType 'Automatic'
  3. 确认用户在 Administrators 组(否则 shutdown 会拒绝)
  4. 设备管理器 → 网卡 → 电源管理 → 允许幻数据包唤醒
  5. powercfg /a 确认休眠可用(部分主板 firmware 不支持 S4)

HA 端关键配置

# configuration.yaml
switch:
  - platform: wake_on_lan
    name: "PC Power On"
    host: 192.168.12.112
    mac: 08:BF:B8:85:A5:EB
    broadcast_address: 192.168.12.255

command_line:
  - switch:
      name: "PC Shutdown"
      unique_id: pc_shutdown
      command_on: "python3 /config/.ssh/pc_ssh.py shutdown"
      command_off: "python3 /config/.ssh/pc_ssh.py shutdown"
      command_state: "python3 /config/.ssh/pc_ssh.py state"
      value_template: "{{ 'ON' in value }}"
  # sleep / hibernate / restart 同模式

实体清单

实体 作用
switch.pc_power_on WOL(单击触发)
switch.pc_shutdown 关机
switch.pc_sleep 睡眠
switch.pc_hibernate 休眠
switch.pc_restart 重启
script.pc_* 上面 5 个的快捷脚本(给语音用)
binary_sensor.pc_online ping 探测(UI 添加)

踩过的坑(避坑指南)

现象 真因 修复
ValueError: Unable to determine type for ping: None device_tracker.ping 老语法 binary_sensor.ping
The ping platform for the binary_sensor integration does not support platform setup HA 2026.4 移除了此平台 改顶级 ping:
The ping integration does not support YAML setup HA 2026.4 ping 集成 UI-only 必须从 UI 添加
send_on_start 警告 switch.wake_on_lan 不支持此选项 删掉
FileNotFoundError: known_hosts load_host_keys 文件不存在 os.path.exists 兜底
密钥认证 Permission denied Match Group administrators 强制走集中文件 改用密码
whoami 输出 Microsoft 账户要本地名,不是邮箱 whoami 输出作 SSH user

已知限制

  • 睡眠时 SSH 不通,state 命令失败(日志刷屏),但开关状态正确
  • 某些主板 firmware 不支持休眠(S4),pc_hibernate 自动降级为睡眠
  • pc_password​ 是明文,安全性低于 SSH 密钥(后续可升级,见 docs/PC_CONTROL.md §9)

改进路径

  1. 升级到 SSH 密钥(密钥写到 C:\ProgramData\ssh\administrators_authorized_keys)
  2. 加 Microsoft 账户用 .\<localuser> 语法
  3. 加 SSH agent / 多 PC 支持
  4. 加 PC 闲置检测自动化(需要 Windows 端上报 user activity)

变更记录

日期 内容
2026-05-04 初版:etherwake + ssh + ping 三件套概念
2026-06-03 完整落地:5 个 switch + 5 个 script + ping binary_sensor,从 HA 实际配置回写

评论