背景

女儿经常捣蛋关掉爸爸的台式电脑(上面虚拟机跑着集群),防不胜防,爸爸只好放大招了,使用Siri语音控制台式电脑开关机,物理关机键已被架空。当然,女儿再按关机键爸爸还会装作生气的样子让她开心地”得逞”。注意:最简单最好的方案是使用WOL协议+etherwake,因为我的电脑没有PCIe网卡和有线网络(目前使用的是USB外置的wifi接收器),只好另寻出路。

准备材料

  • 树莓派4b x1
  • NodeMCU x1
  • 5V光耦隔离继电器 x1
  • USB线供电线 x1
  • 杜邦线 若干
  • 面包板 x1

安装树莓派系统

树莓派4b刷上官方64位系统

64位系统下载:http://downloads.raspberrypi.org/raspios_arm64/images/

使用官网安装工具安装系统:https://www.raspberrypi.org/software/

树莓派需要安装服务

  • Docker
  • HomeAssistant
  • MQTT

难点克服

因手上的5V光耦隔离继电器不支持Relay,无法实现点击操作。电脑主机的开机动作是,按下开机按钮,然后马上松手。对应PWR跳线大概是短接一秒左右。如果通过switch控制高低电平输出,效果会变成长按。因此我摸索出了一个解决方案,添加一个触发事件,当检测到PC是打开状态是,则将其关闭。相当于控制一盏台灯,一旦检测到台灯亮了马上出发出关灯指令,那么台灯只会闪烁一下,实现类似Click的效果。

NodeMCU刷入ESPEasy

https://github.com/letscontrolit/ESPEasy 下载固件release,自带FlashESP8266.exe刷机工具,固件文件后缀为.bin

打开手机连接NodeMCU的wifi名称为ESP-Easy 密码为configesp

浏览器输入地址 http://192.168.4.1/ 即可进入设置页,然后设置NodeMCU选择要连接到路由器的wifi,输入密码,点击连接,会进入连接倒计时。

记住这个路由器分配给NodeMCU的IP地址,可以在路由器上进行IP绑定,避免每次重新连接是分配不同的IP地址。

此时NodeMCU自身的wifi热点可以关闭了,它已经连接上路由器,我们可以连接路由器分配给NodeMCU的IP即可进入NodeMCU的管理界面。

然后配置MQTT:

配置GPIO开关:

配置说明:

此时NodeMCU会订阅MQTT服务的消息,当接收到值为1的消息,将GPIO-12(D6)引脚置为高电平,当接收到值为0的消息,将GPIO-12(D6)引脚置为低电平。

当需要控制电脑开机时,触发一个值为1的MQTT消息,随后马上触发一个值为0的MQTT消息,那么GPIO-12(D6)状态变化是低电平->高电平->低电平,对应继电器是断开->闭合->断开,对应PWD跳线则是短接了一瞬间(跟用手去按一下物理开机键效果一致),从而实现了开机(关机也一样)。

接线

USB线接主机背后的USB口,另一端接NodeMCU进行供电

主机PWD跳线一根接继电器的COM端,另一根接继电器的NC/NO端(高低电平触发)

继电器VCC接NodeMCU的VIN

继电器GND接NodeMCU的GND

继电器IN接NodeMCU的D6

效果如下:

安装HomeAssistant

先安装Docker:

sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
 
 echo \
  "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
  sudo apt-get update
  
  sudo apt-get install docker-ce docker-ce-cli containerd.io
  
  sudo docker run hello-world

安装MTQQ服务:

sudo apt-get update
sudo apt-get upgrade -y

#安装mosquitto
sudo apt-get install mosquitto

#设置用户和密码,这里用户为mqtt
sudo mosquitto_passwd -c /etc/mosquitto/pwfile mqtt

#设置开机启动
sudo /etc/init.d/mosquitto enable

配置MTQQ:

sudo vim /etc/mosquitto/conf.d/mqtt.conf

port 1883
listener 1884
protocol websockets
allow_anonymous false
password_file /etc/mosquitto/pwfile

启动MQTT服务:

sudo /etc/init.d/mosquitto start

然后执行以下脚本安装HomeAssistant:

https://github.com/home-assistant/supervised-installer/blob/master/installer.sh

配置HomeAssistant:

vim /usr/share/hassio/homeassistant/configuration.yaml

# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:

# Text to speech
tts:
  - platform: google_translate

group: !include groups.yaml
# automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
homekit:
  - name: Tenhan-HASS

mqtt:
  broker: 192.168.xx.xx
  port: 1883
  username: mtqq
  password: xxxxx
  discovery: true
switch:
  - platform: mqtt
    unique_id: "switch.dian_nao_zhu_ji"
    name: "电脑主机"
    state_topic: "ESP_Easy/switch_pc/switch01"
    command_topic: "ESP_Easy/gpio/12"
    payload_on: "1"
    payload_off: "0"
    state_on: "1"
    state_off: "0"
    optimistic: false
    qos: 2
    retain: true
automation:
  trigger:
    - platform: state
      entity_id: switch.dian_nao_zhu_ji
      from: "off" 
      to: "on"
  action:
    - service: homeassistant.turn_off
      target:
        entity_id: switch.dian_nao_zhu_ji
        # Turn off whichever entity triggered the automation.
        #entity_id: "{{ trigger.entity_id }}"

可以通过网页访问HomeAssistant,也可以下载HomeAssistant的app进行连接。

例如浏览器打开:http://<host>:8123

效果如下:

iPhone接入HomeAssistant

打开HomeAssistant后台管理页面

打开iPhone的Home应用,通过扫描HomeAssistant后台管理页的二维码进行接入,按提示操作即可。
接入HomeKit的效果:

通过Siri语音控制开关机

随着滴一声,电脑开机,大功告成。