HomeAssistant + 向日葵智能插座实现PC优雅远程开关机

为了能让我更方便的在床上推旮旯game,我购入了一个向日葵智能插座,但官方APP的体验用起来有点鸡肋,于是就想着把插座接入HomeAssistant(下文简称HA),再配合上HA的一系列自动化脚本,实现了非常舒服的开关机流程,水篇文章记录一下吧

安装&配置HA

先把镜像拉下来一把唆(需要2GB左右存储空间)

1
docker pull homeassistant/home-assistant:stable

用docker compose方便些

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
homeassistant:
container_name: homeassistant
image: homeassistant/home-assistant:stable
volumes:
- ./config:/config
# - /etc/localtime:/etc/localtime:ro 我的设备是openwrt 不存在localtime文件
- /run/dbus:/run/dbus:ro
restart: unless-stopped
privileged: true
network_mode: host
environment:
TZ: Asia/Shanghai

8123端口进HA后台,进行一些简单的配置,这里不赘述了

进入容器根目录

1
2
docker exec -it homeassistant bash
cd ..

执行以下命令安装HACS应用市场

1
wget -O - https://get.hacs.xyz | bash

执行完毕后重启HA 就能在侧边栏看到HACS了

image-20251205124531468

在HACS内搜索sunlogin,添加向日葵自定义集成

安装完成后,进入HA 设置 > 设备与服务 > 添加集成,并搜索 sunlogin,登录你的向日葵账号,添加你在向日葵APP内绑定的插座即可

配置自动化

开关插座电源

我的思路是:当电脑的IP地址ping不通,且如果插座开关为开启状态时,就认为电脑已关机,并关闭插座开关。反之则认为已开机,开插座(如果你的插座具备功率统计功能,可以依据接入的功率判断)

添加一个ping的集成,地址设为你电脑的IP地址

HA设置->自动化与场景->自动化这么配(开插座大同小异,依葫芦画瓢即可)

image-20251205130833045

远程开关机

开机可以走AC Recovery来电自启,插座通电时电脑也一起开

远程关机实现有点麻烦,如果想完全脱离向日葵APP,需要在电脑上配置一个Python脚本来监测HA发送的字符串,若匹配则执行shutdown关机,这里放个示例代码(来自Gemini3),大家可根据需要修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import socket
import os
import sys

# 配置
HOST = '0.0.0.0' # 监听所有网卡接口
PORT = 8888 # 监听端口
SECRET_CMD = "SHUTDOWN_NOW" # 你的暗号

def start_server():
# 创建 TCP Socket (IPv4)
# SOCK_STREAM 代表 TCP,SOCK_DGRAM 代表 UDP。TCP 更可靠。
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try:
# 绑定端口
s.bind((HOST, PORT))
s.listen(1) # 开始监听,最大排队数为1
print(f"✅ 服务已启动,正在监听端口 {PORT}...")
print(f"⏳ 等待 Home Assistant 发送指令: {SECRET_CMD}")

while True:
# 阻塞等待连接
conn, addr = s.accept()
with conn:
print(f"🔗 收到连接请求,来自: {addr}")

# 接收数据 (一次最多 1024 字节)
data = conn.recv(1024)
if not data:
continue

# 解码并去除空白字符
received_cmd = data.decode('utf-8').strip()
print(f"📩 收到内容: {received_cmd}")

# 核心判断逻辑
if received_cmd == SECRET_CMD:
print("⚠️ 验证通过!正在执行关机指令...")
# 发送回执给 HA (可选)
conn.sendall(b"OK, Shutting down...")

# 执行 Windows 关机命令
# /s = 关机, /t 5 = 延迟5秒, /c = 注释
os.system('shutdown /s /t 5 /c "Home Assistant 请求关机"')

# (可选) 收到命令后退出循环,结束脚本?
# 通常为了稳定性,建议不退出,继续监听,除非重启清空
else:
print("❌ 指令错误,忽略。")
conn.sendall(b"Error: Wrong Command")

except OSError as e:
print(f"❌ 端口绑定失败 (可能端口被占用): {e}")

if __name__ == "__main__":
start_server()

在HA的configuration.yaml文件内增加这么几行(注意替换IP地址)

1
2
shell_command:
trigger_pc_shutdown: 'python3 -c "import socket; s=socket.socket(); s.settimeout(2); s.connect((\"192.168.1.5\", 8888)); s.send(b\"SHUTDOWN_NOW\"); s.close()"'

到Windows防火墙把Python设为允许入站

HA设置->自动化与场景->脚本内添加一个脚本

image-20251205130228652

执行动作没问题即可

然后把Python脚本设为开机自启(可以把拓展名改为.pyw无界面运行)

在HA的APP内配置一下磁贴,走通知栏远程开关机

Screenshot_2025-12-05-13-15-33-10_9d26c6446fd7bb8

感谢将向日葵插座接入HA的开发者大佬

https://github.com/cx3Y/sunlogin