def configuration(action): form = AddRoomForm(request.form) error = None success = None if form.validate_on_submit(): if action == 'add': topic = request.form['topic'] displayname = request.form['displayname'] nightlevel = request.form['nightlevel'] subscription = getSubscription(topic) if subscription: error = 'Topic already exist.' else: item = { 'Topic': topic, 'Timestamp': time.time(), 'Displayname': displayname, 'Nightlevel': Decimal(nightlevel) } r = putItem('Subscription',item) if r: roomSubscribe(topic) success = 'Added new room.' else: error = 'Unable to add subscription.' elif action == 'edit': topic = request.form['topic'] displayname = request.form['displayname'] nightlevel = request.form['nightlevel'] subscription = getSubscription(topic) if subscription: key = { 'Topic': topic } updateExpression = 'set Displayname = :d, Nightlevel=:n' expressionAttributeValues = { ':d': displayname, ':n': Decimal(nightlevel) } r = updateItem('Subscription',key,updateExpression,expressionAttributeValues) if r: success = 'Room edited.' else: error = 'Unable to edit subscription.' else: error = 'Topic does not exist.' templateData = { 'form': form, 'error': error, 'success': success } return render_template('settings/configuration.html', **templateData)
def mqttCallback(client, userdata, message): rooms = app.rooms topic = message.topic payload = json.loads(message.payload) parts = topic.split('/') if len(parts) == 3: room = parts[1] type = parts[2] if room in rooms: socketio = app.socketio rpi = rooms[room] if type == 'sensors': rpi.setSensorsData(payload) socketio.emit(room,rpi.getSensorsData(),room='sensors') light = rpi.light if light: subscription = getSubscription(rpi.topic) if subscription: nightlevel = subscription['Nightlevel'] leds = rpi.leds if leds: lastmotion = rpi.lastmotion if convertLight(light) > nightlevel or not lastmotion or lastmotion < datetimeToTimestamp(datetime.datetime.now() - datetime.timedelta(seconds=30)): for pin,d in leds.iteritems(): value = d['Value'] overwrite = d['Overwrite'] if value != 0 and not overwrite: setLEDValue(room,pin,0) elif type == 'controls': rpi.setControlsData(payload) socketio.emit(room,rpi.getControlsData(),room='controls') elif type == 'motion': lastmotion = payload['Timestamp'] rpi.lastmotion = lastmotion light = rpi.light if light: subscription = getSubscription(rpi.topic) nightlevel = subscription['Nightlevel'] if convertLight(light) <= nightlevel: leds = rpi.leds if leds: for pin,d in leds.iteritems(): value = d['Value'] overwrite = d['Overwrite'] if value != 1 and not overwrite: setLEDValue(room,pin,1) socketio.emit(room,rpi.getControlsData(),room='controls')
def roomSubscribe(topic): subscription = getSubscription(topic) if subscription: topicname = subscription['Topic'] displayname = subscription['Displayname'] rpi = RPI(topicname,displayname) app.rooms[topicname] = rpi mqttClient = app.mqttClient topic = 'room/{}/#'.format(topicname) mqttClient.subscribe(topic, 1, mqttCallback)
def deletesubscription(topic): if topic: subscription = getSubscription(topic) if subscription: topic = subscription['Topic'] key = {'Topic': topic} r = deleteItem('Subscription', key) if r: roomUnsubscribe(topic) deleteSensorTopic = DeleteSensorTopic(topic) deleteSensorTopic.start() return ('', 204)
def subscriptionjson(room): if room: results = [getSubscription(room)] else: results = scan('Subscription') data = [] if results: for s in results: data.append({ 'Topic': s['Topic'], 'Timestamp': s['Timestamp'], 'Displayname': s['Displayname'], 'Nightlevel': s['Nightlevel'] }) return json.dumps(data, cls=DecimalEncoder)
def deletesubscription(topic): if topic: subscription = getSubscription(topic) if subscription: topic = subscription['Topic'] key = { 'Topic': topic } r = deleteItem('Subscription',key) if r: roomUnsubscribe(topic) condition = Key('Room').eq(topic) columns = '#timestamp' expressions = {'#timestamp':'Timestamp'} results = query('Sensor',condition,columns,expressions) for r in results: key = { 'Room': topic, 'Timestamp': r['Timestamp'] } deleteItem('Sensor',key) return redirect(url_for('settings.configuration'))