mbed connector webapp quickstart

Committer:
group-Make-NTU-Hackathon
Date:
Fri Feb 10 08:36:15 2017 +0000
Revision:
0:4233b7b10255
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-Make-NTU-Hackathon 0:4233b7b10255 1 import mbed_connector_api # mbed Device Connector library
group-Make-NTU-Hackathon 0:4233b7b10255 2 import pybars # use to fill in handlebar templates
group-Make-NTU-Hackathon 0:4233b7b10255 3 from flask import Flask # framework for hosting webpages
group-Make-NTU-Hackathon 0:4233b7b10255 4 from flask_socketio import SocketIO, emit,send,join_room, leave_room
group-Make-NTU-Hackathon 0:4233b7b10255 5 from base64 import standard_b64decode as b64decode
group-Make-NTU-Hackathon 0:4233b7b10255 6 import os
group-Make-NTU-Hackathon 0:4233b7b10255 7
group-Make-NTU-Hackathon 0:4233b7b10255 8 app = Flask(__name__)
group-Make-NTU-Hackathon 0:4233b7b10255 9 socketio = SocketIO(app,async_mode='threading')
group-Make-NTU-Hackathon 0:4233b7b10255 10
group-Make-NTU-Hackathon 0:4233b7b10255 11 if 'ACCESS_KEY' in os.environ.keys():
group-Make-NTU-Hackathon 0:4233b7b10255 12 token = os.environ['ACCESS_KEY'] # get access key from environment variable
group-Make-NTU-Hackathon 0:4233b7b10255 13 else:
group-Make-NTU-Hackathon 0:4233b7b10255 14 token = "ChangeMe" # replace with your API token
group-Make-NTU-Hackathon 0:4233b7b10255 15
group-Make-NTU-Hackathon 0:4233b7b10255 16 connector = mbed_connector_api.connector(token)
group-Make-NTU-Hackathon 0:4233b7b10255 17
group-Make-NTU-Hackathon 0:4233b7b10255 18 @app.route('/')
group-Make-NTU-Hackathon 0:4233b7b10255 19 def index():
group-Make-NTU-Hackathon 0:4233b7b10255 20 # get list of endpoints, for each endpoint get the pattern (/3201/0/5853) value
group-Make-NTU-Hackathon 0:4233b7b10255 21 epList = connector.getEndpoints().result
group-Make-NTU-Hackathon 0:4233b7b10255 22 for index in range(len(epList)):
group-Make-NTU-Hackathon 0:4233b7b10255 23 print "Endpoint Found: ",epList[index]['name']
group-Make-NTU-Hackathon 0:4233b7b10255 24 e = connector.getResourceValue(epList[index]['name'],"/3201/0/5853")
group-Make-NTU-Hackathon 0:4233b7b10255 25 while not e.isDone():
group-Make-NTU-Hackathon 0:4233b7b10255 26 None
group-Make-NTU-Hackathon 0:4233b7b10255 27 epList[index]['blinkPattern'] = e.result
group-Make-NTU-Hackathon 0:4233b7b10255 28 print "Endpoint List :",epList
group-Make-NTU-Hackathon 0:4233b7b10255 29 # fill out html using handlebar template
group-Make-NTU-Hackathon 0:4233b7b10255 30 handlebarJSON = {'endpoints':epList}
group-Make-NTU-Hackathon 0:4233b7b10255 31 comp = pybars.Compiler()
group-Make-NTU-Hackathon 0:4233b7b10255 32 source = unicode(open("./views/index.hbs",'r').read())
group-Make-NTU-Hackathon 0:4233b7b10255 33 template = comp.compile(source)
group-Make-NTU-Hackathon 0:4233b7b10255 34 return "".join(template(handlebarJSON))
group-Make-NTU-Hackathon 0:4233b7b10255 35
group-Make-NTU-Hackathon 0:4233b7b10255 36 @socketio.on('connect')
group-Make-NTU-Hackathon 0:4233b7b10255 37 def connect():
group-Make-NTU-Hackathon 0:4233b7b10255 38 print('connect ')
group-Make-NTU-Hackathon 0:4233b7b10255 39 join_room('room')
group-Make-NTU-Hackathon 0:4233b7b10255 40
group-Make-NTU-Hackathon 0:4233b7b10255 41 @socketio.on('disconnect')
group-Make-NTU-Hackathon 0:4233b7b10255 42 def disconnect():
group-Make-NTU-Hackathon 0:4233b7b10255 43 print('Disconnect')
group-Make-NTU-Hackathon 0:4233b7b10255 44 leave_room('room')
group-Make-NTU-Hackathon 0:4233b7b10255 45
group-Make-NTU-Hackathon 0:4233b7b10255 46 @socketio.on('subscribe_to_presses')
group-Make-NTU-Hackathon 0:4233b7b10255 47 def subscribeToPresses(data):
group-Make-NTU-Hackathon 0:4233b7b10255 48 # Subscribe to all changes of resource /3200/0/5501 (button presses)
group-Make-NTU-Hackathon 0:4233b7b10255 49 print('subscribe_to_presses: ',data)
group-Make-NTU-Hackathon 0:4233b7b10255 50 e = connector.putResourceSubscription(data['endpointName'],'/3200/0/5501')
group-Make-NTU-Hackathon 0:4233b7b10255 51 while not e.isDone():
group-Make-NTU-Hackathon 0:4233b7b10255 52 None
group-Make-NTU-Hackathon 0:4233b7b10255 53 if e.error:
group-Make-NTU-Hackathon 0:4233b7b10255 54 print("Error: ",e.error.errType, e.error.error, e.raw_data)
group-Make-NTU-Hackathon 0:4233b7b10255 55 else:
group-Make-NTU-Hackathon 0:4233b7b10255 56 print("Subscribed Successfully!")
group-Make-NTU-Hackathon 0:4233b7b10255 57 emit('subscribed-to-presses')
group-Make-NTU-Hackathon 0:4233b7b10255 58
group-Make-NTU-Hackathon 0:4233b7b10255 59 @socketio.on('unsubscribe_to_presses')
group-Make-NTU-Hackathon 0:4233b7b10255 60 def unsubscribeToPresses(data):
group-Make-NTU-Hackathon 0:4233b7b10255 61 print('unsubscribe_to_presses: ',data)
group-Make-NTU-Hackathon 0:4233b7b10255 62 e = connector.deleteResourceSubscription(data['endpointName'],'/3200/0/5501')
group-Make-NTU-Hackathon 0:4233b7b10255 63 while not e.isDone():
group-Make-NTU-Hackathon 0:4233b7b10255 64 None
group-Make-NTU-Hackathon 0:4233b7b10255 65 if e.error:
group-Make-NTU-Hackathon 0:4233b7b10255 66 print("Error: ",e.error.errType, e.error.error, e.raw_data)
group-Make-NTU-Hackathon 0:4233b7b10255 67 else:
group-Make-NTU-Hackathon 0:4233b7b10255 68 print("Unsubscribed Successfully!")
group-Make-NTU-Hackathon 0:4233b7b10255 69 emit('unsubscribed-to-presses',{"endpointName":data['endpointName'],"value":'True'})
group-Make-NTU-Hackathon 0:4233b7b10255 70
group-Make-NTU-Hackathon 0:4233b7b10255 71 @socketio.on('get_presses')
group-Make-NTU-Hackathon 0:4233b7b10255 72 def getPresses(data):
group-Make-NTU-Hackathon 0:4233b7b10255 73 # Read data from GET resource /3200/0/5501 (num button presses)
group-Make-NTU-Hackathon 0:4233b7b10255 74 print("get_presses ",data)
group-Make-NTU-Hackathon 0:4233b7b10255 75 e = connector.getResourceValue(data['endpointName'],'/3200/0/5501')
group-Make-NTU-Hackathon 0:4233b7b10255 76 while not e.isDone():
group-Make-NTU-Hackathon 0:4233b7b10255 77 None
group-Make-NTU-Hackathon 0:4233b7b10255 78 if e.error:
group-Make-NTU-Hackathon 0:4233b7b10255 79 print("Error: ",e.error.errType, e.error.error, e.raw_data)
group-Make-NTU-Hackathon 0:4233b7b10255 80 else:
group-Make-NTU-Hackathon 0:4233b7b10255 81 data_to_emit = {"endpointName":data['endpointName'],"value":e.result}
group-Make-NTU-Hackathon 0:4233b7b10255 82 print data_to_emit
group-Make-NTU-Hackathon 0:4233b7b10255 83 emit('presses', data_to_emit)
group-Make-NTU-Hackathon 0:4233b7b10255 84
group-Make-NTU-Hackathon 0:4233b7b10255 85 @socketio.on('update_blink_pattern')
group-Make-NTU-Hackathon 0:4233b7b10255 86 def updateBlinkPattern(data):
group-Make-NTU-Hackathon 0:4233b7b10255 87 # Set data on PUT resource /3201/0/5853 (pattern of LED blink)
group-Make-NTU-Hackathon 0:4233b7b10255 88 print('update_blink_pattern ',data)
group-Make-NTU-Hackathon 0:4233b7b10255 89 e = connector.putResourceValue(data['endpointName'],'/3201/0/5853',data['blinkPattern'])
group-Make-NTU-Hackathon 0:4233b7b10255 90 while not e.isDone():
group-Make-NTU-Hackathon 0:4233b7b10255 91 None
group-Make-NTU-Hackathon 0:4233b7b10255 92 if e.error:
group-Make-NTU-Hackathon 0:4233b7b10255 93 print("Error: ",e.error.errType, e.error.error, e.raw_data)
group-Make-NTU-Hackathon 0:4233b7b10255 94
group-Make-NTU-Hackathon 0:4233b7b10255 95
group-Make-NTU-Hackathon 0:4233b7b10255 96 @socketio.on('blink')
group-Make-NTU-Hackathon 0:4233b7b10255 97 def blink(data):
group-Make-NTU-Hackathon 0:4233b7b10255 98 # POST to resource /3201/0/5850 (start blinking LED)
group-Make-NTU-Hackathon 0:4233b7b10255 99 print('blink: ',data)
group-Make-NTU-Hackathon 0:4233b7b10255 100 e = connector.postResource(data['endpointName'],'/3201/0/5850')
group-Make-NTU-Hackathon 0:4233b7b10255 101 while not e.isDone():
group-Make-NTU-Hackathon 0:4233b7b10255 102 None
group-Make-NTU-Hackathon 0:4233b7b10255 103 if e.error:
group-Make-NTU-Hackathon 0:4233b7b10255 104 print("Error: ",e.error.errType, e.error.error, e.raw_data)
group-Make-NTU-Hackathon 0:4233b7b10255 105
group-Make-NTU-Hackathon 0:4233b7b10255 106 # 'notifications' are routed here, handle subscriptions and update webpage
group-Make-NTU-Hackathon 0:4233b7b10255 107 def notificationHandler(data):
group-Make-NTU-Hackathon 0:4233b7b10255 108 global socketio
group-Make-NTU-Hackathon 0:4233b7b10255 109 print "\r\nNotification Data Received : %s" %data['notifications']
group-Make-NTU-Hackathon 0:4233b7b10255 110 notifications = data['notifications']
group-Make-NTU-Hackathon 0:4233b7b10255 111 for thing in notifications:
group-Make-NTU-Hackathon 0:4233b7b10255 112 stuff = {"endpointName":thing["ep"],"value":b64decode(thing["payload"])}
group-Make-NTU-Hackathon 0:4233b7b10255 113 print "Emitting :",stuff
group-Make-NTU-Hackathon 0:4233b7b10255 114 socketio.emit('presses',stuff)
group-Make-NTU-Hackathon 0:4233b7b10255 115
group-Make-NTU-Hackathon 0:4233b7b10255 116 if __name__ == "__main__":
group-Make-NTU-Hackathon 0:4233b7b10255 117 connector.deleteAllSubscriptions() # remove all subscriptions, start fresh
group-Make-NTU-Hackathon 0:4233b7b10255 118 connector.startLongPolling() # start long polling connector.mbed.com
group-Make-NTU-Hackathon 0:4233b7b10255 119 connector.setHandler('notifications', notificationHandler) # send 'notifications' to the notificationHandler FN
group-Make-NTU-Hackathon 0:4233b7b10255 120 socketio.run(app,host='0.0.0.0', port=8080)