示例#1
0
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)
示例#2
0
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')
示例#3
0
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)
示例#4
0
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)
示例#5
0
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)
示例#6
0
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'))