Home assistant+Macrodeck+Home spot cube实现远程智能控制电脑开关机
一、Home spot cube
家里台式机所在位置没有网口,使用无线网卡上网,台式机是一台零刻SEi12小主机,挂在显示器背面,开机比较不方便,想过用esp32板子来实现智能遥控,但要改造机器,略显麻烦,想着以最小成本、相对简单的办法实现,网口平时用不着不如用来挂个小路由器来实现,手上还有三个小路由Home spot cube,正好废物利用下,前几年不想买无线网口,就是拆出板子挂机箱旁边当无线网卡用,Home spot cube原版系统是日语的使用不方便,以前已经刷成totolink N500R,支持无线中继,设置成无线中继后,lan口插网线接电脑网口,硬件环境部分就完成了,零刻的小主机bios里没有网络唤醒开关选项,默认已经开启网络唤醒,也不用做任何设置。
二、Macrodeck
电脑开机通过网络唤醒功能来实现,而关机就要在电脑上装有相应的软件来进行远程关机,实现方法有非常多,因为刚折腾了macrodeck,客户端是用一部老旧手机红米5A改成桌面控制台,里面已经设置了一个关机宏命令,可以在关机前先关掉桌面控制台上的macrodeck客户端,控制台上的智能家居控制面板app切到前台,所以我自然而然的选择macrodeck来实现。
关于macrodeck的使用其实也能另开一篇,这里简单介绍下我实现开关机这件事上的实现效果和思路,开机时实现自动启动桌面控制台(红米5A手机)上的客户端,关机时先关闭桌面控制台上的客户端,桌面控制台显示智能家居控制界面,这里电脑控制手机都是通过adb命令来实现的,手机设置成开机自动开启无线调试并且是固定ip上网,在电脑开机启动中添加一个脚本,用于执行adb命令,远程开启macrodeck客户端,这样实现了开机时桌面控制台自动切到macrodeck客户端,关机功能在macrodeck里设置一个宏,也是通过脚本实现先通过adb远程关闭客户端,再关闭电脑,这样通过macrodeck客户端进行关机时就可以先关客户端再关电脑,但直接通过电脑系统关机功能关机无法关闭客户端,尝试过几种系统关机时执行指定脚本,都没有成功,有知道实现办法可以评论区留言,谢先。
创建以下四个文件:

