Sensors - aaronwmorris/indi-allsky GitHub Wiki

Overview

indi-allsky supports reading external sensors (eg temperature) with SBCs like Raspberry Pi.

Unsupported Hardware

If you have an unsupported sensor, please open an Enhancement Issue and I will investigate adding support. It may take a week or two if I have to order the part.

GPIO Permissions

If you receive a PermissionDenied exception when accessing GPIO pins

https://github.com/aaronwmorris/indi-allsky/wiki/GPIO-Permissions

Raspberry Pi 5 - RuntimeError: Cannot determine SOC peripheral base address

source virtualenv/indi-allsky/bin/activate

pip uninstall RPi.GPIO rpi.lgpio

pip install --upgrade rpi.lgpio

Sensor Units

Sensor values may be reported in either Celcius or Fahrenheit depending on the setting for Temperature Display on the Camera tab under configuration.

Slots

Data is shared between the indi-allsky processes using a multiprocessing Array. Each sensor module supports a different number of sensors. Some sensors only support a single type, others support multiple eg temperature, humidity, pressure, etc. The code will populate multiple slots of data based on the sensor type.

All slots are floating point values.

System Temperature Slots

There are 30 (0-29) slots for system temperatures.

  • 0 is the camera temperature
  • 1-9 are reserved for future use
  • Slots 10-29 are for all sensor values returned by psutil.sensors_temperatures(). Raspberry Pi 1-4 will have a single sensor value (CPU temp), Pi5 has 2 temperatures (CPU Temp, GPU Temp). Generic PCs can have many temperatures returned. The order of the temperature values is not controllable, the first is NOT always the CPU temperature. The order and label for the temperatures can be seen on the System page.

User Slots

There are 30 (0-29) sensor slots for user data.

  • 0 is the camera temperature
  • 1 is the dew heater state (duty cycle)
  • 2 is the dew point temperature
  • 3 is the frost point temperature
  • 4 is the fan state (duty cycle)
  • 5 is the heat index
  • 6 is the wind direction in degrees
  • 7 is sqm
  • 8-9 are reserved for future use
  • Slots 10-29 are available to be assigned for sensors.

Testing sensors

There is a test script will will execute the same code that indi-allsky utilizes so you do not have to start the program to validate their behavior.

source virtualenv/indi-allsky/bin/activate

./misc/sensor_test.py

Interfaces

I2C

The I2C interface needs to be activated on your SBC. This can be done with sudo raspi-config on Raspberry Pi systems. sudo armbian-config on Armbian.

Use i2cdetect -y 1 to inspect the I2C bus to find the correct address for your device.

sudo apt-get install i2c-tools

SPI

The SPI interface needs to be activated on your SBC. This can be done with sudo raspi-config on Raspberry Pi systems.

1-Wire

The 1-Wire interface needs to be activated on your SBC. This can be done with sudo raspi-config on Raspberry Pi systems.

The default 1-Wire pin on Raspberry Pi devices is GPIO4 (pin 7). This can be overridden in /boot/firmware/config.txt

dtoverlay=w1-gpio,gpiopin=5

Sensors

Sensor Type Status
OpenWeather Map API Temp Working
Weather Underground API Temp Working
MQTT Broker Working
DS18x20 Temp Working
DHT11 Temp Working
DHT21 Temp My sample did not work
DHT22 Temp Working
SHT3x Temp Working
SHT4x Temp Working
AHT10/20 Temp Working
BMP180 Temp Working
BMP/BME280 Temp Working - BMP modules do not report humidity
BME680 Temp Working
Si7021 Temp Working
TMP36 via ADS1015 Temp Working
TMP36 via ADS1115 Temp Untested
LM35 via ADS1015 Temp Untested
LM35 via ADS1115 Temp Untested
MLX90614 Sky Temp Working
MLX90640 Thermal Camera Working
TSL2561 Light Working
TSL2591 Light Working
VEML7700 Light Working
BH1750 Light Working
SI1145 Light Working
LTR390 Light Working

OpenWeather Map

The OpenWeather Map API may be used to query local weather conditions for your location. This is not a physical sensor, but data is returned for your local weather conditions based on longitude and latitude.

The API is queried every 5 minutes, therefore there should be no more than 288 (automated) queries per day.

Returns 9 values:

  • temperature
  • "Feels Like" temperature
  • humidity
  • pressure
  • clouds percent
  • wind speed
  • wind gusts
  • 1h rain
  • 1h snow

Weather Underground

The Weather Underground API may be used to query weather conditions. This is not a physical sensor, but data is returned for your local weather conditions based on a given Station ID.

The API is queried every 5 minutes, therefore there should be no more than 288 (automated) queries per day.

Note: The Pin/Port field is used for the Station ID

Returns 8 values:

  • temperature
  • humidity
  • pressure
  • wind speed
  • wind gusts
  • total rain
  • solar radiation
  • uv

MQTT Broker Sensor

A sensor value from an MQTT Broker may be queried. The Pin field is used for the topic subscription. Up to 5 topics may be subscribed by providing a comma separated list. eg topic1,base/topic2

The payload for the topics must be a value that can be converted to a float.

Returns 5 float values

DS18x20 Dallas Temperature Sensor

