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]
Exemple #3
0
 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)
Exemple #4
0
    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)