Yandex:成人智能家居



最近,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-颜色管理。

实例:

  • g
  • 病毒
  • 温度_k

3. devices.capabilities.mode-切换模式。

实例:

  • 恒温器
  • fan_speed

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
实例:

  • fan_speed

我不会描述其余的属性,那里的一切都很简单。

要使其正常工作,您需要:

  • 控制者
  • 任何域
  • 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的说明。

安装和配置certbot
apt-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/developer
2.使用您的帐户登录。
3.点击“创建对话”
4.选择“智能家居”
5.输入所需的参数:

  • 名称 -任何名称。
  • 端点URL-类型为yourdomain / provider的地址,其中noip或您的域中收到ssl证书的地址,而不是“ yourdomain ”。



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



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灯泡会更容易,这就足够了。 但是,如果您打算为自己建造一个真正的智能家居,那么简单的方法就无法在这里完成。 但是是否值得,每个人都会自己决定。 感谢您的关注!

Source: https://habr.com/ru/post/zh-CN465537/


All Articles