long long ago,我在某多多花了1分钱买了个普普通通小夜灯。订单里它长这样

小夜灯订单

等小夜灯送过来一看,嘿,它的确长这样,真是出乎我的意料。 小夜灯

不过现在我不是要夸奖商家是多么的童叟无欺,看一下标题,我要介绍一下怎么用苹果设备上的 Siri 来通过语音控制这个小夜灯的开关。

第一阶段(手动控制)

这个小灯只暴露了一根USB接口线来作为电源输入方式,没有电池,本身也没有控制小夜灯的开关。使用方式为USB线接上电就亮,断开就不亮,逻辑很简单。 每当夜幕降临,拿出我祖传的“五福一安”充电器,插在寸土寸金的插板上,把小夜灯的 USB 线插在充电器上,然后小熊亮了。许久以后,我困了,不想耍手机了,要睡了,就得从床上爬起来,把小夜灯的 USB 线断开,然后去睡觉。

麻烦! 但我很长时间以来都是这么用的。

第二阶段(Siri控制)

当我说出通过 Siri 语音控制小夜灯的时候,你们一定好奇一个点,那就是 Siri 跟小夜灯怎么进行交互?我也不卖关子,就是通过树莓派(Raspberry Pi)。

某天我想开小夜灯的时候,看着小夜灯的USB线突发奇想,我还有一台吃灰的树莓派啊,能不能把它利用起来更加方便地控制小夜灯? 也就是在同一瞬间,一个解决方案浮现在脑海,这个解决方案最终达到的效果是可以通过苹果设备的Siri直接语音控制小夜灯的开关。 通过Siri控制小夜灯的开和关,需要先把小夜灯的USB线插在树莓派上,并且树莓派要连上网。我设想的具体流程是这样的。

  1. 对苹果设备说“Hey Siri,打开小夜灯”
  2. Siri 被唤起,并根据“打开小夜灯”指令匹配到事先添加好的快捷指令
  3. 苹果设备执行“打开小夜灯”快捷指令,这个快捷指令只有一个操作,就是通过网络连接到树莓派,并向树莓派发送一个指令
  4. 树莓派通过执行收到的指令来控制其USB口电源的开关,这样就做到了小夜灯电源的开关。

以上这4个步骤中,1、2、3没有问题,之前做过,我知道链路是通的。关键就在于第4步,之前没了解过树莓派是否可以控制其USB口的电源开关,但我还是持有乐观态度,我认为八成可以。

树莓派控制USB口电源

经过网上冲浪,我找到了通过uhubctl来控制树莓派USB口电源的方法。以下操作均在我的树莓派4B(Debian 10)中执行,其他型号的树莓派请自行确认是否适用。

  1. 检查4B的EEPROM固件版本,固件版本不能低于000137ad
    sudo rpi-eeprom-update
    

    固件版本

  2. 安装 uhubctl,版本最好不低于2.4.0。一开始我通过apt-get安装的,版本并不是最新的,导致控制失败(失败的现象是USB电源切断后又迅速恢复)。 后来我找到了uhubctlgithub仓库,然后通过源码编译安装最新版。 编译安装前需要先安装libusb-1.0
    sudo apt-get install libusb-1.0-0-dev
    

    然后获取源码并编译

    git clone https://github.com/mvp/uhubctl
    cd uhubctl
    make
    

    安装在/usr/sbin/uhubctl

    sudo make install
    

    据说安装完需要重启一下树莓派,但是我没有重启也没问题。

  3. uhubctl安装完毕,来试一下它是否好用。把小夜灯插在树莓派的任意USB口中。刚插上去后小夜灯亮了,说明USB供上电了。我们来关闭试一下
    sudo uhubctl -l 2 -a off
    

    执行指令后看到小夜灯关闭了,说明USB口电源被切断了。由于树莓派的USB拓扑结构,4个USB端口的供电是统一控制的,上面这个指令关闭了4个USB端口的电源。 我们再来打开试一下

    sudo uhubctl -l 2 -a on
    

    可以看到小夜灯又亮了。 成功!

  4. 还剩最后一步,在苹果设备上创建2个快捷指令,一个叫“打开小夜灯”,一个叫“关闭小夜灯”,每个快捷指令里分别有个“通过SSH运行脚本”的操作。 配置方式如图(请确保在系统设置里给快捷指令“允许运行脚本”的权限) 配置快捷指令 由于我配置的主机地址为局域网ip,所以需要将苹果设备与树莓派连接在同一个局域网下才能进行控制。当然也可以通过其他手段(公网ip接入、内网穿透)来实现通过公网控制,就不必在同一个局域网下了。
  5. 完成以上步骤,就可以通过“Hey Siri,打开小夜灯”和“Hey Siri,关闭小夜灯”来打开和关闭小夜灯了。比原先方便多了。

改进方向

后续可以改进小夜灯的供电接口,以通过树莓派的GPIO引脚进行控制,毕竟通过切换树莓派的4个USB口电源来控制小夜灯不那么优雅。不过由于USB口暂时只有这一个小夜灯在用,所以还可以,问题不大。

REFERENCE