Trail of Explore🚲.

HA一键睡眠 唤醒PC

Word count: 731Reading time: 3 min
2024/01/08

SELFHOSTED发现了貌似HomeAssistant一键睡眠/唤醒linux的帖子,想着在Windows也试一下

就不用在早上离开被窝开机,睡觉时候离开被窝关机 ;)

虽然说通过RD客户端也可以实现,但是我还是喜欢“一键启动”的方式

docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'
services:
  homeassistant:
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    volumes:
      - ./config:/config
    environment:
      - TZ=Asia/ShangHai
    ports:
      - 8123:8123
    restart: unless-stopped
    privileged: true

一键睡眠/唤醒PC

Ref: https://www.ninjazumbi.com/articles/linux/ha-power-mgmt.html#ha-power-mgmt
1.config添加两个文件
sleep.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# sshpass -p 00294572 ssh Dell@10.10.22.46 "shutdown /h" 需要启用,powercfg /hibernate on,但是会生成休眠文件,占用c盘位置,通过注册表也无法修改
# @See https://superuser.com/questions/1727575/how-do-i-move-windows-11-64-bit-page-and-hibernation-files
sshpass -p 00294572 ssh Dell@10.10.22.46 "rundll32.exe powrprof.dll,SetSuspendState 0,1,0"

# https://superuser.com/questions/42124/how-can-i-put-the-computer-to-sleep-from-command-prompt-run-menu
# 这段命令使用 rundll32.exe 运行 powrprof.dll 动态链接库中的 SetSuspendState 函数,该函数用于将系统置于挂起状态(睡眠或休眠)。
# 具体地说,这个命令的参数是:
# powrprof.dll: 动态链接库的名称。
# SetSuspendState: 包含在 powrprof.dll 中的函数名,用于设置系统的挂起状态。
# 0,1,0: 是传递给 SetSuspendState 函数的参数,分别表示:
# 0: 保留参数,通常为 0。
# 1: 设置挂起状态(1 表示挂起,0 表示休眠)。
# 0: 保留参数,通常为 0。
# 因此,这个命令的目的是将系统置于挂起状态,具体是休眠还是睡眠取决于操作系统的配置和支持。这种方式通常在 Windows 中用于将计算机置于睡眠或休眠状态

wake.sh

1
2
#!/bin/bash
wakeonlan -i 10.10.22.254 C0-25-A5-BC-A9-F1

2.configuration.yaml添加配置

1
2
3
shell_command:
  sleep_script: /config/sleep.sh
  wake_script: /config/wake.sh

3.scripts.yaml添加配置

1
2
3
4
5
6
7
8
9
10
11
12
pc_sleep:
  alias: pc_sleep
  sequence:
  - service: shell_command.sleep_script
    data: {}
  mode: single
pc_wake:
  alias: pc_wake
  sequence:
  - service: shell_command.wake_script
    data: {}
  mode: single

4.HA添加仪表盘
配置-添加仪表盘-进入仪表盘-添加卡片-点击按钮

5.系统睡眠之后,运行在windows的HA就无法被调用,此时可以用Wake On Lan 安卓应用配置开启

使用代码也可达到一样的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import socket
import struct

def wake_on_lan(mac_address):
# MAC 地址转换为二进制格式
mac_bytes = bytes.fromhex(mac_address.replace(':', '').replace('-', '').replace('.', ''))

# 构造 Magic Packet
magic_packet = b'\xFF' * 6 + mac_bytes * 16

# 创建 UDP Socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
# 设置广播地址
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

# 发送 Magic Packet 到 UDP 9 端口, 修改broadcast广播地址 例如192.168.31.0/24的广播地址为192.168.31.255, 把主机位置1即可
s.sendto(magic_packet, ('<broadcast>', 9))

# 用法示例:唤醒 MAC 地址为 C0:25:A5:BC:A9:F2 的设备
wake_on_lan('C0:25:A5:BC:A9:F2')

image.png
image.png

image.png
image.png

CATALOG
  1. 1. 一键睡眠/唤醒PC