The driver I am currently using has the code added for the Adafruit SHT31D 
humidity sensor which connects to the I2C bus at address 0x44.

I can not use the official Adafruit driver as it needs python3 to run.

The code I added for the SHT31 is from line 233 to 262 and then from line 
478 to 487.

The driver code is attached.

Thank you 

On Wednesday, 24 July 2019 15:26:37 UTC+2, gjr80 wrote:
>
> Agree it is almost certainly the driver. Can you post the driver code you 
> are using, or a link to the code, so we can have a look. As long as the 
> driver is consistently emitting loop packets WeeWX should take care of the 
> rest.
>
> Gary
>

-- 
You received this message because you are subscribed to the Google Groups 
"weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/weewx-user/5f1cd8f5-ae3c-44be-b989-65835bb9a1b1%40googlegroups.com.
#
#
# GroveWeatherPi Solar Powered Weather Station
# Version 2.3 October 3, 2016 
#
# SwitchDoc Labs
# www.switchdoc.com
#
# extended by [email protected] - no warranties.

# imports

import sys
import time
from datetime import datetime
import random 
import re
import math
import os

sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/SDL_Adafruit_ADS1x15')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/SDL_Pi_SSD1306')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/Adafruit_Python_SSD1306')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/RTC_SDL_DS3231')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/Adafruit_Python_BMP')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/Adafruit_Python_GPIO')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/SDL_Pi_WeatherRack')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/SDL_Pi_FRAM')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/RaspberryPi-AS3935/RPi_AS3935')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/SDL_Pi_INA3221')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/SDL_Pi_TCA9545')
sys.path.append('/home/pi/SDL_Pi_GroveWeatherPi/graphs')
sys.path.append('/usr/share/weewx')

import subprocess
import RPi.GPIO as GPIO

import smbus

import struct

# Check for user imports
try:
	import conflocal as config
except ImportError:
	import config

# if (config.enable_MySQL_Logging == True):
#	import MySQLdb as mdb

import weewx.drivers
DRIVER_NAME = 'GrovePi'

################
# Device Present State Variables
###############

config.TCA9545_I2CMux_Present = False
config.SunAirPlus_Present = False
config.AS3935_Present = False
config.DS3231_Present = False
config.BMP280_Present = False
config.FRAM_Present = False
config.HTU21DF_Present = False
config.AM2315_Present = False
config.ADS1015_Present = False
config.ADS1115_Present = False
config.OLED_Present = False
config.WXLink_Present = False


import SDL_Pi_INA3221
import SDL_DS3231
import Adafruit_BMP.BMP280 as BMP280
import SDL_Pi_WeatherRack as SDL_Pi_WeatherRack

import SDL_Pi_FRAM
from RPi_AS3935 import RPi_AS3935

import SDL_Pi_TCA9545

import Adafruit_SSD1306

import Scroll_SSD1306


def loader(config_dict, engine):
    return GrovePiDriver(**config_dict[DRIVER_NAME])

def returnStatusLine(device, state):

        returnString = device
        if (state == True):
                returnString = returnString + ":   \t\tPresent"
        else:
                returnString = returnString + ":   \t\tNot Present"
        return returnString

################
# TCA9545 I2C Mux 

#/*=========================================================================
#    I2C ADDRESS/BITS
#    -----------------------------------------------------------------------*/
TCA9545_ADDRESS =                         (0x73)    # 1110011 (A0+A1=VDD)
#/*=========================================================================*/

#/*=========================================================================
#    CONFIG REGISTER (R/W)
#    -----------------------------------------------------------------------*/
TCA9545_REG_CONFIG            =          (0x00)
#    /*---------------------------------------------------------------------*/

TCA9545_CONFIG_BUS0  =                (0x01)  # 1 = enable, 0 = disable 
TCA9545_CONFIG_BUS1  =                (0x02)  # 1 = enable, 0 = disable 
TCA9545_CONFIG_BUS2  =                (0x04)  # 1 = enable, 0 = disable 
TCA9545_CONFIG_BUS3  =                (0x08)  # 1 = enable, 0 = disable 

#/*=========================================================================*/

