def send(self, code, retval_type, destination_id):
        code_sha1 = hashlib.sha1(bytearray(code)).digest()
        code_hash = [ord(i) for i in code_sha1[-4:]]
        code_padding = [
            0
        ] if len(code) % 2 == 1 else 0  # Make sure the capsule has even length
        capsule_length = 2 + len(code_hash) + len(code) + len(code_padding)
        capsule = [capsule_length % 256, (capsule_length >> 8) % 256
                   ] + code_hash + code + code_padding

        retval_size = sizeInBits(retval_type) / 8
        capsule_fragments = list(
            chunks(capsule, CodeGeneratorZwave.MAX_PAYLOAD))
        number_of_fragments = len(capsule_fragments)
        # print "Return type " + str(retval_type)
        # print "Return size " + str(retval_size)
        # print "Executing capsule", capsule
        for i in range(number_of_fragments):
            message = [
                0x88, CodeGeneratorZwave.WKECO_COMM_ECOCOMMAND,
                CodeGeneratorZwave.seqnr % 256, CodeGeneratorZwave.seqnr / 256,
                i, number_of_fragments - 1, retval_size
            ] + capsule_fragments[i]
            # print "Fragment ", capsule_fragments[i]
            # print "Message ", message
            pyzwave.send(destination_id, message)
            reply = pyzwave.receive(1000)
            if (reply[1][3] == CodeGeneratorZwave.WKECO_REPLY_TOO_BIG):
                raise OutOfMemoryError(
                    "Capsule too big to fit in the node's buffer")
            if (reply[1][3] == CodeGeneratorZwave.WKECO_REPLY_EXECUTED):
                # print "Received reply after executing capsule:" + str(reply)
                return bytearray(reply[1][4:])
Beispiel #2
0
    def handler(self):
        while 1:
            logging.info('just before handler tasks.get')
            defer = tasks.get()

            destination = defer.message.destination
            command = defer.message.command
            payload = defer.message.payload

            retries = 3

            while retries > 0:
                try:
                    pyzwave.send(destination, [0x88, command] + payload)

                    if len(defer.allowed_replies) > 0:
                        BrokerAgent.init().append(defer)

                    break
                except Exception as e:
                    log = "===========IOError========== retries remaining: " + str(retries)
                    logging.exception(log)
                retries -= 1

            if retries == 0 or len(defer.allowed_replies) == 0:
                # returns immediately to handle failues, or no expected replies
                defer.callback(None)

            gevent.sleep(0)
    def handler(self):
        while 1:
            defer = tasks.get()
            logging.debug('handler: getting defer from task queue')

            if defer.message.command == "discovery":
                logging.debug('handler: processing discovery request')
                nodes = pyzwave.discover()
                gateway_id = nodes[0]
                total_nodes = nodes[1]
                # remaining are the discovered nodes
                discovered_nodes = nodes[2:]
                try:
                    discovered_nodes.remove(gateway_id)
                except ValueError:
                    pass # sometimes gateway_id is not in the list
                defer.callback(discovered_nodes)
            elif defer.message.command == "routing":
                logging.debug('handler: processing routing request')
                routing = {}
                nodes = pyzwave.discover()
                gateway_id = nodes[0]
                nodes = nodes[2:]
                try:
                    nodes.remove(gateway_id)
                except ValueError:
                    pass # sometimes gateway_id is not in the list
                for node in nodes:
                    routing[node] = pyzwave.routing(node)
                    try:
                        routing[node].remove(gateway_id)
                    except ValueError:
                        pass
                defer.callback(routing)
            else:
                logging.debug('handler: processing send request')
                retries = 1
                destination = defer.message.destination
                command = defer.message.command
                payload = defer.message.payload

                while retries > 0:
                    try:
                        logging.debug("handler: sending message from defer")
                        pyzwave.send(destination, [0x88, command] + payload)

                        if len(defer.allowed_replies) > 0:
                            BrokerAgent.init().append(defer)

                        break
                    except Exception as e:
                        log = "==IOError== retries remaining: " + str(retries)
                        logging.exception(log)
                    retries -= 1

                if retries == 0 or len(defer.allowed_replies) == 0:
                    logging.error("handler: returns immediately to handle failues, or defer has no expected replies")
                    defer.callback(None)

            gevent.sleep(0)
 def send_raw(self, address, payload):
     ret = None
     with self._global_lock:
         try:
             logger.info("sending %d bytes %s to %X" %
                         (len(payload), payload, address))
             pyzwave.send(address, payload)
         except Exception as e:
             ret = traceback.format_exc()
             logger.error("send_raw exception %s\n%s" % (str(e), ret))
     return ret
