Programming Voice Controlled Iot Applications With Alexa and Raspberry Pi John Allwork All Chapter

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 67

Programming Voice-controlled IoT

Applications with Alexa and Raspberry


Pi John Allwork
Visit to download the full and correct content document:
https://ebookmass.com/product/programming-voice-controlled-iot-applications-with-al
exa-and-raspberry-pi-john-allwork/
books
books books

Programming

Programming Voice-controlled IoT Applications • Dr John Allwork


Voice-controlled
IoT Applications Programming Voice-controlled
with Alexa and Raspberry Pi IoT Applications
with Alexa and Raspberry Pi
The book is split into two parts: the first part covers creating Alexa skills
and the second part, designing Internet of Things and Smart Home devices
using a Raspberry Pi.
tials
John Allwork graduated from
Sheffield University where he
import creden
The first chapters describe the process of Alexa communication, opening
an Amazon account and creating a skill for free. The operation of an Alexa developed an interest in computers

# constants
and gained his MSc at UMIST.

T%H:%M:%S.00Z
skill and terminology such as utterances, intents, slots, and conversations After two years working for ICL as
m - % d
are explained. Debugging your code, saving user data between sessions, a design engineer, he returned to
UTC_FORMAT = “ % Y - %
a z o n . c o m / a u t h/o2/token”
m
https://api.a
S3 data storage and Dynamo DB database are discussed. UMIST where he graduated with a
PhD in ‘Design and Development of
Microprocessor Systems’.
TOKEN_URI = “
In-skill purchasing, enabling users to buy items for your skill as well as

s constants
certification and publication is outlined. Creating skills using AWS Lambda
# Token acces
He worked for several years in
and ASK CLI is covered, along with the Visual Studio code editor and technical support and as manager
n t i a l s . k e y [ ‘ CLIENT_ID’]
rede T’]
CLIENT_ID = c ‘CLIENT_SECRE
local debugging. Also covered is the process of designing skills for visual in electronics distribution, working
closely with Intel engineers and
e n t i a l s . k e y [
= cred
displays and interactive touch designs using Alexa Presentation Language.
CLIENT_SECRET
later designing Inmos Transputer
systems.
The second half of the book starts by creating a Raspberry Pi IoT “thing”
to control a robot from your Alexa device. This covers security issues and Having taught electronics at
s_to ken():
methods of sending and receiving MQTT messages between an Alexa Manchester Metropolitan University,
he retired in 2011 but retained
def get_acces
device and the Raspberry Pi.
his interest in electronics and
= {
token_params t_credentials
”,
programming. His other occupations
Creating a smart home device is described including forming a security consist of traveling, walking,
p e ” : “ c l i e n
profile, linking with Amazon, and writing a Lambda function that gets geocaching and spending time on “grant_ty a c t i ve_events”,
e x a : : p r o
“scope”: “al
triggered by an Alexa skill. Device discovery and on/off control is his allotment.

LIENT_ID,
demonstrated.
l i e n t _ i d ” : C
“c
Next, readers discover how to control a smart home Raspberry Pi display
n t _ s e c r e t ” : CLIENT_SECRET
from an Alexa skill using Simple Queue Service (SQS) messaging to “clie
switch the display on and off or change the color.
A node-RED design is discussed from the basic user interface right up to
}
configuring MQTT nodes. MQTT messages sent from a user are displayed Elektor International Media
on a Raspberry Pi. www.elektor.com
token_headers
= {
o n / j s o n ; c h a r set=UTF-8”
”: “applicati
A chapter discusses sending a proactive notification such as a weather “Content-Type
alert from a Raspberry Pi to an Alexa device. The book concludes by
}
explaining how to create Raspberry Pi as a stand-alone Alexa device.
I , h e a d e r s = t oken_headers
s
Dr John Allwork
ts.post(TOKEN
_UR
n s e = r e q u e
respo

SKU20400_COV_Programming Voice-controlled IoT Applications_v02.indd Alle pagina's 16-01-2023 11:08


● This is an Elektor Publication. Elektor is the media brand of
Elektor International Media B.V.
PO Box 11, NL-6114-ZG Susteren, The Netherlands
Phone: +31 46 4389444

● All rights reserved. No part of this book may be reproduced in any material form, including photocopying, or
storing in any medium by electronic means and whether or not transiently or incidentally to some other use of this
publication, without the written permission of the copyright holder except in accordance with the provisions of the
Copyright Designs and Patents Act 1988 or under the terms of a licence issued by the Copyright Licencing Agency
Ltd., 90 Tottenham Court Road, London, England W1P 9HE. Applications for the copyright holder's permission to
reproduce any part of the publication should be addressed to the publishers.

● Declaration
The Author and Publisher have used their best efforts in ensuring the correctness of the information contained in
this book. They do not assume, and hereby disclaim, any liability to any party for any loss or damage caused by
errors or omissions in this book, whether such errors or omissions result from negligence, accident, or any other
cause.
All the programs given in the book are Copyright of the Author and Elektor International Media. These programs
may only be used for educational purposes. Written permission from the Author or Elektor must be obtained before
any of these programs can be used for commercial purposes.

● British Library Cataloguing in Publication Data


A catalogue record for this book is available from the British Library

● I SBN 978-3-89576-531-5 Print


ISBN 978-3-89576-532-2 eBook

● F irst edition
© Copyright 2023: Elektor International Media B.V.
Editor: Alina Neacsu
Prepress Production: Jack Jamar | Graphic Design, Maastricht

Elektor is part of EIM, the world's leading source of essential technical information and electronics products for pro
engineers, electronics designers, and the companies seeking to engage them. Each day, our international team develops
and delivers high-quality content - via a variety of media channels (including magazines, video, digital media, and social
media) in several languages - relating to electronics design and DIY electronics. www.elektormagazine.com

●4
Contents

Contents

About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Chapter 1 Alexa History and Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14


1.1 Alexa voice service and AWS Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2 Pricing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3 Alexa skills . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4 Supported programming languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5 Terminology – Invocation, Utterances, Intents and Slots . . . . . . . . . . . . . . . . . . 16
1.5.1 Alexa Wake word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.2 Invocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.3 Utterances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.4 Intents and requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.5.5 Slots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.5.6 Interaction model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.7 Endpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.8 Regions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.6 Skill Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.7 Session attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.8 Request and response JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.9 Blueprint skills . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.10 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.11 References: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Chapter 2 Creating your Amazon Account . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23


2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2 Create your Amazon account . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3 Your skills . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.4 Hosting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

Chapter 3 Creating an Alexa Skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28


3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2 Your first skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

●5
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

3.2.1 The interaction model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29


3.2.2 Choose a method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.3 The Invocation Name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.4 The Intents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.5 The code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3 Testing your skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4 Skill I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.4.1 Skill request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.4.2 Skill response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.4.3 Speech Synthesis Markup Language (SSML) . . . . . . . . . . . . . . . . . . . . . . . 43
3.5 Code editing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5.1 Edit the HelloWorldIntentHandler code . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5.2 Add some debug code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.6 Test your code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.7 Utility code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.8 Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.9 Node.js differences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.10 Node.js debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Chapter 4 Slots and Dialogs, Saving Session Data . . . . . . . . . . . . . . . . . . . . . . . . . . 52


4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2 Slots in action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.3 Slot skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.3.1 Invocation Name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.4 Skill flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.5 Add the intent to our skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.6 Evaluate your model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.6.1 The JSON editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.7 Accessing the slot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.8 The code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.8.1 Test your skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.9 Session attributes - saving slot values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.9.1 Remember their name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.10 Dialog delegation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.11 The Birthday code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.12 Handling Yes and No intents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.13 Multiple Yes / No sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

●6
Contents

4.14 AMAZON.SearchQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.15 ASK SDK Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.16 Intent error logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.17 Language understanding NLU and Automatic speech recognition ASR . . . . . . . . 82
4.18 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Chapter 5 S3 Storage and DynamoDB Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83


5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.2 Local storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.3 Persistent attributes, DynamoDB and S3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3.1 Code example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.3.2 DynamoDB database storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.4 Request and response interceptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.5 DynamoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.6 S3 storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.7 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Chapter 6 Certification and Publishing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99


6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.2 Adding further languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3 Distribution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.4 Availability and Beta Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.5 Beta Tester . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.6 Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.7 Submission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
6.8 Post Publication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
6.9 Analytics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
6.10 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
6.11 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

Chapter 7 Creating Skills with Lambda and ASK CLI . . . . . . . . . . . . . . . . . . . . . . . . 107


7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.1.1 AWS Lambda skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.2 ASK CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
7.3 Visual Studio code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.4 Local debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
7.4.1 Add Alexa debugger configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
7.4.2 Test your Alexa skill in VS code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

●7
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

7.5 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124


7.6 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Chapter 8 Alexa Presentation Language – APL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125


8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
8.2 APLA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
8.2.1 APLA components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
8.3 Datasources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
8.4 APLA datasource example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
8.5 Adding an APLA reprompt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
8.6 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
8.7 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

Chapter 9 APL Visual Multimodal Responses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136


9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
9.2 Creating an APL Visual Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
9.3 Visual Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
9.4. APL component example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
9.5 Using the Authoring Tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
9.6 Integrating APL and code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
9.6.1 Check for screen support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
9.7 APL Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
9.7.1 Standard Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
9.7.2 Media Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
9.7.3 User-defined commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
9.7.4 Execute Commands directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
9.8 Responsive components and Alexa Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
9.9 Converting Text to speech – using Transformers . . . . . . . . . . . . . . . . . . . . . . . 151
9.9.1 Transformer APL design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
9.9.2 Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
9.9.3 Using the ExecuteDirective command . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
9.10 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
9.11 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

Chapter 10 Alexa In-skill Purchasing (ISP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158


10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
10.2 Create your ISP skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

●8
Contents

10.3 Accessing your ISP code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161


10.4 Retrieve in-skill products, get their information and purchase. . . . . . . . . . . . . . 164
10.5 Produce detail and purchase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
10.6 Purchase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
10.6.1 Failed Purchase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
10.6.2 Refunds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
10.7 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

Chapter 11 Progressive Response - Accessing the Internet . . . . . . . . . . . . . . . . . . . 179


11.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
11.2 Steps to Send a Progressive Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
11.3 Progressive response example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
11.3.1 Code response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
11.4 asyncio, async and await - awaiting a web response . . . . . . . . . . . . . . . . . . . . 183
11.5 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

Chapter 12 Creating a Raspberry Pi IoT Thing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184


12.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
12.2. Create a Raspberry Pi IoT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
12.2.1 a) Create our ‘Thing’ and its certificates . . . . . . . . . . . . . . . . . . . . . . . . 184
12.2.1 b) Thing’s endpoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
12.2.1 c) Transfer the certificates to your Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
12.2.2 Create and run the Python code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
12.2.3 Send messages to your Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
12.2.4 Create an Alexa-Hosted Skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
12.2.5 Test the skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
12.3 Add intents to the Alexa skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
12.4 Control the robot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
12.5 Add intent handlers to the skill code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
12.6 Modify your code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
12.6.1 Modify your Pi code - LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
12.6.2 Modify your Pi code - explorerhat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
12.7 Test your robot or LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
12.8 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

Chapter 13 Smart Home Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201


13.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201

●9
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

13.2 Alexa Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201


13.3 Login with Amazon (LWA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
13.3.1 Create a security profile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
13.4 Create your Smart Home Skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
13.5 Create a Lambda function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
13.6 Lambda skill code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
13.7 Test your Lambda function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
13.8 Link the function to the skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
13.9 Configure account linking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
13.10 Enable and Link the skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
13.11 Clean up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
13.12 Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
13.13 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
13.14 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Chapter 14 Controlling a smart home raspberry Pi with SQS . . . . . . . . . . . . . . . . . . 214


14.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
14.2 Create an SQS Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
14.3 Raspberry Pi SQS code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
14.4 Create a Smart Home skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
14.5 Create the function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
14.6 Create a security profile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
14.7 Configure the smart home skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
14.8 Add the function code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
14.9 Test the function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
14.10 Discover your device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
14.11 Test from an Alexa device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
14.12 Clean up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
14.13 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
14.14 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

Chapter 15 IoT, Pi and Node-RED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225


15.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
15.2 Prerequisites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
15.3 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
15.4 Running node-RED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
15.5 Node-RED user interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

● 10
Contents

15.6 First flow design - Hello world . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228


15.7 Hardware I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
15.7.1 Add an input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
15.8 Using the Sense Hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
15.9 Node-RED dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
15.10 Sense Hat output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
15.11 IoT - Receiving MQTT messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
15.12 Create a new IoT thing for MQTT communication. . . . . . . . . . . . . . . . . . . . . . 242
15.12.1 Subscribe to a topic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
15.13 Node-RED IoT Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
15.14 Receiving MQTT messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
15.15 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249

Chapter 16 Proactive Events – Sending Raspberry Pi Alexa Notifications . . . . . . . . . 250


16.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
16.2 The Lambda function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
16.3 Send a notification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
16.4 Code to get the access token . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
16.5 Send the notification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
16.6 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
16.7 References: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

Chapter 17 Raspberry Pi as a Stand-alone Alexa Device . . . . . . . . . . . . . . . . . . . . . 262


17.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
17.2 Raspberry Pi setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
17.3 Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
17.3.1 Register your AVS device with Amazon . . . . . . . . . . . . . . . . . . . . . . . . . 263
17.3.2 Download and install the AVS SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
17.3.3 Run and authorize the sample app . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
17.4 Use the sample app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
17.5 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
17.6 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

Chapter 18 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272


18.1 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

● 11
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

About the Author

Dr. John Allwork was born in 1950 in Kent, England and became interested in electronics
and engineering at school. He went to Sheffield University on their BEng Electrical and
Electronic Engineering course. There he developed an interest in computers and continu-
ed his education on an MSc course in Digital Electronics and Communication at UMIST.
After two years working for ICL as a design, commissioning and test Engineer he returned
to UMIST where he graduated with a Ph.D. in ‘Design and Development of Microprocessor
Systems’.

He worked for several years in technical support and as a manager in electronics distribu-
tion, working closely with Intel Application Engineers and followed this with design work
using the Inmos Transputer systems.

Having taught at Manchester Metropolitan University he retired in 2011 but has kept up
his interest in electronics and programming as well as his other occupation of travelling,
walking, geocaching and spending time on his allotment.

● 12
Introduction

This book is aimed at anyone who wants to learn about programming for Alexa devices
and extending that to Smart Home devices and controlling hardware, in particular the
Raspberry Pi.

It covers Alexa programming concepts from the basic concepts of Alexa Voice service, the
interaction model and the skill code which runs on AWS (Amazon Web Services) Lambda.

It takes the reader through all stages of creating skills to certification and publishing,
including writing skills that involve in-skill purchasing. It discusses different ways of crea-
ting skills, then moves on to creating visual skills using APL (Alexa Presentation Langua-
ge) for screen-based Alexa devices.

The book then moves on to cover different ways of controlling hardware including the
Internet of Things and Smart Home devices. There are interfaces with the Raspberry Pi
using MQTT and SQS communication, displaying on the Pi using Node-RED and Python
code.

Although mostly based on Python, Node.js examples or links are also provided. The full
code is provided in a separate document.

Please note that Alexa skill development, the developer console and APL versions have
changed since writing this book, so please bear with the author if there are slight diffe-
rences.

I do not pretend to know all there is about Alexa and Raspberry Pi programming – they
seem to advance faster than I can follow! I have a background in hardware and software
design. I am sure that there are areas where some programmers may be offended by my
code and that there may be better ways to write it, but I have written and tried all the
examples and know they work. I hope the examples will spur you on to find solutions to
your own problems. Should you need more information then please try the online help
and the Raspberry Pi or Alexa forums: alexa.design/slack is particularly good. There are
plenty of programmers out there willing to help solve your problems, often extremely
quickly; certainly faster than I would get back to you!

I wish to thank my friends for encouraging me, especially Dr. Hugh Frost, Andy Marsh
and Dr. John Nichols; the Alexa staff: in particular Jeff Nunn, Jeff Blankenburg and Ryan J
Lowe; helpers on the alexa.design/slack group, including Andy Whitworth; subscribers of
my YouTube and GitHub channels who have made encouraging comments; and the many
anonymous people on the internet, forums, blogs and websites who have answered many
questions, not just my own – keep up the good work. Not least of all I would like to thank
my wife Penny, for supporting me throughout.

And of course, you for buying the book!

● 13
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

Chapter 1 • Chapter 1 Alexa History and Devices

Alexa is the virtual voice assistant and Echo is the device.


The standard Amazon Echo device general release was in 2015. In 2019, newer versions
were released, with more rounded designs and better audio.
Amazon Echo Dot was released in 2016 with a smaller design than the standard Echo. Va-
rious releases and designs, including a kid’s version, have continued to the 5th generation
with a clock and improved LED display in 2022.

In 2017, Amazon released a combination of the Dot and Show, called the Echo Spot. In
the same year, the Echo Show was released and featured a slanted, 7-inch touchscreen,
camera and speaker. This later changed to a 10-inch screen (Echo Show 10), and more
recently, added a 360-rotating display.

The Echo Show 5 came in 2019, (2nd gen in 2021), as well as Echo Show 8 and an Echo
Show 15 in 2021 designed for wall mounting.

There are other devices too, including the Button, Flex, Input, Look and recently the Astro
robot.

Here are some of my devices (not including smart devices). From the top: Echo Show 8,
Fire TV stick, Echo Auto, my original Echo dot, and the Echo Spot.

● 14
Chapter 1 ● Alexa History and Devices

Even though many devices have a screen, you should always design for ‘voice first’.

1.1 Alexa voice service and AWS Lambda


Alexa Voice Service is Amazon’s cloud service that processes the audio, determines the
appropriate action (AVS) and returns a response to the device. For the skill to produce
the appropriate response, designers need to implement two major parts: the interaction
model and the skill code which runs on AWS (Amazon Web Services) Lambda.

The interaction model is what your users say and how they communicate with your skill.
AWS Lambda is a serverless, event-driven computing service that lets you run your code.
Lambda can be triggered by many AWS services and you only pay for what you use.

When a user interacts with an Echo device, AVS sends a request to the skill which is run-
ning on AWS Lambda. The skill replies with a response that is turned into a speech and/
or visual response back to the user.

1.2 Pricing
Although there are charges for AWS Lambda, the AWS Lambda free tier includes one
million free requests per month and 400,000 GB-seconds of compute time per month, as
well as 500 Mb storage. As you can see, this is more than enough for a beginner. For more
information, see https://aws.amazon.com/lambda/pricing/

For developers whose skills use more than this, Amazon provides Promotional Credits
which reward those who build cloud-hosted applications, software, or tools for sustaina-
bility-related work.
For FAQ see reference 1.

1.3 Alexa skills


There are a few different types of Alexa skills2. You may already have realized that a skill
communicating with an Alexa device is different from one switching on your lights or tel-
ling you there’s someone at your front door.

● 15
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

At the moment, there are 15 different types of Alexa skills.


The more common ones are:

Skill Function Skill Type Description


Automotive Pre-built and Custom Automotive applications
Custom Custom Voice and visual (APL) applications
Flash briefing Pre-built Provide news and short content information
Games Custom Voice and visual driven game skills
Music Pre-built Skills to control audio content
Smart Home Pre-built Skills to control smart home devices
Video Pre-built Control video devices and content

We’ll be concentrating on Custom skills. Blueprint pre-built skills are also available and
easy to develop but have reduced options for user experience. We’ll also study smart
home skills, of course.

1.4 Supported programming languages


AWS Lambda natively supports Java, Go, PowerShell, Node.js, C#, Python, and Ruby
code. This book will mainly use Python, but it also provides code snippets and links for
Node.js.

1.5 Terminology – Invocation, Utterances, Intents and Slots


As with learning anything new, there is new terminology to be understood. You will soon
meet (or may already have met) Invocation, Utterances, Intents and Slots.

1.5.1 Alexa Wake word


This is the word used to start your Alexa device listening to your command.
Currently, there are five wake words: ‘Alexa’ (the default), ‘Amazon’, ‘Echo’, ‘Computer’
and ‘Ziggy’. You can change these for your devices, but not invent new ones.

1.5.2 Invocation
The ‘invocation’ is the phrase used to trigger your skill, e.g.: ‘Alexa, open Johns’ weather
skill’ or ‘Alexa, launch my cooking skill’.

1.5.3 Utterances
Utterances are the phrases that your user says to make a request. There can be many
ways to achieve the same result, e.g.: What’s the time? What’s the time now? What time
is it? – you will have to think of as many possible ways that your user can interact with
your skill. Nevertheless, Alexa will build your model and try to find similar utterances.

All the possible ways to do this can be difficult to describe (considering, for instance, how
many different ways and types of pizza someone might order), so Amazon has recently
announced Alexa Conversations to help with this. For more information, see reference 3.

● 16
Chapter 1 ● Alexa History and Devices

1.5.4 Intents and requests


The utterances are linked to one intent in the code. For instance, all the ‘time’ utterances
would be linked to the same intent, e.g., GetTimeIntent, and this would trigger a GetTi-
meIntent function in our skill code.

There are two types of Intents:

• Built-in Intents
- Standard built-in intents: These are provided by default by Amazon that every skill
must have, e.g.: AMAZON.StopIntent, AMAZON.CancelIntent, AMAZON.Fallback-
Intent, etc. and include: AMAZON.YesIntent, and AMAZON.NoIntent, intents for
screen control (e.g., scroll up/ down/ left / right) and media intents (pause, repeat,
resume), and also an AMAZON.SendToPhoneIntent. You can see these when you
add an intent, and select “Use an existing intent from Alexa’s built-in library”
- The Alexa Skills Kit also provides a library of specific built-in intents and includes
intents such as Actor intents, Books, Calendar, LocalBusiness, Music, TV, Series,
WeatherForecast, etc.

These intend to add functionality to your skill without you having to provide any sample
utterances. For example, the WeatherForecast includes a search action (What is), an ob-
ject (WeatherForecast), location (London) and date (tomorrow) .
We won’t cover them in this book, see:

https://developer.amazon.com/en-US/docs/alexa/custom-skills/built-in-intent-library.html

• Custom Intents

These are created as required for the skill (e.g., GetTimeIntent)


If you use an Amazon template, the code for the built-in intents is provided for you.
There are three types of requests that the skill can send:

• A Launch request that runs when our skill is invoked (as a result of the user saying,
‘Alexa open …’ or ‘Alexa, launch ...’).
• An Intent request which contains the intent name and variables passed as slot values.
• A SessionEnded request, which occurs when the user exits the skill, or there is an
unmatched user’s response (although you may be able to trap this out with AMAZON.
FallbackIntent).

This information is all packaged and sent as a request (and returned as a response) as a
JSON file. We’ll look at the JSON code later.

1.5.5 Slots
A slot is a variable that contains information that is passed to an intent. The user might
say ‘What’s the time in London’. Here ‘London’ (or Paris or Rome) is passed as a slot
variable to the intent code.

● 17
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

Amazon provides built-in slot types, such as numbers, dates and times, as well as built-
in list types such as actors, colors, first names, etc. In the previous example, we could use
AMAZON.GB_CITY which provides recognition of over 15,000 UK and world-wide cities
used by UK speakers.

However, some of these slots are being deprecated (including AMAZON.GB_CITY in favour
of AMAZON.CITY), so check. The full list is covered at ‘List Slot Types:

https://developer.amazon.com/en-US/docs/alexa/custom-skills/slot-type-reference.html#list-slot-types

Alexa slot types fall into the following general categories:

• Numbers, Dates, and Times


• Phrases
• Lists of Items

Developers can create custom slots for variables that are specific to their skill.
When we define our utterances, slots are shown in curly braces: {city}, e.g.:

Example:

Intent GetTimeIntent
Utterance What is the time in
Slot {city}

Utterances can have many slots and slot types.

The GetTimeIntent will trigger a function in your skill (which you might sensibly call Get-
TimeIntentFunction).

Slots are used to pass data from your VUI (voice user interface) to your program. As an
example, we might have an Alexa skill that asks for your name.

The VUI might go like this:

User: “Alexa, Open What’s my name”


(Invoke the skill – the launch request executes)
Alexa: “Welcome, please tell me your name”
User: “My name is John” (“John” is passed in a slot to myName intent)
Alexa: “Hello John”
(Your intent picks John from the slot passed to it and responds)

● 18
Chapter 1 ● Alexa History and Devices

At this point, the slot data is lost unless you save it. You can save data in a temporary
folder but more often data is stored in session attributes, you will find out later.

1.5.6 Interaction model


The combination of the utterances and their related intents and slots make up the inter-
action model. This needs to be built by the developer console, and in doing so Alexa may
recognize further utterances similar to those you have defined.

1.5.7 Endpoints
The endpoint is where your code is hosted. You can choose an Amazon-hosted, AWS
Lambda ARN (Amazon Resource Name) site or host it yourself on an HTTPS site that you
manage.

If you choose an AWS site, it will give you an ID beginning arn:aws:lambda and look
like: arn:aws:lambda:<region>:function:<functionID>. You skill also has an ID looking
something like this: amzn1.ask.skill.a0093469-4a50-4428-82e6-abcde990fgh3.

1.5.8 Regions
If using an AWS-hosted site, you should host your code in a region near to your user.
We’ll see that there are lots of regions, but for some skills currently only North Virginia
is available.

1.6 Skill Sessions


The period that your skill runs for is called a session. A skill session begins when a user
invokes your skill and Alexa sends your skill a request. Your skill receives the request and
returns a response for Alexa to speak to the user.

If the shouldEndSession parameter is ‘true’ the skill terminates, otherwise, the session
remains open and expects the user to respond. If no user input occurs, a reprompt is
sent if included in the code. If the user still doesn’t respond (after about 8 seconds), the
session ends 4.

Skill connections and progressive responses may override these rules. For example, if
a skill has to get further information from another source, e.g., when your taxi will be
available, or pizza delivered.

1.7 Session attributes


Session attributes are used to hold data during a session, for example, your user’s name.
When the session finally ends, the data is lost. To prevent this from happening, data can
be stored permanently in persistent attributes. This can be held in a DynamoDb database
which is provided as one of the AWS services and easily accessed using an Alexa-Hosted
Skill. With an Alexa-Hosted Skill, you can build your model, edit your code and publish
your skill all from within the developer console.

● 19
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

1.8 Request and response JSON


We saw in the figure above how the request is sent from the user (Alexa Voice Service)
to your code and how the response is returned from your code.
This data is passed in a JSON format. JSON (JavaScript Object Notation) is a lightweight
data-interchange format. It is easy for humans to read and write and easy for machines
to parse and generate” 5

The basic JSON request contains information on the active session, the context, the sys-
tem information on the application (ID), user, deviceID, and the request itself:

{
“version”: “1.0”,
“session”: {
( ..session parameters)
}
“context”: {
( ..information on the Alexa device)
}
“System”: {

“request”: {
“type”: “IntentRequest”,
“requestId”: “amzn1.echo-api.request.745d…9a”,
“locale”: “en-GB”,
“timestamp”: “2022-04-14T09:27:01Z”,
“intent”: {
“name”: “HelloWorldIntent”,
“confirmationStatus”: “NONE”
}
}
The reply JSON contains is the response speech and reprompt, as well as the state
of the EndSession and session attributes.
{
“body”: {
“version”: “1.0”,
“response”: {
“outputSpeech”: {
“type”: “SSML”,
“ssml”: “<speak>Welcome, you can say Hello or Help.</speak>”
},
“reprompt”: {
“outputSpeech”: {
“type”: “SSML”,
“ssml”: “<speak>Welcome, you can say Hello or Help.</speak>”
}
},

● 20
Chapter 1 ● Alexa History and Devices

“shouldEndSession”: false,
“type”: “_DEFAULT_RESPONSE”
},
“sessionAttributes”: {},
“userAgent”: “ask-python/1.11.0 Python/3.7.12”
}
}

The response can get more complicated if there is a dialog session occurring (i.e., if the
program hasn’t enough information to complete the intent request and has to ask for
more).

We’ll look at the information passed in the JSON request and response and how to extract
it in a later chapter.

1.9 Blueprint skills


Alexa provides blueprint skills, where you can ‘fill in the blanks’ to make your skill. These
are worth looking at for some fun and information presenting skills.

The current categories are: At home, Kids recommended, Learning and knowledge, Fun
and Games, Storyteller, Greetings and Occasions, Communities and Organizations, and
Business 6. We won’t cover them here.

● 21
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

1.10 Summary
We’ve seen how the Alexa devices have developed from the original voice-only device to
screen-based and robot devices, how the Alexa Voice service works and looked at termin-
ology – Invocation, Utterances, Intents and Slots. Finally, we looked at a skill session and
how data is passed and saved during a session and between sessions.

In the next chapter, we’ll see how to set up an Alexa account before moving on to our
first Alexa skill.

1.11 References:
1. https://aws.amazon.com/lambda/faqs/
2. https://developer.amazon.com/en-US/docs/alexa/ask-overviews/list-of-skills.html
3. https://www.youtube.com/watch?v=1nYfRvg976E
4. https://developer.amazon.com/en-US/docs/alexa/custom-skills/
manage-skill-session-and-session-attributes.html
5. https://www.json.org/json-en.html
6. https://blueprints.amazon.com

● 22
Chapter 2 ● Creating your Amazon Account

Chapter 2 • Creating your Amazon Account

2.1 Introduction
There are three ways to create an Alexa Skill.

1. Using Alexa-Hosted Skill – this is most probably the easiest way. You don’t need
an AWS account – you can just get started.
2. Using AWS Lambda and the Developer Console.
3. Using an IDE (such as Visual Studio code) and ASK CLI (Alexa Skills Kit and Com-
mand Line Interpreter).

In any case, you need an Amazon developer account.

We’ll use an Alexa-Hosted skill where we can. It provides most of the requirements we
need including extra storage (S3) and a database (DynamoDB). We’ll study these in a
later chapter.

2.2 Create your Amazon account


You don’t need an AWS account for Alexa-Hosted skills, but you will need one for smart
home skills.

Go to the Amazon Developer website at: https://developer.amazon.com/

Click ‘Developer Console’ and create your Amazon Developer account.

● 23
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

Complete the form and create your account. You may have to authenticate it with an OTP.

Answer the rest of the questions in the Amazon Developer Registration.

Agree to the terms and click submit.

You can now provide payment information, user roles, etc., or leave until later. If you
want to earn money from In Skill Purchases, you will have to complete this.

The next screen is the Amazon Developer Dashboard – My Account page:


https://developer.amazon.com/settings/console/myaccount

However, you can always complete this later.

● 24
Chapter 2 ● Creating your Amazon Account

Eventually, you will get to the developer console.

We will be using the Alexa Skills Kit but note the other items here.

• Alexa Voice Service (AVS) is used to integrate Alexa features and functions into a
product (see chapter 17).
• Amazon Appstore is an app store for Android and provides apps for Fire Tablets.
• Amazon Dash console enables you to manage Amazon dash buttons.
• Amazon GameOn is for mobile gamers to share their experiences (high scores, tips,
tricks, etc.) and to participate in challenges.
• Login with Amazon (LWA) is used to authenticate users using their Amazon accounts.
You need this if you create any smart home devices.

We’ll use LWA and AVS later.

● 25
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

2.3 Your skills


Clicking the Alexa Skill Kit takes you to the development console. If this is the first time
you’ve been here, you won’t have any skills listed.

2.4 Hosting
Click on the Hosting tab to see what you’re allowed to access.

You’ll find the storage and data transfer more than enough for now.

● 26
Chapter 2 ● Creating your Amazon Account

2.5 Summary
In this chapter, we saw the different ways of creating and Alexa skill, created our develo-
per account, and saw how to start an Alexa-Hosted skill.

In the next chapter we’ll develop our first skill.

● 27
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

Chapter 3 • Creating an Alexa Skill

3.1 Introduction
In the last chapter, we saw how to start an Alexa-Hosted Skill. This provides access to
three AWS Lambda endpoints, an S3 bucket for storage and access to a DynamoDB data-
base. We’ll discuss these in later chapters.

Let’s create our first skill now.

3.2 Your first skill


As we saw, clicking the Alexa Skill Kit takes you to the development console. If this is the
first time you’ve been here, you won’t have any skills listed.
It’s at: https://developer.amazon.com/alexa/console/ask

Click the Create Skill button.

In the next screen, you’re asked for a skill name, the locale (language and location) for
your skill, and if you want more than one locale, to sync them. This will link all the utte-
rances. The user interface has changed slightly since originally writing this chapter, but
the process is the same.

● 28
Chapter 3 ● Creating an Alexa Skill

There are rules as to what names you can give your skill. It must be at least two charac-
ters and less than fifty, and brand names are only allowed if you show proof of rights.
When you publish your skill, these will be checked.

It’s sensible to give your skill a two- or three-word name. Try ‘<your name> first skill’.
I’ve used John’s first demo skill.

3.2.1 The interaction model


The interaction model is how your skill communicates with the user. Some templates are
provided for you (Flash briefing, smart home, video, etc.). Leave it as Custom.

3.2.2 Choose a method


The choices are Alexa-hosted – Node.js or Python, or Provision your own.
In this book, we’ll mostly be using Python, but there will be Node.js examples or links.
Choose Node.js or Python.

● 29
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

In the top right-hand corner, you can select the hosting region. It’s sensible to select one
nearest to you.

Click ‘Create skill’. The next screen provides some templates. There are more Node.js
templates than Python. Some provide examples of intents, data persistence and perso-
nalization. Choose ‘Start from scratch’ and ‘Continue with Template’.

● 30
Chapter 3 ● Creating an Alexa Skill

You can also import a skill, say from GitHub.

Your Alexa skill will be created. It takes about a minute and then you’re taken to the de-
veloper console build tab.

The first thing you notice is the video showing you how to build an Alexa Skill. You can
view this now if you want to.

At the top left is your skill name. To the left of this, you can return to your skill list. To the
right, you can move between the build tab (currently displayed), the Code and Test tabs
which we’ll look at soon and the Distribution, Certification and Analytics tabs which are
used when publishing the skill.

● 31
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

This template skill can now be tested and executed – you don’t have to do anything. But
before we run our skill, let’s take a look at the invocation and intents. Remember, the
invocation is what your user says to invoke (start) your skill, for instance: “Alexa, open
John’s first demo skill”; the intents are what your users say when the skill is running du-
ring a conversation e.g., “My favorite color is red”.
On the right-hand side, there is a skill builder checklist that shows that four stages have
been completed.

We won’t monetize our skill just yet – we will cover that in a later chapter. These actions
are also available in the left-hand column, which also shows the currently selected lan-
guage. The items labelled ‘Custom’ can be expanded for more detail.

We’ll look at the Invocation Name and Build Model in this chapter, and the Intents and
Endpoint in the next.

3.2.3 The Invocation Name


Let’s start by checking the Invocation Name. Either click the right-hand column “1. Invo-
cation Name” or expand the left-hand column and select “Skill Invocation Name”.

● 32
Chapter 3 ● Creating an Alexa Skill

Sometimes (as here) the Invocation Name says, “change me”. If necessary, change this
to your skill name (it can be anything, but it seems sensible). I’ve used john’s first demo
skill. The user will say “Alexa, open john’s first demo skill” to invoke the skill. Note that
the Invocation Name can only be lowercase.

As you’ve changed the invocation, you will have to rebuild your model. Save the model
and rebuild it. Use the option we saw above (3. Build Model), or these buttons.

Whilst it’s doing that (It won’t take long), take a look at the Skill Launch Phrases and
Intent Launch Phrases.

Skill and Intent launch phrases enable your users to interact with your skill without sta-
ting the launch name. Neither is available until the skill is published.

3.2.4 The Intents


Click the Interaction model then Intents to see the current Intents.
They are Cancel, Help, Stop, NavigateHome (they respond to the user saying ‘cancel’,
‘help’, ‘stop’ and ‘go home’), HelloWorld (triggered when the user says ‘Hello’) and Fall-
back. The Fallback intent is triggered by a user utterance that doesn’t match any skill
intent and allows you to write code to provide the user with more details about your skill
and how to interact with it.

● 33
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

If you click on an intent, you get a list of the utterances that will trigger the intent.

3.2.5 The code


Before we can test the skill, we have to deploy the code. Let’s look at the code first. Click
the Code tab.

The Python code example here begins by importing the libraries we need. For example,
import logging imports the libraries that enable us to output debugging information to
Cloudwatch logs, see section 3.8. To do this we use the code

logger.info(info_to_display)

● 34
Chapter 3 ● Creating an Alexa Skill

The handlers follow. These deal with the launch request and intents such as Hello or Help.

class LaunchRequestHandler(AbstractRequestHandler):

class HelpIntentHandler(AbstractRequestHandler):

We’ll look at these in more detail later.

The rest of the intents follow. These include the Stop or Cancel intent (what to do when
the user says “stop” or “cancel”); the Fallback intent (what to do if the user’s utterance
doesn’t match any voice model intent); the SessionEnded intent (what to do when the
session ends), on so on.

The intent handlers are registered using the sb.add_request_handler code, where sb is
the SkillBuilder() code. This is imported by the command:

● 35
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

‘from ask_sdk_core.skill_builder import SkillBuilder’, at the top of your code.


The entry point of the code is at the end: lambda_hander = sb.lambda_handler()

This example uses Classes, you can also use Decorators. For a more detailed description
of both, and the code, see:
https://developer.amazon.com/en-US/docs/alexa/alexa-skills-kit-sdk-for-python/develop-your-first-skill
html#using-handler-classes

It’s worth noting the link mentioned in this code to more skill examples at:
https://alexa.design/cookbook

For the Node.js version, refer to section 3.9 at the end of this chapter.

Before looking at our code in more detail, let’s make the welcome message more perso-
nal, then test our skill.

● 36
Chapter 3 ● Creating an Alexa Skill

Click the code tab.

Python:

• Find the line that says:


speak_output = “Welcome, you can say Hello or Help. Which would you like to try?”

This is about line 30:

• Change this to, say:


speak_output = “Hello John, please say Hello or Help.”

You can use your name instead of mine!

• If you are unfamiliar with Python, you MUST ensure your code is tabbed correctly.

Note that this is in the LaunchRequestHandler code, which runs when the user starts your
skill.

• Save the code. Click the deploy button in the top right-hand corner.

Node.js:

• For Node.js, find the line that says:


const speakOutput = ‘Welcome, you can say Hello or Help.
Which would you like to try?’;

This is about line 13. Change it to, say:


const speakOutput = ‘Hello John, please say Hello or Help.’;

• Make sure that the quotes match and the line ends with a semi-colon.

• Save the code.

Remember that, after making any changes to your code and before we can test it, we
must save and deploy the code.

● 37
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

Click deploy in the top right-hand corner.

You’ll get a message when it’s been deployed, e.g., Last Deployed: Apr 13, 2022, 8:26 PM.

3.3 Testing your skill


We can now test the skill. Click the Test tab. This opens the Alexa Simulator. You have to
enable skill testing. Change that from ‘Off’ to ‘Development’.

You can now send any command that you might usually use with your Alexa device (try:
Alexa, what’s the weather).

We can now launch the skill.

Type (or click the microphone button and say) “Open <launch name>” e.g., “Open johns
first demo skill”. You don’t have to use the wake word (i.e., No need to say or type Alexa,
open johns first demo skill).

● 38
Chapter 3 ● Creating an Alexa Skill

Congratulations! You’ve just got your first skill working.

Troubleshooting
If it doesn’t work, check that you have the correct invocation name, that you saved and
built the model and that you saved and deployed your code. Also, if the box under Alexa
Simulator e.g., English (GB) is greyed out, close the developer console and log in again.

In the simulator, you can see we see the invocation: “open johns first demo skill”

The response: “Welcome, you can say …” (Or whatever you changed it to)
and after saying ‘hello’, our HelloWorld intent code response: “Hello”.

The skill terminates after this conversation – we’ll see why later. If you type in Hello
again, your program doesn’t respond - Alexa responds instead.

You can save up to 30 utterances for later use by clicking the plus sign:

Note that, depending on how the user invokes your skill, it is possible that the launch
request isn’t executed.

For more about invoking custom skills, see:


https://developer.amazon.com/en-US/docs/alexa/custom-skills/understanding-how-users-invoke-
custom-skills.html#about-invoking-custom-skills

(or search for “invoke alexa skill”).

3.4 Skill I/O


At the top of the simulator, there are options to show the Skill I/O, the Device Display,
Device Log and Personalization.

The Device Display is used to show what the device will display if it has a screen. If you
scroll down, you’ll see that it currently displays the skill name and how to exit. We’ll see
this in action when we discuss Alexa Presentation Language in a later chapter.

● 39
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

The device log provides details of the actions of the skill, including events and directives:

Personalization. Alexa devices are capable of identifying a recognized skill user if it is set
up and agreed by the user. You can use this in your code and test using personalization.
For more details, see:
https://developer.amazon.com/en-US/docs/alexa/custom-skills/add-personalization-to-your-skill.html

Sklll I/O. Scroll down to see the JSON code.

Remember, communication uses JSON code requests and responses. This shows the JSON
input (request –sent to your code) and JSON output (response – received by your code).

JSON is easy to understand. If you look at the JSON output, you can see where the
<speak>Welcome, you can say … occurs.

3.4.1 Skill request


The JSON input request data is sent by your Alexa device as a result of hearing the launch
phrase. This contains lots of useful information such as the locale, device capabilities
(does it have a screen?), the userId and so on. We’ll use some of this information in later
code examples.

We won’t list all the JSON input here – you can do that yourself, but I will look at a few
relevant items, and we’ll see more later on.

● 40
Chapter 3 ● Creating an Alexa Skill

It starts with the version, then the session items that identify the sessionId, the applica-
tion and the user’s userId.

{
“version”: “1.0”,
“session”: {
“new”: true,
“sessionId”: “amzn1.echo-api.session.27d.. e7cb”,
“application”: {
“applicationId”: “amzn1.ask.skill.4649.. 981”
},
“attributes”: {},
“user”: {
“userId”: “amzn1.ask.account.AFCVJZSYW…VY2BH6HI”
}

It follows with some information on the device under “context” > “Viewports”. In this
case, it refers to the Alexa simulator we’re using and tells us we have a rectangular screen
capable of showing APL, it can’t rotate and has a pixel height and width of 1280 × 800.
See if you can identify these in your display

“context”: {
“Viewports”: [
{
“type”: “APL”,
“id”: “main”,
“shape”: “RECTANGLE”,

It continues with information about the System. We’ll look at System>device>Supporte-


dInterfaces later to see if the device can support APL.

“System”: {

“application”: {
“applicationId”: “amzn1.ask.skill.4649….981”
},
“user”: {
“userId”: “amzn1.ask.account.AFCVJZSY…H6HI”
},
“device”: {
“deviceId”: “amzn1.ask.device.AGSER…DU”,
“supportedInterfaces”: {}

● 41
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

Finally, information about the request itself is displayed. In this case, we see that it was
a launch request, and the locale was en-GB (I’m in the UK)

“request”: {
“type”: “LaunchRequest”,
“requestId”: “amzn1.echo-api.request.a7ed3cc2-4bba-9e82-3c79e5e4eb59”,
“locale”: “en-GB”,
“timestamp”: “2022-04-13T19:57:52Z”,
“shouldLinkResultBeReturned”: false
}
}

We’ll see how to extract some of this data in our code later.

If we compare the request with that after entering ‘hello’, we get this:

“request”: {
“type”: “IntentRequest”,
“requestId”: “amzn1.echo-api.request.745de8e2-7… 6fc9a”,
“locale”: “en-GB”,
“timestamp”: “2022-04-14T09:27:01Z”,
“intent”: {
“name”: “HelloWorldIntent”,
“confirmationStatus”: “NONE”
}

We can see that we have an IntentRequest and its name is “HelloWorldIntent”. We pick
this up in our code to reply.

3.4.2 Skill response


The skill response is the one generated by your code (we haven’t looked at that yet, but
the bit that creates the “Welcome, you can say Hello or Help.”).

This is the response to the open skill launch request. It’s short, so we’ll look at the whole
listing:

{
“body”: {
“version”: “1.0”,
“response”: {
“outputSpeech”: {
“type”: “SSML”,
“ssml”: “<speak>Welcome, you can say Hello or Help.</speak>”
},
“reprompt”: {
“outputSpeech”: {

● 42
Chapter 3 ● Creating an Alexa Skill

“type”: “SSML”,
“ssml”: “<speak>Welcome, you can say Hello or Help.</speak>”
}
},
“shouldEndSession”: false,
“type”: “_DEFAULT_RESPONSE”
},
“sessionAttributes”: {},
“userAgent”: “ask-python/1.11.0 Python/3.7.12”
}
}

With Node.js the userAgent is:


“ask-node/2.12.0 Node/v12.22.11 sample/hello-world/v1.2”

The main parts here are the response > outputSpeech. This is SSML (Speech Synthesis
Markup Language) which tells the device what to say initially, and the reprompt > output-
Speech which tells the device what to say if the user doesn’t respond. In this case, because
“shouldEndSession” is false, the user then has 8 seconds to respond, before the device
gives up.

3.4.3 Speech Synthesis Markup Language (SSML)


SSML provides additional control to your speech. You use SSML in your output by using
“type”: “SSML” as seen above, instead of “type”: “PlainText”

“outputSpeech”: {
“type”: “SSML”,
“ssml”: “<speak>This speech uses SSML</speak>”
}

There is a long list of SSML tags. They can also be used in APLA, see section 8.2. They
are listed at:
https://developer.amazon.com/en-US/docs/alexa/custom-skills/speech-synthesis-markup-language-
ssml-reference.html

The more commonly used ones are:

• audio Plays an audio file.


<audio src=”soundbank://soundlibrary/bell/chimes/chimes_01”/>
• break Provides a pause. Set time with strength or time attribute.
<break time=”2s”/>
• emphasis Gives emphasis (strong, moderate or reduced).
<emphasis level=”strong”>I really like</emphasis> you
• voice Used to speak the text using Amazon Polly voice, such as Hans,
Marlene, Vicki in German locale, or Amy, Brian, Emma in en_GB.

● 43
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

<speak>Sorry, but
<voice name=”Brian”>I am a robot</voice>
</speak>
• speak Surrounds the text to be spoken with this tag.
<speak>This is what Alexa sounds like without any SSML</speak>

There are strict requirements and limitations for audio when used in SSML. The main ones
being: a valid MP3 file hosted on an https source, no longer than (a combined) total of
240 seconds, a bit rate of 48 kbps and sample rate of 22050 Hz, 24000 Hz, or 16000 Hz.

Alexa provides a library of sound effects that you can use. It has a wide selection of short
audio clips, from Air/Fire Extinguisher through Animal to Wood/Squeaks, see
https://developer.amazon.com/en-US/docs/alexa/custom-skills/ask-soundlibrary.html

3.5 Code editing


We edited the welcome message previously. To get familiar with using the editor, let’s
change the HelloWorldIntent handler and add some debug code.

3.5.1 Edit the HelloWorldIntentHandler code


The reason the skill terminates after entering ‘Hello’ is because there was no reprompt
outputSpeech message (see above). That is provided with an ‘ask’ in the return statement.

Python:

• Find the line of code that says:


# .ask (“add a reprompt if you want to keep the session open for the user to respond”)

• The # is a comment. Change the line to the following:


.ask(“Say Hello again”)

Node.js:

• Find the line (about line 32) beginning: //.reprompt .


• Remove the //.

3.5.2 Add some debug code


We’ll add a couple of lines so that we can see how to log messages and debug our code.
Debug messages appear in the Cloudwatch logs, see section 3.8.

Using Python, before each of the speak_output lines of code add

logger.info(“In launch request”)


and
logger.info(“In hello world intent handler”)

● 44
Chapter 3 ● Creating an Alexa Skill

In Python, make sure they are tabbed correctly (at the same level as the speak_output).

The Node.js changes are in sections 3.9 and 3.10 and use console.log() command.

Your code should look like this ():

You can see how your code is steered to the correct procedure from the JSON message.
The launch request had a “type”: “LaunchRequest”, which is picked up by the code:
return ask_utils.is_request_type(“LaunchRequest”)(handler_input)

● 45
Programming Voice-controlled IoT Applications with Alexa and Raspberry Pi

And the HelloWorldIntent is detected by:


return ask_utils.is_intent_name(“HelloWorldIntent”)(handler_input)

The Node.js code is steered with the following commands:


return Alexa.getRequestType(handlerInput.requestEnvelope) === ‘LaunchRequest’;
and
return Alexa.getRequestType(handlerInput.requestEnvelope) === ‘IntentRequest’
&& Alexa.getIntentName(handlerInput.requestEnvelope) === ‘HelloWorldIntent’;

We’ll look at Intents and handler_input in more detail in the next chapter.
Save and deploy your code.

3.6 Test your code


This time you can say ‘Hello’ as many times as you want. Note that the Alexa simulator
doesn’t time out like a real device. Try it on a device. If it doesn’t work make sure the
login (and locale) for your developer is the same as that for your Alexa device.

3.7 Utility code


Whilst your code is deploying, look at the other two pieces of Lambda Python code: requi-
rements.txt and utils.py (the Node.js functions are described at the end):

requirements.txt
This imports the libraries we need:
boto3==1.9.216
ask-sdk-core==1.11.0

We’ll see in a later chapter that boto3 is used to create, configure, and manage AWS ser-
vices, such as the Amazon Simple Storage Service (Amazon S3). On a side note, you can
search for “Why is it called Boto3?”.

ask-sdk-core provides the ‘boiler plate’ code for developing our Alexa Skills.
We’ll add to requirements.txt in later chapters.

utils.py
The create_presigned_url code here provides temporary access to S3 storage (‘buckets’)
to users who do not have AWS credentials or permissions. We’ll use that later too.

● 46
Chapter 3 ● Creating an Alexa Skill

3.8 Debugging
When you’ve tested your code, Click the Code tab and then the CloudWatch logs tab.

You may have to use the drop-down box to select your region, depending on where you are.

If you select the wrong region, you’ll get an error message:

You may also be prompted to complete your settings (language and region) for the Cloud-
Watch logs to work.

● 47
Another random document with
no related content on Scribd:
O bigode fanado posto ao ferro
Está alli num desterro,
E cada pello em solidão tão rara,
Que parece ermitão da tua cara;
De cabelleira tal affirmam cegos
Que a mandaste comprar no Arco dos pregos.

Olhos ... .. ... sempre á porta,


Me têm esta alma absorta,
Principalmente vendo-lhe as vidraças
Nos grosseiros caixilhos das couraças;
Cangalhas que formaram luminosas
Em dois arcos de pipa duas ventosas.

De muito cego, e não de malquerer,


A ninguem pódes ver,
Tão cego és que não vês teu prejuizo,
Sendo cousa que se olha com o juizo;
Tu és mais cego do que eu, que te susurro,
Que em te olhando não vejo mais que um burro.

Chato o nariz, de cócaras sempre posto,


Te corre todo o rosto
De gatinhas buscando algum jazigo,
Aonde o desconheçam por embigo,
Té que se esconde d’onde mal o vejo,
Por fugir ao fedor do teu bocejo.

Faz-lhe tal visinhança a tua bocca


Que com razão não pouca
O nariz se recolhe para o centro,
Mudado para os baixos lá de dentro,
Surge outra vez, e vendo a baforada,
Lhe fica alli a ponta um dia engastada.
Pernas e pés defendem a tua cara
Velhaca, e quem cuidára,
Tomando-te a medida das cavernas,
Se movesse tal corpo com taes pernas?
Cuidei que eras rossim das Alpujarras,
E já frizão te digo pelas garras.

Um cazaquim trazias sobre o coiro,


Qual odre, a quem o toiro
Uma e outra cornada deu traidora,
E lhe deitou de todo o vento fóra;
Tal vinha o teu vestido de enrugado,
Que o tive por um odre esfuracado.

O que te vir ser todo rabadilha


Dirá que te perfilha
Uma quaresma, chato percevejo,
Por arenque de fumo ou por badejo;
Sem carne e osso, quem ha ahi que creia
Sinão que és descendente de lampreia?

Livre-te Deus de um sapateiro ou xastre,


Que te temo um desastre;
E é que por sovéla ou por agulha
Armem sobre levar-te alguma bulha,
Porque, depositando-te a justiça,
Será num agulheiro ou em cortiça.

Na esquerda mão trazias a bengala,


E, ou por força ou por gala,
No sovaco por vezes a mettias,
Só por fazer infindas cortezias,
Tirando ao povo, quando te destapas,
Entonces o chapéu, agora as capas.
Fundia-se a cidade em carcajadas,
Vendo as duas entradas
Que fizeste do mar a Sancto Ignacio,
E depois do Collegio a teu palacio,
O rabo erguido em cortezias mudas,
Como quem pelo .. tomava ajudas.

Ao teu palacio te acolheste, e logo


Casa armaste de jogo,
Ordenando as merendas por tal geito,
Que a cada jogador se dá um confeito:
Dos tafues um confeito era um boccado,
Sendo tu pela cara o enforcado.

Depois déste em fazer tanta parvoice,


Que ainda que o povo risse
A principio, cresceu depois a tanto
Que chegou a chorar com triste pranto:
Chora-se nú de um roubador de falso,
E vendo-te eu de riso me descalço.

Chinga-te o negro, o branco te pragueja,


E a ti nada te aleja;
E por teu sem-sabor e pouca graça
És fabula do lar, riso da praça,
Té que a bala, que o braço te levára,
Venha segunda vez levar-te a cara!
AO CONFESSOR
DO ARCEBISPO D. FREI JOÃO DA MADRE DE DEUS

Eu, que me não sei calar,


Mas antes tenho por mingua,
Não purgar-se qualquer lingua,
A risco de arrebentar:
Vos quero, amigo, contar
(Pois sois o meu secretario)
Um successo extraordinario,
Um caso tremendo e atroz:
Porém fique aqui entre nós.

Do confessor jesuita,
Que ao ladrão do confessado
Não só absolve o peccado,
Mas os fructos lhe alcovita:
Do precursor da visita,
Que na vanguarda marchando,
Vai pedindo e vai tirando,
O demo ha de ser algoz:
Porém fique aqui entre nós.

O ladronaço em rigor
Não tem para que dizer
Furtos, que antes de os fazer
Já os sabe o confessor:
Cala-os, para ouvir melhor,
Pois, com officio alternado,
Confessor e confessado
Alli se barbeam sós:
Porém fique aqui entre nós.
Aqui o ladrão se consente
Sem castigo e com escusa,
Porque do mesmo se accusa
O confessor delinquente:
Ambos alternadamente,
Um a outro e outro a um,
O peccado, que é commum,
Confessa em commua voz:
Porém fique aqui entre nós.

Um e outro, á mór cautela,


Vem a ser neste incidente
Confessor e penitente;
Porém fique ella por ella.
O demo em tanta mazella
Diz: faço, porque façais;
Absolvo, porque absolvais;
Pacto inopinado poz:
Porém fique aqui entre nós.

Não se dá a este ladrão


Penitencia em caso algum;
E sómente em um jejum
Se tira a consolação:
Elle estará como um cão
De levar a bofetada;
Mas na cara ladrilhada
Emenda o pejo não poz:
Porém fique aqui entre nós.
Mechanica disciplina
Vem a impor por derradeiro
O confessor marceneiro
Ao peccador carapina:
E como qualquer se inclina
A furtar e mais furtar,
Se conjura a escavacar
As bolças co’ um par de enxós:
Porém fique aqui entre nós.

O tal confessor me abysma,


Que revele, e não se offenda,
Que um frade sagrado venda
O sagrado oleo da Chrisma.
Por dinheiro a gente chrisma,
E por cera, havendo queixa,
Que nem a da orelha deixa
Onde chrismando a mão poz:
Porém fique aqui entre nós.

Que em toda a franciscania


Não achasse um mau ladrão,
Que lhe ouvisse a confissão,
Mais que um padre da Apanhia!
Nisto, amigo, ha sympathia;
E é que lhe veiu a pêllo
Que um vá atando no orello
O que o outro mette no coz:
Porém fique aqui entre nós.
Que tanta culpa mortal
Se absolva? eu perco o tino;
Pois absolve um theatino
Peccados de pedra e cal:
Quem em vida monacal
Quer dar á filha um debate
Condemnando em dote ou date,
Vem a dar-lhe o pão e a noz:
Porém fique aqui entre nós.

As freiras com sanctas sêdes


Saem condemnadas em pedra,
Quando o ladronaço medra,
Roubando pedra e paredes.
Vós, amigo, que isto vêdes,
Deveis a Deus graças dar
Por nos fazer secular,
E não zote de albernoz:
Porém fique aqui entre nós.
EM 1686 DIMINUIRAM
AQUELLE VALOR A QUE SE HAVIA ERGUIDO A MOEDA
QUANDO O P. ESTAVA NA CÔRTE, ONDE ENTÃO COM SEU
ALTO JUIZO SENTIU MAL DO ARBITRISTA QUE ASSIM O
ACONSELHÁRA A EL-REI, COMO SE ENTENDE NAQUELLES
VERSOS CONTRA ELLE FEITOS:

Sendo pois o alterar da moeda


O assopro, o arbitrio, o ponto e ardil,
De justiça a meu ver se lhe devem
As honras que teve Ferraz e Soliz.

E agora com experiencia dos malos que padocia a


Republica nestas alterações so jacta de o haver extranhado
então, julgando estos malos por incentivo de outros maiores.

Tractam de diminuir
O dinheiro a meu pezar,
Que para a cousa baixar
O melhor meio é subir:
Quem via tão alto ir,
Como eu vi ir a moeda,
Lhe prognosticou a queda,
Como eu lh’a prognostiquei:
Dizem que o mandou El-Rei,
Quer creais, quer não creiais,
Não vos espanteis, que inda lá vem mais.
Mandam a força do fado,
Por ser justo que o dinheiro
Baixe a seu valor primeiro
Depois de tão levantado:
O que se vir sublimado
Por ter mais quatro mangabas,
Hão de peza-lo ás oitavas,
E por leve hão de engeita-lo:
E si com todo este abalo
Por descontentes vos dais,
Não vos espanteis, que inda lá vem mais.

As pessoas de quem rezo


Hão de ser como o ferrollho:
Val pouco tomado a olho,
Val menos tomado a pezo.
Os que prézo, e que desprézo,
Todos serão de uma casta,
E só moços de canasta,
Entre veras e entre chanças
Com pezos e com balanças
Vão á justiça os mais:
Não vos espanteis, que inda lá vem mais.

Porque como em Maranhão


Mandam novelos á praça,
Assim vós por esta traça
Mandareis o algodão:
Haverá permutação,
Como ao principio das gentes,
E todos os contrahentes
Trocarão droga por droga,
Pão por sal, lenha por soga,
Vinhas por cannaviaes:
Não vos espanteis, que inda lá vem mais.
Virá a frota para o anno,
E que leve vos agouro,
Si não tudo a pezo de ouro,
A pezo tudo de engano:
Não é o valor deshumano,
Que a cada oitava se dá,
Da prata, que corre cá,
Pelo meu fraco conceito;
Mas o cobrar fiel direito,
E obliquo quando pagais:
Não vos espanteis, que inda lá vem mais.

Bem merece esta cidade


Esta afflicção, que a assalta,
Pois os dinheiros exalta
Sem real auctoridade:
Eu si hei de fallar verdade,
O aggressor do delicto
Devia ser só afflicto:
Mas si estão tão descançados,
Talvez que sejam chamados
Nesta frota que esperais:
Não vos espanteis, que ainda lá vem mais.
RETRATO
DO PADRE DAMASO DA SILVA

Pois me enfada o teu feitio,


Quero, Frizão, neste dia
Retratar-te em quatro versos
Ás maravi, maravi, maravilhas.
Ouçam e olhem,
Venham, venham, verão
O Frizão da Bahia,
Que está retratado
Ás maravi, maravi, maravilhas.

A cara é um fardo de arroz,


Que, por larga e por comprida,
É ração de um elephante
Vindo da India.
Ouçam e olhem,
Venham, venham, verão
O Frizão da Bahia,
Que está retratado
Ás maravi, maravi, maravilhas.

A bocca desempedrada
É a ponte de Coimbra,
Onde não entram nem sahem
Mais que mentiras.
Ouçam e olhem,
Venham, venham, verão
O Frizão da Bahia,
Que está retratado
Ás maravi, maravi, maravilhas.
Não é a lingua de vacca
Pelo maldizente e maldicta,
Mas pelo muito que corta
De tiririca.
Ouçam e olhem,
Venham, venham, verão
O Frizão da Bahia,
Que está retratado
Ás maravi, maravi, maravilhas.

No corpazil torreão
A natureza prevista
Formou a fresta da bocca
Para guarita.
Ouçam e olhem,
Venham, venham, verão
O Frizão da Bahia,
Que está retratado
Ás maravi, maravi, maravilhas.

Quizera as mãos comparar-lhe


Ás do gigante Golias,
Si as do gigante não foram
Tão pequeninas.
Ouçam e olhem,
Venham, venham, verão
O Frizão da Bahia,
Que está retratado
Ás maravi, maravi, maravilhas.
Os ossos de cada pé
Encher podem de reliquias
Para toda a christandade
As sacristias.
Ouçam e olhem,
Venham, venham, verão
O Frizão da Bahia,
Que está retratado
Ás maravi, maravi, maravilhas.

É grande Conimbricense
Sem jámais pôr pé em Coimbra,
E sendo ignorante sabe
Mais que gallinha.
Ouçam e olhem,
Venham, venham, verão
O Frizão da Bahia,
Que está retratado
Ás maravi, maravi, maravilhas.

Como na lei de Mafoma


Não se argumenta, e se briga,
Elle, que nada argumenta,
Tudo porfia.
Ouçam e olhem,
Venham, venham, verão
O Frizão da Bahia,
Que está retratado
Ás maravi, maravi, maravilhas.
MARINICOLAS

Marinicolas todos os dias


O vejo na sege passar por aqui,
Cavalheiro de tão lindas partes,
Como, verbi gratia, Londres e Pariz.

Mais fidalgo que as mesmas estrellas,


Que as doze do dia viu sempre luzir,
Que seu pae por não sei que desastre
Tudo o que comia vinha pelo giz.

Peneirando-lhe os seus avelorios,


É tal a farinha do nympho gentil,
Que por machos é sangue Tudesco,
Porém pelas femeas humor meretriz.

Um avô, que rodou esta côrte


Num coche de quatro de um Dom Beleaniz,
Sôbre mulas foi tão attractivo,
Que as Senhoras todas trouxe atraz de si.

Foi um grande verdugo de bestas,


Pois co’um azorrague e dois borzeguins,
Ao compás dos maus passos que davam
Lhes ia cantando o lá, sol, fá, mi.

Marinicolas era muchacho


Tão gran’ rabaceiro de escumas de rins,
Que jámais para as toucas olhava,
Por achar nas calças melhor fraldelim.
Sendo já sumilher de cortina
De um xastre de barbas, saiu d’aprendiz
Dado só ás lições de canudo,
Rapante de especie de .. viril.

Cabrestilhos tecendo em arames,


Tão pouco lucrava no patrio paiz,
Que se foi dando velas ao vento
Ao reino dos Servos, não mais que a servir.

Lá me dizem que fez carambola


Com certo Cupido, que fôra d’aqui
Empurrado por uma Sodoma,
No anno de tantos em cima de mil.

Por signal que no sitio nefando


Lhe poz a ramella do olho servil
Um travesso, porque de cadeira
A seus .. servisse aquelle ambar gris.

Mordeduras de perro raivoso


Có o pello se curam do mesmo mastim,
E aos mordidos do rabo não póde
O sumo do rabo de cura servir.

Tanto em fim semeou pela terra,


Que havendo colhido bastante quatrim,
Resolvendo a ser Perotangas
Cruzou o Salobre, partiu o Zenith.

Avistando este nosso hemispherio,


Calou pela barra em um bergantim,
Poz em terra os maiores joanetes
Que viram meus olhos desde que nasci.
Pretendendo com recancanilhas
Roubar as guaritas de um salto subtil,
Embolçava com alma de gato,
A risco de sape, dinheiro de miz.

Sinão quando na horta do Duque


Andando de ronda um certo malsim,
Estumando-lhe um cão pechelingue
O demo do gato botou o seitil.

Marinicolas vendo-se entonces


De todo expurgado sem maravedi,
Alugava rapazes ao povo,
Por ter de caminho de quem se servir.

Exercendo-os em jogos de mãos


Tão lestos os tinha o destro arlequim,
Que si não lhes tirára a peçonha
Ganhára com elles dois mil potosis.

A tendeiro se poz de.....


E na taboleta mandou esculpir
Dois cachopos, e a lettra dizia:
Os ordenhadores se alquilam aqui.

Tem por mestre do terço......


Um pagem de lança, que Marcos se diz,
Que si em casa anda ao rabo d’elle,
O traz pela rua ao rabo de si.

Uma tarde em que o perro celeste


Do sol acossado se poz a latir,
Marinicola estava com Marcos
Limpando-lhe os moncos de certo nariz.
Mas sentindo ruido na porta,
Aonde batia um Gorra civil,
Um e outro se poz em fugida,
Temiendo los dientes de algun javali.

Era pois o baeta travesso:


Si um pouco de antes aportára alli,
Como sabe latim o baeta,
Pudiera cogerlos en un má latin.

Ao depois dando d’elle uma força


As alcoviteiras do nosso confim,
Lhe valeu no sagrado da egreja
O nó indissoluvel de um rico mongil.

Empossado da simples consorte


Cresceu de maneira naquelles chapins,
Que inda hoje dá graças infindas
Aos falsos informes de quis, quid e quid.

Não obstante pagar de vazio


O sancto hymeneu um picaro vil,
Se regala á ufa do sogro,
Comendo e bebendo como mochachim.

Com chamar-se prudente com todos,


Que muitos babosos o têm para si,
Elle certo é o meu desenfado,
Que um tolo prudente dá muito que rir.

É dotado de um entendimento
Tão vivo e esperto, que fôra um Beliz,
Si lhe houvera o juizo illustrado
Um dedo de grego, outro de latim.
Entre gabos o triste idiota
Tão pago se mostra dos seus gorgotis,
Que nascendo sendeiro de gemma,
Quer á fina força metter-se a rossim.

Deu agora em famoso arbitrista,


E quer por arbitrios o triste malsim
Que o vejamos subir á Excellencia,
Como diz que vimos Montalvão subir.

Sendo pois o alterar a moeda


O assopro, o arbitrio, o ponto e o ardil,
De justiça, a meu ver, se lhe devem
As honras que teve Ferraz e Soliz.

Dêm com elle no alto da forca,


Adonde o fidalgo terá para si
Que é o mais estirado de quantos
Beberam no Douro, mijaram no Rim.

Si o intento é bater-se moeda,


Correrem-lhe gages e ser mandarim,
Porque andando a moeda na forja
Se ri de Cuama, de Sena e de Ophir?

Sempre foi da moeda privado,


Mas vendo-se agora Senhor e Juiz,
Condemnando em portaes a moeda,
Abriu ás unhadas portas para si.

Muito mais lhe rendeu cada palmo


D’aquella portada que dois potosis;
Muito mais lhe valeu cada pedra
Que vale un ochavo de Valladolid.
Pés de puas com topes de seda,
Cabellos de cabra com pós de marfim,
Pés e puas de riso motivo,
Cabellos e topes motivo de rir.

Uma tia, que abaixo do muro


Lacões esquarteja, me dizem que diz:
Sua Alteza sem ir meu sobrinho
A nada responde de não ou de sim.

Pois a prima da rua do Saco


Tambem se reputa de todos alli,
Que a furaram como velador
Para o garavato de certo candil.

Outras tias me dizem que foram


Tão fortes gallegas, e tão varonis,
Que sobre ellas foi muito mais gente
Do que sobre Hespanha em tempo do Cid.

Catharina conigibus era


Uma das avôas da parte viril,
D’onde vem conixarem-se todas
As conigibundas do tal genesis.

Despachou-se com habito e tença


Por grandes serviços, que fez ao Sofi,
Em matar nos fieis Portuguezes
De puro enfadonho tres ou quatro mil.

E porque de mechanica tanta


Não foi dispensado, tenho para mim
Que em usar da mechanica falsa
Se soube livrar da mechanica vil.
É possível que calce tão alto
A baixa vileza de um sujo escarpim,
Para o qual não é a agua bastante
Da grossa corrente do Gualdaquibir?

Marinicolas é finalmente
Sugeito de prendas de tanto matiz,
Que está hoje batendo moeda,
Sendo ainda hontem um vilão ruim.

You might also like