
最近,Yandex推出了其智能家居系统。 我们提供购买便宜的Wi-Fi设备的方法:电源插座中的适配器,灯泡和红外遥控器。 有趣的是,“智能”设备的开发人员有机会创建自己的“智能家居”技能,这将使您能够将设备连接到Yandex系统并通过Alice管理其语音。 技能列表上出现了越来越多的新品牌。 爱丽丝非常了解俄语,这使她成为俄罗斯市场语音助手中无可争议的领导者。
但是,并非一切都如此顺利...
首先要减去:基本上,所有提议的系统都是“多云的”。 由于它们的性能直接取决于与制造商服务器的连接质量,因此有时会怀疑它们的可靠性。 而且,当您关闭Internet时,设备将完全变成“南瓜”。
第二点是:脚本系统。 脚本是智能家居的重要组成部分。 在这里,它们是非常原始的:如果“该短语就是如此”,则启用“该设备就是如此”。 对于我的智能家居,这太少了。
缺点并没有就此结束,但是其余的可能性更多与系统的不成熟有关。 Yandex开发团队将继续积极添加各种功能和要编辑的错误,这要归功于它们!
在研究了文档之后,我决定创建Yandex UD技能并将智能家居控制器连接到该技能。 这将使您不必依赖云服务器,无需在控制器上本地实现任何脚本,同时可以通过Alice的语音控制系统。 为此,我在Node.js上编写了插件“ yandex2mqtt”。
一点理论
-爱丽丝,开灯。
这句话之后,魔术发生了,灯亮了。 但是幕后是什么? 让我们弄清楚它们是如何工作的。
Yandex站听到了熟悉的命令后,便将数据发送到Yandex服务器,我们已在该服务器上预先指定了控制器的地址。 服务器处理该信息并将其以后期请求的形式重定向到控制器。 在控制器上,中间API(在我们的示例中为yandex2mqtt插件)处理请求并将其重定向到MQTT主题。 接下来,在Node-Red程序中处理脚本。
红色节点决定下一步该做什么。 如果由脚本提供,则他发送命令以打开相应主题MQTT中的灯。 wb-mqtt-serial驱动程序通过向中继模块发送Modbus命令来响应,该模块将切换中继。 最后,灯亮了! 是的,该路径不是很近,但是对于用户来说,只有几分之一秒的路程。
让我们仔细看看yandex2mqtt插件。 Yandex要求技能才能工作的第一件事是用于在Yandex应用程序中捆绑帐户的oAuth服务。 Yandex从oAuth服务收到授权令牌后,它将请求设备列表。 yandex2mqtt插件以设备列表的形式响应所有具有json格式的属性。 然后它们出现在可用于控制的设备列表中(在所谓的类星体中)。 现在,如果您告诉Alice打开列表中的某个设备,Yandex将向其发送一个Post请求,其中包含他想打开的设备数据。 作为响应,插件确认包含,并将新状态写入同一插件设置中指定的mqtt主题。 如果设备在没有Yandex参与的情况下更改了状态,则插件在mqtt主题中看到了新数据后,将在请求状态时将其发送到Yandex,仅当您在类星体中输入设备本身时,这种情况才会发生。 在其他情况下,Yandex不轮询状态。
现在,我将讨论Yandex UD设备的一些属性。
设备类型
为了在“类星体”中正确显示以及爱丽丝对命令进行更精确的定义,Yandex建议为设备分配不同类型的设备。 共有10种类型:
- devices.types.light-任何灯,枝形吊灯,灯泡等
- devices.types.socket-插座
- devices.types.switch-开关
- devices.types.thermostat-恒温器
- devices.types.thermostat.ac-空调
- devices.types.media_device-媒体设备
- devices.types.media_device.tv-电视
- devices.types.cooking-厨房用具
- devices.types.cooking.kettle-制造商
- devices.types.other-其他与之前段落不符的内容。
能力
而且,每个设备必须至少具有一种
功能 。
Yandex UD总共具有5种技能。 每个技能具有不同的功能
(实例) ,某些技能具有多个此类功能,这在配置设备时增加了灵活性。
能力:1.
devices.capabilities.on_off-打开和关闭。
实例:
2.
devices.capabilities.color_setting-颜色管理。
实例:
3.
devices.capabilities.mode-切换模式。实例:
4.
devices.capabilities.range-范围控制。实例:
5.
devices.capabilities.toggle-静音。实例:
通过正确组合设备的所有属性,Alice可以毫无问题地理解分配给她的用于管理智能家居的所有命令。 当然,在这里结合技巧有些困难。 该文档显然没有指出哪些技能可以组合,哪些不能。 但是“科学oke法”将帮助我们实现这一目标。
因此,例如,我发现空调包含四个技能:
设备类型:
devices.types.thermostat.ac技能类型:
devices.capabilities.on_off实例:
devices.capabilities.range实例:
devices.capabilities.mode实例:
devices.capabilities.mode实例:
我不会描述其余的属性,那里的一切都很简单。
要使其正常工作,您需要:
- 控制者
- 任何域
- SSL证书
- Node.js
- Yandex2mqtt插件
- MQTT经纪人
- 节点红
控制者
我的“智能”公寓是由Wiren Board 6控制的。但是您可以使用任何其他可以拉Node.js和Node-Red的Linux控制器。 例如,Raspberry pi或PC。
域
当然,希望拥有一个白色IP地址并购买一个域,但这不是必需的。 您可以使用
DDNS-例如,
www.noip.com 。
一切都很简单:注册,创建免费的主机名,输入您的IP地址。 某些路由器具有特殊的DDNS设置,您可以在其中输入noip.com数据。 更改后,路由器将自动发送IP地址。 如果路由器中没有此类设置,则可以在控制器上安装noip程序并将其添加到自动运行。 该程序将执行与具有特殊DDNS设置的路由器完全相同的操作-在noip.com数据库中更新您的IP地址
因此,我们有一个静态地址将所有请求重定向到我们的控制器。
端口443和80
现在,几乎每个家庭都有路由器。 除了其明显的功能外,它还成为来自外部有害访客的本地网络的障碍。 但是在某些情况下,我们需要从外部访问内部网络。 路由器制造商对此进行了设想,并添加了NAT(网络地址转换)功能。
我将不介绍设置路由器的时间,因为每个制造商的路由器都不同。 如何执行此操作,请阅读路由器的说明。 Google关键字:端口转发,端口映射,NAT。
必须转发用于访问yandex2mqtt的端口(可以是任何端口,我选择443)和端口80(仅需要获取SSL证书。收到证书后,即可关闭端口80)。
SSL证书
立即将所有点都放在“和”上:自签名证书将不起作用。
大多数域注册商(例如reg.ru)为客户提供针对主域(www.yourdomain.ru)的免费SSL证书。 如果您购买了专门用于Alice的域,则可以使用提供的SSL证书。
如果您没有自己的域,或者为Alice分配了另一个子域(例如alice.yourdomain.ru),则需要获取该子域或DDNS服务提供的地址的证书。
为此,我建议使用免费服务从letsencrypt.org获取SSL证书。
要获得证书,您需要安装certbot程序,运行并指定它要求的所有数据。 同时,端口80应该是免费的并且可以从外部访问,我建议您仔细研究letencrypt的说明。
安装和配置certbotapt-get update apt-get install certbot
停止看门狗和Nginx服务。
service watchdog stop service nginx stop
我们转发路由器中的第80个端口。
运行certbot程序:
certbot certonly --standalone
启动后,程序将询问一些简单的问题。
1.您的电子邮件。 只需输入地址,然后按Enter