This sensor is a 1-Wire interface type device. On Raspberry Pi, the default 1-Wire pin is GPIO4 (pin 7). The Pin in the indi-allsky config is not used.

Returns 1 value:

  • temperature

DHT11/21/22 Temperature Sensor

This sensor only requires a single pin and in some cases a pull up resistor.

Returns 2 values:

  • temperature
  • humidity

BMP180 Temperature Sensor

The BMP180 has an i2c interface. Common I2C addresses are 0x77 and 0x76.

Returns 2 values: temperature and pressure (hPa)

Pin I2C Note
VCC 5v on 5 pin sensors, 3.3v on 4 pin modules
GND
SLC SLC Raspi pin 2
SDA SDA Raspi pin 3
3.3 Not available on 4 pin modules

BMP/BME280 Temperature Sensor

The BME280 can be used in either i2c or SPI modes. Common I2C addresses are 0x77 and 0x76.

Returns 3 values:

  • temperature
  • humidity
  • pressure
Pin I2C SPI Note
VCC Usually 3.3v
GND
SLC SLC SCLK I2C - Raspi pin 2SPI - Raspi pin 23 (SCLK)
SDA SDA MISO I2C - Raspi pin 3SPI - Raspi pin 19 (MOSI)
CSB CS SPI - Any GPIO pin
SDO MOSI SPI - Raspi pin 21 (MISO)

BMP280

BMP280 does not support humidity measurements. Chip ID 0x58. Without the humidity measurement, dew point calculations will not be available.

RuntimeError: Failed to find BME280! Chip ID 0x58

If you receive this Exception, you need to edit virtualenv/indi-allsky/lib/python3.##/site-packages/adafruit_bme280/basic.py and set _BME280_CHIPID to 0x58

BME680 Temperature Sensor

The BME680 can be used in either i2c or SPI modes. Common I2C addresses are 0x77 and 0x76.

Returns 4 values:

  • temperature
  • humidity
  • pressure
  • gas (ohm)
Pin I2C SPI Note
VCC Usually 3.3v
GND
SLC SLC SCLK I2C - Raspi pin 2SPI - Raspi pin 23 (SCLK)
SDA SDA MISO I2C - Raspi pin 3SPI - Raspi pin 19 (MOSI)
SDO MOSI SPI - Raspi pin 21 (MISO)
CSB CS SPI - Any GPIO pin

BME680 notes

  • The initial humidity measurement may always be 100%. Subsequent measurements should be correct.

Si7021 Temperature Sensor

The Si7021 has an i2c interface. Default I2C address is 0x40.

Returns 2 values

  • temperature
  • humidity

SHT3x Temperature Sensor

The SHT3x has an i2c interface. Common I2C addresses are 0x44 and 0x45.

Returns 2 values

  • temperature
  • humidity

SHT40/41/45 Temperature Sensor

The SHT4x has an i2c interface. Common I2C addresses are 0x44 and 0x45.

Returns 2 values

  • temperature
  • humidity

AHT10/20 Temperature Sensor

The AHTx0 has an i2c interface. Default I2C address is 0x38.

Returns 2 values

  • temperature
  • humidity

TMP36 Temperature Sensor via ADS1x15 ADC

The ADS1x15 ADC has an i2c interface. Common I2C addresses are 0x48, 0x49, 0x4a, and 0x4b

The ADC reads the analog voltage from the TMP36 sensor which is converted to the temperature value.

Returns 1 value

  • temperature

LM35 Temperature Sensor via ADS1x15 ADC

The ADS1x15 ADC has an i2c interface. Common I2C addresses are 0x48, 0x49, 0x4a, and 0x4b

The ADC reads the analog voltage from the LM35 sensor which is converted to the temperature value.

Returns 1 value

  • temperature

MLX90614 Sky Temperature

This MLX90614 has an i2c interface. Default i2c address is 0x5a

Note: My module was not detected with i2cdetect, but it still worked.

Returns 2 values:

  • temperature
  • sky_temperature

MLX90640 Thermal Camera

This MLX90640 has an i2c interface. Default i2c address is 0x33

Thermal image is TBD.

Returns 1 value:

  • avg_temperature

TSL2561 Light Sensor

The TSL2561 has an i2c interface. Default i2c address is 0x39

Returns 3 values:

  • lux
  • broadband
  • infrared

TSL2591 Light Sensor

The TSL2561 has an i2c interface. Default i2c address is 0x29

Returns 4 values:

  • lux
  • visible
  • infrared
  • full_spectrum

VEML7700 Light Sensor

The VEML7700 has an i2c interface. Default i2c address is 0x10

Returns 4 values:

  • lux
  • light
  • white light

BH1750 Light Sensor

The BH1750 has an i2c interface. Default i2c address is 0x23

Returns 1 value:

  • lux

SI1145 UV Light Sensor

The SI1145 has an i2c interface. Default i2c address is 0x60

Returns 3 values:

  • visible
  • ir
  • uv index

LTR390 UV Light Sensor

The LTR390 has an i2c interface. Default i2c address is 0x53

Returns 4 values:

  • uv
  • light
  • uv index
  • lux

Test Data Generator

This simulates a sensor with 4 data points. For development systems.

Returns 4 values