Preferences input directly into an Array?

Does anyone know of a better way to get a list of entries collected in a preferences page into an Array?

input name: “userNames[1]” creates a variable named settings.userNames[1] and not an array.

This works, but it’s messy as it creates 30 settings variables in addition to the state.userNames array. Anyone have a better solution?

    def usersPage() {
    dynamicPage(name:"usersPage", title: "User / Code List", uninstall: true, install: true) {
    
        section("User Names/Identifiers (1-10)") {
//            log.trace "User Names"
            input name: "user1", title: "Code #1 Name", type: string, multiple: false, required: false
            input name: "user2", title: "Code #2 Name", type: string, multiple: false, required: false
            input name: "user3", title: "Code #3 Name", type: string, multiple: false, required: false
            input name: "user4", title: "Code #4 Name", type: string, multiple: false, required: false
            input name: "user5", title: "Code #5 Name", type: string, multiple: false, required: false
            input name: "user6", title: "Code #6 Name", type: string, multiple: false, required: false
            input name: "user7", title: "Code #7 Name", type: string, multiple: false, required: false
            input name: "user8", title: "Code #8 Name", type: string, multiple: false, required: false
            input name: "user9", title: "Code #9 Name", type: string, multiple: false, required: false
            input name: "user10", title: "Code #10 Name", type: string, multiple: false, required: false 
        }
        
        section("User Names/Identifiers (11-20)") {
            input name: "user11", title: "Code #11 Name", type: string, multiple: false, required: false
            input name: "user12", title: "Code #12 Name", type: string, multiple: false, required: false
            input name: "user13", title: "Code #13 Name", type: string, multiple: false, required: false
            input name: "user14", title: "Code #14 Name", type: string, multiple: false, required: false
            input name: "user15", title: "Code #15 Name", type: string, multiple: false, required: false
            input name: "user16", title: "Code #16 Name", type: string, multiple: false, required: false
            input name: "user17", title: "Code #17 Name", type: string, multiple: false, required: false
            input name: "user18", title: "Code #18 Name", type: string, multiple: false, required: false
            input name: "user19", title: "Code #19 Name", type: string, multiple: false, required: false
            input name: "user20", title: "Code #20 Name", type: string, multiple: false, required: false 
        }
        
        section("User Names/Identifiers (21-30)") {
            input name: "user21", title: "Code #21 Name", type: string, multiple: false, required: false
            input name: "user22", title: "Code #22 Name", type: string, multiple: false, required: false
            input name: "user23", title: "Code #23 Name", type: string, multiple: false, required: false
            input name: "user24", title: "Code #24 Name", type: string, multiple: false, required: false
            input name: "user25", title: "Code #25 Name", type: string, multiple: false, required: false
            input name: "user26", title: "Code #26 Name", type: string, multiple: false, required: false
            input name: "user27", title: "Code #27 Name", type: string, multiple: false, required: false
            input name: "user28", title: "Code #28 Name", type: string, multiple: false, required: false
            input name: "user29", title: "Code #29 Name", type: string, multiple: false, required: false
            input name: "user30", title: "Code #30 Name", type: string, multiple: false, required: false 
        }
        state.userNames = "[ ${user1}, ${user2}, ${user3}, ${user4}, ${user5}, ${user6}, ${user7}, ${user8}, ${user9}, ${user10},  ${user11}, ${user12}, ${user13}, ${user14}, ${user15}, ${user16}, ${user17}, ${user18}, ${user19}, ${user20},  ${user21}, ${user22}, ${user23}, ${user24}, ${user25}, ${user26}, ${user27}, ${user28}, ${user29}, ${user30} ]"
    } 
}

Since Settings is already an Array why not just do a for loop to create the input values?

ex.

section("1-20") { for(int i = 0; i < 20; i++) { input name: "user$i", title: "Code #$i Name", type: string, multiple: false, required: false }

Then just access the settings properties where settings contains user* and loop through those.

`settings.each
}

That will work, I guess, but it still creates 30 individual variables. I’m trying to get to:

"Door opened by ${userNames[data.usedCode]}"

While I can figure how to use your method to accomplish this, since the IDE doesn’t scroll long pages when you look at the details on a SmartApp, I really am trying to avoid having 30 individual variables.

Is there no way to read these directly into an array?

pseudo code, but essentially its:

`
def usercodes = settings.findAll { it.name.contains(“user”) }
def userName = usercodes.findAll { it.name = $codeentered }

log.debug “Door opened by $userName[0].value”
`

There are a few examples of exactly how to do this in the devicetype examples in the IDE.

This breaks the sim, but would like to continue to explore a way to ask the user for a variable number of multiple entries (either text or number). ‘multiple:true’ seems to not offer this with these data types.

1 Like

How far did you get on this? :slight_smile: I’d like to do something similar and let users add stuff dynamically… :slight_smile: