使用Amazon Echo和Python控制Raspberry Pi GPIO

此项目的主要目的在于使用 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 的第一种方法。

步骤1:初始化

我使用一块 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

命令如下图:

enter image description here

对于 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 这样的服务。

步骤三:Python 脚本

打开一个新的终端会话并创建一个 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账户

enter image description here

先创建或者登陆 AWS开发者账户并打开Alexa Skill列表

步骤五:Alexa Skill - 信息

enter image description here

将 Skill 名称设置为'GPIO Control',将 Invocation Name 设置为要用于激活 Skill 的词。 点击'Next' 继续。

步骤六:Alexa Skill - 交互模式

enter image description here enter image description here

将以下内容复制/粘贴到'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'。

步骤七:Alexa Skill - 配置

enter image description here

选择'HTTPS'作为服务端点类型并选择一个区域。

从步骤2输入 ngrok URL,然后单击 'Next'。 URL 应该如下:

https://ed6ea04d.ngrok.io

步骤八:Alexa Skill - SSL 证书 #

enter image description here

选择 'My development endpoint is a sub-domain of a domain that has a wildcard certificate from a certificate authority' 选项并点击 'Next'。

步骤九:Alexa Skill - 测试

enter image description here enter image description here

如果一切设置正确,您现在应该看到一个类似于上面第一个图像的屏幕。 技能现已启用,可以通过使用以下语法连接到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
尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

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