The I2c example here does not work for me.
local word = i2c.read(i2c_addr, TSL2561_REGISTER_ADC0_LSB, 2);
local lumo = (word << 8) + word;
when I try to run this I get this in the log.
“the index ‘1’ does not exist”
Then (more confusing) when I look at this example
It shows this:
local hi = _i2c.read(_addr, REG_LTHB, 1);
local lo = _i2c.read(_addr, REG_LTLB, 1);
local temp = (hi << 3) | (lo >> 5);
Now, what is the  at the end all about ?
Likely, the read is failing and returning an error code (vs a 2 byte string, which is what you’d expect).
Try adding this code:
local word = i2c.read(i2c_addr, TSL2561_REGISTER_ADC0_LSB, 2); if (word == null) server.log("i2c error "+i2c.readerror());
…which will tell you what went wrong.
The  at the end of i2c_read is just retrieving the first byte from the string object returned by i2c.read(). Really, this is an example that needs updating because it doesn’t deal with error cases where null is returned as the read failed.
@hugo, after I posted this, I then tried just that. It was as you said returning an error code. Got it working now. thanks