米家通过HomeAssistant控制笔记本电脑开关机
- 配置HomeAssistant
- 配置EMQX mqtt
- 自动化配置
- 电脑关机实现
- 电脑开机实现(网络唤醒WOL包)
环境准备:
- HomeAssistant:能配置接入米家的设备,我这里采用fnos安装
- MQTT服务器:可以使用免费的云服务器或则本地安装都可以,我这里采用本地搭建emqx
- 米家:有可以控制的设备
- 电脑(支持网络唤醒不支持的电脑)
配置HomeAssistant
首先是使用fnos安装配置HomeAssistant
安装好后直接进入后台配置相关账户,因为飞牛os商店里面安装的HomeAssistant无法接通米家的设备,这里还需要通过安装hacs来实现控制米家设备和获取米家设备状态,打开docker的HomeAssistant控制台输入以下指令并重启就可以安装成功了
bash
// 下载并安装hacs
wget -O - https://get.hacs.xyz | bash -
// 重启
reboot
然后通过hacs安装Xiaomi Miot Auto来添加米家设备
然后我们添加集成米家设备
然后选择模式接入即可获取设备信息,这里有三种接入模式:
- 自动模式:插件定期更新支持本地miot协议的设备,并自动将用户赛选的设备符合条件的型号使用本地链接(推荐)
- 本地模式:继承配置嗦赛选的设备都将使用本地链接,如勾选了不支持本地的miot协议的设备将不可用
- 云端模式:继承配置所筛选的设备都将使用云端链接,建议旧版miio、蓝牙、ZigBee设备使用
然后到这一步HomeAssistant就可以控制我们的米家设备了,还可以获取米家设备信息,这里推荐一篇博主的配置HomeAssistant,他的教程会详细很多而且文章附带B站UP主视频配置会更加容易操作【小米MIoT设备接入HomeAssistant通用插件教程】,下一步我们需要创建一个mqtt服务器
配置EMQX mqtt
下载镜像
设置端口,这里保持默认
移植下一步然后输入你的IP地址:18083进入后台默认账号密码admin public
然后我们的mqtt就安装好了,下一步配置HomeAssistant的MQTT服务,进入设置添加设备与集成选择mqtt
然后输入你的NAS的IP地址,端口填入1883
然后我们可以通过emqx的后台web调试来测试链接是否成功
自动化配置
然后我们创建一条自动化来实现控制米家控制,这也是关键的一点,我的思路是米家通过控制设备的一个状态让HomeAssistant检测到设备状态,当状态为开就执行开机,当状态为管就执行关机,具体操作如下:
当人在传感器的指示灯被打开就发送mqtt指令on(记住这里的computer_contrl主题,这个对后面的控制关机会用到)
当存在感应传感器指示灯关发送off指令(这里应该是执行网络唤醒程序,看文章后:网络唤醒WOL包)
然后在米家中我们创建两条手动控制指令来控制人在传感器的指示灯的开关
然后我们在emqx中可以订阅computer_contrl这个主题,然后通过米家控制测试是否会被触发,这里实测触发正常,但是非常的缓慢(大概30s),如果您是主要使用HomeAssistant(苹果的homekit)那反应速度会比该种方式要快的过(不知道有没有设置可以调整设备状态的轮询时间),因为HomeAssistant获取米家设备的速度还是比较慢,我测试了直接在网页点击通信响应速度会非常快。
电脑关机实现
既然我们实现了HomeAssistant发送mqtt消息,那接下来我们只需要通过代码去接受mqtt消息然后执行关机指令即可实现控制关机,下面我是用python来实现mqtt通信测试;
1、安装paho-mqtt包
2、测试代码
python
import paho.mqtt.client as mqtt
import time
import os
# MQTT 配置
broker_address = "192.168.10.104" # MQTT 服务器地址
port = 1883 # 端口号,默认为 1883
publish_topic = "computer_contrl" # 发布给HomeAssistant消息的主题
subscribe_topic = "computer_contrl" # 订阅HomeAssistant发送消息的主题
# 当客户端收到来自服务器的CONNACK响应时调用
def on_connect(client, userdata, flags, rc, properties):
if rc == 0:
print("Connected with result code " + str(rc))
client.subscribe(topic=subscribe_topic,qos=1) # 订阅HomeAssistant发送消息的主题
# 订阅成功后调用
def on_subscribe(client, userdata, mid, granted_qos, properties):
print("On Subscribed: Success" + str(granted_qos))
# 在收到消息的时候被调用
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
#这里需要解析发过来的数据,根据自己配置的主题包来定义,可以扩展json格式数据
if str("off") in str(msg.payload):
# os.system('shutdown /r /t 0') # 重启电脑
# os.system('shutdown /s /t 0') # 关闭电脑
os.system('notepad.exe') # 打开记事本
else:
print("off")
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)# 创建客户端实例
client.on_connect = on_connect # 绑定连接回调函数
client.username_pw_set("admin", "password") # emqx可以不设置,如果是其他mqtt服务器需要设置
client.connect(host=broker_address, port=port, keepalive=60) # 连接到MQTT Broker
client.on_subscribe = on_subscribe # 订阅回调
client.on_message = on_message # 收到消息
time.sleep(2) # 等待链接服务器
client.loop_forever() # 开始监听消息
# 断开连接
# client.disconnect()
然后我们创建一个按钮手动触发执行mqtt下发
最终我们收到消息,然后我们通过python就可以做很多事情,这里我演示打开记事本,当然这里语言不重要,只要能链接mqtt什么语言都可以,选择你合适的语言去搞就好了,在这个基础上还可以做很多事,根据发送的消息不同可以打开软件,可以休眠电脑,可以关闭电脑重启电脑都是可以的,然后我们需要做的就是代码在开机自动运行就可以了,具体的操作步骤如下:
- 获取python安装路径:执行python -version(将python.exe替换为pythonw.exe这样开机就不会显示cmd窗口直接后台运行)
- 获取脚本存放路径:右击python脚本文件
- 在任务计划程序中添加执行任务:按win键输入任务计划程序打开即可
我这里做测试没有替换python.exe是为了方便看到是否开机运行脚本状态,如果正常使用记得替换,脚本位置不推荐放在桌面可以根据情况更改位置
取消勾选
保存任务
电脑开机实现(网络唤醒WOL包)
首先我们需要保证电脑以太网卡通过网线链接到路由器(无线网卡不行,关机后无线网卡会掉电无法唤醒),保证和HomeAssistant在同一网关下的路由器,然后使用cmd命令行获取网卡的mac地址,然后打开HomeAssistant的安装的文件夹(不论是docker安装还是服务器安装还是其他闲置电脑安装都会有这个文件),在该文件中添加以下代码(根据IPconfig中获取的信息更改以下代码)
bash
#yaml通过缩进判断变量从属关系,↓属于一级配置,需要顶格,不要留空格!
switch:
- platform: wake_on_lan
name: "Computer" # 定义HA中实体的名称,可任意命名
mac: "9C-6C-80-05-DE-55" # 主机(电脑)的MAC地址
host: "192.168.10.245" # 主机(电脑)地址,可省略
broadcast_address: "192.168.10.255" # 广播地址.不可省略.此处假设路由器地址为192.168.10.1,如为其他网段需要修改
broadcast_port: 9 # 止定wol端口,可省略
然后回到HomeAssistant检查配置无误重启服务(完全重启)
然后我们在卡片中添加实体
然后保存设置,通过点击该按钮就会发送网络唤醒包给设置的mac地址的网卡,因为我的笔记本离路由器太远,网络唤醒实验我没法验证,这里推荐几篇博文自行尝试即可
网络唤醒Wake-on-LAN (WoL or WOL) 设置方法
通过Home Assistant实现远程唤醒WOL
然后在对应的自动化里控制该实体即可实现米家控制远程唤醒了;