This example presents field data from sensor BME280 connecting to cloud, mbed Device Connector.

Please read details at the link. https://github.com/soramame21/connector-api-python-quickstart_4BME280

app.py

Committer:
Ren Boting
Date:
2017-08-23
Revision:
1:b194c28a1670
Parent:
0:a9bcda5b678a

File content as of revision 1:b194c28a1670:

import mbed_connector_api             # mbed Device Connector library
import pybars                         # use to fill in handlebar templates
from   flask          import Flask    # framework for hosting webpages
from   flask_socketio import SocketIO
from   flask_socketio import emit
from   flask_socketio import send
from   flask_socketio import join_room
from   flask_socketio import leave_room
from   base64         import standard_b64decode as b64decode
import os

app = Flask(__name__)
socketio = SocketIO(app,async_mode='threading')

if 'ACCESS_KEY' in os.environ.keys():
    token = os.environ['ACCESS_KEY'] # get access key from environment variable
else:
    token = "ChangeMe" # replace with your API token

connector = mbed_connector_api.connector(token)

@app.route('/')
def index():
    # get list of endpoints, for each endpoint get resources
    epList = connector.getEndpoints().result
    for index in range(len(epList)):
        print "Endpoint Found: ",epList[index]['name']
        print "epList[index]", epList[index]
        print "end", index
        e_h = connector.getResourceValue(epList[index]['name'],"/3304/0/5700")
        e_t = connector.getResourceValue(epList[index]['name'],"/3303/0/5700")
        e_p = connector.getResourceValue(epList[index]['name'],"/3323/0/5700")
        while not e_p.isDone() or not e_t.isDone or not e_h.isDone :
            None
        epList[index]['humidity_value'] = e_h.result
        epList[index]['tempereture_value'] = e_t.result
        epList[index]['pressure_value'] = e_p.result
    
    print "Endpoint List :",epList
    # fill out html using handlebar template
    handlebarJSON = {'endpoints':epList}
    comp = pybars.Compiler()
    tmp_src = open("./views/index.hbs",'r').read()
    source = unicode(tmp_src, "utf-8")
    template = comp.compile(source)
    return "".join(template(handlebarJSON))

@socketio.on('connect')
def connect():
    print('Connect')
    join_room('room')

@socketio.on('disconnect')
def disconnect():
    print('Disconnect')
    leave_room('room')

@socketio.on('subscribe_to_presses')
def subscribeToPresses(data):
    print('subscribe_to_presses: ',data)
    # Subscribe to all changes of resources
    e_h = connector.putResourceSubscription(data['endpointName'],'/3304/0/5700')
    e_t = connector.putResourceSubscription(data['endpointName'],'/3303/0/5700')
    e_p = connector.putResourceSubscription(data['endpointName'],'/3323/0/5700')
    while not e_h.isDone() or not e_t.isDone() or not e_p.isDone():
        None
    if e_h.error:
        print("Error e_h 21: ",e_h.error.errType, e_h.error.error, e.raw_data)
    elif e_t.error:
        print("Error e_t 21: ",e_t.error.errType, e_t.error.error, e_t.raw_data)
    elif e_p.error:
        print("Error e_p 21: ",e_p.error.errType, e_p.error.error, e_p.raw_data)
    else:
        print("Subscribed Successfully!")
        emit('subscribed-to-presses')

@socketio.on('unsubscribe_to_presses')
def unsubscribeToPresses(data):
    print('unsubscribe_to_presses: ',data)
    e_h = connector.deleteResourceSubscription(data['endpointName'],'/3304/0/5700')
    e_t = connector.deleteResourceSubscription(data['endpointName'],'/3303/0/5700')
    e_p = connector.deleteResourceSubscription(data['endpointName'],'/3323/0/5700')
    while not e_h.isDone() or not e_t.isDone() or not e_p.isDone():
        None
    if e_h.error:
        print("Error e_h 22: ",e_h.error.errType, e_h.error.error, e.raw_data)
    elif e_t.error:
        print("Error e_t 22: ",e_t.error.errType, e_t.error.error, e_t.raw_data)
    elif e_p.error:
        print("Error e_p 22: ",e_p.error.errType, e_p.error.error, e_p.raw_data)
    else:
        print("Unsubscribed Successfully!")
    emit('unsubscribed-to-presses',{"endpointName":data['endpointName'],"value":'True'})

@socketio.on('get_presses')
def getPresses(data):
    # Read data from GET resources
    e_h = connector.getResourceValue(data['endpointName'],"/3304/0/5700")
    e_t = connector.getResourceValue(data['endpointName'],"/3303/0/5700")
    e_p = connector.getResourceValue(data['endpointName'],"/3323/0/5700")
    while not e_p.isDone() or not e_t.isDone or not e_h.isDone :
        None
    if e_h.error :
        print("Error e_h: ",e_h.error.errType, e_h.error.error, e_h.raw_data)
    elif e_t.error :
        print("Error e_t: ",e_t.error.errType, e_t.error.error, e_t.raw_data)
    elif e_p.error :
        print("Error e_p: ",e_p.error.errType, e_p.error.error, e_p.raw_data)
    else:
        dataT_to_emit = {"endpointName":'multiple_data', "value":"e_t="+e_t.result+";e_h="+e_h.result+";e_p="+e_p.result}
        emit('SetTemp', dataT_to_emit)


# 'notifications' are routed here, handle subscriptions and update webpage
def notificationHandler(data):
    global socketio
    print "\r\nNotification Data Received : %s" %data['notifications']
    notifications = data['notifications']
    tmp=""
    for thing in notifications:
        if  thing["path"]=="/3304/0/5700":
            tmp +="e_h="+b64decode(thing["payload"])+";"
        elif thing["path"]=="/3303/0/5700":
            tmp +="e_t="+b64decode(thing["payload"])+";"
        elif thing["path"]=="/3323/0/5700":
            tmp +="e_p="+b64decode(thing["payload"])+";"
    
    stuff = {"endpointName":thing["ep"],"value":tmp+"end"}
    print ("990 Emitting :",stuff)
    socketio.emit('SetTemp',stuff)

if __name__ == "__main__":
    # remove all subscriptions, start fresh
    connector.deleteAllSubscriptions()
    # start long polling connector.mbed.com
    connector.startLongPolling()
    # send 'notifications' to the notificationHandler FN
    connector.setHandler('notifications', notificationHandler)
    socketio.run(app,host='0.0.0.0', port=8080)