Ejemplo n.º 1
0
class States(object):
    def __init__(self):
        self._dao = Sensors()
        self._sr = StateResolver()

    exposed = True

    def GET(self, *args, **kwargs):

        sensors = self._dao.findSensors()
        sensors = sorted(sensors,
                         key=itemgetter('locationName', 'ChannelDescriptor'))

        elements = []
        for sensor in sensors:
            elements.append({
                'color': self.getBackgroundColor(sensor),
                'room': '%(loc)s: %(sen)s' % {
                    'loc': sensor['locationName'],
                    'sen': sensor['name']
                },
                'channel': sensor['ChannelDescriptor'],
                'value': sensor['value'],
                'status': self._sr.getDisplayState(sensor)
            })

        cherrypy.response.headers['Content-Type'] = 'application/json'
        return json.dumps(elements)

    def getBackgroundColor(self, sensor):
        stype = sensor['sensorTypeName']
        if stype == 'CONTACT_REED':
            if float(sensor['value']) == 1:
                return '#FF0000'
            else:
                return '#00FF00'  # closed door == green colour
        elif stype == 'CONTACT_PRESSUREMAT':
            if float(sensor['value']) == 1:
                return '#00FF00'  # vacant chair == green colour
            else:
                return '#FF0000'
        elif stype == 'TEMPERATURE_MCP9700_HOT' or stype == 'TEMPERATURE_MCP9700_COLD':
            #return str((float(sensor['value']) - 0.5) * 100.0) + 'C'
            temp = float(sensor['value'])
            if temp < 0.0:
                r = 0
            elif temp > 50.0:
                r = 255
            else:
                r = int(temp * 5.1)  # -0C..+50C -> 0..255
            g = 0
            b = 255 - r
            return '#%02X%02X%02X' % (r, g, b)
        elif stype == 'POWER_CONSUMPTION_MONITOR':
            if self._sr.isSensorOn(sensor):
                return '#FFFF00'
            else:
                return '#00FF00'  # closed door == green colour
        else:
            return 'None'
Ejemplo n.º 2
0
class GEOSystem(PollingProcessor):
	
	def __init__ (self, hostName, userName, password, database, query):
		super(GEOSystem, self).__init__()
		self._geoDao = SQLDao(hostName, userName, password, database)		
		self._geoQuery = query
		self._sensorDao = Sensors()
		self._sensors = self._sensorDao.findSensors()
		self._sr = StateResolver()
		self._channels = {}
		self._warned = []

	@property
	def channels(self):		
		return self._channels

	def start(self):
		print "Started polling geo sensors"
		self._addPollingProcessor('geoSensors', self.pollGeoSystem, None, 0.1)

	def stop(self):
		print "Stopped polling geo sensors"
		self._removePollingProcessor('geoSensors')

	def pollGeoSystem(self):
		rows = self._geoDao.getData(self._geoQuery)
		# This appears to be needed or 'CALL exppower' doesn't update the power values,
		# oddly, it updates the timestamp field though...
		self._geoDao.close()
		for row in rows:
			try:
				sensor = next(s for s in self._sensors if s['ChannelDescriptor'] == str(row['ID']))
			except StopIteration:
				# Only warn once, or we'll flood the console
				if row['ID'] not in self._warned:
					print >> sys.stderr, "Warning: Unable to locate sensor record for geo sensor %s. ID: %s" % (row['Description'], row['ID'])
					self._warned.append(row['ID'])
				continue

			_device = sensor['locationName']
			_name = sensor['name']
			_id = sensor['sensorId']
			_type = sensor['sensorTypeName']

			# Only warn once, or we'll flood the console
			if _name != row['Description'] and row['ID'] not in self._warned:
				print >> sys.stderr, 'Warning: Channel name differs from Geo-System description: %s / %s' % (_name, row['Description'])
				self._warned.append(row['ID'])

			_status = self._sr.getDisplayState({'sensorTypeName': _type, 'value': row['Power'], 'sensorId': _id })

			self._channels[row['ID']] = { 
										'id': _id,
										'room': _device,
										'channel': _name,
										'value': '%.1f' % row['Power'],
										'status': _status
										}
