Regarding
["String", "Number"]
versus
["command", "deviceID"]
I believe that it is not a data type, unless you have documentation showing otherwise, but what it shows to the user on the device page so there is some kind of indication of what to put in the box, and therefore when inputting data, you can see easily without going into the driver code (as an end user) that one wants the deviceID and the other the command. If you don't label as such, say if you have 'string' and then another 'string' the end user wouldn't know which data to put in which.
Regarding the duplicate of the customCommand - that uses the command that does a press&release versus the deviceCommand does just a push (and effectively holds). Maybe we could just link to the press and release command, as I'm not sure when you would need just press.
do you want to test the following, to see if everything still works, else I'd suggest having separate press and pressrelease commands
def deviceCommand(command, deviceID) {
sendMsg('{"hubId":"' + state.remoteId + '","timeout":30,"hbus":{"cmd":"vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction","id": "0", "params":{"status": "press","timestamp": "0","verb": "render", "action": "{\\"command\\": \\"' + command + '\\", \\"type\\":\\"IRCommand\\", \\"deviceId\\": \\"' + deviceID + '\\"}"}}}')
}
as
def deviceCommand(command, deviceID) {
sendMsg('{"hubId":"' + state.remoteId + '","timeout":30,"hbus":{"cmd":"vnd.logitech.harmony/vnd.logitech.harmony.engine?holdAction","id": "0", "params":{"status": "pressrelease","timestamp": "0","verb": "render", "action": "{\\"command\\": \\"' + command + '\\", \\"type\\":\\"IRCommand\\", \\"deviceId\\": \\"' + deviceID + '\\"}"}}}')
}
other option would be to add in another variable into deviceCommand to allow selecting press or pressrelease
Do you follow?