Node-red-contrib-mcp23017chip

I've found the problem. (It has nothing to do with user/group/privileges.)

The programmer who wrote the node originally, declared a variable of an 'i2c-bus' instead of 'i2c'.
A bus can not have a "sub-bus".
This is the right way to handle it:

const i2c = global.get('i2c');
const aBus = i2c.open(11, err => {
  if (err) {
    throw err;
  }
...

Here is an example to list the possible/supported functions of an I2C bus:

[{"id":"1d042afc.dc4755","type":"function","z":"34aad6f7.b85c6a","name":"I2C Functionalities scan","func":"'use strict';\n\n// When run, this program will output the same information as the\n// command 'i2cdetect -F 1'\n//const i2c = global.require('i2c');\nconst i2c = global.get('i2c');\nconst BusNumber = 1;\nconst aBus = i2c.open(BusNumber, err => {\n  if (err) {\n    throw err;\n  }\n\n  node.debug('i2c Bus opened successful.');\n  \n  aBus.i2cFuncs((err, i2cFuncs) => {\n    const boolToYesNo = bool => bool ? 'yes' : 'no';\n\n    if (err) {\n      throw err;\n    }\n\n    console.log('Functionalities implemented by /dev/i2c-11:');\n    console.log('I2C                              ' + boolToYesNo(i2cFuncs.i2c));\n    console.log('SMBus Quick Command              ' + boolToYesNo(i2cFuncs.smbusQuick));\n    console.log('SMBus Send Byte                  ' + boolToYesNo(i2cFuncs.smbusSendByte));\n    console.log('SMBus Receive Byte               ' + boolToYesNo(i2cFuncs.smbusReceiveByte));\n    console.log('SMBus Write Byte                 ' + boolToYesNo(i2cFuncs.smbusWriteByte));\n    console.log('SMBus Read Byte                  ' + boolToYesNo(i2cFuncs.smbusReadByte));\n    console.log('SMBus Write Word                 ' + boolToYesNo(i2cFuncs.smbusWriteWord));\n    console.log('SMBus Read Word                  ' + boolToYesNo(i2cFuncs.smbusReadWord));\n    console.log('SMBus Process Call               ' + boolToYesNo(i2cFuncs.smbusProcCall));\n    console.log('SMBus Block Write                ' + boolToYesNo(i2cFuncs.smbusWriteBlock));\n    console.log('SMBus Block Read                 ' + boolToYesNo(i2cFuncs.smbusReadBlock));\n    console.log('SMBus Block Process Call         ' + boolToYesNo(i2cFuncs.smbusBlockProcCall));\n    console.log('SMBus PEC                        ' + boolToYesNo(i2cFuncs.smbusPec));\n    console.log('I2C Block Write                  ' + boolToYesNo(i2cFuncs.smbusWriteI2cBlock));\n    console.log('I2C Block Read                   ' + boolToYesNo(i2cFuncs.smbusReadI2cBlock));\n  });\n});\n\nreturn aBus;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":370,"y":600,"wires":[["6300686f.7c8ca"]]},{"id":"6300686f.7c8ca","type":"debug","z":"34aad6f7.b85c6a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":550,"y":600,"wires":[]},{"id":"351e5767.889d5","type":"inject","z":"34aad6f7.b85c6a","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":180,"y":600,"wires":[["1d042afc.dc4755"]]}]