# I2C Mux TCA9545 Detection
try:
	tca9545 = SDL_Pi_TCA9545.SDL_Pi_TCA9545(addr=TCA9545_ADDRESS, bus_enable = TCA9545_CONFIG_BUS0)


	# turn I2CBus 1 on
	tca9545.write_control_register(TCA9545_CONFIG_BUS2)
	config.TCA9545_I2CMux_Present = True
except:
	print ">>>>>>>>>>>>>>>>>>><<<<<<<<<<<"
	print "TCA9545 I2C Mux Not Present" 
	print ">>>>>>>>>>>>>>>>>>><<<<<<<<<<<"
	config.TCA9545_I2CMux_Present = False


################
# turn I2CBus 0 on
if (config.TCA9545_I2CMux_Present):
	 tca9545.write_control_register(TCA9545_CONFIG_BUS0)

# HTU21DF Detection
try:
        HTU21DFOut = subprocess.check_output(["htu21dflib/htu21dflib","-l"])
        config.HTU21DF_Present = True
except:
        config.HTU21DF_Present = False


###############

#WeatherRack Weather Sensors
#
# GPIO Numbering Mode GPIO.BCM
#

anemometerPin = 26
rainPin = 21

# constants

SDL_MODE_INTERNAL_AD = 0
SDL_MODE_I2C_ADS1015 = 1    # internally, the library checks for ADS1115 or ADS1015 if found

#sample mode means return immediately.  THe wind speed is averaged at sampleTime or when you ask, whichever is longer
SDL_MODE_SAMPLE = 0
#Delay mode means to wait for sampleTime and the average after that time.
SDL_MODE_DELAY = 1

# turn I2CBus 0 on
if (config.TCA9545_I2CMux_Present):
	tca9545.write_control_register(TCA9545_CONFIG_BUS0)
weatherStation = SDL_Pi_WeatherRack.SDL_Pi_WeatherRack(anemometerPin, rainPin, 0,0, SDL_MODE_I2C_ADS1015)

weatherStation.setWindMode(SDL_MODE_SAMPLE, 5.0)
#weatherStation.setWindMode(SDL_MODE_DELAY, 5.0)

################
# DS3231/AT24C32 Setup
# turn I2CBus 0 on
# if (config.TCA9545_I2CMux_Present):
#         tca9545.write_control_register(TCA9545_CONFIG_BUS0)

filename = time.strftime("%Y-%m-%d%H:%M:%SRTCTest") + ".txt"
starttime = datetime.utcnow()

ds3231 = SDL_DS3231.SDL_DS3231(1, 0x68)


try:

        ds3231.write_now()
        ds3231.read_datetime()
        print "DS3231=\t\t%s" % ds3231.read_datetime()
        config.DS3231_Present = True
        print "----------------- "
        print "----------------- "
        print " AT24C32 EEPROM"
        print "----------------- "
        print "writing first 4 addresses with random data"
        for x in range(0,4):
                value = random.randint(0,255)
        	print "address = %i writing value=%i" % (x, value)
                ds3231.write_AT24C32_byte(x, value)
        print "----------------- "

        print "reading first 4 addresses"
        for x in range(0,4):
                print "address = %i value = %i" %(x, ds3231.read_AT24C32_byte(x))
        print "----------------- "

except IOError as e:
        print "I/O error({0}): {1}".format(e.errno, e.strerror)
        config.DS3231_Present = False



################

# BMP280 Setup 

try:
        bmp280 = BMP280.BMP280()
        config.BMP280_Present = True

except IOError as e:

        #    print "I/O error({0}): {1}".format(e.errno, e.strerror)
        config.BMP280_Present = False

##############

# Setup SHT31
# Turn I2CBus 1 on
if (config.TCA9545_I2CMux_Present):
	tca9545.write_control_register(TCA9545_CONFIG_BUS1)

##############

# Dtetct SHT31

try:

	bus = smbus.SMBus(1)
	bus.write_i2c_block_data(0x44, 0x2C, [0x06])

	time.sleep(0.5)

	data = bus.read_i2c_block_data(0x44, 0x00, 6)

	temp = data[0] * 256 + data [1]
	cTemp = -45 + (175 * temp / 65535.0)
	fTemp = -49 + (315 * temp / 65535.0)
	humidity = 100 *(data[3] *256 + data[4]) / 65535.0

	#print "Temperature in Celsius is : %.2f C" %cTemp
	#print "Relative Humidity is : %.2f %%RH" %humidity

