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:])
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
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)
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)