mbed connector webapp quickstart
app.py@0:4233b7b10255, 2017-02-10 (annotated)
- 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?
User | Revision | Line number | New 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) |