Ejemplo n.º 3
0
class States(object):
    def __init__(self):
        self._dao = Sensors()
        self._sr = StateResolver()
    
    exposed = True
    
    def GET(self, *args, **kwargs):
        
        sensors = self._dao.findSensors()
        sensors = sorted(sensors, key = itemgetter('locationName', 'ChannelDescriptor'))
        
        elements = []
        for sensor in sensors:
            elements.append(
                            {
                             'color': self.getBackgroundColor(sensor),
                             'room': '%(loc)s: %(sen)s' % { 'loc': sensor['locationName'], 'sen': sensor['name'] },
                             'channel': sensor['ChannelDescriptor'],
                             'value': sensor['value'],
                             'status': self._sr.getDisplayState(sensor)
                             })
        
        cherrypy.response.headers['Content-Type'] = 'application/json'
        return json.dumps(elements)

    def getBackgroundColor(self, sensor):
        stype = sensor['sensorTypeName']
        if stype == 'CONTACT_REED':
            if float(sensor['value']) == 1:
                return '#FF0000'
            else:
                return '#00FF00' # closed door == green colour
        elif stype == 'CONTACT_PRESSUREMAT':
            if float(sensor['value']) == 1:
                return '#00FF00' # vacant chair == green colour
            else:
                return '#FF0000'
        elif stype == 'TEMPERATURE_MCP9700_HOT' or stype == 'TEMPERATURE_MCP9700_COLD':
            #return str((float(sensor['value']) - 0.5) * 100.0) + 'C'
            temp = float(sensor['value'])
            if temp < 0.0:
                r = 0
            elif temp > 50.0:
                r = 255
            else:
                r = int(temp * 5.1) # -0C..+50C -> 0..255
            g = 0
            b = 255 - r
            return '#%02X%02X%02X' % (r, g, b)
        elif stype == 'POWER_CONSUMPTION_MONITOR':
            if self._sr.isSensorOn(sensor):
                return '#FFFF00'
            else:
                return '#00FF00' # closed door == green colour
        else:
            return 'None'
Ejemplo n.º 4
0
class ZigBee(PollingProcessor):

    # Initialisation method
    # Opens the configured UDP socket for the receipt of broadcast messages.
    def __init__(self, udpPort):
        super(ZigBee, self).__init__()
        self.sock = socket(AF_INET, SOCK_DGRAM)
        self.sock.settimeout(1)
        self.sock.bind(('', udpPort))

        # Place for the callback methods to store "static" values.
        # Currently only needed for the Moving Average Filter for the MCP9700
        # temperature sensor temperature calculations.
        self._handler_memory = {}
        self._channels = {}
        self._sr = StateResolver()
        self._sensorDao = Sensors()
        self._sensors = self._sensorDao.findSensors()
        self._warned = []

    @property
    def channels(self):
        if self._channels == None:
            self._channels = {}

        return self._channels

    def start(self):
        print "Started polling zigBee sensors"
        self._addPollingProcessor('zigBee', self.pollZigbeeSensors, None,
                                  0.0001)

    def stop(self):
        print "Stopped polling zigBee sensors"
        self._removePollingProcessor('zigBee')

    # ZigBee thread main loop
    def pollZigbeeSensors(self):
        try:
            data, _ = self.sock.recvfrom(10240, 0)
        except Exception as e:
            if type(e) != timeout:
                print e
            return

        (_, mac, channel, val) = data.split(' ')

        mac = mac.lower()
        channel = channel.upper()

        try:
            sensor = next(s for s in self._sensors
                          if s['ChannelDescriptor'] == str(mac) + str(channel))
        except StopIteration:
            #Only warn once, or we'll flood the console
            if str(mac) + str(channel) not in self._warned:
                print >> sys.stderr, "Warning: Unable to locate sensor record for zigbee sensor ID: %s" % (
                    str(mac) + str(channel))
                self._warned.append(str(mac) + str(channel))
            return

        _device = sensor['locationName']
        _pin = sensor['name']
        _id = sensor['sensorId']

        if val != '-' and val != '':
            _type = sensor['sensorTypeName']
            _uuid = '%s_%s' % (mac, channel)
            if _type == 'TEMPERATURE_MCP9700_HOT' or _type == 'TEMPERATURE_MCP9700_COLD':
                _value = str((float(val) - 0.5) * 100.0)
            else:
                _value = val

            _status = self._sr.getDisplayState({
                'sensorTypeName': _type,
                'value': _value,
                'sensorId': _id
            })

            self._channels[_uuid] = {
                'id': _id,
                'room': _device,
                'channel': _pin,
                'value': _value,
                'status': _status
            }
