Seeed-Studio / grove.py

Python library for Seeedstudio Grove devices
MIT License
147 stars 97 forks source link

Problem in i2c.py opening multiple i2c busses #56

Open maubuz opened 2 years ago

maubuz commented 2 years ago

This issue was reported by @nikolozka in Issue #12.

The issue is still in the code and I would like to submit a PR for it, however, I'm trying to understand the reasoning behind this.

class Bus:
    instance = None
    MRAA_I2C = 0

    def __init__(self, bus=None):
       ... skipping code ...

       if not Bus.instance:
            Bus.instance = smbus.SMBus(bus)

      ... rest of code ...

Why is instance being used as a class attribute? It effectively makes the Bus class a singleton class. Are there any advantages to doing this that I'm missing?

To reproduce this problem:

File "/usr/local/lib/python3.7/dist-packages/grove/grove_temperature_humidity_aht20.py", line 44, in read
    self.bus.write_i2c_block_data(self.address, 0x00, [0xac, 0x33, 0x00])
File "/usr/local/lib/python3.7/dist-packages/smbus2/smbus2.py", line 643, in write_i2c_block_data
    ioctl(self.fd, I2C_SMBUS, msg)
OSError: [Errno 6] No such device or address
lakshanthad commented 2 years ago

Hello,

Could you please refer to the code here in "beta" branch for i2c.py and try again? https://github.com/Seeed-Studio/grove.py/commit/994c0467fe1e40b94e597536ab7760381b51cf2c#diff-52f36dd5ac4814c063e9adea411aa5764d3c963850457d2a022155f7172ada9c

Also test with this code in "beta" branch: https://github.com/Seeed-Studio/grove.py/blob/beta/grove/i2c.py

Thank you

maubuz commented 1 year ago

I know it's been a long time but thanks for the suggestions. I tested the two suggestions and they both work in my case. Any ideas of when that code would be merged with master?

For those interested in getting this package working with multiple i2c buses immediately, as proposed by @nikolozka in #12 , I suggest the following changes in grove/i2c.py:

Modify lines 50 and 51:

if not Bus.instance:
    Bus.instance = smbus.SMBus(bus)

To:

if not self.instance:
    self.instance = smbus.SMBus(bus)

To find where grove/i2c.py is installed, try pip show grove.py.

maubuz commented 1 year ago

PR #66 created. Feel free to reject if upcoming changes make this obsolete.