使用叮当声控智米电风扇

感谢 hahack42 的投稿。作为一个完全开源的智能音箱项目,叮当也能够很方便的接入其他智能家电,并声控它们。本文将介绍如何使用叮当声控智米电风扇。

前言

dingdang-robot (以下简称“叮当”),是我在今年5月20号开源的一个基于树莓派的中文智能音箱项目。

起初,我只是抱着一个好玩的心态做这个项目,并不期望这个项目能得到多少关注。然而,随着 QQ 用户群人数的不断壮大,越来越多的朋友安装了叮当,并且真正将它投入在了日常的使用上。很多朋友也提出了各种好玩的建议、想法,甚至为叮当贡献了插件或者捐赠了这个项目,让我觉得这个项目是很有价值的,也让我知道,我能做的还有很多东西。因此,我并不是开源了叮当之后就撒手不管了,而是利用业余时间不断完善叮当,又陆续发布了 8 个小版本,使得叮当在响应速度和功能丰富程度上都有了很大提升:

自 v0.1.1 起,邮件通知也增加了 echo 功能,用户可以发送带 [echo] 前缀的邮件给叮当接入的邮箱,从而实现让叮当朗读标题的消息,而不是提醒有新的邮件。利用这个功能,可以很方便地和 ifttt 结合,当满足某个条件时让图灵通知这个事件。例如,我将 ifttt 的 Date & Time 触发器和 Email 做了联动,实现定时在每天晚上 11 点发送邮件通知我睡觉;

前缀的邮件给叮当接入的邮箱,从而实现让叮当朗读标题的消息,而不是提醒有新的邮件。利用这个功能,可以很方便地和 ifttt 结合,当满足某个条件时让图灵通知这个事件。例如,我将 ifttt 的 Date & Time 触发器和 Email 做了联动,实现定时在每天晚上 11 点发送邮件通知我睡觉; 自 v0.1.2 起,叮当的响应速度有了很大提升;

v0.1.3 增加了 snowboy 离线唤醒 STT 引擎,目前有 PocketSphinx 和 snowboy 两套离线唤醒引擎可供选择;

v0.1.4 增加了 SendQR 插件,可以让叮当将微信的登录二维码发送到邮箱。@hhao 也给叮当写了个可以获取二维码图片文件的服务器插件。另外,邮箱增加了 [control] 前缀支持,用户可以发送带 [control] 前缀标题的邮件,该标题里的内容会被当成一句指令交给叮当执行,从而实现类似微信的远程控制叮当的功能;

前缀支持,用户可以发送带 前缀标题的邮件,该标题里的内容会被当成一句指令交给叮当执行,从而实现类似微信的远程控制叮当的功能; v0.1.5 开始,可以微信控制音乐播放了;

v0.1.7 开始,所有插件都可以通过在插件配置里头通过 enable 选项开关;

选项开关; 叮当的官方+第三方插件数量由 6 个增加到了 13 个。

除了完善已有的功能,我也正试图让叮当往智能家电控制中心的方向上发展。

如今很多智能音箱除了用来听歌对话之外,还扮演了家庭中的一个控制中心的角色。不过,由于各家采用的接入协议有所区别,A 家的智能家电并不见得能得到 B 家的智能音箱的支持。而由于叮当是开源的项目,对其进行定制,接入控制家电所需的协议,从而实现声控大部分的智能家电是完全可能的。今天我就分享一下如何用叮当控制智米电风扇。

智米风扇声控插件

先上视频。这个视频演示了使用叮当实现对智米风扇的电源开关、摇头开关、自然风开关、风量调节、预约关机的声控:

插件的主页:https://github.com/wzpan/dingdang-smart-mi-fan 。

安装插件

先安装 python2-miio :

pip install python2-miio

之后,克隆本项目到任意目录:

sudo git clone https://github.com/wzpan/dingdang-smart-mi-fan.git

再将里头的 SmartMiFan.py 拷贝至 /home/pi/.dingdang/custom 目录。

cp dingdang-smart-mi-fan/SmartMiFan.py /home/pi/.dingdang/custom/

如果没有 custom 目录,就先创建它然后再执行上面的拷贝命令:

mkdir /home/pi/.dingdang/custom

然后,确保你的智米电风扇已开机并和叮当所在的机器处于同一个局域网下。然后执行以下命令获取风扇的 host 和 token :

miio2 discover

最后在 /home/pi/.dingdang/profile.yml 中添加如下配置:

# 智米风扇 smart_mi_fan: host: “192.168.1.106” token: “32e9af2050bc9d6f599c061733effee0” angle: 60 # 摇头的角度范围。可选值为 30/60/90/120

完成后重启叮当即可使用本插件。

指令列表

指令 相同指令 用途 打开风扇 启动风扇 打开风扇 关闭风扇 – 关闭风扇 开启自然风 启动自然风 切换到自然风模式 关闭自然风 关闭自然风 切换到普通模式 开始摇头 开启摇头 开始摇头 停止摇头 结束摇头,关闭摇头 结束摇头 加大风速 加快风速,加大风量,加大风力 加大风扇转速 减少风速 减慢风速,减少风量,减小风力 降低风扇转速 $num $unit 后关闭风扇 $num 是数字, $unit 可以是秒/分钟/小时 预约关机

开发心得

下面说说开发心得。小米的智能家电使用的是 miio 协议。在编写这个插件之前,我先试用了 @homeassistantchina 提供的 HomeAssistant 的智米风扇插件 smart_mi_fan.py,这个插件在 HomeAssistant 里头的体验非常不错:

通过阅读这个插件,我发现这个插件依赖了一个封装了 miio 协议的 Python 3 的库 python-miio 。再阅读 python-miio 的源码,可以发现这个库就是通过 socket 来实现和家电的通讯的。整个发送消息的逻辑写成了一个 send 函数:

def send(self, command, parameters=None)

使用这个函数非常简单,只需要传入要发送的指令即可。

通过阅读 smart_mi_fan.py 的源码,不难发现 miio 的指令主要是两个类型:

获取属性。获取风扇的温度、角度、电源、风速等属性。通过发送 get_prop 指令并带上需要获取的属性名即可得到这些属性的值。具体有如下这些: temp_dec :温度;

:温度; humidity :湿度;

:湿度; angle :角度;

:角度; speed :风速;

:风速; poweroff_time :预约关机的时间(秒);

:预约关机的时间(秒); power :是否开机;

:是否开机; ac_power :是否使用交流电供电;

:是否使用交流电供电; battery :电池剩余电量;

:电池剩余电量; angle_enable :是否摇头;

:是否摇头; speed_level :正常风风速等级;

:正常风风速等级; natural_level :自然风风速等级;

:自然风风速等级; child_lock :儿童锁;

:儿童锁; buzzer :是否有声音反馈;

:是否有声音反馈; led_b :LED指示灯的亮度。 设置属性。设置某个属性的值。通过发送 set_属性名 指令并带上值即可对该属性进行控制。

了解了这个套路后,我只需要照着写一个叮当的插件,即可实现让叮当声控智米风扇的目标。

不过,在完成这个目标前,我还遇到了一个问题:python-miio 只能在 Python 3 环境中使用,而叮当是使用 Python 2 编写的。于是我对 python-miio 进行了 Python 2 版本的移植,发布为 python2-miio 。为了避免两个版本的 miio 命令行工具冲突,我把 python 2 版本的 miio 更名为 miio2 。

插件的编写过程也很轻松,和写其他的叮当插件一样的套路,所以整个插件我只用了一个晚上的时间就写好了。如果你看过我之前写的一篇编写叮当插件的教程《手把手教你编写叮当机器人插件》,那么阅读风扇声控插件的源码也不会很困难,这里就只放上源码链接:https://github.com/wzpan/dingdang-smart-mi-fan/blob/master/SmartMiFan.py。

最后就是插件的发布问题。考虑到这个插件比较私人——大部分用户并没有智米风扇,因此我并没有把它丢进 dingdang-contrib 中,而是单独创建了一个仓库来托管。对于需要使用这个插件的人,只需要将它放到个人的插件目录 /home/pi/.dingdang/custom 中,即可让该插件生效 。这样的好处是无需改动 contrib 目录,也不会影响 contrib 目录的更新。

原文 hahack.com