diff --git a/README.md b/README.md index f6f4270..825bd8e 100644 --- a/README.md +++ b/README.md @@ -45,32 +45,23 @@ To control the enclosure temperature or get temperature triggered events, you ne #### DHT11, DHT22 and AM2302 sensors -Wire the sensor following the wiring diagram on the pictures on thingiverse, you can use any GPIO pin. +Wire the sensor following the wiring diagram on the pictures on thingiverse; you can use any GPIO pin. For DHT11 and DHT22 sensors, don't forget to connect a 4.7K - 10K resistor from the data pin to VCC. Also, be aware that DHT sensors some times can not work reliably on linux, this is a limitation of reading DHT sensors from Linux--there's no guarantee the program will be given enough priority and time by the Linux kernel to reliably read the sensor. Another common issue is the power supply. you need a constant and good 3.3V, sometimes a underpowered raspberry pi will not have a solid 3.3V power supply, so you could try powering the sensor with 5V and using a level shifter on the read pin. -You need to install Adafruit library to use the temperature sensor on raspberry pi. +You need to install the Adafruit library to use the temperature sensor on Raspberry Pi. Recent versions of this plugin have moved to supporting the CircuitPython-based library on Python3 installed below. Open a raspberry pi terminal and type: ``` -cd ~ -git clone https://github.com/adafruit/Adafruit_Python_DHT.git -cd Adafruit_Python_DHT +pip3 install adafruit-circuitpython-dht sudo apt-get update -sudo apt-get install build-essential python-dev python-openssl -sudo python setup.py install +sudo apt-get install libgpiod2 -y ``` -Note: All libraries need to be installed on raspberry pi system python not octoprint virtual environment. +This will install all requirements of the library. -You can test the library by using: - -``` -cd examples -sudo ./AdafruitDHT.py 2302 4 -``` -Note that the first argument is the temperature sensor (11, 22, or 2302), and the second argument is the GPIO that the sensor was connected. +You can test the library by using the sample code from https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/python-setup. #### DS18B20 sensor diff --git a/octoprint_enclosure/BME280.py b/octoprint_enclosure/BME280.py index fa5f7c0..c5c93dc 100644 --- a/octoprint_enclosure/BME280.py +++ b/octoprint_enclosure/BME280.py @@ -1,151 +1,25 @@ -import smbus import sys -import time -from ctypes import c_short -from ctypes import c_byte -from ctypes import c_ubyte +import smbus2 +import bme280 if len(sys.argv) == 2: - DEVICE = int(sys.argv[1],16) + DEVICE = int(sys.argv[1], 16) else: print('-1 | -1') sys.exit(1) -bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1 - # Rev 1 Pi uses bus 0 - -def getShort(data, index): - # return two bytes from data as a signed 16-bit value - return c_short((data[index+1] << 8) + data[index]).value - -def getUShort(data, index): - # return two bytes from data as an unsigned 16-bit value - return (data[index+1] << 8) + data[index] - -def getChar(data,index): - # return one byte from data as a signed char - result = data[index] - if result > 127: - result -= 256 - return result - -def getUChar(data,index): - # return one byte from data as an unsigned char - result = data[index] & 0xFF - return result - -def readBME280ID(addr=DEVICE): - # Chip ID Register Address - REG_ID = 0xD0 - (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) - return (chip_id, chip_version) - -def readBME280All(addr=DEVICE): - # Register Addresses - REG_DATA = 0xF7 - REG_CONTROL = 0xF4 - REG_CONFIG = 0xF5 - - REG_CONTROL_HUM = 0xF2 - REG_HUM_MSB = 0xFD - REG_HUM_LSB = 0xFE - - # Oversample setting - page 27 - OVERSAMPLE_TEMP = 2 - OVERSAMPLE_PRES = 2 - MODE = 1 - - # Oversample setting for humidity register - page 26 - OVERSAMPLE_HUM = 2 - bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM) - - control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE - bus.write_byte_data(addr, REG_CONTROL, control) - - # Read blocks of calibration data from EEPROM - # See Page 22 data sheet - cal1 = bus.read_i2c_block_data(addr, 0x88, 24) - cal2 = bus.read_i2c_block_data(addr, 0xA1, 1) - cal3 = bus.read_i2c_block_data(addr, 0xE1, 7) - - # Convert byte data to word values - dig_T1 = getUShort(cal1, 0) - dig_T2 = getShort(cal1, 2) - dig_T3 = getShort(cal1, 4) - - dig_P1 = getUShort(cal1, 6) - dig_P2 = getShort(cal1, 8) - dig_P3 = getShort(cal1, 10) - dig_P4 = getShort(cal1, 12) - dig_P5 = getShort(cal1, 14) - dig_P6 = getShort(cal1, 16) - dig_P7 = getShort(cal1, 18) - dig_P8 = getShort(cal1, 20) - dig_P9 = getShort(cal1, 22) - - dig_H1 = getUChar(cal2, 0) - dig_H2 = getShort(cal3, 0) - dig_H3 = getUChar(cal3, 2) - - dig_H4 = getChar(cal3, 3) - dig_H4 = (dig_H4 << 24) >> 20 - dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F) - - dig_H5 = getChar(cal3, 5) - dig_H5 = (dig_H5 << 24) >> 20 - dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F) - - dig_H6 = getChar(cal3, 6) - - # Wait in ms (Datasheet Appendix B: Measurement time and current calculation) - wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575) - time.sleep(wait_time/1000) # Wait the required time - - # Read temperature/pressure/humidity - data = bus.read_i2c_block_data(addr, REG_DATA, 8) - pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) - temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) - hum_raw = (data[6] << 8) | data[7] - - #Refine temperature - var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11 - var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14 - t_fine = var1+var2 - temperature = float(((t_fine * 5) + 128) >> 8); - - # Refine pressure and adjust for temperature - var1 = t_fine / 2.0 - 64000.0 - var2 = var1 * var1 * dig_P6 / 32768.0 - var2 = var2 + var1 * dig_P5 * 2.0 - var2 = var2 / 4.0 + dig_P4 * 65536.0 - var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0 - var1 = (1.0 + var1 / 32768.0) * dig_P1 - if var1 == 0: - pressure=0 - else: - pressure = 1048576.0 - pres_raw - pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1 - var1 = dig_P9 * pressure * pressure / 2147483648.0 - var2 = pressure * dig_P8 / 32768.0 - pressure = pressure + (var1 + var2 + dig_P7) / 16.0 - - # Refine humidity - humidity = t_fine - 76800.0 - humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity))) - humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0) - if humidity > 100: - humidity = 100 - elif humidity < 0: - humidity = 0 - - return temperature/100.0,pressure/100.0,humidity +# Rev 2 Pi, Pi 2 & Pi 3 & Pi 4 use bus 1 +# Rev 1 Pi uses bus 0 +bus = smbus2.SMBus(1) def main(): try: - temperature,pressure,humidity = readBME280All() - print('{0:0.1f} | {1:0.1f}'.format(temperature, humidity)) + calibration_params = bme280.load_calibration_params(bus, DEVICE) + data = bme280.sample(bus, DEVICE, calibration_params) + + print('{0:0.1f} | {1:0.1f}'.format(data.temperature, data.humidity)) except: print('-1 | -1') -if __name__=="__main__": +if __name__== "__main__": main() diff --git a/octoprint_enclosure/__init__.py b/octoprint_enclosure/__init__.py index 2e1cb32..42ed6a4 100644 --- a/octoprint_enclosure/__init__.py +++ b/octoprint_enclosure/__init__.py @@ -1133,20 +1133,23 @@ class EnclosurePlugin(octoprint.plugin.StartupPlugin, octoprint.plugin.TemplateP def read_bme280_temp(self, address): try: - script = os.path.dirname(os.path.realpath(__file__)) + "/BME280.py " + script = os.path.dirname(os.path.realpath(__file__)) + "/BME280.py" + cmd = [sys.executable, script, str(address)] if self._settings.get(["use_sudo"]): - sudo_str = "sudo " - else: - sudo_str = "" - cmd = sudo_str + "python " + script + str(address) + cmd.insert(0, "sudo") if self._settings.get(["debug_temperature_log"]) is True: self._logger.debug("Temperature BME280 cmd: %s", cmd) - stdout = (Popen(cmd, shell=True, stdout=PIPE).stdout).read() - if self._settings.get(["debug_temperature_log"]) is True: - self._logger.debug("BME280 result: %s", stdout) - temp, hum = stdout.decode("utf-8").split("|") - + stdout = Popen(cmd, stdout=PIPE, stderr=PIPE, universal_newlines=True) + output, errors = stdout.communicate() + + if self._settings.get(["debug_temperature_log"]) is True: + if len(errors) > 0: + self._logger.error("BME280 error: %s", errors) + else: + self._logger.debug("BME280 result: %s", output) + + temp, hum = output.split("|") return (self.to_float(temp.strip()), self.to_float(hum.strip())) except Exception as ex: self._logger.info( diff --git a/setup.py b/setup.py index e09b7ff..61d2cc5 100644 --- a/setup.py +++ b/setup.py @@ -33,7 +33,7 @@ plugin_url = "https://github.com/vitormhenrique/OctoPrint-Enclosure" plugin_license = "AGPLv3" # Any additional requirements besides OctoPrint should be listed here -plugin_requires = ["RPi.GPIO>=0.6.5","requests>=2.7","smbus2>=0.3.0","gpiozero==1.6.2","bme680>=1.1.0"] +plugin_requires = ["RPi.GPIO>=0.6.5", "requests>=2.7", "smbus2>=0.3.0", "gpiozero==1.6.2", "RPi.bme280", "bme680"] additional_setup_parameters = {}