Beispiel #5
0
def sendcmd(dest, cmd, payload=[], retries=3):
  pyzwave.receive(10) # Clear pending messages
  while retries >= 0:
    try:
      pyzwave.send(dest, [0x88, cmd] + payload)
    except:
      print "=============IOError============ retries remaining:"
      print retries
      if retries <= 0:
        raise
      else:
        retries -= 1
    else:
      if cmd == APPMSG:
        ack = pyzwave.receive(5000) # Receive ack of APPMSG, TODO: see if sending succeeded.
        print "APPMSG ACK:", ack
      return
    def handler(self):
        while 1:
            defer = tasks.get()
            print 'handler: getting defer from task queue'

            if defer.message.command == "discovery":
                print 'handler: processing discovery request'
                nodes = pyzwave.discover()
                gateway_id = nodes[0]
                total_nodes = nodes[1]
                # remaining are the discovered nodes
                discovered_nodes = nodes[2:]
                try:
                    discovered_nodes.remove(gateway_id)
                except ValueError:
                    pass # sometimes gateway_id is not in the list
                defer.callback(discovered_nodes)
            elif defer.message.command == "routing":
                print 'handler: processing routing request'
                routing = {}
                nodes = pyzwave.discover()
                gateway_id = nodes[0]
                nodes = nodes[2:]
                try:
                    nodes.remove(gateway_id)
                except ValueError:
                    pass # sometimes gateway_id is not in the list
                for node in nodes:
                    routing[node] = pyzwave.routing(node)
                    try:
                        routing[node].remove(gateway_id)
                    except ValueError:
                        pass
                defer.callback(routing)
            else:
                print 'handler: processing send request'
                retries = 1
                destination = defer.message.destination
                command = defer.message.command
                payload = defer.message.payload

                # prevent pyzwave send got preempted and defer is not in queue
                if len(defer.allowed_replies) > 0:
                    print "handler: appending defer", defer, "to queue"
                    getAgent().append(defer)

                while retries > 0:
                    try:
                        print "handler: sending message from defer"
                        pyzwave.send(destination, [0x88, command] + payload)

                        break
                    except Exception as e:
                        log = "==IOError== retries remaining: " + str(retries)
                        print log
                    retries -= 1

                if retries == 0 or len(defer.allowed_replies) == 0:
                    print "handler: returns immediately to handle failues, or defer has no expected replies"
                    defer.callback(None)

            gevent.sleep(0)
Beispiel #7
0
    def handler(self):
        while 1:
            defer = tasks.get()
            #print 'handler: getting defer from task queue'

            if defer.message.command == "discovery":
                #print 'handler: processing discovery request'
                nodes = pyzwave.discover()
                gateway_id = nodes[0]
                total_nodes = nodes[1]
                # remaining are the discovered nodes
                discovered_nodes = nodes[2:]
                try:
                    discovered_nodes.remove(gateway_id)
                except ValueError:
                    pass  # sometimes gateway_id is not in the list
                defer.callback(discovered_nodes)
            elif defer.message.command == "routing":
                #print 'handler: processing routing request'
                routing = {}
                nodes = pyzwave.discover()
                gateway_id = nodes[0]
                nodes = nodes[2:]
                try:
                    nodes.remove(gateway_id)
                except ValueError:
                    pass  # sometimes gateway_id is not in the list
                for node in nodes:
                    routing[node] = pyzwave.routing(node)
                    try:
                        routing[node].remove(gateway_id)
                    except ValueError:
                        pass
                defer.callback(routing)
            elif defer.message.command == "device_type":
                #print 'handler: processing routing request'
                device_type = pyzwave.getDeviceType(defer.message.destination)
                defer.callback(device_type)
            else:
                #print 'handler: processing send request'
                retries = 1
                destination = defer.message.destination
                command = defer.message.command
                payload = defer.message.payload

                # prevent pyzwave send got preempted and defer is not in queue
                if len(defer.allowed_replies) > 0:
                    print "[transport] handler: appending defer", defer, "to queue"
                    getAgent().append(defer)

                while retries > 0:
                    try:
                        #print "handler: sending message from defer"
                        pyzwave.send(destination, [0x88, command] + payload)

                        break
                    except Exception as e:
                        log = "==IOError== retries remaining: " + str(retries)
                        print '[transport] ' + log
                    retries -= 1

                if retries == 0 or len(defer.allowed_replies) == 0:
                    print "[transport] handler: returns immediately to handle failues, or defer has no expected replies"
                    defer.callback(None)

            gevent.sleep(0)