run-macrodeck-client.bat内容,按自己的环境进行修改:
@echo off #adb工具所在目录 cd D:PortableAppadb #连接手机无线调试服务,根据自己的ip和端口进行修改 .adb connect 192.168.31.209:5555 #启动macrodeck客户端 .adb -s 192.168.31.209:5555 shell am start -n com.suchbyte.macrodeck/.MainActivity
run-macrodeck-client.vbs内容,作用是运行上面bat脚本时不显示命令行窗口:
CreateObject("WScript.Shell").Run "run-macrodeck-client.bat",0
stop-macrodeck-client.bat内容,远程关闭客户端并关闭电脑:
@echo off cd D:PortableAppadb .adb connect 192.168.31.209:5555 #远程关闭客户端 .adb -s 192.168.31.209:5555 shell am force-stop com.suchbyte.macrodeck #启动智能家居控制面板fully kiosk browser .adb -s 192.168.31.209:5555 shell am start -n de.ozerov.fully/.FullyActivity
stop-macrodeck-client.vbs内容:
CreateObject("WScript.Shell").Run "stop-macrodeck-client.bat",0
然后把run-macrodeck-client.vbs的快捷方式放到系统的开机启动目录,实现电脑开机后启动远程客户端,再在macrodeck里添加一个关机按钮的宏指令,按下时执行stop-macrodeck-client.vbs进行关机操作,实现先关闭远程客户端在关闭电脑。
这里要实现Home assistant智能控制关机,就是通过调用macrodeck宏指令来实现,这一步最为困难,因为没有现成的home assistant集成或脚本,需要自己写脚本,而macrodeck官方也没有提供通讯协议、api和相关文档,需要深入研究源码分析通讯协议,好在现在有AI工具,可以帮我们轻松分析和写代码,官方有提供一个网页客户端,看了一下网页源码,发现客户端的实现主要在http://web.macrodeck.org/js/client.js 这个JavaScript文件里,把这个网址丢给AI,让它帮我们分析通讯协议,然后让它帮忙写出连接服务端和调用宏命令的JavaScript源码,然后利用在线执行JavaScript工具(https://www.wetools.com/js-run )进行测试修改,直至成功实现所需功能,调试时可以修改电脑端macrodeck快捷方式,在目标栏部分在命令的后面添加参数--debug-console,然后重新运行,可以开启一个调试窗口,方便查看代码调用运行结果,方便调试。
成功后得到是JavaScript源码,但home assistant的shell环境无法执行,需要让AI帮忙转换成python代码,因为hass是基于python开发的,有运行环境,转换后上传到hass上测试,成功运行后,接下来就是在hass上添加一个开关实体。
三、Home assistant
要通过hass进行远程控制电脑开关机,首先需要在hass添加一个开关实体,这个开关实现三个功能:开机,关机,电脑开关机状态。
1. 开机
开机通过电脑网络唤醒功能实现,所需硬件环境第一部分已准备好,hass通过安装wol集成,输入电脑有线网口的mac地址生成一个按钮实体,执行该实体的按下操作就会发送幻数据包开启电脑。
2. 关机
第二部分已准备好调用macrodeck关机宏命令的python脚本文件,将脚本文件用hass的文件编辑器上传到/config/scripts目录,config目录就是对应文件编辑器内的/homeassistant目录,目录内没有scripts目录的话,可以新建一个,上传后,编辑configuration.yaml文件,添加以下内容:
shell_command: turn_off_pc: "python /config/scripts/macrodeck_shutdown_pc.py"
python脚本:
import json import time import websocket import subprocess client_id = "dg4v6r7q5" #长度9个字符,可以随意写,也可以不改直接用 api_version = 20 #api版本号不用改 device_type = "Web" #设备类型,不用改 button_id = "2_5" #客户端里各按钮的坐标编号,第一个数字是行号,从上往下从0开始,第二个数字为列,从左往右从0开始,此参数用于告诉服务端执行哪个宏命令,按自己具体情况进行修改 def call_macrodeck(): try: websocket_instance = websocket.WebSocket() websocket_instance.connect('ws://192.168.31.140:8191/') #服务端ip和端口,按自己实际情况修改 #与服务端建立连接 connect_message = { "Method": "CONNECTED", "Client-Id": client_id, "API": api_version, "Device-Type": device_type } websocket_instance.send(json.dumps(connect_message)) #按下按钮 def button_press(id): press_message = { "Method": "BUTTON_PRESS", "Message": id } websocket_instance.send(json.dumps(press_message)) button_press(button_id) time.sleep(1) #放开按钮 def button_release(id): release_message = { "Method": "BUTTON_RELEASE", "Message": id } websocket_instance.send(json.dumps(release_message)) button_release(button_id) #断开连接 websocket_instance.close() return True except Exception as e: print(f'连接 MacroDeck 出错: {e}') return False call_macrodeck()
以上代码只要修改button_id和服务端ip及端口即可,整个过程就是模拟按下按钮的操作。
3.电脑开关机状态
电脑开关机状态的检测,是通过hass的ping集成功能实现的,添加ping集成输入电脑ip地址会生成一个设备和两个实体,两个实体一个是设备跟踪,一个设备是否在线状态,我们通过是否在线来判断开关机状态。


添加开关实体
以上完成后,就是添加一个开关实体,开关实体是通过创建辅助元素来生成的,在列表中选择template--》开关模板,输入名称,我这里输入“电脑“,其他参数如下第二张图所示,然后提交完成添加开关实体。


参数说明:
值模板:这几行template代码意思是根据前面生成的ping实体的是否在线状态来设置开关实体的开、关状态,在线就是开关已打开,不在线就是开关为关状态。
开启时的动作:开关实体打开时调用wol实体的按下动作进行开机。
关闭时的动作:开关实体关闭时调用前面设置的shell命令来关机。
设备:放空,这是一个独立的虚拟开关,不用关联其他设备。
现在可以到hass的lovece界面添加开关实体按钮来控制电脑开关机,如果需要小爱同学语音控制,可以通过巴法平台,将这个开关实体导到米家进行语音控制,如果想要一个实体按钮来开关机,可以搞个无线开关,我这里利用桌面控制台(红米5A手机)的音量实体键,配合macrodroid和tasker的hass插件来实现长按音量键进行开关机。
至此远程智能控制电脑开关机已实现,开关机操作方式非常多样,实体键、手机语音、智能音箱、触摸屏幕均可以进行开关机,后续还可以按照需求与其他设备进行联动,也可以在现在的基础上进行修改、添加实现更多远程控制电脑的操作。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