2.提示您阅读用户协议。 如果您同意所有内容,请输入“ A”,这表示同意,即我同意。

3.该程序要求允许您将电子邮件地址发送给开发人员。 输入N。

4.输入您要接收证书的域(可以输入我们之前在noip中收到的证书)。 在这里,我举一个错误输入的例子。 不需要http://前缀。

如果您正确执行了所有操作,则会看到以下内容:

这意味着证书已成功接收。 记住证书和密钥的路径,在配置yandex2mqtt插件时将需要它。 为了安全起见,请在路由器设置中关闭端口80,它将不再有用。
我们打开看门狗和Nginx服务。
service nginx start service watchdog start
letencrypt的证书颁发了
3个月。
不要忘记更新。 Node.js和yandex2mqtt插件
安装方式配置node.js存储库
curl -sL https://deb.nodesource.com/setup_10.x | bash -
接下来,安装或更新所有必要的组件
apt-get install -y nodejs git make g++ gcc build-essential
成功安装后,将yandex2mqtt存储库复制到控制器。
git clone https://github.com/munrexio/yandex2mqtt.git /mnt/data/root/yandex2mqtt
我们设定权利。
chown -R root:root /mnt/data/root/yandex2mqtt
我们转到文件夹。
cd /mnt/data/root/yandex2mqtt
我们开始安装。
npm install
安装完成。
自动启动创建一个系统单位:转到控制器上的
/ etc / systemd / system /文件夹,并创建一个名为
yandex2mqtt.service的文件。 将以下内容复制到其中:
[Unit] Description=yandex2mqtt After=network.target [Service] ExecStart=/usr/bin/npm start WorkingDirectory=/mnt/data/root/yandex2mqtt StandardOutput=inherit StandardError=inherit Restart=always User=root [Install] WantedBy=multi-user.target
之后,保存更改并关闭文件。
要启用该设备,请在控制台中输入命令:
systemctl enable yandex2mqtt.service
现在您可以使用命令启动和停止插件
service yandex2mqtt start service yandex2mqtt stop service yandex2mqtt restart
设置:所有必需的插件设置都在文件
/mnt/data/root/yandex2mqtt/config.js中根据您的参数编辑此文件。
SSL证书必须是
fullchain 。
配置完成后,使用以下命令运行yandex2mqtt:
service yandex2mqtt start
设置并启动网桥后,建议您在
此站点上检查证书。
只需输入您将用来访问Alice的域。 为了正确操作,证书必须通过所有检查。 否则,将无济于事。
技能Yandex UD
技能创造1.转到页面
dialogs.yandex.ru/developer2.使用您的帐户登录。
3.点击“创建对话”
4.选择“智能家居”
5.输入所需的参数:

- 隐私 -选择“不显示在目录中”(必填!否则,该技能将不会通过即时审核)
- 开发人员的姓名和电子邮件 -指明您的详细信息。
- 说明 -任何文字
- 图标 -任何图标。

6.帐户捆绑:

点击“添加新”
- 前两点- 指定config.js / clients中的数据 :
1.
应用程序标识符为clientId
2.
应用程序秘密 -clientSecret

7.保存技能

8.点击“审核”

9.点击“发布”

将设备添加到Yandex UD。1.在电话上转到Yandex应用程序

2.在菜单中,选择设备/智能家居

3.点击“添加设备”

4.选择你的技能

5.点击“合并帐户”

6.授权页面将打开
输入登录名和密码(在users块的config.js文件中设置)
7.单击“允许”。

8.单击“更新设备列表”

现在,可以为Alice提供命令来管理添加的设备。 相应的小组将讨论mqtt指示的主题。
仍然需要将一些操作绑定到这些主题。
节点红
选择Node-Red作为自动化系统。 这是一个很棒的可视化编程工具。 可以在
此处查看安装和配置过程。
设置和自动化智能家居的过程将涉及整篇文章,甚至两篇文章。 并且已经有很多这样的文章。 而是使用插件的一个小例子,如何打开灯泡的声音。
为了方便起见,我们在Web界面的Wiren Board 6控制器上创建虚拟设备。
在
wb-rules规则引擎中,您需要输入
defineVirtualDevice("yandex", { title: "yandex controls", cells: { light1: { type: "switch", value: false }, } });
我们将在
config.js中针对“轻型”设备的“开启”技能类型
编写此虚拟设备
的 MQTT主题:
devices: [ //_______________ ______________// { name: '', room: '', type: 'devices.types.light', mqtt: [ { type: 'on', set: '/devices/yandex/controls/light1/on', // stat: '/devices/yandex/controls/light1' // }, ], capabilities: [ { type: 'devices.capabilities.on_off', retrievable: true, state: { instance: 'on', value: true } }, ] }, //_______________ _______________// ]
现在,使用短语“爱丽丝,打开/关闭灯”,虚拟设备将切换。
让我们转到按照说明安装的Node-Red。
为了方便使用Wiren Board 6,您还可以使用其他“节点”
node-red-contrib-wirenboard 。
WBE2R-R-ZIGBEE扩展模块安装在控制器中,从而可以使用ZigBee协议连接到TRODFRY系列的IKeevskaya智能灯。
现在由小决定。 将一些块扔到Node-Red工作区中,用“字符串”连接它们,然后单击“部署”。

ikeevsky灯泡通过zigbee2mqtt插件连接,因此在mqtt中必须向json发送灯泡主题以进行控制。 为此,我们将在WB虚拟设备和mqtt bulb主题之间插入一个简单的函数。

单击部署。 我们检查。
爱丽丝,打开灯!
因此,今天我们学习了如何将Alice连接到自动化系统。 也许在某些情况下它太复杂了,购买常规的wi-fi灯泡会更容易,这就足够了。 但是,如果您打算为自己建造一个真正的智能家居,那么简单的方法就无法在这里完成。 但是是否值得,每个人都会自己决定。 感谢您的关注!