def publication_add(publication_params): print("**UUID: ", publication_params[1]) print("**NodeID: ", publication_params[2]) print("**Group Number : ", publication_params[3]) global cc cc.publish_set(8, 0) cc.composition_data_get() time.sleep(2) cc.appkey_add(0) time.sleep(1) print("**Appkey Added") cc.model_app_bind( (db.nodes[int(publication_params[2])].unicast_address) + 1, 0, mt.ModelId(0x1000)) time.sleep(1) print("**Appkey Bound") cc.model_publication_set( db.nodes[int(publication_params[2])].unicast_address + 1, mt.ModelId(0x1000), mt.Publish(db.groups[int(publication_params[3])].address, index=0, ttl=1))
def addAppKeys(self, uuid, groupAddrId=0): """ Used to: - subscribes the serial device to the group address - add publication address of each element to the serial device - bind app_key to each model on each element - set the client to publish to the group address Parameters ---------- node : index of node in db groupAddrId : index of group address in db """ node = self.uuid_to_node_index(uuid) command = cmd.AddrSubscriptionAdd(self.db.groups[groupAddrId].address) self.message_que.append(functools.partial(self.iaci.send, command)) for e, element in enumerate(self.db.nodes[node].elements): # Add each element to the serial device's pubusb list element_address = self.db.nodes[node].unicast_address + e command = cmd.AddrPublicationAdd(element_address) self.message_que.append(functools.partial(self.iaci.send, command)) for model in element.models: # Generic OnOff Server if str(model.model_id) == "1000": self.message_que.append( functools.partial(self.cc.model_app_bind, element_address, 0, mt.ModelId(0x1000))) # Generic OnOff Client if str(model.model_id) == "1001": self.message_que.append( functools.partial(self.cc.model_app_bind, element_address, 0, mt.ModelId(0x1001))) self.message_que.append( functools.partial( self.cc.model_publication_set, element_address, mt.ModelId(0x1001), mt.Publish(self.db.groups[groupAddrId].address, index=0, ttl=1))) # Simple OnOff Server if str(model.model_id) == "00590000": self.message_que.append( functools.partial( self.cc.model_app_bind, element_address, 0, mt.ModelId(0x0000, company_id=0x0059))) self.message_que.append( functools.partial(self.addAppKeysComplete, uuid)) self.send_next_message()
def server_set_subscribe(self, server_address, element, modelid, subscribe_address): node = self._find_node_int(server_address) devkey_handle, address_handle = self._get_handles(node) self.cc.publish_set(devkey_handle, address_handle) self.cc.model_subscription_delete_all(node.unicast_address + element, mt.ModelId(modelid)) self.cc.model_subscription_add(node.unicast_address + element, subscribe_address, mt.ModelId(modelid)) self._free_handles(devkey_handle, address_handle)
def __model_sig_app_list_handler(self, opcode, message): status, element_address, model_id = struct.unpack( "<BHH", message.data[0:5]) status = AccessStatus(status) self.logger.info("SIG Model App List status: %s", status) if status == AccessStatus.SUCCESS: appkeys = ConfigurationClient._unpack_key_ind(message.data[5:]) model = self.model_get(element_address, mt.ModelId(model_id)) model.bind = appkeys self.db_save() self.logger.info("SIG model %04x has appkey(s) %r bound", model_id, appkeys)
def client_set_publish(self, client_address, element, modelid, publish_address): node = self._find_node_int(client_address) devkey_handle, address_handle = self._get_handles(node) self.cc.publish_set(devkey_handle, address_handle) self.cc.model_publication_set( node.unicast_address + element, mt.ModelId(modelid), mt.Publish(publish_address, index=0, ttl=1)) self._free_handles(devkey_handle, address_handle)
def config_node(nodeconfig_params): print("**Configure existing node") print("**UUID: ", nodeconfig_params[1]) print("**NodeID: ", nodeconfig_params[2]) print("**Channel 1: ", nodeconfig_params[3]) print("**Channel 2: ", nodeconfig_params[4]) print("**Channel 3: ", nodeconfig_params[5]) print("**Channel 4: ", nodeconfig_params[6]) print("**LPN State: ", nodeconfig_params[7]) print("**LPN Poll Timeout: ", nodeconfig_params[8]) print("**LPN Delay: ", nodeconfig_params[9]) print("**LPN Receive Window: ", nodeconfig_params[10]) #print("**Unicast Address from UUID: ",db.nodes[int(nodeconfig_params[3])].unicast_address) #print("**DevKey from UUID: ",db.nodes[int(nodeconfig_params[3])].device_key) time.sleep(1) # device.send(cmd.DevkeyAdd( # db.nodes[int(nodeconfig_params[3])].unicast_address, 0, db.nodes[int(nodeconfig_params[3])].device_key)) # device.send(cmd.AddrPublicationAdd( # db.nodes[int(nodeconfig_params[3])].unicast_address)) # time.sleep(1) global cc cc.publish_set(8, 0) cc.composition_data_get() time.sleep(2) cc.appkey_add(0) time.sleep(1) print("**Appkey Added") cc.model_app_bind(db.nodes[int(nodeconfig_params[2])].unicast_address, 0, mt.ModelId(0x1002)) time.sleep(1) print("**Appkey Bound") time.sleep(2) print("**Node Config Client created") nc.publish_set(0, 0) time.sleep(1) # nc.set(nodeconfig_params[4]) nc.set(int(nodeconfig_params[3]), int(nodeconfig_params[4]), int(nodeconfig_params[5]), int(nodeconfig_params[6]), int(nodeconfig_params[7]), int(nodeconfig_params[8]), int(nodeconfig_params[9]), int(nodeconfig_params[10])) time.sleep(5) print("**Set Params") cc.node_reset() time.sleep(1) print("**Reset Node")
def subscription_add(subscription_params): print("**UUID: ", subscription_params[1]) print("**NodeID: ", subscription_params[2]) print("**Group Number : ", subscription_params[3]) global cc cc.publish_set(8, 0) cc.composition_data_get() time.sleep(2) cc.appkey_add(0) time.sleep(1) print("**Appkey Added") cc.model_app_bind( (db.nodes[int(subscription_params[2])].unicast_address) + 1, 0, mt.ModelId(0x1000)) time.sleep(1) print("**Appkey Bound") cc.model_subscription_add( db.nodes[int(subscription_params[2])].unicast_address + 1, db.groups[int(subscription_params[3])].address, mt.ModelId(0x1000))
def __model_sig_subscription_list_handler(self, opcode, message): status, element_address, model_id = struct.unpack( "<BHH", message.data[0:5]) status = AccessStatus(status) self.logger.info("SIG Model Subscription List status: %s", status) if status == AccessStatus.SUCCESS: if len(message.data) > 5: addresses = struct.unpack( "<" + "H" * (len(message.data[5:]) // 2), message.data[5:]) addresses = [mt.group_address(a) for a in addresses] else: addresses = [] model = self.model_get(element_address, mt.ModelId(model_id)) model.subscribe = addresses self.db_save() self.logger.info("SIG model %04x has addresse(s) %r bound", model_id, addresses)
def __model_sig_app_list_handler(self, opcode, message): status, element_address, model_id = struct.unpack( "<BHH", message.data[0:5]) status = AccessStatus(status) self.logger.info("SIG Model App List status: %s", status) if status == AccessStatus.SUCCESS: if len(message.data) > 5: appkeys = struct.unpack( "<" + "H" * (len(message.data[5:]) // 2), message.data[5:]) appkeys = [mt.KeyIndex(i) for i in appkeys] else: appkeys = [] model = self.model_get(element_address, mt.ModelId(model_id)) model.bind = appkeys self.db_save() self.logger.info("SIG model %04x has appkey(s) %r bound", model_id, appkeys)