Ejemplo n.º 5
0
class ZigBee(PollingProcessor):

	# Initialisation method
	# Opens the configured UDP socket for the receipt of broadcast messages.
	def __init__ (self, udpPort):
		super(ZigBee, self).__init__()
		self.sock = socket(AF_INET, SOCK_DGRAM)
		self.sock.settimeout(1)
		self.sock.bind(('', udpPort))

		# Place for the callback methods to store "static" values.
		# Currently only needed for the Moving Average Filter for the MCP9700
		# temperature sensor temperature calculations.
		self._handler_memory = {}
		self._channels = {}
		self._sr = StateResolver()
		self._sensorDao = Sensors()
		self._sensors = self._sensorDao.findSensors()
		self._warned = []

	@property
	def channels(self):
		if self._channels == None:
			self._channels = {}
		
		return self._channels

	def start(self):
		print "Started polling zigBee sensors"
		self._addPollingProcessor('zigBee', self.pollZigbeeSensors, None, 0.0001)

	def stop(self):
		print "Stopped polling zigBee sensors"
		self._removePollingProcessor('zigBee')
		
	# ZigBee thread main loop
	def pollZigbeeSensors(self):
		try:
			data, _ = self.sock.recvfrom(10240, 0)
		except Exception as e:
			if type(e) != timeout:
				print e
			return

		(_, mac, channel, val) = data.split(' ')

		mac = mac.lower()
		channel = channel.upper()
		
		try:
			sensor = next(s for s in self._sensors if s['ChannelDescriptor'] == str(mac) + str(channel))
		except StopIteration:
			#Only warn once, or we'll flood the console
			if str(mac) + str(channel) not in self._warned:
				print >> sys.stderr, "Warning: Unable to locate sensor record for zigbee sensor ID: %s" % (str(mac) + str(channel))
				self._warned.append(str(mac) + str(channel))
			return

		_device = sensor['locationName']
		_pin = sensor['name']
		_id = sensor['sensorId']

		if val != '-' and val != '':
			_type = sensor['sensorTypeName']
			_uuid = '%s_%s' % (mac , channel)
			if _type == 'TEMPERATURE_MCP9700_HOT' or _type == 'TEMPERATURE_MCP9700_COLD':
				_value = str((float( val) - 0.5) * 100.0)
			else:
				_value = val
			
			_status = self._sr.getDisplayState({'sensorTypeName': _type, 'value': _value, 'sensorId': _id })

			self._channels[_uuid] = { 
									'id': _id, 
									'room': _device, 
									'channel': _pin, 
									'value': _value, 
									'status': _status
									}
Ejemplo n.º 6
0
class ZWaveHomeController(PollingProcessor):

	# Initialisation method
	# Opens the configured UDP socket for the receipt of broadcast messages.
	def __init__ (self, ipAddress):
		super(ZWaveHomeController, self).__init__()
		
		self._baseUrl = "http://%(ip)s:80/api/devices" % {'ip': ipAddress}

		# Place for the callback methods to store "static" values.
		# Currently only needed for the Moving Average Filter for the MCP9700
		# temperature sensor temperature calculations.
		self._handler_memory = {}
		self._channels = {}
		self._sr = StateResolver()
		self._sensorDao = Sensors()
		self._sensors = self._sensorDao.findSensors()
		self._warned = []

	@property
	def channels(self):
		if self._channels == None:
			self._channels = {}
		
		return self._channels

	def start(self):
		print "Started polling zwave sensors"
		self._addPollingProcessor('zwave', self.pollZWaveSensors, None, 0.1)

	def stop(self):
		print "Stopped polling zwave sensors"
		self._removePollingProcessor('zwave')
		
	def pollZWaveSensors(self):
		try:
			# http://192.168.1.109/devices
			url = self._baseUrl
			request = urllib2.Request(url)
			base64string = base64.encodestring('%s:%s' % ('admin', 'admin')).replace('\n', '')
			request.add_header("Authorization", "Basic %s" % base64string)
			result = urllib2.urlopen(request)
			data = json.load(result) 
		except Exception as e:
			if type(e) != timeout:
				print e
			return
		
		for device in data:
			channelDescriptor = 'zwave:' + str(device['id'])
			try:
				sensor = next(s for s in self._sensors if s['ChannelDescriptor'] == channelDescriptor)
			except StopIteration:
				# Only warn once, or we'll flood the console
				if channelDescriptor not in self._warned:
					print >> sys.stderr, "Warning: Unable to locate sensor record for zwave sensor ID: %s (%s)" % (str(channelDescriptor), str(device['name']))
					self._warned.append(channelDescriptor)
				continue
	
			_device = sensor['locationName']
			_pin = sensor['name']
			_id = sensor['sensorId']
	
			# order determines priority
			valueKeys = ['valueSensor', 'value']
			
			val = ''
			for valueKey in valueKeys:
				if device['properties'].has_key(valueKey):
					val = device['properties'][valueKey]
					break
	
			if val != '-' and val != '':
				_type = sensor['sensorTypeName']
				_uuid = channelDescriptor
				if _type == 'TEMPERATURE_MCP9700_HOT' or _type == 'TEMPERATURE_MCP9700_COLD':
					_value = str((float(val) - 0.5) * 100.0)
				else:
					_value = val
				
				_status = self._sr.getDisplayState({'sensorTypeName': _type, 'value': _value, 'sensorId': _id })
	
				self._channels[_uuid] = { 
										'id': _id,
										'room': _device,
										'channel': _pin,
										'value': _value,
										'status': _status
										}
