Skip to content

Instantly share code, notes, and snippets.

@jamesbulpin
Created September 28, 2016 20:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jamesbulpin/bdfae2113b40ebdad7f8106c3f242a95 to your computer and use it in GitHub Desktop.
Save jamesbulpin/bdfae2113b40ebdad7f8106c3f242a95 to your computer and use it in GitHub Desktop.
An AWS Echo "skill adapter" Lambda function to route lighting control requests to Octoblu via a POST trigger
import urllib
import urllib2
octoblu_trigger = "https://triggers.octoblu.com/v2/flows/<your flow>/triggers/<your trigger>
def lambda_handler(event, context):
access_token = event['payload']['accessToken']
if event['header']['namespace'] == 'Alexa.ConnectedHome.Discovery':
return handleDiscovery(context, event)
elif event['header']['namespace'] == 'Alexa.ConnectedHome.Control':
return handleControl(context, event)
def handleDiscovery(context, event):
payload = ''
header = {
"namespace": "Alexa.ConnectedHome.Discovery",
"name": "DiscoverAppliancesResponse",
"payloadVersion": "2"
}
if event['header']['name'] == 'DiscoverAppliancesRequest':
payload = {
"discoveredAppliances":[
{
"applianceId":"Bedroom1=Desk",
"manufacturerName":"James Bulpin",
"modelName":"LWRF",
"version":"v0.1",
"friendlyName":"Bedroom 1 Desk Lamp",
"friendlyDescription":"Desk lamp in bedroom 1",
"isReachable":True,
"actions":[
"turnOn",
"turnOff"
],
"additionalApplianceDetails":{
"mqttTopic":"Light/Bedroom1/Desk"
}
},
{
"applianceId":"Bedroom2=Lamp",
"manufacturerName":"James Bulpin",
"modelName":"LWRF",
"version":"v0.1",
"friendlyName":"Bedroom 2 Lamp",
"friendlyDescription":"Bedside lamp in bedroom 2",
"isReachable":True,
"actions":[
"turnOn",
"turnOff"
],
"additionalApplianceDetails":{
"mqttTopic":"Light/Bedroom2/Lamp"
}
},
{
"applianceId":"Lounge=Ceiling",
"manufacturerName":"James Bulpin",
"modelName":"LWRF",
"version":"v0.1",
"friendlyName":"Lounge light",
"friendlyDescription":"Main ceiling light in the living room",
"isReachable":True,
"actions":[
"turnOn",
"turnOff"
],
"additionalApplianceDetails":{
"mqttTopic":"Light/Lounge/Ceiling"
}
}
]
}
return {"header":header, "payload":payload}
def handleControl(context, event):
payload = ''
device_id = event['payload']['appliance']['applianceId']
message_id = event['header']['messageId']
obmsg = {"debug":event}
cfm = ""
if event['header']['name'] == 'TurnOnRequest' or event['header']['name'] == 'TurnOffRequest':
if event['header']['name'] == 'TurnOnRequest':
obmsg["message"] = "on"
cfm = "TurnOnConfirmation"
else:
obmsg["message"] = "off"
cfm = "TurnOffConfirmation"
obmsg["topic"] = event["payload"]["appliance"]["additionalApplianceDetails"]["mqttTopic"]
url = octoblu_trigger
data = urllib.urlencode(obmsg)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
payload = { }
header = {
"namespace":"Alexa.ConnectedHome.Control",
"name":cfm,
"payloadVersion":"2",
"messageId": message_id
}
return {"header":header, "payload":payload}
@jamesbulpin
Copy link
Author

Prototype code - hardcoded device list etc.

@jamesbulpin
Copy link
Author

Octoblu trigger URL needs specifiying

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment