OpenWhisk + Raspberry Pi + Twilio + IBM Waston 打造 Serverless 智能家居

在过去的几年中,我们看到了智能个人助理,如苹果公司的 Siri,亚马逊 Alexa 和 Google Assistant 的普及率显着提高。尽管它们最初看起来不过是一种新颖的东西,但是它们已经发展成为一种便利的接口,可以与便利的 API 和物联网连接的设备进行交互。

该系列将引导用户使用 Raspberry Pi 建立自己的家庭自动化集线器。 这是第一篇博客文章,提供了一个一步一步的教程,创建一个射频电路、使用 Raspberry Pi 打开和关闭电源插座。一旦电路和软件依赖关系得到正确的安装和配置,用户还将能够利用 Watson 的语言服务通过语音、文本命令来控制电源插座。此外,我们将展示 OpenWhisk Serverless 函数如何能够根据定时计划、天气变化、被激活的运动传感器等来触发这些套接字。我们假定读者对 Linux 和电子电路有基本的了解。

本教程需要以下组件:

  • Raspberry Pi 3
  • Etekcity 433 MHz 插座
  • USB 麦克风
  • GPIO 带状电缆 + 分线板
  • 433 MHz 射频发射器和接收器
  • 面包板

步骤一:安装软件依赖

登录到 Raspberry Pi,并安装 wiringPi 库。 该库使应用程序能够读取、控制树莓派的 GPIO 引脚。

sudo apt-get -y update
sudo apt-get -y install git-core
git clone git://git.drogon.net/wiringPi
git pull origin master
./wiringPi/build

通过运行以下命令,来确保 wiringPi 库安装正确。

gpio readall

Pi GPIO output

接下来,安装 433Utils,它将调用 wiringPi 库以 433MHz 的频率发送和接收消息。在我们的情况下,每个插座都有一个独特的 RF 码来打开和关闭电源。我们将使用其中一个 wiringPi 实用程序,标题为 “RFSniffer” 来实质上注册这些唯一的代码。433MHz 频率是许多常用设备的标准配置,如车库门开启装置,恒温器,窗/门传感器,汽车钥匙等。因此,这种初始设置不仅限于控制电源插座。可以通过在 Raspberry Pi 上运行以下命令来安装此库。

sudo apt-get install build-essential
git clone git://github.com/ninjablocks/433Utils.git
cd 433Utils/RPi_utils
make

步骤二:设置 RF 电路

按照下面的电路图来显示硬件图:

Raspberry Pi RF 电路

现在我们将确定哪些 RF 码与 Etekcity 的插座对应。开始运行:

sudo /var/www/rfoutlet/RFSniffer

它将监听射频接收器的输入信号,并将其写入标准输出。当 Etekcity 遥控器上的开/关按钮被按下时,如果电路连接正确,Raspberry Pi 应该显示以下输出。

pi@raspberrypi:~ $ sudo /var/www/rfoutlet/RFSniffer
Received 5528835
Received pulse 190
Received 5528844
Received pulse 191

当确定射频插座的开、关信号后,将捕获的信号放置在 /etc/environment 文件中。

RF_PLUG_ON_1=5528835
RF_PLUG_ON_PULSE_1=190
RF_PLUG_OFF_1=5528844
RF_PLUG_OFF_PULSE_1=191

现在,插入关联的套接字,然后运行以下命令以确保 Raspberry Pi 可以打开和关闭套接字。这个命令只需要以要求的脉冲长度发送 RF 代码,该代码将作为 -l 参数提供。

/var/www/rfoutlet/codesend ${RF_PLUG_ON_1} -l ${RF_PLUG_ON_PULSE_1}
/var/www/rfoutlet/codesend ${RF_PLUG_OFF_1} -l ${RF_PLUG_OFF_PULSE_1}

现在我们可以通过 cli 手动控制套接字,我们将继续前进,尝试不同的方式来自动控制它们。我们将使用一个名为 Openwhisk 的 Serverless 事件驱动平台,而不是在 Raspberry Pi 上编写和执行管道和复杂的自动化逻辑。在这个实现中,Openwhisk 的操作(aciton)通过 MQTT 消息与 Raspberry Pi 通信。

