From 62524808fc9429799be4cced89aa7df5ad7604ec Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 13 Feb 2022 16:21:22 -0500 Subject: [PATCH 1/4] Add type annotations for basic.py --- adafruit_bme280/basic.py | 61 ++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/adafruit_bme280/basic.py b/adafruit_bme280/basic.py index 67d2eb4..fffab39 100644 --- a/adafruit_bme280/basic.py +++ b/adafruit_bme280/basic.py @@ -35,6 +35,13 @@ from micropython import const +try: + from typing import Optional + from busio import I2C, SPI + from digitalio import DigitalInOut +except ImportError: + pass + __version__ = "2.6.4" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME280.git" @@ -81,7 +88,7 @@ class Adafruit_BME280: """ # pylint: disable=too-many-instance-attributes - def __init__(self): + def __init__(self) -> None: """Check the BME280 was found, read the coefficients and enable the sensor""" # Check device ID. chip_id = self._read_byte(_BME280_REGISTER_CHIPID) @@ -102,7 +109,7 @@ def __init__(self): """Pressure in hectoPascals at sea level. Used to calibrate `altitude`.""" self._t_fine = None - def _read_temperature(self): + def _read_temperature(self) -> None: # perform one measurement if self.mode != MODE_NORMAL: self.mode = MODE_FORCE @@ -124,12 +131,12 @@ def _read_temperature(self): self._t_fine = int(var1 + var2) - def _reset(self): + def _reset(self) -> None: """Soft reset the sensor""" self._write_register_byte(_BME280_REGISTER_SOFTRESET, 0xB6) sleep(0.004) # Datasheet says 2ms. Using 4ms just to be safe - def _write_ctrl_meas(self): + def _write_ctrl_meas(self) -> None: """ Write the values to the ctrl_meas and ctrl_hum registers in the device ctrl_meas sets the pressure and temperature data acquisition options @@ -138,15 +145,15 @@ def _write_ctrl_meas(self): self._write_register_byte(_BME280_REGISTER_CTRL_HUM, self.overscan_humidity) self._write_register_byte(_BME280_REGISTER_CTRL_MEAS, self._ctrl_meas) - def _get_status(self): + def _get_status(self) -> int: """Get the value from the status register in the device """ return self._read_byte(_BME280_REGISTER_STATUS) - def _read_config(self): + def _read_config(self) -> int: """Read the value from the config register in the device """ return self._read_byte(_BME280_REGISTER_CONFIG) - def _write_config(self): + def _write_config(self) -> None: """Write the value to the config register in the device """ normal_flag = False if self._mode == MODE_NORMAL: @@ -158,7 +165,7 @@ def _write_config(self): self.mode = MODE_NORMAL @property - def mode(self): + def mode(self) -> int: """ Operation mode Allowed values are the constants MODE_* @@ -166,14 +173,14 @@ def mode(self): return self._mode @mode.setter - def mode(self, value): + def mode(self, value: int) -> None: if not value in _BME280_MODES: raise ValueError("Mode '%s' not supported" % (value)) self._mode = value self._write_ctrl_meas() @property - def _config(self): + def _config(self) -> int: """Value to be written to the device's config register """ config = 0 if self.mode == 0x03: # MODE_NORMAL @@ -183,7 +190,7 @@ def _config(self): return config @property - def _ctrl_meas(self): + def _ctrl_meas(self) -> int: """Value to be written to the device's ctrl_meas register """ ctrl_meas = self.overscan_temperature << 5 ctrl_meas += self.overscan_pressure << 2 @@ -191,13 +198,13 @@ def _ctrl_meas(self): return ctrl_meas @property - def temperature(self): + def temperature(self) -> float: """The compensated temperature in degrees Celsius.""" self._read_temperature() return self._t_fine / 5120.0 @property - def pressure(self): + def pressure(self) -> Optional[float]: """ The compensated pressure in hectoPascals. returns None if pressure measurement is disabled @@ -230,7 +237,7 @@ def pressure(self): return pressure @property - def relative_humidity(self): + def relative_humidity(self) -> Optional[float]: """ The relative humidity in RH % returns None if humidity measurement is disabled @@ -238,7 +245,7 @@ def relative_humidity(self): return self.humidity @property - def humidity(self): + def humidity(self) -> Optional[float]: """ The relative humidity in RH % returns None if humidity measurement is disabled @@ -268,13 +275,13 @@ def humidity(self): return humidity @property - def altitude(self): + def altitude(self) -> float: """The altitude based on current :attr:`pressure` versus the sea level pressure (``sea_level_pressure``) - which you must enter ahead of time)""" pressure = self.pressure # in Si units for hPascal return 44330 * (1.0 - math.pow(pressure / self.sea_level_pressure, 0.1903)) - def _read_coefficients(self): + def _read_coefficients(self) -> None: """Read & save the calibration coefficients""" coeff = self._read_register(0x88, 24) # BME280_REGISTER_DIG_T1 coeff = list(struct.unpack("> 4)) self._humidity_calib[5] = float(coeff[5]) - def _read_byte(self, register): + def _read_byte(self, register: int) -> int: """Read a byte register value and return it""" return self._read_register(register, 1)[0] - def _read24(self, register): + def _read24(self, register: int) -> float: """Read an unsigned 24-bit value as a floating point and return it.""" ret = 0.0 for b in self._read_register(register, 3): @@ -304,10 +311,10 @@ def _read24(self, register): ret += float(b & 0xFF) return ret - def _read_register(self, register, length): + def _read_register(self, register: int, length: int) -> bytearray: raise NotImplementedError() - def _write_register_byte(self, register, value): + def _write_register_byte(self, register: int, value: int) -> None: raise NotImplementedError() @@ -358,7 +365,7 @@ class Adafruit_BME280_I2C(Adafruit_BME280): """ - def __init__(self, i2c, address=0x77): # BME280_ADDRESS + def __init__(self, i2c: I2C, address: int = 0x77) -> None: # BME280_ADDRESS from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel i2c_device, ) @@ -366,14 +373,14 @@ def __init__(self, i2c, address=0x77): # BME280_ADDRESS self._i2c = i2c_device.I2CDevice(i2c, address) super().__init__() - def _read_register(self, register, length): + def _read_register(self, register: int, length: int) -> bytearray: with self._i2c as i2c: i2c.write(bytes([register & 0xFF])) result = bytearray(length) i2c.readinto(result) return result - def _write_register_byte(self, register, value): + def _write_register_byte(self, register: int, value: int) -> None: with self._i2c as i2c: i2c.write(bytes([register & 0xFF, value & 0xFF])) # print("$%02X <= 0x%02X" % (register, value)) @@ -428,7 +435,7 @@ class Adafruit_BME280_SPI(Adafruit_BME280): """ - def __init__(self, spi, cs, baudrate=100000): + def __init__(self, spi: SPI, cs: DigitalInOut, baudrate: int = 100000) -> None: from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel spi_device, ) @@ -436,7 +443,7 @@ def __init__(self, spi, cs, baudrate=100000): self._spi = spi_device.SPIDevice(spi, cs, baudrate=baudrate) super().__init__() - def _read_register(self, register, length): + def _read_register(self, register: int, length: int) -> bytearray: register = (register | 0x80) & 0xFF # Read single, bit 7 high. with self._spi as spi: spi.write(bytearray([register])) # pylint: disable=no-member @@ -444,7 +451,7 @@ def _read_register(self, register, length): spi.readinto(result) # pylint: disable=no-member return result - def _write_register_byte(self, register, value): + def _write_register_byte(self, register: int, value: int) -> None: register &= 0x7F # Write, bit 7 low. with self._spi as spi: spi.write(bytes([register, value & 0xFF])) # pylint: disable=no-member From a824e4978a676c7caec9579944eb0aa252667313 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 13 Feb 2022 16:28:23 -0500 Subject: [PATCH 2/4] Add type annotations for advanced.py --- adafruit_bme280/advanced.py | 49 +++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/adafruit_bme280/advanced.py b/adafruit_bme280/advanced.py index ef1175a..6d39615 100644 --- a/adafruit_bme280/advanced.py +++ b/adafruit_bme280/advanced.py @@ -32,6 +32,13 @@ from micropython import const from adafruit_bme280.basic import Adafruit_BME280 +try: + import typing # pylint: disable=unused-import + from busio import I2C, SPI + from digitalio import DigitalInOut +except ImportError: + pass + __version__ = "0.0.0-auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME280.git" @@ -134,7 +141,7 @@ class Adafruit_BME280_Advanced(Adafruit_BME280): """ # pylint: disable=too-many-instance-attributes - def __init__(self): + def __init__(self) -> None: """Check the BME280 was found, read the coefficients and enable the sensor""" self._overscan_humidity = OVERSCAN_X1 self._overscan_temperature = OVERSCAN_X1 @@ -144,7 +151,7 @@ def __init__(self): super().__init__() @property - def standby_period(self): + def standby_period(self) -> int: """ Control the inactive period when in Normal mode Allowed standby periods are the constants STANDBY_TC_* @@ -152,7 +159,7 @@ def standby_period(self): return self._t_standby @standby_period.setter - def standby_period(self, value): + def standby_period(self, value: int) -> None: if not value in _BME280_STANDBY_TCS: raise ValueError("Standby Period '%s' not supported" % (value)) if self._t_standby == value: @@ -161,7 +168,7 @@ def standby_period(self, value): self._write_config() @property - def overscan_humidity(self): + def overscan_humidity(self) -> int: """ Humidity Oversampling Allowed values are the constants OVERSCAN_* @@ -169,14 +176,14 @@ def overscan_humidity(self): return self._overscan_humidity @overscan_humidity.setter - def overscan_humidity(self, value): + def overscan_humidity(self, value: int) -> None: if not value in _BME280_OVERSCANS: raise ValueError("Overscan value '%s' not supported" % (value)) self._overscan_humidity = value self._write_ctrl_meas() @property - def overscan_temperature(self): + def overscan_temperature(self) -> int: """ Temperature Oversampling Allowed values are the constants OVERSCAN_* @@ -184,14 +191,14 @@ def overscan_temperature(self): return self._overscan_temperature @overscan_temperature.setter - def overscan_temperature(self, value): + def overscan_temperature(self, value: int) -> None: if not value in _BME280_OVERSCANS: raise ValueError("Overscan value '%s' not supported" % (value)) self._overscan_temperature = value self._write_ctrl_meas() @property - def overscan_pressure(self): + def overscan_pressure(self) -> int: """ Pressure Oversampling Allowed values are the constants OVERSCAN_* @@ -199,14 +206,14 @@ def overscan_pressure(self): return self._overscan_pressure @overscan_pressure.setter - def overscan_pressure(self, value): + def overscan_pressure(self, value: int) -> None: if not value in _BME280_OVERSCANS: raise ValueError("Overscan value '%s' not supported" % (value)) self._overscan_pressure = value self._write_ctrl_meas() @property - def iir_filter(self): + def iir_filter(self) -> int: """ Controls the time constant of the IIR filter Allowed values are the constants IIR_FILTER_* @@ -214,14 +221,14 @@ def iir_filter(self): return self._iir_filter @iir_filter.setter - def iir_filter(self, value): + def iir_filter(self, value: int) -> None: if not value in _BME280_IIR_FILTERS: raise ValueError("IIR Filter '%s' not supported" % (value)) self._iir_filter = value self._write_config() @property - def _config(self): + def _config(self) -> int: """Value to be written to the device's config register """ config = 0 if self.mode == MODE_NORMAL: @@ -231,7 +238,7 @@ def _config(self): return config @property - def _ctrl_meas(self): + def _ctrl_meas(self) -> int: """Value to be written to the device's ctrl_meas register """ ctrl_meas = self.overscan_temperature << 5 ctrl_meas += self.overscan_pressure << 2 @@ -239,7 +246,7 @@ def _ctrl_meas(self): return ctrl_meas @property - def measurement_time_typical(self): + def measurement_time_typical(self) -> float: """Typical time in milliseconds required to complete a measurement in normal mode""" meas_time_ms = 1.0 if self.overscan_temperature != OVERSCAN_DISABLE: @@ -251,7 +258,7 @@ def measurement_time_typical(self): return meas_time_ms @property - def measurement_time_max(self): + def measurement_time_max(self) -> float: """Maximum time in milliseconds required to complete a measurement in normal mode""" meas_time_ms = 1.25 if self.overscan_temperature != OVERSCAN_DISABLE: @@ -309,7 +316,7 @@ class Adafruit_BME280_I2C(Adafruit_BME280_Advanced): """ - def __init__(self, i2c, address=_BME280_ADDRESS): + def __init__(self, i2c: I2C, address: int = _BME280_ADDRESS) -> None: from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel i2c_device, ) @@ -317,7 +324,7 @@ def __init__(self, i2c, address=_BME280_ADDRESS): self._i2c = i2c_device.I2CDevice(i2c, address) super().__init__() - def _read_register(self, register, length): + def _read_register(self, register: int, length: int) -> bytearray: with self._i2c as i2c: i2c.write(bytes([register & 0xFF])) result = bytearray(length) @@ -325,7 +332,7 @@ def _read_register(self, register, length): # print("$%02X => %s" % (register, [hex(i) for i in result])) return result - def _write_register_byte(self, register, value): + def _write_register_byte(self, register: int, value: int) -> None: with self._i2c as i2c: i2c.write(bytes([register & 0xFF, value & 0xFF])) # print("$%02X <= 0x%02X" % (register, value)) @@ -379,7 +386,7 @@ class Adafruit_BME280_SPI(Adafruit_BME280_Advanced): """ - def __init__(self, spi, cs, baudrate=100000): + def __init__(self, spi: SPI, cs: DigitalInOut, baudrate: int = 100000) -> None: from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel spi_device, ) @@ -387,7 +394,7 @@ def __init__(self, spi, cs, baudrate=100000): self._spi = spi_device.SPIDevice(spi, cs, baudrate=baudrate) super().__init__() - def _read_register(self, register, length): + def _read_register(self, register: int, length: int) -> bytearray: register = (register | 0x80) & 0xFF # Read single, bit 7 high. with self._spi as spi: spi.write(bytearray([register])) # pylint: disable=no-member @@ -396,7 +403,7 @@ def _read_register(self, register, length): # print("$%02X => %s" % (register, [hex(i) for i in result])) return result - def _write_register_byte(self, register, value): + def _write_register_byte(self, register: int, value: int) -> None: register &= 0x7F # Write, bit 7 low. with self._spi as spi: spi.write(bytes([register, value & 0xFF])) # pylint: disable=no-member From 75fdee682e989aa4d1b254f20c5966d9f243c1cf Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 13 Feb 2022 16:39:46 -0500 Subject: [PATCH 3/4] Remove Optional typing, comments about returning None It looks to be a holdover from a previous commit that actually did have the ability to return None. --- adafruit_bme280/basic.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/adafruit_bme280/basic.py b/adafruit_bme280/basic.py index fffab39..dd54eba 100644 --- a/adafruit_bme280/basic.py +++ b/adafruit_bme280/basic.py @@ -204,10 +204,9 @@ def temperature(self) -> float: return self._t_fine / 5120.0 @property - def pressure(self) -> Optional[float]: + def pressure(self) -> float: """ The compensated pressure in hectoPascals. - returns None if pressure measurement is disabled """ self._read_temperature() @@ -237,18 +236,16 @@ def pressure(self) -> Optional[float]: return pressure @property - def relative_humidity(self) -> Optional[float]: + def relative_humidity(self) -> float: """ The relative humidity in RH % - returns None if humidity measurement is disabled """ return self.humidity @property - def humidity(self) -> Optional[float]: + def humidity(self) -> float: """ The relative humidity in RH % - returns None if humidity measurement is disabled """ self._read_temperature() hum = self._read_register(0xFD, 2) # BME280_REGISTER_HUMIDDATA From 72c2d68a9f74a48b6f9274e0e5b4067a63df7559 Mon Sep 17 00:00:00 2001 From: Alec Delaney Date: Sun, 13 Feb 2022 16:40:57 -0500 Subject: [PATCH 4/4] Remove Optional import, add pylint disable --- adafruit_bme280/basic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_bme280/basic.py b/adafruit_bme280/basic.py index dd54eba..e57cc9c 100644 --- a/adafruit_bme280/basic.py +++ b/adafruit_bme280/basic.py @@ -36,7 +36,7 @@ from micropython import const try: - from typing import Optional + import typing # pylint: disable=unused-import from busio import I2C, SPI from digitalio import DigitalInOut except ImportError: