"""
This sample demonstrates a simple skill built with the Amazon Alexa Skills Kit.
The Intent Schema, and Sample Utterances for this skill, as well
as testing instructions are located at http://amzn.to/1LzFrj6
The code is developed by:
Md. Khairul Alam
February, 2018
For additional samples, visit the Alexa Skills Kit Getting Started guide at
http://amzn.to/1LGWsLG
"""
from __future__ import print_function
import urllib2
import xml.etree.ElementTree as etree
from datetime import datetime as dt
import time
import paho.mqtt.client as mqtt
received_message = ""
user = ""
mqtt_topic = ""
# Define event callbacks
def on_connect(client, userdata, flags, rc):
print("rc: " + str(rc))
def on_message(client, obj, msg):
received_message = str(msg.payload)
print(msg.topic + " " + str(msg.qos) + " " + received_message)
def on_subscribe(client, obj, mid, granted_qos):
print("Subscribed: " + str(mid) + " " + str(granted_qos))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
#client.username_pw_set("cnpemclt", "ccZRVtdCTqID")
client.connect("iot.eclipse.org", "1883")
#client.connect("m12.cloudmqtt.com", 15708, 60)
# Start subscribe, with QoS level 0
client.subscribe("test/robot", 0)
def lambda_handler(event, context):
""" Route the incoming request based on type (LaunchRequest, IntentRequest,
etc.) The JSON body of the request is provided in the event parameter.
"""
print("event.session.application.applicationId=" +
event['session']['application']['applicationId'])
print("event.session.application.userId=" +
event['session']['user']['userId'])
#char = event['session']['user']['userId']
#first 10 char from used id will be used to generate an unique topic
#common part of the user id is deducted
print(event['session']['user']['userId'][18:28])
global user
global mqtt_topic
user = event['session']['user']['userId'][18:28]
topic = "WALABOT/ROBOT/ARM/"
mqtt_topic = topic + user
print(mqtt_topic)
"""
Uncomment this if statement and populate with your skill's application ID to
prevent someone else from configuring a skill that sends requests to this
function.
"""
# if (event['session']['application']['applicationId'] !=
# "amzn1.echo-sdk-ams.app.[unique-value-here]"):
# raise ValueError("Invalid Application ID")
if event['session']['new']:
on_session_started({'requestId': event['request']['requestId']},
event['session'])
if event['request']['type'] == "LaunchRequest":
return on_launch(event['request'], event['session'])
elif event['request']['type'] == "IntentRequest":
return on_intent(event['request'], event['session'])
elif event['request']['type'] == "SessionEndedRequest":
return on_session_ended(event['request'], event['session'])
def on_session_started(session_started_request, session):
""" Called when the session starts """
print("on_session_started requestId=" + session_started_request['requestId']
+ ", sessionId=" + session['sessionId'])
def on_launch(launch_request, session):
""" Called when the user launches the skill without specifying what they
want
"""
print("on_launch requestId=" + launch_request['requestId'] +
", sessionId=" + session['sessionId'])
# Dispatch to your skill's launch
return get_welcome_response()
def on_intent(intent_request, session):
""" Called when the user specifies an intent for this skill """
print("on_intent requestId=" + intent_request['requestId'] +
", sessionId=" + session['sessionId'])
intent = intent_request['intent']
intent_name = intent_request['intent']['name']
# Dispatch to your skill's intent handlers
if intent_name == "PickObjectIntent":
return pick_object(intent, session)
elif intent_name == "AMAZON.HelpIntent":
return get_help()
elif intent_name == "AMAZON.StopIntent" or intent_name == "AMAZON.CancelIntent":
return session_end(intent, session)
else:
raise ValueError("Invalid intent")
def on_session_ended(session_ended_request, session):
""" Called when the user ends the session.
Is not called when the skill returns should_end_session=true
"""
print("on_session_ended requestId=" + session_ended_request['requestId'] +
", sessionId=" + session['sessionId'])
# add cleanup logic here
# --------------- Functions that control the skill's behavior ------------------
def get_welcome_response():
""" If we wanted to initialize the session to have some attributes we could
add those here
"""
session_attributes = {}
card_title = "Welcome"
speech_output = "Welcome to the wala-arm application. I can pick an object from any random location " \
"by the help of Wala-bot. To know how to configure Wala-bot just say help, "\
"or to pick an object you can ask me, 'pick the object.'"
# If the user either does not reply to the welcome message or says something
# that is not understood, they will be prompted again with this text.
reprompt_text = "To pick an object just ask me, pick the object."
should_end_session = False
#myMQTTClient.publish("test/door", "welcome", 0)
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def get_help():
""" If we wanted to initialize the session to have some attributes we could
add those here
"""
global user
temp = user
count = 0
while count<20:
temp = temp[:count] + ' ' + temp[count:] #added a space after every character
count+=2
session_attributes = {}
card_title = "Help"
speech_output = "I am sending an MQTT message to the Raspberry Pi, connected with Wala-bot. " \
" Use wala-bot/ robot/ arm/ " + temp + ", as your MQTT topic. "\
" I am spelling the last word again, " + temp + " . Use block letters for the topic name."\
" For details please visit hackster.io and search for Wala-arm." \
# If the user either does not reply to the welcome message or says something
# that is not understood, they will be prompted again with this text.
reprompt_text = "I am waiting for your command."
should_end_session = False
#myMQTTClient.publish("test/door", "welcome", 0)
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def pick_object(intent, session):
""" If we wanted to initialize the session to have some attributes we could
add those here
"""
#client.publish("walabot/robot/arm/...", "pick")
global mqtt_topic
client.publish(mqtt_topic, "pick")
time.sleep(2)
session_attributes = {}
card_title = "Picking Object"
speech_output = "OK."
# If the user either does not reply to the welcome message or says something
# that is not understood, they will be prompted again with this text.
reprompt_text = ""
should_end_session = True
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
def session_end(intent, session):
""" If we wanted to initialize the session to have some attributes we could
add those here
"""
session_attributes = {}
card_title = "End"
speech_output = "Thank you for calling me. Have a nice day!"
# If the user either does not reply to the welcome message or says something
# that is not understood, they will be prompted again with this text.
reprompt_text = ""
should_end_session = True
return build_response(session_attributes, build_speechlet_response(
card_title, speech_output, reprompt_text, should_end_session))
# --------------- Helpers that build all of the responses ----------------------
def build_speechlet_response(title, output, reprompt_text, should_end_session):
return {
'outputSpeech': {
'type': 'PlainText',
'text': output
},
'card': {
'type': 'Simple',
'title': title,
'content': output
},
'reprompt': {
'outputSpeech': {
'type': 'PlainText',
'text': reprompt_text
}
},
'shouldEndSession': should_end_session
}
def build_response(session_attributes, speechlet_response):
return {
'version': '1.0',
'sessionAttributes': session_attributes,
'response': speechlet_response
}
Comments