def create(self): # Write controller labels self.nlsData.append('# controller labels') self.nlsData.append('') self.nlsData.append( self.NODE_NAME.format( 'controller', self.config['controller']['name'] + ' Controller')) self.nlsData.append( self.NODE_ICON.format( 'controller', self.config['controller'].get('icon', 'GenericCtl'))) self.nlsData.append('') self.nlsData.append( self.COMMAND_NAME.format('ctl-DISCOVER', 'Re-Discover')) self.nlsData.append( self.STATUS_NAME.format( 'ctl', 'ST', self.config['controller']['name'] + ' Online')) self.nlsData.append('') # Write controller node nodeDef = ET.SubElement(self.nodeTree, 'nodeDef', id='controller', nls='ctl') sts = ET.SubElement(nodeDef, 'sts') ET.SubElement(sts, 'st', id='ST', editor='bool') cmds = ET.SubElement(nodeDef, 'cmds') ET.SubElement(cmds, 'sends') accepts = ET.SubElement(cmds, 'accepts') ET.SubElement(accepts, 'cmd', id='DISCOVER') # Write primary devices for driverName, driverData in self.config['drivers'].items(): polyCommandsData = self.config['poly']['drivers'].get( driverName, {}).get('commands', {}) paramParser = ParamParser(driverData, True) nodeDesc = driverData.get('description', utils.name_to_desc(driverName)) nlsName = utils.name_to_nls(driverName) nlsData = [ self.STATUS_NAME.format(nlsName, 'ST', nodeDesc + ' Online') ] states = self.write_node_info(polyCommandsData, paramParser, driverName, nodeDesc, nlsName, driverData, nlsData) ET.SubElement(states, 'st', id='ST', editor='bool') # Write sub devices for groupName, groupData in driverData.get('commandGroups', {}).items(): polyGroupData = self.config['poly']['commandGroups'].get( groupName) if polyGroupData: self.write_node_info( polyCommandsData, paramParser, driverName + '_' + groupName, nodeDesc + ' ' + utils.name_to_desc(groupName), utils.name_to_nls(driverName + polyGroupData.get('nls', groupName)), groupData)
def createDevices(self): customData = self.polyConfig.get('customData', {}) addressMap = copy.deepcopy(customData.get('addressMap', {})) discoveredDevices = customData.get('discoveredDevices', {}) removedDevices = customData.get('removedDevices', {}) devicesConfig = self.configData.get('devices', {}) if discoveredDevices is not None: devicesConfig.update(discoveredDevices) self.configData['devices'] = devicesConfig for deviceName, deviceData in devicesConfig.items(): if self.isDeviceConfigured(deviceData) and deviceData.get('enable', True): driverName = deviceData['driver'] deviceData.update(self.configData['drivers'][driverName]) polyData = self.configData['poly']['drivers'].get( driverName, {}) deviceData['poly'].update(polyData) deviceDriver = self.deviceDriverInstances.get(driverName, {}).get( deviceName) if deviceDriver is None: deviceDriver = self.get_device_driver(driverName, deviceData)( utils.merge_commands(deviceData), LOGGER, True) self.deviceDriverInstances[driverName][deviceName] = deviceDriver nodeAddress = self.getDeviceAddress(deviceName, addressMap) if nodeAddress not in removedDevices: nodeName = deviceData.get( 'name', utils.name_to_desc(deviceName)) primaryDevice = PrimaryRemoteDevice(self, nodeAddress, driverName, nodeName, deviceData, deviceDriver) self.addNode(primaryDevice) for commandGroup, commandGroupData in deviceData.get( 'commandGroups', {}).items(): commandGroupData['poly'] = polyData groupConfig = self.configData['poly']['commandGroups'].get( commandGroup) if groupConfig: groupDriverName = driverName + '_' + commandGroup groupNodeAddress = self.getDeviceAddress( deviceName + '_' + commandGroup, addressMap) if groupNodeAddress not in removedDevices: self.addNode(RemoteDevice(self, primaryDevice, nodeAddress, groupNodeAddress, groupDriverName, utils.name_to_desc( commandGroup), commandGroupData, deviceDriver)) if customData.get('addressMap') != addressMap: self.saveCustomData({ 'addressMap': addressMap, 'discoveredDevices': discoveredDevices, 'removedDevices': removedDevices })
def write_node_info(self, polyCommandsData, paramParser, nodeName, nodeDesc, nlsName, nodeData, nlsData=[]): assert len(nlsName) <= 16, 'Node NLS name is too long: {}'.format( nlsName) self.nlsData.append('# ' + nodeName + ' labels\n') self.nlsData.append(self.NODE_NAME.format(nodeName, nodeDesc)) self.nlsData.append( self.NODE_ICON.format(nodeName, nodeData.get('icon', 'GenericCtl'))) self.nlsData.extend(nlsData) nodeDef = ET.SubElement(self.nodeTree, 'nodeDef', id=nodeName, nls=nlsName) states = ET.SubElement(nodeDef, 'sts') cmds = ET.SubElement(nodeDef, 'cmds') ET.SubElement(cmds, 'sends') accepts = ET.SubElement(cmds, 'accepts') for commandName, commandData in nodeData['commands'].items(): if not commandData.get('result'): commandKey = nodeName + '_' + commandName self.nlsData.append( self.COMMAND_NAME.format( nlsName + '-' + commandName, commandData.get('description', utils.name_to_desc(commandName)))) cmd = ET.SubElement(accepts, 'cmd', id=commandName) param = None nlsCommand = utils.name_to_nls(commandKey) polyData = polyCommandsData.get(commandName, {}) if commandData.get('acceptsNumber'): param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand) editor = ET.SubElement(self.editorTree, 'editor', id=nlsCommand) range = ET.SubElement(editor, 'range') for rangeKey, rangeValue in polyData['param'].items(): range.set(rangeKey, str(rangeValue)) elif 'value_set' in commandData: names = paramParser.value_sets[commandData['value_set'] + '_names'] param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand) editor = ET.SubElement(self.editorTree, 'editor', id=nlsCommand) ET.SubElement(editor, 'range', uom='25', subset='0-' + str(len(names) - 1), nls=nlsCommand + '_I') for key, value in names.items(): self.nlsData.append(nlsCommand + '_I-' + str(key) + ' = ' + value) if 'driver' in polyData: polyDriverName = polyData['driver']['name'] param.set('init', polyDriverName) ET.SubElement(states, 'st', id=polyDriverName, editor=nlsCommand) self.nlsData.append( self.STATUS_NAME.format( nlsName, polyDriverName, polyData['driver'].get( 'description', utils.name_to_desc(commandName)))) self.nlsData.append('') return states
def write_node_info(self, polyCommandsData, paramParser, nodeName, nodeDesc, nlsName, nodeData, nlsData=[]): assert len(nlsName) <= 16, 'Node NLS name is too long: {}'.format( nlsName) self.nlsData.append('# ' + nodeName + ' labels\n') self.nlsData.append(self.NODE_NAME.format(nodeName, nodeDesc)) self.nlsData.append( self.NODE_ICON.format(nodeName, nodeData.get('icon', 'GenericCtl'))) self.nlsData.extend(nlsData) nodeDef = ET.SubElement(self.nodeTree, 'nodeDef', id=nodeName, nls=nlsName) states = ET.SubElement(nodeDef, 'sts') cmds = ET.SubElement(nodeDef, 'cmds') ET.SubElement(cmds, 'sends') accepts = ET.SubElement(cmds, 'accepts') cmd_list = [] for commandName, commandData in nodeData['commands'].items(): commandKey = nodeName + '_' + commandName nlsCommand = utils.name_to_nls(commandKey) polyData = polyCommandsData.get(commandName, {}) polyDriverName = polyData.get('driver', {}).get('name') if not commandData.get('result'): self.nlsData.append( self.COMMAND_NAME.format( nlsName + '-' + commandName, commandData.get('description', utils.name_to_desc(commandName)))) cmd = ET.SubElement(accepts, 'cmd', id=commandName) param = None if (commandData.get('acceptsNumber') or commandData.get('acceptsHex') or commandData.get('acceptsPct') or commandData.get('acceptsFloat')): param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand) editor = ET.SubElement(self.editorTree, 'editor', id=nlsCommand) range = ET.SubElement(editor, 'range') for rangeKey, rangeValue in polyData['param'].items(): range.set(rangeKey, str(rangeValue)) elif 'value_set' in commandData: param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand) self.add_driver_desc( nlsCommand, paramParser.value_sets[commandData['value_set'] + '_names']) else: cmd_list.append(commandName) if polyDriverName: if param is None: raise RuntimeError( 'Driver configured but command is not configured for parameters: ' + commandName) param.set('init', polyDriverName) elif commandData.get('readOnly', False) and 'value_set' in commandData: self.add_driver_desc( nlsCommand, paramParser.value_sets[ commandData['value_set'].replace('_reverse', '') + '_names']) if polyDriverName: ET.SubElement(states, 'st', id=polyDriverName, editor=nlsCommand) self.nlsData.append( self.STATUS_NAME.format( nlsName, polyDriverName, polyData['driver'].get( 'description', utils.name_to_desc(commandName)))) if len(cmd_list) > self.COMMAND_LIST_THRESHOLD: nlsCommand = nlsName + '_C' for cmd_index, commandName in enumerate(cmd_list): self.nlsData.append( nlsCommand + '-' + str(cmd_index) + ' = ' + commandData.get('description', utils.name_to_desc(commandName))) self.nlsData.append( self.COMMAND_NAME.format(nlsName + '-execute', 'Send Command')) cmd = ET.SubElement(accepts, 'cmd', id='execute') param = ET.SubElement(cmd, 'p', id='', editor=nlsCommand) editor = ET.SubElement(self.editorTree, 'editor', id=nlsCommand) range = ET.SubElement(editor, 'range') range.set('nls', nlsCommand) range.set('uom', '25') range.set('subset', '0-' + str(len(cmd_list) - 1)) self.nlsData.append('') return states