def _publish(self,sender,signal,data): now = time.time() dld = DustLinkData.DustLinkData() mac = data['mac'] #========== connect/disconnect if (self.lastCheck==None) or (now-self.lastCheck>self.CHECKDELAY): # remember I just checked self.lastCheck = now # we need to use "raw" access because dld.getPublisherSettings() # does not return all settings settings = dld.get(['system','publishers','xively']) # record the xivelyApiKey xivelyApiKey = None if ('xivelyApiKey' in settings) and settings['xivelyApiKey']: xivelyApiKey = settings['xivelyApiKey'] # update status if xivelyApiKey==None: with self.statusLock: self.status['apiKeySet'] = 'NO' else: with self.statusLock: self.status['apiKeySet'] = 'YES' # decide whether to connect/disconnect if (not self.connector) and xivelyApiKey: # connect # log log.info("Connecting to Xively") # remember API key self.xivelyApiKey = xivelyApiKey # connect try: self.connector = xivelyConnector.xivelyConnector( apiKey = self.xivelyApiKey, productName = 'SmartMesh IP Starter Kit', productDesc = 'Connecting using DustLink', ) except Exception as err: # log log.error("Error while connecting to Xively: {0}".format(err)) # update status with self.statusLock: self.status['status'] = 'CONNECTION FAILED' self.status['numConnectionsFailed']+= 1 # disconnect self._disconnect() else: # update status with self.statusLock: self.status['status'] = 'CONNECTED' self.status['numConnectionsOK'] += 1 self.status['lastConnected'] = dld.timestampToStringShort(now) elif ((self.connector) and (not xivelyApiKey)) or (self.xivelyApiKey!=xivelyApiKey): # disconnect self._disconnect() #========== publish data if self.connector: try: self.connector.publish( mac = data['mac'], datastream = data['type'], value = data['lastvalue'], ) except Exception as err: # log log.error( "Error while publishing to {0}/{1}: {2}".format( FormatUtils.formatMacString(mac), data['type'], err, ) ) # update status with self.statusLock: self.status['numPublishedFail'] += 1 # disconnect self._disconnect() else: # update status with self.statusLock: self.status['numPublishedOK'] += 1 #========== subscribe if self.connector: if mac not in self.subscribedMotes: try: if ('subscribeToLed' in data) and (data['subscribeToLed']): # create datastream self.connector.publish( mac = mac, datastream = 'led', value = 0, ) # subscribe self.connector.subscribe( mac = mac, datastream = 'led', callback = self._led_cb, ) except Exception as err: # log log.error( "Error while subscribing to {0}/{1}: {2}".format( FormatUtils.formatMacString(mac), 'led', err, ) ) # update status with self.statusLock: self.status['status'] = 'SUBSCRIPTION FAILED' self.status['numSubscriptionsFailed'] += 1 # disconnect self._disconnect() else: self.subscribedMotes += [mac]
def _publish(self, sender, signal, data): now = time.time() dld = DustLinkData.DustLinkData() mac = data['mac'] #========== connect/disconnect if (self.lastCheck == None) or (now - self.lastCheck > self.CHECKDELAY): # remember I just checked self.lastCheck = now # we need to use "raw" access because dld.getPublisherSettings() # does not return all settings settings = dld.get(['system', 'publishers', 'xively']) # record the xivelyApiKey xivelyApiKey = None if ('xivelyApiKey' in settings) and settings['xivelyApiKey']: xivelyApiKey = settings['xivelyApiKey'] # update status if xivelyApiKey == None: with self.statusLock: self.status['apiKeySet'] = 'NO' else: with self.statusLock: self.status['apiKeySet'] = 'YES' # decide whether to connect/disconnect if (not self.connector) and xivelyApiKey: # connect # log log.info("Connecting to Xively") # remember API key self.xivelyApiKey = xivelyApiKey # connect try: self.connector = xivelyConnector.xivelyConnector( apiKey=self.xivelyApiKey, productName='SmartMesh IP Starter Kit', productDesc='Connecting using DustLink', ) except Exception as err: # log log.error( "Error while connecting to Xively: {0}".format(err)) # update status with self.statusLock: self.status['status'] = 'CONNECTION FAILED' self.status['numConnectionsFailed'] += 1 # disconnect self._disconnect() else: # update status with self.statusLock: self.status['status'] = 'CONNECTED' self.status['numConnectionsOK'] += 1 self.status[ 'lastConnected'] = dld.timestampToStringShort(now) elif ((self.connector) and (not xivelyApiKey)) or (self.xivelyApiKey != xivelyApiKey): # disconnect self._disconnect() #========== publish data if self.connector: try: self.connector.publish( mac=data['mac'], datastream=data['type'], value=data['lastvalue'], ) except Exception as err: # log log.error("Error while publishing to {0}/{1}: {2}".format( FormatUtils.formatMacString(mac), data['type'], err, )) # update status with self.statusLock: self.status['numPublishedFail'] += 1 # disconnect self._disconnect() else: # update status with self.statusLock: self.status['numPublishedOK'] += 1 #========== subscribe if self.connector: if mac not in self.subscribedMotes: try: if ('subscribeToLed' in data) and (data['subscribeToLed']): # create datastream self.connector.publish( mac=mac, datastream='led', value=0, ) # subscribe self.connector.subscribe( mac=mac, datastream='led', callback=self._led_cb, ) except Exception as err: # log log.error("Error while subscribing to {0}/{1}: {2}".format( FormatUtils.formatMacString(mac), 'led', err, )) # update status with self.statusLock: self.status['status'] = 'SUBSCRIPTION FAILED' self.status['numSubscriptionsFailed'] += 1 # disconnect self._disconnect() else: self.subscribedMotes += [mac]
def run(self): while True: elem = self.queue.get() if elem==self.CLOSE_MESSAGE: if self.publisher: self.publisher.close() return (mac,datastream,value) = elem AppData().incrementMoteCounter(mac,COL_NUMDATAPUB) if self.publisher==None: apiKey = AppData().getApiKey() if apiKey: self.publisher = xivelyConnector.xivelyConnector( apiKey = apiKey, productName = 'SmartMesh IP Starter Kit', productDesc = 'Manager {0}'.format( FormatUtils.formatMacString(AppData().getManager()), ), ) if self.publisher==None: continue try: # publish self.publisher.publish( mac = mac, datastream = datastream, value = value, ) # log output = [] output += ['pushed following data to Xively:'] output += ['- mac: {0}'.format( FormatUtils.formatMacString(mac), ) ] output += ['- datastream: {0}'.format(datastream)] output += ['- value: {0}'.format(value)] output = '\n'.join(output) log.debug(output) except Exception as err: output = [] output += ['==============='] output += ['{0}: Exception when publishing'.format(self.name)] output += ['- mac: {0}'.format(FormatUtils.formatMacString(mac))] output += ['- datastream: {0}'.format(datastream)] output += ['{0}'.format(type(err))] output += ['{0}'.format(err)] output += [''] output = '\n'.join(output) log.error(output) print output else: AppData().incrementMoteCounter(mac,COL_NUMDATAPUBOK)
def run(self): while True: elem = self.queue.get() if elem == self.CLOSE_MESSAGE: if self.publisher: self.publisher.close() return (mac, datastream, value) = elem AppData().incrementMoteCounter(mac, COL_NUMDATAPUB) if self.publisher == None: apiKey = AppData().getApiKey() if apiKey: self.publisher = xivelyConnector.xivelyConnector( apiKey=apiKey, productName='SmartMesh IP Starter Kit', productDesc='Manager {0}'.format( FormatUtils.formatMacString( AppData().getManager()), ), ) if self.publisher == None: continue try: # publish self.publisher.publish( mac=mac, datastream=datastream, value=value, ) # log output = [] output += ['pushed following data to Xively:'] output += [ '- mac: {0}'.format( FormatUtils.formatMacString(mac), ) ] output += ['- datastream: {0}'.format(datastream)] output += ['- value: {0}'.format(value)] output = '\n'.join(output) log.debug(output) except Exception as err: output = [] output += ['==============='] output += ['{0}: Exception when publishing'.format(self.name)] output += [ '- mac: {0}'.format( FormatUtils.formatMacString(mac)) ] output += ['- datastream: {0}'.format(datastream)] output += ['{0}'.format(type(err))] output += ['{0}'.format(err)] output += [''] output = '\n'.join(output) log.error(output) print output else: AppData().incrementMoteCounter(mac, COL_NUMDATAPUBOK)