场景
以前写过一个安卓app可以远程操作家里旧手机给电脑发wake-on-lan数据包触发远程开机,最近用上了米家的智能家居,想把远程开关机集成到米家里,同时又不想买米家的开机卡
碰壁
首先研究了Home Assistant,部署完了对接米家的时候发现只能单向用ha操作米家设备,这不是和我的需求反了吗
然后看了一下小米iot平台开发者账号,发现要企业资质才能申请😓
问gpt,给了一个用脚本模拟米家设备的方案,会顶替掉一个设备😓
今天下班不死心在网上搜,突然看到一个知乎文章,发现还有这种好东西
折腾
巴法云
先注册巴法云账号,然后点按钮切到mqtt设备云并新建一个设备,此处设备命名后缀代表了设备的类型,参考
创建一个设备,该设备的名字代表了后面mqtt协议的频道,然后可以给设备自定义一个昵称,这个名字是米家关联后的设备名字
在该页面左上角可以看到密钥,点击显示复制出来,可以用mosquitto_sub订阅mqtt,接收消息
termux
然后是termux,研究ha的时候就给旧手机装好了,其实不用proot也可以用,但是之前已经装好了那就拿着用了
我用的脚本如下
#!/bin/bash
ID="{secret}" # 用自己的替换
TOPIC="{topic}"
HOST="bemfa.com"
PORT=9501
mosquitto_sub -h "$HOST" -p "$PORT" -i "$ID" -t "$TOPIC" | while read payload
do
ts=$(date +"%Y-%m-%d %H:%M:%S")
echo "[$ts] $payload" > $TOPIC.log
if [[ "$payload" == "on" ]]; then
wakeonlan 01:02:03:04:05:06
elif [ "$payload" == "off" ]; then
ssh device "shutdown /s /t 30 /f" # 需要配置 ssh config
fi
done
运行脚本后会阻塞,此时如果在巴法云管理页面上可以看到订阅者:在线 1,如果在网页上推送消息,则log文件中会打印推送的消息
米家
在米家app中找到 我的 > 添加其他平台 > 巴法
输一下账号密码,然后会看到设备(需要是巴法云上名字符合后缀要求的设备,否则不会同步到米家),看到后就可以退出来了
使用
触发开关机首先可以用语音操作小爱同学打开电脑,这儿的电脑是巴法云里设置的设备昵称,触发之后会给mqtt推送一条消息on
然后可以使用米家操作按钮开关,但是米家里是看不到这个设备的,所以要用到自动化/手动控制去控制小爱音响,设备选择小爱音响,动作选择自定义,然后写打开电脑,就可以触发巴法云的mqtt推送了,延迟基本上在1秒左右