except IOError as e:

	config.SHT31_Present = False

##############
# Setup AM2315
# turn I2CBus 0 on
if (config.TCA9545_I2CMux_Present):
         tca9545.write_control_register(TCA9545_CONFIG_BUS0)


###############

# Detect AM2315
try:
        from tentacle_pi.AM2315 import AM2315
        try:
		am2315 = AM2315(0x5c,"/dev/i2c-1")
    		outsideTemperature, outsideHumidity, crc_check = am2315.sense() 
		#print "outsideTemperature: %0.1f C" % outsideTemperature
    		#print "outsideHumidity: %0.1f %%" % outsideHumidity
    		#print "crc: %i" % crc_check
                config.AM2315_Present = True
		if (crc_check == -1):
                	config.AM2315_Present = False

        except:
                config.AM2315_Present = False
except:
        config.AM2315_Present = False
        print "------> See Readme to install tentacle_pi"


###############

# Set up FRAM 
# Set up FRAM

# turn I2CBus 0 on
if (config.TCA9545_I2CMux_Present):
         tca9545.write_control_register(TCA9545_CONFIG_BUS0)
fram = SDL_Pi_FRAM.SDL_Pi_FRAM(addr = 0x50)
# FRAM Detection
try:
        fram.read8(0)
        config.FRAM_Present = True
except:
        config.FRAM_Present = False


#fram = SDL_Pi_FRAM.SDL_Pi_FRAM(addr = 0x50)


# Main Loop - sleeps 10 seconds
# command from RasPiConnect Execution Code

def hardware_name(self):
        return DRIVER_NAME

def loader(config_dict, engine):
    return GrovePiDriver(**config_dict[DRIVER_NAME])

class GrovePiDriver(weewx.drivers.AbstractDevice):
	def __init__(self, **stn_dict):
		self.poll_interval = float(stn_dict.get('poll_interval', 30)) # seconds
#       self.air_temperature = 0
#       self.air_sensor = 1
#       grovepi.pinMode(self.air_sensor, 'INPUT')		

	def genLoopPackets(self):
		while True:
			sampleAndDisplay()
			packet = {
				'usUnits'    : weewx.METRIC,
				'outTemp'    : bmp180Temperature,
				'dateTime'   : int(time.time() + 0.5),
            			'inTemp'     : inTemp,
            			'barometer'  : bmp180Pressure,
            			'pressure'   : bmp180Altitude,
            			'windSpeed'  : currentWindSpeed,
            			'windDir'    : currentWindDirection,
            			'windGust'   : currentWindGust,
            			'outHumidity': humidity,
            			'rain'       : totalRain,
				}
			print packet
			yield packet
			time.sleep(15)
			
def sampleAndDisplay():
        
	global currentWindSpeed, currentWindGust, currentWindDirection
	global bmp180Temperature, bmp180Pressure, bmp180Altitude,  bmp180SeaLevel
	global outsideTemperature, outHumidity, crc_check
	global currentWindDirectionVoltage

	global HTUtemperature, HTUhumidity
	global totalRain
	global inTemp

	global block1, block2
	
	# turn I2CBus 0 on
 	if (config.TCA9545_I2CMux_Present):
         	 tca9545.write_control_register(TCA9545_CONFIG_BUS0)
