电脑控制
更新日期: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 端前置
- 装 OpenSSH Server:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 - 启动服务:
Start-Service sshd; Set-Service -Name sshd -StartupType 'Automatic' - 确认用户在 Administrators 组(否则
shutdown会拒绝) - 设备管理器 → 网卡 → 电源管理 → 允许幻数据包唤醒
-
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)
改进路径
- 升级到 SSH 密钥(密钥写到
C:\ProgramData\ssh\administrators_authorized_keys) - 加 Microsoft 账户用
.\<localuser>语法 - 加 SSH agent / 多 PC 支持
- 加 PC 闲置检测自动化(需要 Windows 端上报 user activity)
变更记录
| 日期 | 内容 |
|---|---|
| 2026-05-04 | 初版:etherwake + ssh + ping 三件套概念 |
| 2026-06-03 | 完整落地:5 个 switch + 5 个 script + ping binary_sensor,从 HA 实际配置回写 |