任何智能家居发烧友的梦想都是可以与之交谈的家,但现实距离之遥远。
例如,Amazon Echo允许您使用任意数量的语音控制功能,但是对话必须由您提出一个问题–您不能只是让她宣布重要消息。
您可以使用Sonos系统来做到这一点,还有一些DIY Raspberry Pi魔术。今天,我将向您展示如何在Sonos系统上设置语音通知,并介绍一些有用的IFTTT配方,OpenHAB集成等以利用通知功能。
请注意,这里有提供了与OpenHAB的本机Sonos绑定,但已知由于uPnP库错误而导致内存问题。我建议暂时不使用它,而改用本教程中的方法。
运行Raspian linux的Raspberry Pi是本教程的理想选择,但它也可以在您基于Linux的任何家庭服务器上使用运行。在这种情况下,我使用的是运行开源家庭自动化系统OpenHAB的Raspberry Pi。
您将需要
安装最新的Node
通过键入以下命令检查您拥有的Node版本:
node -v
请注意,不支持版本6。如果您有Node 6,请先将其删除,然后按照以下说明安装v5.5。
如果您没有v5或出现找不到错误,请按照以下说明安装Node。以下命令假定使用Raspberry Pi 2。对于较旧的型号,请使用 armv6l 而不是 armv7l 。
wget https://nodejs.org/download/release/latest-v5.x/node-v5.12.0-linux-armv7l.tar.gztar -xvf node-v5.12.0-linux-armv7l.tar.gzcd node-v5.12.0-linux-armv7lsudo cp -R * /usr/local
再次输入以下内容进行确认:
node -v
,您应该看到v5 .12(或您下载的最新版本)。
接下来,我们要安装一些Node模块。我们还需要节点包管理器。
sudo apt-get install npmsudo npm install -g npmsudo npm install -g node-gyp
这是前提条件,现在到了有趣的东西上。
Sonos HTTP API
Sonos HTTP API在本地网络上创建了一个Web服务器,它使我们能够对带有消息的URL进行ping操作,以在Sonos上进行公告(并根据需要进行远程控制,尽管本教程仅专注于语音通知方面)。
git clone https://github.com/jishi/node-sonos-http-api.git sonoscd sonosnpm install --productionnpm start
如果看到未找到有关此类模块的消息,只需执行另一个 npm install 和模块名称,然后尝试 npm start 再次。如果遇到与“需要C ++ 11编译器" 有关的错误,请使用以下命令进行修复:
sudo apt-get install gcc-4.8 g++-4.8sudo update-alternatives --install/usr/bin/gccgcc/usr/bin/gcc-4.6 20sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 20sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
最终,您应该看到类似以下内容:
服务器现在正在运行,与Sonos连接。该API的格式很简单:
http://[SERVER IP]:5005/[ROOM NAME]/[ACTION]
或作为一个具体示例:
http://192.168.1.99:5005/kitchen/playlist/chillout
我们感兴趣的操作是“ say"命令,其用法如下:
http://192.168.1.99:5005/kitchen/say/make%20use%20of%20is%20awesome/en-gb
您将在VoiceRSS.org听到有关必须注册到API密钥的错误消息。您应该已经完成此操作,因此请键入以下内容并适当地粘贴在API密钥中:
nano settings.json
{
"voicerss":"YOURAPIKEY"}
(按CTRL-X,Y保存文件)
重新启动服务器,然后再次ping通URL。几秒钟后,您应该会听到悦耳的英语声音(尽管您愿意,也可以将URL的结尾更改为 zh-cn )。要使Pi重新启动时重新启动Sonos HTTP API服务器:
sudo nano /etc/rc.local
在退出0 之前添加一行:
sudo node /home/pi/sonos/server.js < /dev/null &
只需通过ping通URL即可从本地网络上的任何地方创建语音消息的能力,因此,此时的可能性是广阔的。但是,如果您在寻求创意,请继续阅读一些我已经设置的有用通知。
关于事件的OpenHAB通知
让我们首先举一个简单的例子:运动检测。这是激活灯的常见用例,但是如果它是在交通拥挤的地区的运动传感器,或者也可能作为向前警告有人正在驶向花园小路的警告,您可能还需要语音通知。
rule "Garden motion detected"when Item Garden_Motion changed then var String message = "You have a visitor" sendHttpGetRequest("http://localhost:5005/kitchen/say/"+message.encode("UTF-8")+"/en-gb")end
您应该看到如何将这些简单的语音通知集成到您的任何规则中,但让我们尝试一些更复杂的事情。
从IFTTT到OpenHAB再到Sonos的每日天气报告
在此食谱中,我们将让Sonos在您喜欢的时间宣布每日天气报告。
您需要启用My.OpenHAB绑定,因为这会在内部OpenHAB服务器之间建立安全的连接以及外部IFTTT服务。如果尚未设置,请进行设置-您可以参考我们的OpenHAB指南的第1部分以获取完整说明,否则,我假设您已经为所有项目启用了持久性设置。
接下来,在您的OpenHAB安装中创建一个新的String项目,该项目将存储每日天气报告。在My.OpenHAB频道中看到此代码之前,我们需要使用一些默认变量对其进行初始化。 ping以下URL(将 raspberrypi.local 更改为您的OpenHAB服务器,或仅使用其IP地址,并将 Todays_Weather 更改为您命名为String的名称):
http://raspberrypi.local:8080/CMD?Todays_Weather=Sunny
登录My.OpenHAB并检查 Items (项目)列表,以确保变量现在已导出。
返回IFTTT,创建新配方,并使用天气频道是您一天中首选时间的触发条件。如果您从未使用过,则需要首先设置位置。
选择My.OpenHAB作为操作,然后选择Todays_Weather作为要更新的变量。
现在,只需选择下一个半小时的时间进行测试-您可以在知道它可以正常工作之后稍后再更新配方。
果然,在测试时间(实际上是之前),我
2016-02-27 10:28:01.689 [DEBUG] [o.o.i.m.i.MyOpenHABServiceImpl] - Received command Mostly Cloudy today! With a high of 7C and a low of 1C. Repeat. Conditions will be Mostly Cloudy today, with a high of 7C and a low of 1C. for item Todays_Weather2016-02-27 10:28:01.697 [DEBUG] [o.o.i.m.i.MyOpenHABServiceImpl] - store(Todays_Weather), state = Mostly Cloudy today! With a high of 7C and a low of 1C. Repeat. Conditions will be Mostly Cloudy today, with a high of 7C and a low of 1C.
下一步,我们需要一个OpenHAB规则将此变量发送到Sonos“ say" URL。应该执行以下操作:
rule "Announce daily weather report"when Item Todays_Weather received updatethen sendHttpGetRequest("http://localhost:5005/kitchen/say/"+Todays_Weather.state.toString.encode("UTF-8")+"/en-gb")end
这很简单:每当Todays_Weather变量更新时(每天上午8点自动更新),都会对URL进行ping操作。我们使用 encode(“ UTF-8")字符串函数使IFTTT中的句子适合在URL中使用。要手动测试系统的这一部分,只需再次使用OpenHAB HTTP API:
http://raspberrypi.local:8080/CMD?Todays_Weather=Cloudy, with a chance of meatballs.
不使用OpenHAB即可连接到IFTTT,使用If-This-Then-Node
最后,让我们来看一下在没有OpenHAB中介的情况下如何从任何IFTTT配方进行连接。取而代之的是,我们将安装另一台Web服务器,并将其暴露给开放的Internet。这并非没有风险:任何类型的开放服务器都存在安全风险,但我们通过不运行完整的服务器堆栈(只是一个小型的特定服务,仅接受安全JSON数据包格式的某些命令来缓解此风险),因此,可以进行SQL注入或身份验证攻击)。完成后,您将拥有一个公共URL,可以从IFTTT Maker频道向其发送消息。
首先从那里设置许多免费的动态DNS服务之一-我建议DuckDNS ,特别是因为它为Raspberry Pi提供了一组简单的说明,从而使其能够自动更新IP地址。遵循这些步骤,并记住您的URL,以进行下一步。您的路由器可能还内置了动态DNS功能,因此请先在此处检查。就我而言,我可以免费获得一个 *。mynetgear.com URL,因此我已经使用了它。
接下来,找到路由器的端口转发配置页面;在这里,我们将告诉它如何处理传入的请求。将所有HTTP请求(端口80)转发到Raspberry Pi服务器上的端口1337。我假设您已经为Raspberry Pi保留了一个IP地址–如果没有,请在路由器的配置页面上查看保留的IP,因为下周您不会更改它,并且让服务器突然停止工作。
现在要安装服务器软件的最后一位。
https://github.com/sebauer/if-this-then-node.gitcd if-this-then-node/npm installnode server.js
您应该看到以下内容。
没关系,这仅意味着我们需要更新我们的详细信息。在Nano中打开 config.js 并将这些详细信息编辑为默认值以外的任何内容,然后保存。再次运行服务器时,应该看到以下内容:
很好。输入动态DNS主机名,并在URL末尾附加/ ifttn / ,以测试您的计算机是否可以从外部访问。如果一切正常,消息“ IFTTN – if-this-then-node 2.0.1版已启动并正在运行!" 。再次,要使此脚本在启动时运行,请编辑 /etc/rc.local 文件并添加:
sudo node /home/pi/if-this-then-node/server.js < /dev/null &
If-This-Then-Node通过插件起作用–提供了一些默认值,但我们对此并不感兴趣。相反,请使用以下命令下载我为您编写的此自定义插件。
cd pluginswget https://gist.githubusercontent.com/jamesabruce/4af8db24ba3452b94877/raw/d11c1cff3aa44dbb6a738eeb15202f3db461de75/sonos.js
您还需要安装 request 模块。
npm install request
然后重新启动服务器。该插件非常简单,但与我们到目前为止使用的URL略有不同。在这种情况下,我使用了特殊的“ sayall"操作,该操作将消息发送到每个Sonos设备。
request('http://localhost:5005/sayall/'+params.message+'/en-gb', function (error, response, body)
如果您希望定位到特定设备,请将该行替换为:<
request('http://localhost:5005/'+params.device+'/say/'+params.message+'/en-gb', function (error, response, body)
将另一个名为 device 的行参数添加到下面的JSON请求中,以在其中指定Sonos设备名称。
为了测试这一点,我正在使用IFTTT“执行"按钮应用程序。创建一个新配方,浏览到频道,然后选择 Maker 频道。
Create a new recipe. Enter in the URL you configured earlier from a free dynamic DNS provider (including /ifttn/ at the end of the URL. Don’t forget those slashes). Select POST request, application/json content, and the body of the message as follows, replacing all variables as needed with those you previously configured:
{ "action":"sonos", "user":"YOURUSER", "pw":"YOURPASSWORD", "message":"Incoming message for everyone: Dinner is ready! Repeat. Dinner is ready. Get your asses upstairs now." }
现在我有一个易于使用的按钮,它将在房屋中的每个Sonos设备上宣布该消息。您当然可以将其与要使用该频道中的变量制作自定义消息的任何IFTTT频道配对。您甚至应该可以立即从上面复制天气报告,而无需立即使用OpenHAB,尽管它确实花费了额外的精力来安装另一台服务器。
注意:黑客会自动扫描您 。这种情况一直都在发生,但是如果您正在查看日志,这似乎令人震惊。在下面,您可以看到有人系统地尝试确定是否可以访问任何标准的PHPMyAdmin接口。他们不是。如果您看到类似的内容,请不要惊慌。互联网等同于冷拨随机电话号码,以查看是否有人在那里。
您要宣布什么?
您现在应该拥有工具和知识,可以不断给整座房子洗澡关于您可能想到的一切的语音通知。谁需要音乐?您的唯一限制是来自VoiceRSS.org的350条每日请求-大约每4分钟发送一次,因此您应该没事。
那么您将如何处理?在评论中分享您的想法或IFTTT食谱!
图片来源:S_Photo通过Shutterstock的咖啡和女人