此项目的主要目的在于使用 Amazon Echo 的 Alexa's语音命令 和 Python 来控制 Raspberry Pi 的 GPIO。此文改编自记忆游戏项目(链接:Flask-Ask: A New Python Framework for Rapid Alexa Skills Kit Development.)
Amazon Echo可有可无,但我强烈推荐使用。本文使用一个非常简单的例子轻松的演示如何只使用几十行 Python 代码将 Raspberry Pi 的功能开放给 Alexa。
我写此文的主要原因是因为我在别处找不到类似的指南,觉得功能很酷。目前有几种不同的方式将定制的 Smart Home 编程添加到 Alexa,但据我所知,这是使用Raspberry Pi和 Python 的第一种方法。
我使用一块 Raspberry Pi 3 开发板和最新的 Raspbian Jessie-lite 镜像(镜像来自于:https://www.raspberrypi.org/downloads/raspbian/,此外还需要使用 SSH 的两个终端会话访问 Pi。登录后,输入以下命令来安装所需的软件包和 python 库:
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install python2.7-dev python-dev python-pip
sudo pip install Flask flask-ask
命令如下图:
对于 ngrok 我想不到更好的解释,因此这里是一个引用我之前链接的亚马逊的指南: > ngrok 是一个命令行程序,打开到 localhost 的安全通道,并将该通道暴露在HTTPS端点后面。 ngrok 使得 Alexa 可以立即与您的代码对话。 按照以下三个步骤生成一个公共HTTPS端点到127.0.0.1:5000。
查看 https://ngrok.com/download 并下载最新的 Linux ARM 发布版本压缩包并解压到主目录:
unzip /home/pi/ngrok-stable-linux-arm.zip
之后运行以下命令行:
sudo ./ngrok http 5000
您的屏幕应该能看见类似像上面的图像。 请注意以 https 开头的 'Forwarding' URL,稍后将使用。
注意:不幸的是,每次启动服务时,ngrok URL 都会更改,因此如果您尝试长时间运行,这不是永久的解决方案。 如果您需要一个更为永久的 URL 用于您的项目,我会推荐像 Yaler 或 Page Kite 这样的服务。
打开一个新的终端会话并创建一个 gpio_control.py 文件:
nano gpio_control.py
复制/粘贴以下的代码到刚建立的 gpio_control.py 文件:
from flask import Flask
from flask_ask import Ask, statement, convert_errors
import RPi.GPIO as GPIO
import logging
GPIO.setmode(GPIO.BCM)
app = Flask(__name__)
ask = Ask(app, '/')
logging.getLogger("flask_ask").setLevel(logging.DEBUG)
@ask.intent('GPIOControlIntent', mapping={'status': 'status', 'pin': 'pin'})
def gpio_control(status, pin):
try:
pinNum = int(pin)
except Exception as e:
return statement('Pin number not valid.')
GPIO.setup(pinNum, GPIO.OUT)
if status in ['on', 'high']: GPIO.output(pinNum, GPIO.HIGH)
if status in ['off', 'low']: GPIO.output(pinNum, GPIO.LOW)
return statement('Turning pin {} {}'.format(pin, status))
保存并关闭文件。 使用以下命令运行 python 脚本:
sudo python gpio_control.py
ngrok 和 gpio_control.py 运行的同时我们设置 AWS...
先创建或者登陆 AWS开发者账户并打开Alexa Skill列表。
将 Skill 名称设置为'GPIO Control',将 Invocation Name 设置为要用于激活 Skill 的词。 点击'Next' 继续。
将以下内容复制/粘贴到'Intent Schema'框中:
{
"intents": [{
"intent": "GPIOControlIntent",
"slots": [{
"name": "status",
"type": "GPIO_CONTROL"
},
{
"name": "pin",
"type": "AMAZON.NUMBER"
}]
}]
}
接下来,点击'Add Slot Type'并在'Enter Type'下写入'GPIO_CONTROL',在'Enter Values'下写入:
on
off
这只是一个简单的例子,'high','low'或者其他更丰富的词都可以添加。
将以下内容复制/粘贴到'Sample Utterances'框中:
GPIOControlIntent to turn pin {pin} {status}
点击'Save'然后'Next'。
选择'HTTPS'作为服务端点类型并选择一个区域。
从步骤2输入 ngrok URL,然后单击 'Next'。 URL 应该如下:
https://ed6ea04d.ngrok.io
选择 'My development endpoint is a sub-domain of a domain that has a wildcard certificate from a certificate authority' 选项并点击 'Next'。
如果一切设置正确,您现在应该看到一个类似于上面第一个图像的屏幕。 技能现已启用,可以通过使用以下语法连接到AWS开发人员帐户的任何Amazon Echo设备(或http://echosim.io/)进行访问:
Alexa, tell Raspberry Pi to turn pin {pin number} {on or off}
例如:
Alexa, tell Raspberry Pi to turn pin twenty one on
如果您有任何问题,测试 Skill 的最简单的方法是使用测试页面上的语音或服务模拟器。 尝试在服务模拟器下的'Enter Utterance'框中输入以下内容:
turn pin twenty one on
然后点击 'Ask GPIO Control' 运行测试。
测试完成后,无需再继续进行 Skill 设置,因为剩下的已公开发布。 据我所知,没有什么可以阻止使用者继续以“开发”模式进行个人使用,尽管如此,我的最终目标是使用此功能将 Alexa 整合到我现有的 Raspberry Pi 智能家居设置中,以便一切都可以自动控制。
这是我的第一个指导,所以任何反馈是赞赏。 如果您有任何问题或麻烦设置,我将尽全力帮助。 祝你好运!
如果您已遵循上述所有步骤,并希望添加更多功能,您可以通过以下步骤创建一个可以使用 'fan' 或 'light' 等实际单词进行调用的功能。
将以下代码添加到 gpio_control.py :
@ask.intent('LocationControlIntent', mapping={'status': 'status', 'location': 'location'})
def location_control(status, location):
locationDict = {
'fan': 12,
'light': 21
}
targetPin = locationDict[location]
GPIO.setup(targetPin, GPIO.OUT)
if status in ['on', 'high']: GPIO.output(targetPin, GPIO.HIGH)
if status in ['off', 'low']: GPIO.output(targetPin, GPIO.LOW)
return statement('Turning {} {}!'.format(location, status))
复制/粘贴以下代码到 'Intent Schema' 框中:
{
"intents": [{
"intent": "LocationControlIntent",
"slots": [{
"name": "status",
"type": "GPIO_CONTROL"
},
{
"name": "location",
"type": "LOCATION"
}]
}]
}
接下来,点击 'Add Slot Type' 并在'Enter Type' 写入'LOCATION'。 在 'Enter Values' 下,记下您想要用来实现此目的的任何字词,例如:
fan
light
television
复制/粘贴以下代码到 'Sample Utterances' 框中:
LocationControlIntent to turn {location} {status}
LocationControlIntent to change the {location} to {status}
点击 'Save',它将更新您的设置,之后新的短语将可用。例:
Alexa, tell Raspberry Pi to turn fan on
Alexa, tell Raspberry Pi to change the light to off
观光\评论区