#		print "----------------- "
	print " Local WeatherRack Weather Sensors Sampling" 
	print "----------------- "
	#

	currentWindSpeed = weatherStation.current_wind_speed()
  	currentWindGust = weatherStation.get_wind_gust()
  	totalRain = weatherStation.get_current_rain_total()
	currentWindDirection = weatherStation.current_wind_direction()

	print("Rain Total=\t%0.2f in")%(totalRain/25.4)
	print("Wind Speed=\t%0.2f MPH")%(currentWindSpeed/1.6)
	print("MPH wind_gust=\t%0.2f MPH")%(currentWindGust/1.6)

	if (config.ADS1015_Present or config.ADS1115_Present):
		print "Wind Direction=\t\t\t %0.2f Degrees" % weatherStation.current_wind_direction()
		print "Wind Direction Voltage=\t\t %0.3f V" % weatherStation.current_wind_direction_voltage()
	else:
		print "No Wind Direction Available - No ADS1015 or ADS1115 Present"
	
	print "----------------- "
        print "----------------- "
        if (config.DS3231_Present == True):
                print " DS3231 Real Time Clock"
        else:
                print " DS3231 Real Time Clock Not Present"

        print "----------------- "
        #

        if (config.DS3231_Present == True):
                currenttime = datetime.utcnow()

                deltatime = currenttime - starttime

                print "Raspberry Pi=\t" + time.strftime("%Y-%m-%d %H:%M:%S")

                print "DS3231=\t\t%s" % ds3231.read_datetime()

                print "DS3231 Temperature= \t%0.2f C" % ds3231.getTemp()
                inTemp = ds3231.getTemp()


	print "----------------- "
#	print "SecondCount=", secondCount
#       print "----------------- "
#	print "----------------- "
#       print "----------------- "
        if (config.BMP280_Present == True):
                print " BMP280 Barometer"
        else:
                print " BMP280 Barometer Not Present"
        print "----------------- "

	if (config.BMP280_Present):
		print 'Temperature = \t{0:0.2f} C'.format(bmp280.read_temperature())
		print 'Pressure = \t{0:0.2f} KPa'.format(bmp280.read_pressure()/1000)
		print 'Altitude = \t{0:0.2f} m'.format(bmp280.read_altitude())
		print 'Sealevel Pressure = \t{0:0.2f} KPa'.format(bmp280.read_sealevel_pressure(config.BMP280_Altitude_Meters)/1000)
		print "----------------- "
		
		bmp180Pressure = bmp280.read_pressure()/100
		bmp180Altitude = bmp280.read_sealevel_pressure(config.BMP280_Altitude_Meters)/100
                bmp180Temperature = bmp280.read_temperature()

        print "----------------- "
        if (config.HTU21DF_Present == True):
                print " HTU21DF Temp/Hum"
        else:
                print " HTU21DF Temp/Hum Not Present"
        print "----------------- "

        # We use a C library for this device as it just doesn't play well with Python and smbus/I2C libraries
        if (config.HTU21DF_Present):
                HTU21DFOut = subprocess.check_output(["htu21dflib/htu21dflib","-l"])
                splitstring = HTU21DFOut.split()

                HTUtemperature = float(splitstring[0])
                HTUhumidity = float(splitstring[1])
                print "Temperature = \t%0.2f C" % HTUtemperature
                print "Humidity = \t%0.2f %%" % HTUhumidity
	else:
		HTUtemperature = 0.0
		HTUhumidity = 0.0

        print "----------------- "

	print "----------------- "

	# turn I2CBus 0 on
 	if (config.TCA9545_I2CMux_Present):
         	tca9545.write_control_register(TCA9545_CONFIG_BUS0)


        print "----------------- "
        if (config.AM2315_Present == True):
                print " AM2315 Temperature/Humidity Sensor"
        else:
                print " AM2315 Temperature/Humidity Sensor Not Present"
        print "----------------- "

        if (config.AM2315_Present):
    		outsideTemperature, outsideHumidity, crc_check = am2315.sense()
    		print "outsideTemperature: %0.1f C" % outsideTemperature
    		print "outsideHumidity: %0.1f %%" % outsideHumidity
    		print "crc: %s" % crc_check
        print "----------------- "

	print "------------------------------"

	#turn I2C bus 1 on
	if (config.TCA9545_I2CMux_Present):
		tca9545.write_control_register(TCA9545_CONFIG_BUS1)


	print "------------------------------"
	print " SHT31 Temperature / Humidity Sensor"
	print "------------------------------"

	print "cTemp: %0.1f C" % cTemp
	print "humidity: %0.1f %%" %humidity
	print "------------------------------"
	print "-------------------------------------------------"


if __name__ == "__main__":
	import weeutil.weeutil
	driver = GrovePiDriver()
    	for packet in driver.genLoopPackets():
        	print weeutil.weeutil.timestamp_to_string(packet['dateTime']), packet

Reply via email to