Ejemplo n.º 7
0
class ZWaveVeraLite(PollingProcessor):

	# Initialisation method
	# Opens the configured UDP socket for the receipt of broadcast messages.
	def __init__ (self, ipAddress, port):
		super(ZWaveVeraLite, self).__init__()
		
		self._loadTime = None
		self._dataVersion = None
		self._baseUrl = "http://%(ip)s:%(port)s/data_request?id=lu_sdata&timeout=%(timeout)s" % {'ip': ipAddress, 'port': port, 'timeout': 60}

		# Place for the callback methods to store "static" values.
		# Currently only needed for the Moving Average Filter for the MCP9700
		# temperature sensor temperature calculations.
		self._handler_memory = {}
		self._channels = {}
		self._sr = StateResolver()
		self._sensorDao = Sensors()
		self._sensors = self._sensorDao.findSensors()
		self._warned = []

	@property
	def channels(self):
		if self._channels == None:
			self._channels = {}
		
		return self._channels

	def start(self):
		print "Started polling zwave sensors"
		self._addPollingProcessor('zwave', self.pollZWaveSensors, None, 0.1)

	def stop(self):
		print "Stopped polling zwave sensors"
		self._removePollingProcessor('zwave')
		
	# ZigBee thread main loop
	def pollZWaveSensors(self):
		try:
			# http://192.168.1.158:3480/data_request?id=lu_sdata
			# http://192.168.1.158:3480/data_request?id=lu_sdata&loadtime=1282441735&dataversion=441736333&timeout=60
			url = self._baseUrl
			if self._loadTime != None and self._dataVersion != None:
				url += '&loadtime=%(load)s&dataversion=(dataversion)s' % {'load': self._loadTime, 'dataversion': self._dataVersion }
			data = json.load(urllib2.urlopen(url)) 
		except Exception as e:
			if type(e) != timeout:
				print e
			return
		
		self._loadTime = data['loadtime']
		self._dataVersion = data['dataversion']
		
		for device in data['devices']:
			channelDescriptor = 'zwave:' + str(device['id'])
			try:
				sensor = next(s for s in self._sensors if s['ChannelDescriptor'] == channelDescriptor)
			except StopIteration:
				# Only warn once, or we'll flood the console
				if channelDescriptor not in self._warned:
					print >> sys.stderr, "Warning: Unable to locate sensor record for zwave sensor ID: %s (%s)" % (str(channelDescriptor), str(device['name']))
					self._warned.append(channelDescriptor)
				continue
	
			_device = sensor['locationName']
			_pin = sensor['name']
			_id = sensor['sensorId']

			valueKeys = ['armed', 'status']

			val = ''
			for valueKey in valueKeys:
				if device.has_key(valueKey):
					val = device[valueKey]
					break
	
			if val != '-' and val != '':
				_type = sensor['sensorTypeName']
				_uuid = channelDescriptor
				if _type == 'TEMPERATURE_MCP9700_HOT' or _type == 'TEMPERATURE_MCP9700_COLD':
					_value = str((float(val) - 0.5) * 100.0)
				else:
					_value = val
				
				_status = self._sr.getDisplayState({'sensorTypeName': _type, 'value': _value, 'sensorId': _id })
	
				self._channels[_uuid] = { 
										'id': _id,
										'room': _device,
										'channel': _pin,
										'value': _value,
										'status': _status
										}