在此,我们需要一个 Bluemix 帐户来设置 Openwhisk 和相应的 Watson 服务。

提供 Watson 服务

让我们继续向下看,登录到 Bluemix 并提供以下服务:

  • 语音转文本 - 该服务转录来自 Raspberry Pi 麦克风的语音输入
  • 自然语言分类器 - 分析转录文本并确定用户命令背后的意图。所包含的培训数据,可以检测到所请求的状态(开或关)和设备类型。
  • Watson 物联网平台 - 这是一个 MQTT 代理。 连接到代理的凭证可以按照以下说明生成。一旦生成凭证,请在 /etc/environment 文件中设置以下值:IOT_ORGIOT_API_KEYIOT_AUTH_TOKENIOT_DEVICE_TYPE

Openwhisk

Serverless 结构正在让云和物联网行业陷入困境,原因有几个:

  • 首先,这些解决方案允许开发者/制造商卸载诸如网络连接,服务器配置和管理,磁盘故障等的操作任务。
  • 其次,这些架构提供了非常有效的计费模式,其中函数仅在需要时执行,并且用户仅在运行时被收费,他们的代码总运行时间达到毫秒。
  • 这些好处使得开发人员可以避免被称为操作任务,只关注应用程序代码和业务逻辑。

如果您不熟悉 Openwhisk,最好通过这里介绍的介绍性文档

为了开始,请先登录到:Bluemix

选择左上角的菜单图标,然后导航到 “Openwhisk”。

OpenWhisk Dashboard

按照说明下载,并安装 Openwhisk CLI。运行 wsk action list 以确保您的凭证和 API 端点设置正确。

继续克隆家庭自动化 GitHub 存储库。该存储库包含一系列的 Openwhisk 操作和用于 Watson Conversation 服务的培训数据:

git clone github.com/IBM/serverless-home-automation /opt/

Openwhisk 允许将多个代码片段或 “Actions” 作为序列链接在一起。要开始,我们将创建一个由三个动作组成的序列:

  • 第一个操作将把音频有效负载转录为文本
  • 第二个动作将使用 Watson 的自然语言分类器服务分析转录的文本结果。这一分析将提取口头消息背后的意图,并确定用户希望 Raspberry Pi 做什么。因此,例如,如果用户按 “Turn on the light” 或 “Flip the switch” 这一行说出一些内容,则 NLC 服务将能够解释该内容。
  • 第三个动作将发送一个 MQTT 消息,通知 Raspberry Pi 打开、关闭套接字。

Hub Architecture

语音转文本的动作(Action)已经内置到 Openwhisk 作为一个公共包,所以我们只需要提供我们的凭据为该服务。展望未来,我们可以通过以下命令创建操作,以调用 Conversation 和 Watson IoT 服务。

cd /opt/serverless-home-automation/iot_gateway/whisk_actions
wsk action create conversation conversation.js
wsk action create parser-python parser-python.py

其他操作只是简单地创建一个 JS 的 promise,它向请求给定的服务发出请求,并在服务调用完成时返回结果。 例如,以下是负责调用对话服务的操作的一小部分。

OpenWhisk JS Promise

一旦操作成功创建,我们可以为每个操作设置默认的服务凭证。否则,每次我们希望我们的操作(action)调用 Watson 服务时,我们都必须传递服务凭证。 要获取这些凭据,请单击 Bluemix 仪表板中的每个置备服务,然后选择 “View credentials” 下拉列表。

Waston Speech To Text-lg

然后在运行下面的命令时插入相应的凭据:

wsk action update conversation -p username ${conversation_username} -p password ${conversation_password} -p workspace_id ${conversation_workspace_id}
wsk action update parser-python -p org ${iot_org_id} -p device_id ${device_id} -p api_token ${api_token}
wsk package bind /whisk.system/watson-speechToText myWatsonSpeechToText -p username ${stt_username} -p password ${stt_password}

接下来,我们可以将这些动作组合成一个序列:

wsk action create homeSequence --sequence /myWatsonSpeechToText/speechToText,conversation,parser-python

为了能够将结果返回给 Raspberry Pi,MQTT 客户端需要监听 Watson IoT 服务。 如果在 /etc/environment 文件中设置了正确的值,则只需运行以下命令即可创建和启用 systemd 服务,该服务将在启动时自动启动。

sudo cp /opt/serverless-home-automation/iot-gateway/node-mqtt.service /etc/systemd/system/
sudo systemctl enable node-mqtt
sudo systemctl start node-mqtt
sudo systemctl status node-mqtt

要测试序列(sequence),请将 USB 麦克风插入 Raspberry Pi,然后运行 rec sample.wav。 记录一个命令,如 “Turn on the light” 或 “Turn off the socket”。然后,使用下面的命令将音频文件的二进制输出,写入一个json文件,然后执行序列。

echo "{\"payload\": \"$(cat sample.wav | base64)\"}" > parameters.json
wsk action invoke homeSequence --blocking --result --params-file parameters.json

最后,我们可以使用 Snowboy 检测工具包设置一个唤醒词。“唤醒词” 允许设备在后台被动地收听,并且一旦检测到特定的短语就 “醒来”。因此,在这种情况下,当用户说出唤醒词时,Raspberry Pi 将开始录制语音命令,并在录制完成时将音频转发到 Openwhisk 序列(sequence)。

Twilio

作为使用麦克风的替代方案,我们还可以通过利用 Twilio 控制设备插座。Twilio 是一个通信平台,使开发人员能够将 SMS 和 VoIP 功能集成到其应用程序中。其可以通过一个简单的 HTTP 调用或客户端库,从注册的电话号码短信、拨打电话。

#!/usr/bin/python
from twilio.rest import Client
client = Client(account_sid, auth_token)
# Send text message
message = client.messages.create(
    to="+15558675309", 
    from_="+15017250604",
    body="Hello from Python!"
)
# Make phone call
# 'url' points to a XML document that dictates what will be said on the outbound call, how to respond to user input, etc. docs
call = client.calls.create(
    to="+14155551212",
    from_="+15017250604",
    url="http://demo.twilio.com/docs/voice.xml"
)

除了拨打外拨电话和短信外,我们还可以配置 Twilio 平台来响应来电和短信。因此,在我们的情况下,我们希望能够像 “turn on the light” 或 “switch off the fan” 这样的文本,并且将消息内容转发到 OpenWisk 序列。 在我们的情况下,它可以通过配置我们活跃的Twilio号码的 “Messaging” 设置,通过触发与我们的 Openwhisk 序列相关联的 webhook 来响应传入的 SMS 消息。

Twilio 设置

通过选择 “View Action Details” 按钮,然后选择 “Enable as Web Action” 复选框,就可以在 Openwhisk 的 “Develop” 仪表板中找到 webhook url 的确切值。

现在,我们已经配置了我们的 Twilio 号码来触发 Openwhisk 序列,我们需要更新我们的 Openwhisk 操作,来提取和转发相关的 SMS 信息(发送者号码、消息体、时间)到我们的服务。正如我们在 Twilio webhook 文档中所看到的,来自传入的文本消息的信息是作为 JSON 响应转发的。 我们可以通过创建标题为 “printparams” 的操作,来查看传入的 JSON 主体的内容,该操作只是打印从 webhook 请求转发的所有参数。

Bluemix OpenWhisk Twilio 设置

所以,在这里我们看到,Twilio 平台从一个以 7799 结尾的电话号码,收到了一个标题为 “Turn on the fa” 的文本。文本消息值可以通过 “params.Body” 变量访问,所以如果设置使用文本值,我们只需添加一个 “or“ 语句,,并且如果不是文本值,则使用 ”params.data“ 值。

Twilio OpenWhisk Action

由于可以从任何电话发送文本消息,因此可以使用 “params.From” 值来添加一定程度的安全性。

这可以通过调整操作(action),让其仅响应某些电话号码来实现。

原文链接:Home Automation powered by Openwhisk, Raspberry PI, Twilio, and IBM Watson

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.